Как запретить роли администратора изменять "Дату обновления" контента


Обновленная дата содержимого отображается на каждом узле с этим кодом в файле шаблона.

<?php print strftime( "%Y-%m-%d", $node->changed) ?>

Теперь, когда я сохраняю контент с ролью администратора, отображается дата, которую я обновил (конечно). Но я хочу только отобразить дату, обновленную автором контента. Итак, как я могу запретить роли администратора изменять "дату обновления" и обновлять дату только автором контента? Или есть способ отобразить только обновленную дату автором содержание?

Author: chinita7, 2012-02-26

4 answers

Как упоминал Клайв, нет хорошего/простого способа предотвратить обновление метки времени изменения узла, но в качестве возможной альтернативы вы могли бы использовать вместо этого время создания узла:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'presave':
      global $user;
      if ($node->type == 'mynodetype' && !in_array('administrator', $user->roles)) {
        $node->created = time();
      }
      break;
  }
}

Эта реализация hook_nodeapi() установила бы время создания узла 'mynodetype' равным текущему времени, когда его сохраняет не администратор. Вы должны иметь в виду, что пользователи могут вручную устанавливать время создания при редактировании узлов, и это переопределит его для лиц, не являющихся администраторами. Это также будет означать, что в таких случаях фактическое время создания узла будет потеряно, даже если пользователь не изменяет его.

 2
Author: Madis, 2012-03-13 22:05:52

На самом деле вы не можете, это жестко закодировано в node_save() функция с этим битом кода:

$time = time();
if (empty($node->created)) {
  $node->created = $time;
}

// The changed timestamp is always updated for bookkeeping purposes (revisions, searching, ...)
$node->changed = $time;

За исключением реализации вашей собственной формы узла, которая обходит node_save(), вы мало что можете сделать (кроме взлома файла core node.module, который никогда не рекомендуется).

 3
Author: Clive, 2012-02-27 09:03:33
<?php if (($logged_in)&&($user->uid != "1")): ?>
<?php print $submitted; ?>
<?php endif; ?>
 2
Author: hunteryxx, 2012-02-27 03:40:52

Чтобы предотвратить изменения узлов администраторами от обновления даты changed, вы можете создать модуль со следующим кодом. Это работает следующим образом: когда администратор сохраняет узел, новая измененная дата заменяется старой измененной датой.

<?php

/**
 * Implements hook_node_presave().
 * @param $node
 */
function YOURMODULE_node_presave($node) {
  global $user;
  if (in_array('administrator', $user->roles)) {
    $node->changed = $node->original->changed;
  }
}

Приведенный выше код предотвратит обновление даты на всех типах узлов. Если вы хотите, чтобы это применялось только к определенным типам узлов, попробуйте что-то вроде кода ниже. Возможно, вам захочется извлечь массив $types в модуль форма конфигурации.

<?php

/**
 * Implements hook_node_presave().
 * @param $node
 *
 * Add node types to $types array to freeze their changed date.
 */
function YOURMODULE_node_presave($node) {
  $types = array(
    'your_node_type',
    'node_type_2'
  );
  if (in_array($node->type, $types)) {
    $node->changed = $node->original->changed;
  }
}
 1
Author: user2212873, 2016-11-09 17:34:45