Вы здесь

Автоизменение поля у старого материала

1

Добрый день!

Такой вопрос - есть тип материала, у него поле, логическое (отмечают галочку, для отображения в вьювс), возможно ли, если публикуется материал с поставленной галочкой, у предыдущего материала данная галочка снималась. Подозреваю надо ставить rules но не люблю много модулей на сайте. Но если при помощи него можно решить, то поставлю.
Спасибо.

Версия Drupal: 
7.x
Категория: 
Node API
Вопрос задан 10.09.2015 - 17:09
Аватар пользователя Sora
Sora
92

С помощью Rules + VBO.
Создаете представление-VBO, в нем выводите 1 материал с фильтром по NID (сортировка по убыванию).
Создаете правило по триггеру "Создание материала".
В действиях извлекаете список из VBO и LOOP'ом добавляете действие, в котором снимаете галку с материала.

Комментарий оставлен 10.09.2015 - 17:34

Спасибо, мощно конечно :) Поищу темы по данной связке.

Комментарий оставлен 10.09.2015 - 17:38

Ответы

2

hook_node_presave() на сохранение ноды с изменением предыдущей?

Ответ дан 10.09.2015 - 17:33

Это при сохранении, мне надо при публикации... Материал сохраняют, а публикуют позже или по таймеру (Scheduler).

Комментарий оставлен 10.09.2015 - 17:36

Из доков по этому хуку

Act on a node being inserted or updated.

Публикация - это по сути обновление ноды, так что просто добавьте проверку статуса ноды в хуке.
А решение с rules конечно мощное, но какое-то переусложненное, тем более для вашего случая.

Комментарий оставлен 10.09.2015 - 19:36

Сделал, вышел такой код у меня. Буду рад критике.

function updatetop_node_presave($node) {
  if ($node->status == 1 && $node->field_in_top_important['und'][0]['value'] == 1) {
    _updatetop_uncheck_top_status($node->nid);
  }
}

function _updatetop_uncheck_top_status($nid) {
  $nid_unchecked = _updatetop_find_previous_top($nid);
  $query = db_update('field_data_field_in_top_important');
  $query->fields(array(
      'field_in_top_important_value' => 0,
  ));
  $query->condition('entity_id', $nid_unchecked);
  $query->execute();

  $query = db_update('field_revision_field_in_top_important');
  $query->fields(array(
      'field_in_top_important_value' => 0,
  ));
  $query->condition('entity_id', $nid_unchecked);
  $query->execute();
}

function _updatetop_find_previous_top($nid) {
  $query = db_select('field_data_field_in_top_important', 'f');
  $query->fields('f', array('entity_id'));
  $query->condition('f.entity_id', $nid, '<');
  $query->condition('f.field_in_top_important_value', 1, '=');
  $query->execute();
  $result = $query->execute();
  $data = $result->fetchObject();
  return $data->entity_id;
}
Комментарий оставлен 16.09.2015 - 11:38
0

Так ... если нода с галочкой одна, то можно завести переменную, в которой при сохранении ноды с галочкой хранить nid этой ноды.
Если происходит публикация этой ноды (с галочкой), то при этом снимать галочки с остальных нод.
Может быть, как-то так ?

Ответ дан 10.09.2015 - 18:37