Нашел интересный способ обновления нод определенного типа материалов по крону для Drupal7:
http://eureka.ykyuen.info/2012/02/16/drupal-7-batch-update-nodes-by-cron/
Кому лень проходить по ссылке:
<?phpfunction <MODULE>_cron() {
// Get the list of node ids
$sql = "SELECT nid FROM {node} WHERE type = :type";
$result = db_query($sql, array(':type' => '<TYPE>'));
$nids = array();
foreach ($result as $row) {
$nids[] = $row->nid;
}
// Update the table directly
db_update('<FIELD TABLE NAME>')
->fields(array('<FIELD NAME>' => '<NEW VALUE>'))
->condition('entity_id', $nids)
->execute();
// Clear the cache
drupal_flush_all_caches();
}
?>
Я использую для проектов Drupal6 и этот код не работает. Похоже, что проблема в db_update. Подскажите, как же его приладить к шестерке?
Комментарии
Никак не приладить, в шестерке другой DB API. Придется переписать на db_query или drupal_write_record.
А чего интересного?
А зачем?
Ну и node_load, node_save
<?php
// Update the table directly
//изменяем поля если нужно
node_save($nod);
function <MODULE>_cron() {
// Get the list of node ids
$sql = "SELECT nid FROM {node} WHERE type = :type";
$result = db_query($sql, array(':type' => '<TYPE>'));
$nids = array();
foreach ($result as $row) {
$nids[] = $row->nid;
}
foreach ($nids as $nid) {
$node = node_load($nid);
}
// Clear the cache
drupal_flush_all_caches();
}
?>
divined, и снова вам спасибо за подсказку!
Сейчас попробовал, ругается на :type
warning: Invalid argument supplied for foreach() in /sites/all/modules/mymodule/balance_calc.module on line 7.
Поковырялся и нашел еще такое решение:
function balance_calc_cron() {
$query= db_query("SELECT * FROM {node} WHERE type = 'profile'");
while($allnodes = db_fetch_object($query)){
$node_id=$allnodes->nid;
$node=node_load($node_id);
if ($node = node_submit($node)) {
node_save($node);
drupal_set_message(t("Node ".$node->title." added correctly"));
} else {
drupal_set_message(t("Node ".$node->title." added incorrectly"), "error");
}
}
}
?>
Все сработало, но я понял, что в начале топика сам спросил не то, что мне нужно
Суть в том, что мне нужно запускать ноды определенного типа, а не вносить в них изменения, как я думал раньше.
То-есть: у меня есть node-profile.tpl.php (такая нода создается для каждого юзера сайта) в котором выполняется определенный код и мне нужно, что бы этот код выполнялся 1 раз в день по крону. Другими словами: запуск кода в node-profile.tpl.php должен выполнять крон, а пользователь не может т.е. что-то вроде:
$lnode = node_load($node->nid);
$lnode->field_balance[0]['value'] = $current_balance - round($totaldaycost, 2);
node_save($lnode);
};
Есть модуль автоматического запуска крона.
выполняете этот код в кроне и нет проблем.
А какой? Я искал и нашел два похожих http://drupal.org/project/ultimate_cron и http://drupal.org/project/elysia_cron
http://drupal.org/project/poormanscron
да, только вот он каждые N часов может срабатывать, а не в определенное время, как это возможно у стандартного крона.