Доброго вечера!
Пытаюсь сделать обработчик для формы 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; ?>
Очень надеюсь на вашу помощь!
Комментарии
У вас неверные параметры в сабмиттере. Они должны быть эквивалентны параметрам в валидаторе. А посему, там только один способ передавать значения — через $form_state (т.к. $form статическая переменная).
о, я кажется понял! И новые элементы можно добавлять да? Свои всякие, типа $node['new_author'] =1; да?
Спасибо!