Создал модуль, который при запуске cron обновляет данные в таблице с данными поля:
<?php
function mymodule_cron(){
//Подключаемся к таблице с данными для замены
$query = db_select('potencial', 'p');
$query
->fields('p', array('href_activ', 'title', 'href_noactiv'));
$resultPotencial = $query->execute();
//Подключаемся к таблице записей которые нужно заменить
$queryActiv = db_select('field_data_field_myfield', 'f');
$queryActiv
->condition('field_myfield_class', 'noactiv')
->fields('f', array('field_myfield_href', 'field_myfield_title', 'field_myfield_class'));
$resultDataField = $queryActiv->execute();
//При совпадении nid (href_noactiv и field_myfield_href) заменяем данные
foreach($resultPotencial as $p){
foreach($resultDataField as $f){
if($p->href_noactiv == $f->field_myfield_href){
db_update('field_data_field_myfield')
->fields(array('field_myfield_href' => $p->href_activ, 'field_myfield_class' => 'activ', 'field_myfield_title' => $p->title))
->condition('field_myfield_href', $f->field_myfield_href)
->execute();
}
}
}
}
?>
При тестировании модуля первая запись в таблице potencial успешно заменилась, но последующие перестали реагировать, то ли я что то изменил и забыл (хотя логика в действиях вроде правильная), то ли с самого начала всё сделал неправильно, хотя ещё раз - первая запись в potencial обновила data_field но больше не хочет. И ещё db_update обновляет сразу несколько записей в data_field. Может из-за этого?
Комментарии
Да, работает только для первой записи в potencial, потом почему-то родительский цикл останавливается
Видимо, нельзя так делать. Попробуйте внутри цикла не делать db_update, а собирать данные для update в массив:
$update[] = array('href1' => $f->field_myfield_href, 'href2' => $p->href_activ, 'title' => $p->title);
А потом пройтись еще раз в цикле по этой переменной и сделать db_update
А можно как-нибудь без применения db_update изменить заголовок ноды? Пробовал:
<?php
$nid = $p->href_noactiv;
$node = node_load($nid); /* Загружаем ноду с идентификатором */
$node->title = '[Предлагается к удалению]'.$p->title;
node_save($node);
?>
Можно и через node_load/node_save действовать, но это более "дорогой" подход в плане производительности.
Код в принципе правильный, только проверяйте $node после node_load():
....
}
href_noactiv - это же не nid, подозреваю что $node будет пустым
В href_noactiv хранится как раз nid, просто свою таблицу создал и, чтобы не запутался, назвал так столбец
Если $node не пустой, node_save() сработает. Посмотрите print_r($node); после замены $node->title
А куда он выведет эту информацию? Я же через cron этот скрипт запускаю
Весь вечер бился, единственное, что изменил так это кодировку (почему-то стояла windows или что-то вроде того) на utf без BOM, и всё заработало - и db_update и node_save(). Видимо всё дело было в кодировке. В любом случае огромное спасибо за помощь!!!