2010-12-28 3 views
0

У меня есть модуль, и я использую node_load (array ('nid' => arg (1))); проблема заключается в том, что эта функция продолжает получать свои данные для node_load из кэша БД.
Как я могу заставить эту функцию не использовать кеш БД?
Пример
моя ссылка http://mydomain.com/node/344983
Сейчас:
$ узел = node_load (массив ('нидь' => аг (1)), нулевой, правда);
echo $ node-> nid. "-" arg (1);
выход
435632 - 435632
, который случайным образом идентификатор узла (доступный в системе)
и каждый раз я Ctrl + F5 мой браузер я получаю новый NID !!Как заставить функцию drupal не использовать кеш БД?

Спасибо за вашу помощь

+0

Если это в модуле, отправьте свои _menu hooks –

+0

function custom_node_menu() { $ items = array(); $ пунктов [ 'узел'] = массив ( 'заголовок' => 'узел', 'страница обратного вызова' => 'drupal_not_found', 'обратного вызова доступа' => TRUE, то 'тип' => MENU_CALLBACK, ); возврат $ пунктов; } – Alaa

+0

Имеет ли 'node_load (arg (1))' похожие проблемы? Что выводит 'print arg (1)'? Возможно, у вас есть кеширование для анонимных пользователей, и вы просто видите более ранний вывод со страницы? – ceejayoz

ответ

3

Где вы собираетесь это видеть? Например, используете ли вы его как часть вашего файла template.php как часть страницы или как внешний модуль?

Если вы не включили эту функцию в свое собственное пространство имен, попробуйте присвоить ей значение по-разному, чем $node - например, назовите ее $my_node. В зависимости от контекста, имя «узла», скорее всего, будет доступно и модифицировано ядром Drupal и другими модулями.

Если это происходит внутри функции, попробуйте следующее и дайте мне знать, что выход:

$test_node_1 = node_load(344983); // Any hard-coded $nid that actually exists 
echo $test_node_1->nid; 

$test_node_2 = node_load(arg(1)); // Consider using hook_menu loaders instead of arg() in the future, but that's another discussion 
echo $test_node_2->nid; 

$test_node_3 = menu_get_object(); // Another method that is better than arg() 
echo $test_node_3->nid; 

Edit:

Поскольку вы используете hook_block, я думаю, см. вашу проблему - сам блок кэшируется, а не узел.

Try установки BLOCK_NO_CACHE или BLOCK_CACHE_PER_PAGE в hook_block, согласно документации на http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_block/6

Вы должны также попытаться избежать Arg() всякий раз, когда это возможно - это немного угрозу безопасности, и есть лучшие способы достигнуть почти все, что arg() будет делать в среде модуля.

Edit: *

Некоторые примеры кода, который показывает, что я имею в виду:

function foo_block ($op = 'list', $delta = 0, $edit = array()) { 
    switch ($op) { 
     case 'list': 
     $blocks[0] = array(
      'info' => 'I am a block!', 
      'status' => 1, 
      'cache' => BLOCK_NO_CACHE // Add this line 
     ); 
     return $block; 
     case 'view': 
     ..... 
    } 
} 
+0

кажется, что моя проблема связана с самим arg – Alaa

+0

, она находится в блоке крюка. результат будет правильным, если я очищу кеш из базы данных, выполнив следующие запросы mysql: delete from cache_content; delete from cache_block; .... он дает результат правильно для первой страницы, которую я просматриваю, тогда он продолжает давать тот же самый ник для следующих страниц. – Alaa

+0

А, я думаю, что вижу вашу проблему. См. отредактированный ответ выше – anschauung

0

node_load использует db_query, который использует mysql_query - так что нет никакого способа, чтобы легко изменить кэш базы данных с помощью этой функции.

Но, node_load действительно использует кэш Drupal static $nodes. Возможно, это ваша проблема, а не кэш базы данных. У вас может быть node_load этот кэш, позвонив по номеру node_load с номером $reset = TRUE (node_load($nid, NULL, TRUE).

Полная документация находится на странице руководства по node_load на http://api.drupal.org/api/drupal/modules--node--node.module/function/node_load/6

+0

Я уже пробовал устанавливать $ reset в True ... но это не помогло :( – Alaa

+0

Hrm .. вы могли бы описать конкретное поведение, которое вы видите? node_load тянет из потенциально большого количества разных таблиц ... не могли бы вы отредактировать свой ответ, чтобы предоставить примерный код, и образец того, что вы ожидали увидеть? – anschauung

+0

вопрос был отредактирован, чтобы сделать его понятным – Alaa

0

Я имел счастье проходящее в ИО узла к node_load не в массиве.

node_load (1);

В соответствии с Druapl's api это приемлемо, и, похоже, если вы передадите массив в качестве первой переменной, он будет загружен как массив условий, которые будут соответствовать запросу в запросе базы данных.

+0

Итак? должен решить мою проблему? Спасибо – Alaa

+0

Возможно, попробуйте. – ceejayoz

+0

Основная часть моего ответа заключалась в том, как вам нужно передать первую переменную как переменную, а не массив, что является правильным. Я не уверен, почему меня проголосовали. – jhuebsch

0

Этот вопрос не с arg(), ваша проблема в том, что вы включено кэширование для анонимных пользователей ,

Вы можете отключить кеширование, или вы можете исключить пункты меню вашего модуля из кеша с помощью cache exclude module.

редактировать: Как теперь вы объяснили, что это блок, вы можете использовать BLOCK_NO_CACHE в hook_block, чтобы исключить свой блок из кэша блока.

+0

Я очень ценю вашу помощь, но этот модуль должен исключать страницы ... , и вот этот блок появляется на всех страницах, которые более 10 тыс. страниц. так как я могу исключить из кэша этот блок (или модуль, который показывает этот блок). Большое спасибо за вашу помощь. – Alaa

+0

То, что это в блоке, - очень важная информация, которая была бы неплохо иметь в самом вопросе. Есть причина, по которой @Andrew Sledge попросил ваш код 'hook_menu' ... Ответ обновлен. – ceejayoz