Как запретить роли администратора изменять "Дату обновления" контента
Обновленная дата содержимого отображается на каждом узле с этим кодом в файле шаблона.
<?php print strftime( "%Y-%m-%d", $node->changed) ?>
Теперь, когда я сохраняю контент с ролью администратора, отображается дата, которую я обновил (конечно). Но я хочу только отобразить дату, обновленную автором контента. Итак, как я могу запретить роли администратора изменять "дату обновления" и обновлять дату только автором контента? Или есть способ отобразить только обновленную дату автором содержание?
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' равным текущему времени, когда его сохраняет не администратор. Вы должны иметь в виду, что пользователи могут вручную устанавливать время создания при редактировании узлов, и это переопределит его для лиц, не являющихся администраторами. Это также будет означать, что в таких случаях фактическое время создания узла будет потеряно, даже если пользователь не изменяет его.
На самом деле вы не можете, это жестко закодировано в 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, который никогда не рекомендуется).
<?php if (($logged_in)&&($user->uid != "1")): ?>
<?php print $submitted; ?>
<?php endif; ?>
Чтобы предотвратить изменения узлов администраторами от обновления даты 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;
}
}