Обновление нод по крону, в D7 работает, а как сделать в D6 ?

Главные вкладки

Аватар пользователя fit fit 19 августа 2012 в 12:33

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

Комментарии

Аватар пользователя divined divined 19 августа 2012 в 14:20
<?php
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;
  }

  

// Update the table directly
  
foreach ($nids as $nid) {
    
$node node_load($nid);

    

//изменяем поля если нужно

    

node_save($nod);
  }
  
  
// Clear the cache
  
drupal_flush_all_caches();
}
?>
Аватар пользователя fit fit 19 августа 2012 в 15:56

divined, и снова вам спасибо за подсказку!

Сейчас попробовал, ругается на :type

user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':type' at line 1 query: SELECT nid FROM node WHERE type = :type in /sites/all/modules/mymodule/mymodule.module on line 5.
warning: Invalid argument supplied for foreach() in /sites/all/modules/mymodule/balance_calc.module on line 7.
Аватар пользователя fit fit 19 августа 2012 в 17:07

Поковырялся и нашел еще такое решение:

<?php
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");
    }
 }
}
?>

Все сработало, но я понял, что в начале топика сам спросил не то, что мне нужно Smile
Суть в том, что мне нужно запускать ноды определенного типа, а не вносить в них изменения, как я думал раньше.

То-есть: у меня есть node-profile.tpl.php (такая нода создается для каждого юзера сайта) в котором выполняется определенный код и мне нужно, что бы этот код выполнялся 1 раз в день по крону. Другими словами: запуск кода в node-profile.tpl.php должен выполнять крон, а пользователь не может т.е. что-то вроде:

        if ($GLOBALS['user']->uid) {} else {
                $lnode = node_load($node->nid);
                $lnode->field_balance[0]['value'] = $current_balance - round($totaldaycost, 2);
                node_save($lnode);
        };
Аватар пользователя fit fit 19 августа 2012 в 20:03

да, только вот он каждые N часов может срабатывать, а не в определенное время, как это возможно у стандартного крона.