Валидация поля nodereference

Аватар пользователя Orion76 Orion76 25 июля 2011 в 14:35

К товару (ubercart) добавлены 2 автодополняемых поля-nodereference,
в форме редактирования товара после сабмита,
при валидации выдает ошибку :Старый код: заголовок ошибочный. Пожалуйста, проверьте свой выбор.
Что соответствует строке

form_error($element[$field_key], t('%name: title mismatch.
Please check your selection.'
, array('%name' => t($field['widget']['label']))));"

функции валидации формы.

Вот , собственно, функция валидации автокомплит-nodereference-поля из
подмодуля CCK - nodereference Drupal 6
Смотрите комментарии, начинающиеся на "!!!" ....

/**
 * Validate an autocomplete element.
 *
 * Remove the wrapper layer and set the right element's value.
 * This will move the nested value at 'field-name-0-nid-nid'
 * back to its original location, 'field-name-0-nid'.
 */

function nodereference_autocomplete_validate($element, &$form_state) {
  $field_name = $element['#field_name'];
  $type_name = $element['#type_name'];
  $field = content_fields($field_name, $type_name);
  $field_key  = $element['#columns'][0];
  $delta = $element['#delta'];
  $value = $element['#value'][$field_key];
  $nid = NULL;
 
// !!! $value= G 052195M2 Масло оригинальное Longlife III VW 5W30 1 литр [nid:62]

  if (!empty($value)) {

// !!! Здесь для чего-то ищется предыдущее значение поля (связанная нода),
// !!! и если значение имеется, то из $value убирается model(SKU) товара
    if(module_exists('uc_product')){
        $n=node_load($form_state['values']['nid']);
        $field_name=$field['field_name'];
        $refnode=node_load($n->{$field_name}[0]['nid']);
        $model=$refnode->model;
        $res=strpos('x'.$value, $model);
        if(!empty($model) && $res){
            $value=trim(str_replace($model, '', $value).' [nid:'.$refnode->nid.']');
        }
    }

// !!! Здесь из $value "выдирается" title и nid связанной ноды,и если такая нода СУЩЕСТВУЕТ !!! выдается ошибка!!

    preg_match('/^(?:\s*|(.*) )?\[\s*nid\s*:\s*(\d+)\s*\]$/', $value, $matches);
    if (!empty($matches)) {
      // Explicit [nid:n].
      list(, $title, $nid) = $matches;

// !!! $value = G 052195M2 Масло оригинальное Longlife III VW 5W30 1 литр [nid:62]
// !!! $title = G 052195M2 Масло оригинальное Longlife III VW 5W30 1 литр
// !!! $nid = 62

      if (!empty($title) && ($n = node_load($nid))) {

        form_error($element[$field_key], t('%name: title mismatch. Please check your selection.', array('%name' => t($field['widget']['label']))));
      }
    }
    else {
      // No explicit nid.
      $reference = _nodereference_potential_references($field, $value, 'equals', NULL, 1);
      if (empty($reference)) {
        form_error($element[$field_key], t('%name: found no valid post with that title.', array('%name' => t($field['widget']['label']))));
      }
      else {
        // TODO:
        // the best thing would be to present the user with an additional form,
        // allowing the user to choose between valid candidates with the same title
        // ATM, we pick the first matching candidate...
        $nid = key($reference);
      }
    }
  }
  form_set_value($element, $nid, $form_state);
}

Т.е. если выбранная связанная нода существует - то выдается ошибка!!

Дано: Я трезв.
Вопрос: Я перегрелся?

Комментарии

Аватар пользователя Orion76 Orion76 25 июля 2011 в 14:59

пардон... понял... кто-то грязно хакнул модуль

строка:
if (!empty($title) && ($n = node_load($nid)))

должна быть такой:

if (!empty($title) && ($n = node_load($nid)) && $title != $n->title)

тогда смысл проверки кардинально меняется...