как заставить функцию drupal не использовать кеш БД? - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть модуль, и я использую 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!

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

Ответы [ 4 ]

3 голосов
/ 29 декабря 2010

Где ты это называешь? Например, используете ли вы его как часть вашего файла 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, я думаю, что вижу вашу проблему - кешируется сам блок, а не узел.

Попробуйте установить 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 голосов
/ 29 декабря 2010

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

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

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

0 голосов
/ 29 декабря 2010

Мне посчастливилось передать идентификатор узла в node_load, а не в массив.

node_load (1);

Согласно API Друапла это приемлемо ипохоже, что если вы передадите массив в качестве первой переменной, он будет загружен как массив условий для сопоставления в запросе базы данных.

0 голосов
/ 28 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...