Вы здесь

Как программно изменить значение по умолчанию элемента формы ноды?

0

Добрый день.
В D7 работало такое, что при создании ноды через хук hook_node_form_alter в зависимости от текущего пользователя и прочих условий можно было для поля(элемента формы) задать определенное значение по умолчанию:
$form['field_year']['und'][0]['value']['#default_value'] = array('2014');

В D8 #default_value находиться здесь:

$form['field_year']['widget'][0]['value']['#default_value'] = 2014;

но изменение ни к чему не приводит, как и уничтожение

unset($form['field_year']['widget'][0]['value']['#default_value']);

остается значение определенное через настройку поля в админке.

Как заставить это работать в D8?

Версия Drupal: 
8.x
Категория: 
Form API
Вопрос задан 17.02.2018 - 00:16

скорее всего просто не там ищите - не тот ключ

Комментарий оставлен 17.02.2018 - 23:06

не уверен что понял Вас, имеете в виду "ключ" элемента массива php или выражаетесь фигурально. Вот нашел как иностранный гражданин сокрушается, что "нет пути для динамического изменения значения по умолчанию для поля" или это слишком сложно https://www.drupal.org/project/drupal/issues/1797100. мне еще предстоит осознать весь трагизм ситуации.

Из примеров по D8 понятно, что для элемента формы #default_value устанавливается в том же подмассиве где и #type этого элемента, в моем случае все это находиться здесь:
$form['field_year']['widget'][0]['value']

другое дело что на деле не работает, хотя по логике в hook_form_alter имеем уже готовые к отрисовке элементы формы, и вроде как не важно с "field instance" они до этого формировались или нет.
но само поле так ломается:
unset($form['field_year']['widget']);

Комментарий оставлен 18.02.2018 - 18:35

Сейчас попробовал с полем боди, помоему всё прекрасно работает:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function custom_my_form_node_news_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  kint($form);
  $form['body']['widget'][0]['#default_value'] = 'new';
}

Все меняется.

Комментарий оставлен 19.02.2018 - 20:05

Спасибо Вам!
Да у меня тоже заработало, не знаю что это было кеш или я уже в угаре от перехода на D8. На странице ajax, может быть связано с этим.

Еще по поводу ajax:

У меня создание ноды происходит на кастомной странице(кроме формы должна выводится дополнительная информация вне формы и еще другая форма, поэтому стандартная /node/add/node_type уже не подходит).

На данный момент сделал реализацию метода контроллера страницы по образцу модуля node.

custom_module/src/Controller/CustomModuleController.php:

/**
 * @file
 * Contains \Drupal\custom_module\Controller\CustomModuleController.
 */

namespace Drupal\custom_module\Controller;
use Drupal\Core\Controller\ControllerBase;

class CustomModuleController extends ControllerBase {

  /**
   * Page callback example.
   */
  public function add() {

   $type_name = 'page';


  $type = node_type_load($type_name); // replace this with the node type in which we need to display the form for
        $node = $this->entityManager()->getStorage('node')->create(array(
          'type' => $type->id(),
        ));
        $node_create_form = $this->entityFormBuilder()->getForm($node); 

    return $node_create_form;


  }

}

custom_module.routing.yml:

custom_module.add:
  path: 'custom_module/add'
  defaults:
   _controller: '\Drupal\custom_module\Controller\CustomModuleController::add'
   _title: 'Temporary title'
  requirements:
   _permission: 'true' 

Далее навешиваю ajax на элемент формы

advertisements_auto.module:

function custom_module_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
//....................
 form['field_select']['widget']['#ajax'] = array(
     'callback' => 'Drupal\custom_module\NodeFormAjaxSubmit::ajaxFieldSelectCallback',
    'wrapper' => 'wrapper_name',
    //'method' => 'replace',
    //'effect' => 'fade',       

    'progress' => array(
    'type' => 'throbber',
    'message' => NULL,
  ),

 );
//....................
}

Так вот, если вызывать форму по node/add/node_type то ajax работает, код приходит во wrapper_name.
А если по custom_module/add то в консоли ошибка:

AjaxError:
AJAX HTTP-запрос неожиданно завершён.
Следует отладочная информация.
Путь: /custom_module/add?ajax_form=1
Текст Состояния: error
Текст Ответа:
ReadyState: 0

/custom_module/add?ajax_form=1
[{"command":"add_css","data":"\u003Clink rel=\u0022stylesheet\u0022 href=\u0022\/core\/themes\/bartik\/css\/components\/messages.css?p4i771\u0022 media=\u0022all\u0022 \/\u003E\n"},{"command":"insert","method":"prepend","selector":null,"data":" \n \u003Cdiv class=\u0022messages__wrapper layout-container\u0022\u003E\n \u003Cdiv role=\u0022contentinfo\u0022 aria-label=\u0022\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435\u0022 class=\u0022messages messages--error\u0022\u003E\n \u003Cdiv role=\u0022alert\u0022\u003E\n \u003Ch2 class=\u0022visually-hidden\u0022\u003E\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435\u003C\/h2\u003E\n \u041d\u0435\u0443\u0441\u0442\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 (2 \u041c\u0411), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.\n \u003C\/div\u003E\n \u003C\/div\u003E\n \n \u003C\/div\u003E\n ","settings":null}]

'Неустранимые ошибки. Размер загружаемого файла вероятно превысил максимально допустимый размер файла (2 МБ), который поддерживает данный сервер'

В форме нет файловых полей.

Могли бы Вы проверить?

Комментарий оставлен 21.02.2018 - 20:33

создайте об этом другой вопрос, может кто-нибудь поможет

Комментарий оставлен 23.02.2018 - 15:44

Думаю что не стОит, как и переходить на D8. Есть еще и такой баг: на форме не работает ajax если присутствует required поле типа number. И похоже что на drupal.org о ней знают уже пять лет (ПЯТЬ ЛЕТ, Карл). если Вы работаете на D8 то это по моему чудо. обновлюсь лет через пять, посмотрю что да как......

Комментарий оставлен 25.02.2018 - 06:18

Уже перешёл и не жалею. Поначалу было трудно, но а как иначе

Комментарий оставлен 26.02.2018 - 11:48

Ответы