передать значения из _validate в _submit

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

Аватар пользователя Grig Grig 6 августа 2009 в 22:55

Доброго вечера!
Пытаюсь сделать обработчик для формы node_form который бы при введении в поле автор несуществующего автора сам бы создавал автора с заданным именем и мылом. Подсунуть свой прорялщик и обработщик получилось, но не получается передать node->name из my_node_form_validate в my_node_form_submit. И не получается добавить в массив $node какой то новый элемент в котором бы при проверке в _validate помечалось бы, что нужно создать автора. Пробую в _submit вывести $node->name - ничего не выводится(
код сабмита такой например:

<?php function my_node_form_submit($node$form = array()){
    global 
$user;

  

// Convert the node to an object, if necessary.
  
$node = (object)$node;
    
// Validate the "authored by" field.
    
if ($node->new_author == 1) {
      
// The use of empty() is mandatory in the context of usernames
      // as the empty string denotes the anonymous user. In case we
      // are dealing with an anonymous user we set the user ID to 0.
   
echo "metka".$node['name'];
    exit;
   }else{
   echo 
"figa!".$node['name'];
    exit;
   }

  
 }
  
  function 

my_node_form_validate($form, &$form_state) {
  
my_node_validate($form_state['values'], $form);
}
              function 
my_node_validate($node$form = array()) {
    
// Convert the node to an object, if necessary.
  
$node = (object)$node;
  
$type node_get_types('type'$node);

  

// Make sure the body has the minimum number of words.
  // TODO : use a better word counting algorithm that will work in other languages
  
if (!empty($type->min_word_count) && isset($node->body) && count(explode(' '$node->body)) < $type->min_word_count) {
    
form_set_error('body't('The body of your type is too short. You need at least %words words.', array('%words' => $type->min_word_count'type=> $type->name)));
  }

  if (isset(

$node->nid) && (node_last_changed($node->nid) > $node->changed)) {
    
form_set_error('changed't('This content has been modified by another user, changes cannot be saved.'));
  }

  if (

user_access('administer nodes')) {
    
// Validate the "authored by" field.
    
if (!empty($node->name) && !($account user_load(array('name' => $node->name)))) {
      
// The use of empty() is mandatory in the context of usernames
      // as the empty string denotes the anonymous user. In case we
      // are dealing with an anonymous user we set the user ID to 0.
      
$node['name'] = "new.".$node->name;
      
$node['new_author'] = 1;
     
// form_set_error('name', t('The username %name does not exist.', array('%name' => $node->name)));
    
}

    

// Validate the "authored on" field. As of PHP 5.1.0, strtotime returns FALSE instead of -1 upon failure.
    
if (!empty($node->date) && strtotime($node->date) <= 0) {
      
form_set_error('date't('You have to specify a valid date.'));
    }
  }

  

// Do node-type-specific validation checks.
  
node_invoke($node'validate'$form);
  
node_invoke_nodeapi($node'validate'$form);
}
?>

в итоге всегда вне зависимости от того, ввожу ли я существующего автора или несуществующего, я получаю figa!
Причем здесь валидатор подменен полностью, а обработка - подсунута вперед как то вот так(наверно это криво)):

<?php  $form['#validate'][0] = 'my_node_form_validate';
         
     
$i $form['#submit'][0];
            
$form['#submit'][0] = 'my_node_form_submit';  
            
$form['#submit'][1] = $i?>

Очень надеюсь на вашу помощь!

Комментарии

Аватар пользователя neochief neochief 7 августа 2009 в 2:38

У вас неверные параметры в сабмиттере. Они должны быть эквивалентны параметрам в валидаторе. А посему, там только один способ передавать значения — через $form_state (т.к. $form статическая переменная).

Аватар пользователя Grig Grig 7 августа 2009 в 19:28

о, я кажется понял! И новые элементы можно добавлять да? Свои всякие, типа $node['new_author'] =1; да?
Спасибо!