с помощью hook_form_alter создал 4 инпута, хочу при сохранении материала извлечь из них данные и присвоить их стандартному полю.
С помощью foreach я могу сформировать строку
а дальше присвоить ее нужному полю.
но как при сохранении материала получить данные из этого поля?
hook_node_presave($node) но он принимает в качестве аргумента уже ноду, в которой никаких кастомных полей уже нет, непонятно как прокинуть их сюда и уже работать с node_presave
так же хочу понять как повесить на эти поля функцию валидации
<?phpfunction модуль_form_alter(&$form, &$form_state, $form_id) {
global $user;
if($form_id =="property_node_form" && $user->uid == 1){
$form['field_cadastral_num'] = array(
'#type' => 'fieldset',
'#title' => 'Кадастровый номер',
'#attributes' => array(
'class' => array(
'field-type-text',
'field-name-property_node_form'
),
),
'#weight' => $instance['widget']['weight'],
);
$form['field_cadastral_num']['cell'][] = array(
'#type' => 'textfield',
'#default_value' => '',
'#size' => 3,
'#maxlength' => 3,
'#name' => 'kadastr[0]',
'#value' => ''
);
$form['field_cadastral_num']['cell'][] = array(
'#type' => 'textfield',
'#default_value' => '',
'#size' => 3,
'#delta' => 3,
'#maxlength' => 3,
'#name' => 'kadastr[1]',
'#value' => '',
'#prefix' => ':'
);
$form['field_cadastral_num']['cell'][] = array(
'#type' => 'textfield',
'#default_value' => '',
'#size' => 6,
'#maxlength' => 6,
'#name' => 'kadastr[2]',
'#value' => '',
'#prefix' => ':'
);
$form['field_cadastral_num']['cell'][] = array(
'#type' => 'textfield',
'#default_value' => '',
'#size' => 3,
'#maxlength' => 3,
'#name' => 'kadastr[3]',
'#value' => '',
'#prefix' => ':'
);
$form['field_cadastral_number']['#type'] = 'hidden';
drupal_set_message('<pre>'.print_r($form['field_cadastral_num']['cell'],true).'</pre>');
}
}?>
попробовал и вот так:
повесил на submit дополнительную функцию $form['#submit'][] = 'customize_property_form_submit';
в которой я собрал все данные из инпутов в одну строку:
<?php$kadasr_val = '111:111:111:111';?>
далее попытался присвоить эту строку стандартному полю через в нескольких местах.
в т.ч и в build_info
<?php
$form['field_cadastral_number']['und'][0]['value'] = $kadasr_val;
$form['field_cadastral_number']['und'][0]['safe_value'] = $kadasr_val;
$form_state['input']['field_cadastral_number']['und'][0]['value'] = $kadasr_val;
$form_state['build_info']['args'][0]->field_cadastral_number['und'][0]['value'] = $kadasr_val;
$form_state['build_info']['args'][0]->field_cadastral_number['und'][0]['safe_value'] = $kadasr_val;
?>
но при сохранении материала в поле все равно остаются старые данные, они не перезаписываются тем что в строке.
Комментарии
См. $form_state['build_info']
посмотрел, но как прокинуть информацию из кастомных полей стандартное непонятно. Ладно это я смогу и на js
большого костыля в этом нет.
Больше интересует как повесить на эту форму дополнительную валидацию в которую будет отправляться содержимое моих инпутов.
<?php
Array
(
[args] => Array
(
[0] => stdClass Object
(
[uid] => 1
[name] => автор
[type] => property
[language] => und
[title] =>
[status] => 1
[promote] => 0
[sticky] => 0
[created] => 1530598888
[revision] =>
[menu] => Array
(
[link_title] =>
[mlid] => 0
[plid] => 0
[menu_name] => main-menu
[weight] => 0
[options] => Array
(
)
[
module] => menu[expanded] => 0
[hidden] => 0
[has_children] => 0
[customized] => 0
[parent_depth_limit] => 8
)
)
)
[
form_id] => property_node_form[files] => Array
(
[menu] => modules/node/node.pages.inc
)
[
base_form_id] => node_form)
?>
<?php
$form['#validate'][] = 'my_callback';
?>
все таки хочу сделать по-правильному)
повесил на submit дополнительную функцию $form['#submit'][] = 'customize_property_form_submit';
в которой я собрал все данные из инпутов в одну строку
<?php
$kadasr_val = '111:111:111:111';
?>
далее попытался присвоить эту строку стандартному полю через в нескольких местах.
в т.ч и в build_info
<?php
$form['field_cadastral_number']['und'][0]['value'] = $kadasr_val;
$form['field_cadastral_number']['und'][0]['safe_value'] = $kadasr_val;
$form_state['input']['field_cadastral_number']['und'][0]['value'] = $kadasr_val;
$form_state['build_info']['args'][0]->field_cadastral_number['und'][0]['value'] = $kadasr_val;
$form_state['build_info']['args'][0]->field_cadastral_number['und'][0]['safe_value'] = $kadasr_val;
?>
но при сохранении материала в поле все равно остаются старые данные, они не перезаписываются тем что в строке.
$form_state['build_info']['args'][0]->field_cadastral_number['und'][0]['value'] = $kadasr_val;
тут скорее всего так:
$node->field_cadastral_number['und'][0]['value'] = $kadasr_val;
node_save($node);
чтобы использовать node_load нужно чтобы нода существовала, а она еще не создана.
в комментарии написал, решение которое помогло
Если Уж Вам очень надо сделать своими полями а не использовать FAPI, то используйте _extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/functi...
там и form и дисплей, примеры есть в коробке. Тогда результаты сабмита приедут в $node на hook_insert / hook_update , позырить можно например в poll.module
повесил на submit функцию в которой присвоил данные этому элементу и помогло
<?php
$form_state['values']['field_cadastral_number']['und'][0]['value'] = $kadasr_val;
?>