Как ввести доп. условие корректности содержимого?

Главные вкладки

Аватар пользователя iltmpz iltmpz 31 августа 2008 в 6:11

Есть желание сделать такую штуку:
При отправке создаваемого материала/комментария он должен проверяться на определенные условия, например наличие в нем подстроки (цензура?) И, если эта подстрока в нем окажется, выдавать ошибку и не сохраняться.
Вопрос: как это сделать?
Есть ощущение, что надо использовать Форматы ввода - фильтрацию входящего текста, но фильтры только обрабатывают текст и сохраняют его в любом случае.
Или надо как-то использовать триггеры/действия, но действие срабатывает уже после опубликования, и там нет действия "удалить".
Что тут можно придумать?

drupal 6

Комментарии

Аватар пользователя Ромка Ромка 31 августа 2008 в 13:31

С фильтрами поиграться можно, но они не позволят запретить сохранение материала, если в нем найдены ошибки, они позволят, например, удалить или заменить часть строки.

http://api.drupal.ru/api/file/developer/examples/filter_example.module/6

Аватар пользователя dfaker dfaker 31 августа 2008 в 21:28

Вот недавно делал себе проверку на одинаковые значения поля cck node reference:
<?php
function _my_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'validate':
switch ($node->type) {
case 'b':
_validate_unique_fileds_nodereference($node, field_b_author);
break;
}
break;
}
}

// Сама функция проверки по имени поля
function _validate_unique_fileds_nodereference($n, $filed_name) {
if (isset($n->$filed_name) && count($n->$filed_name) > 0) {
$nids = array();
$errFields = array();
foreach ($n->$filed_name as $key => $val) {
if (is_numeric($val[nid])) {
if (in_array($val[nid], $nids))
$errFields[] = $val[_error_element];
$nids[] = $val[nid];
}
}
foreach ($errFields as $errField)
form_set_error($errField, t("Повторяющиеся значения недопустимы!"));
}
}
?>

Это в модуле пишется, только не спрашивайте что это такое

Аватар пользователя iltmpz iltmpz 4 сентября 2008 в 0:25

Спасибо за идею глянуть наконец в сторону написания своего модуля, а то как-то у меня руки не доходили.
Разбирался к хуками, часа 3 убил, пытаясь понять, почему hook_validate не срабатывает, потом решил попробовать hook_nodeapi, и сразу все получилось Smile
Сделал себе модуль из 1-й функции, потом по мере возникновения задач буду туда же дописывать все, что мне нужно.

Выкладываю код своего файла ilfeatures.module:

<?php
// $Id$

function ilfeatures_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch($op)
  {
    case 'validate':
      // Convert the node to an object, if necessary.
      $node = (object)$node;
      $type = node_get_types('type', $node);
      if(strstr($node->body,'та_подстрока_которую_надо_запретить'))
        form_set_error('ilfeatures', t('The body of your type contains substring that is not allowed.', array('type' => $type->name)));
      break;
    default:
  }
}

И еще дополнение для комментария:

function ilfeatures_comment($a1, $op) {
  switch($op)
  {
    case 'validate':
      if(strstr($a1['comment'],'та_подстрока_которую_надо_запретить'))
        form_set_error('ilfeatures', t('The body of your type contains substring that is not allowed.', array('type' => 'Comment')));
      break;
    default:
  }
}