Как прокинуть данные из программного созданного поля в стандартное текстовое, при сохранении материала?

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

Аватар пользователя engenes engenes 3 июля 2018 в 6:54

с помощью 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;
?>

но при сохранении материала в поле все равно остаются старые данные, они не перезаписываются тем что в строке.

Лучший ответ

Аватар пользователя engenes engenes 4 июля 2018 в 6:08

повесил на submit функцию в которой присвоил данные этому элементу и помогло

<?php
$form_state
['values']['field_cadastral_number']['und'][0]['value'] = $kadasr_val;
?>

Комментарии

Аватар пользователя engenes engenes 3 июля 2018 в 9:33

посмотрел, но как прокинуть информацию из кастомных полей стандартное непонятно. Ладно это я смогу и на 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
)
?>
Аватар пользователя engenes engenes 3 июля 2018 в 14:15

все таки хочу сделать по-правильному)
повесил на 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;
?>

но при сохранении материала в поле все равно остаются старые данные, они не перезаписываются тем что в строке.

Аватар пользователя engenes engenes 4 июля 2018 в 6:27

чтобы использовать node_load нужно чтобы нода существовала, а она еще не создана.
в комментарии написал, решение которое помогло

Аватар пользователя sas@drupal.org sas@drupal.org 3 июля 2018 в 14:49
1

Если Уж Вам очень надо сделать своими полями а не использовать FAPI, то используйте _extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/functi...
там и form и дисплей, примеры есть в коробке. Тогда результаты сабмита приедут в $node на hook_insert / hook_update , позырить можно например в poll.module

Аватар пользователя engenes engenes 4 июля 2018 в 6:08

повесил на submit функцию в которой присвоил данные этому элементу и помогло

<?php
$form_state
['values']['field_cadastral_number']['und'][0]['value'] = $kadasr_val;
?>