2010-05-28 2 views
4

Всякий раз, когда создается элемент контента, отображается сообщение, как это:Отключить сообщение о создании контента Drupal?

[Content Type] [Name] has been created. 

Есть ли способ отключить это сообщение для определенных пользователей? Или для всех пользователей тоже будет хорошо.

ответ

3

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

В качестве альтернативы вы можете использовать функцию preprocess_page, проверять, какие сообщения обслуживаются, и удалять ненужные, но это было бы немного сложнее. Должно быть возможно с некоторым регулярным выражением. С другой стороны, этот метод будет немного более дружественным к обновлению, поскольку вы можете продолжать использовать функцию node_form_submit и получать будущие изменения, если таковые имеются.

2

Если вы хотите использовать модуль правил, вы можете использовать новый модуль, который я создал, с именем "Better Rules Message". С помощью этого вы можете установить правило, которое удалит все сообщения после создания узла ...

Надеемся, что это будет добавлено в основной модуль правил в ближайшем будущем.

2

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

Вам нужно будет написать свой собственный крюк отправки до или после вызова node_form_submit.

С помощью кэша отправки после сохранения узла вы можете удалить сообщение с $_SESSION['messages'], если массив сообщений был достаточно легким для работы. Я думаю, это было бы достаточно просто. См drupal_set_message

ИЛИ

Вы могли бы написать некоторый класс в CSS в вашем теле тега и установить дисплей ни когда сообщения о состоянии возвращаются на странице, что форма узла подчиняется. Но это может поставить вашу бизнес-логику в ваш тематический слой, которого следует избегать.

4

Я думаю, что лучшая практика будет использовать hook_nodeapi() и drupal_get_messages('status'). $op для hook_nodeapi() будет insert. Пример:

mymodule_nodeapi(&$node, $op) { 
    if ($node->type == 'content_type_to_check_for' && $op == 'insert') { 
    drupal_get_messages('status'); 
    } 
} 
+0

Я наивно думал, что его можно изменить на странице preprocess_page, но template_preprocess_page уже обработал его к тому времени. –

+1

По крайней мере, в drupal 6, крюк вставки запускается, когда node_form_submit вызывает node_save, прежде чем сообщения будут установлены. –

3

Вот как я открыл для себя, чтобы скрыть такие сообщения для определенных типов контента (тип узла «запрос»):

// specific node type form alteration hook (implements [hook_form_FORM_ID_alter][1]()) 
function MYCUSTOMMODULE_form_request_node_form_alter(&$form, &$form_state) { 
    // ... 
    // custom validation function 
    $form['#validate'][] = '_custom_request_node_form_validate'; 
    // ... 
} 
function _custom_request_node_form_validate($form, &$form_state) { 
    //... 
    // here we can set a submit handler that is executed before 
    // node_form_submit which sets the messages we are trying to hide 
    $form_state['submit_handlers'][] = '_custom_request_node_disable_msg'; 
    //... 
} 
function _custom_request_node_disable_msg($form, &$form_state) { 
    //... 
    // clear status messages 
    drupal_get_messages('status'); 
} 
3

Я написал эту функцию, очень удобно им.Cheers

/** 
* method to assure only wanted messages are shown, filtered by optional type 
*/ 

function my_module_filter_messages() { 

// before emptying the messages cache to get rid of i.e. status messages (uncommented so not kept), first save the types you want to keep in arrays 
// this way you can exactly determine which will be displayed. Use free types such as "admin" or "custom" for own messages 
// could be made smarter with params for node types or message types or with a variable_get (to turn on/off all messages of some sort (i.e. admin)) 

// $statuses = drupal_get_messages('status'); // suppressed by commenting 
$errors = drupal_get_messages('error'); 
$warnings = drupal_get_messages('warning'); 
$customs = drupal_get_messages('custom'); 
$admins = drupal_get_messages('admin'); 
unset($_SESSION['messages']); 

// dpm($admin); 
global $user; 

foreach ($statuses['status'] as $status) { 
    drupal_set_message($status, 'status'); // standard type 
} 
foreach ($errors['error'] as $error) { 
    drupal_set_message($error, 'error'); // standard type 
} 
foreach ($warnings['warning'] as $warning) { 
    drupal_set_message($warning, 'warning'); // standard type 
} 
foreach ($customs['custom'] as $custom) { 
    drupal_set_message($custom, 'custom'); // selfcreated type, note you might want to css this like the others 
} 
// only for admin's eyes, handy for testing 
if($user->uid==1){ 
    foreach ($admins['admin'] as $admin) { 
     drupal_set_message($admin, 'admin'); // selfcreated type, note you might want to css this like the others 
    } 
} 

} 
3

Лучшим способом будет пользователь Disable Messages модуль. Есть много видов сообщений, которые могут быть отключены в этом модуле:

  • Фильтра из сообщений, которые соответствуют полной текстовой строке точно.
  • Отфильтровать сообщения, которые соответствуют регулярному выражению.
  • Права на скрытие всех сообщений определенного типа от любой роли.
  • Отключите всю фильтрацию для определенных пользователей.
  • Отключите всю фильтрацию для определенных путей.
  • Применить фильтрацию только для определенных путей.
  • Отладка системы для получения сообщений в HTML, не показывая ее конечным пользователям.
Смежные вопросы