Drupal behaviors.
14 ноября 2022 в 11:34
Привет Сообщество.
Это слишком много, чтобы просить примеры кода о: Drupal behaviors a way to attach JavaScript functionality.
С переменными, выполненными с помощью php из/в javascript.
Если кто-то может поделиться конкретными случаями, чтобы понять, как это работает.
Go to accepted answer
- Блог
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
Напишите вопрос на английском, пожалуйста, через переводчик совсем не понятно
Hello Community. It's too much to ask for code examples about: Drupal behaviors a way to attach JavaScript functionality. With variables executed with php from/to javascript. If someone can share specific cases to understand how it works. Thank you very much.
Спасибо.
Я извиняюсь но есть у кого-то рабочий пример как из hook_form_alter передать переменную в drupal behaviors?
Спасибо.
Через drupalSettings.
Например в php пишем
<?php
$form['#attached']['drupalSettings']['lol'] = 'kek';
?>
А в js:
Спасибо за ответ.
Но, мне нужно переменная.
Ваш вариант только покажет кек
Мне нужно понять как передать $кек, что изменится.
Спасибо большое
<?php
$form['#attached']['drupalSettings']['lol'] = $kek;
?>
Спасибо.
$form['#attached']['drupalSettings']['lol'] = $kek;
?>
Здесь я понимаю не надо module name?
Вы поставили без, как правильно?
* Implements hook_form_alter().
*/
function <YOUR_MODULE_NAME>_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id){
// If your library is intended to be used on specific form
// check for it using the $form_id argument against your
// form id which in most cases is returned by the ::getFormId()
// method of your form.
if ($form_id !== '<YOUR_FORM_ID'>) {
// This is called eager return, is a technique
// to avoid code nesting to improve code readability.
return;
}
// To attach Blazy for example.
$form['#attached']['library'][] = 'blazy/load';
// To attach a library from a theme.
$form['#attached']['library'][] = '<YOUR_THEME_NAME>/<library_name>';
// To attach a library from a module.
$form['#attached']['library'][] = '<YOUR_MODULE_NAME>/<library_name>';
// Pass even variable from this function to JS settings
$form['#attached']['drupalSettings']['<YOUR_MODULE_NAME>']['variable'] = 'PHP Value To JS';
return $form;
}
Везде разные ответы
Спасибо
drupalSettings - это просто объект в javascript. Имя модуля добавляют только с той целью, чтобы ключи сеттингов не пересекались, а то ведь случайно можно написать такой ключ, который перепишет настройки другого модуля и что-нибудь сломается. То есть имя модуля желательно конечно добавить, но
это не является обязательным.
Понял.
Спасибо большое за ваше терпение и время.
Привет.
Проверил все возможные варианты.
Но динамическая переменная не передаётся в js.
Объясню:
Всё что загружается с drupal-а работает, скажем user name, node id, user email.
Но переменную с reference field нет.
У меня reference field типа content, и хочу передать имя в js. Но не получается, первая загрузка показывает null. И всегда только null. Данные передаю через field->value. И они передаётся, передал через messenger drupal-а и загрузка идёт в переменную. Только вот в js нет.
В чём фишка?
Что не дочитал.
Спасибо.
Это потому что в Entity reference полях нет свойства value. Если нужно название сущности, на которую ссылаются, то обращаться нужно так:
<?php
$node->field_ololo->entity->label();
?>
Добрый.
Я извиняюсь, не хорошо объяснил.
У меня есть поле entity reference, загружаю её через ajax, чтобы получить ID сущность при выборе. Так имею массив, и из этого массива загружаю те поля что мне нужны для логики в форме. Поля загружаются с теми данными с entity reference. Выбераю любую сущность из списка и загрузка работает. Но одно поле string мне нужно её value передать в js. Вот здесь и проблема оно не загружается в js. Ваш пример работает только с переменными что имеет что-то в value а не динамически.
Что-то мне не хватает добавлять.
Вся информация идёт через hook_form_alter.
Если есть идея подскажите пожалуйста.
Спасибо.
Не видя код, очень тяжело что-то посоветовать.
<?php
use Drupal\Component\Utility\Html;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\CssCommand;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Ajax\ReplaceCommand;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldFilteredMarkup;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\Checkboxes;
use Drupal\Core\Render\Markup;
use Drupal\Core\Entity\EntityFormInterface;
use Drupal\Core\Url;
use Drupal\forms_steps\Entity\Workflow;
use Drupal\node\Entity\Node;
use Drupal\user\Entity\User;
use Symfony\Component\HttpFoundation\RedirectResponse;
/*
* Implements hook_form_alter().
*/
function buangh_test_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// new else other example
if (isset($form["field_test2"])) {
$form['field_test2']['#prefix'] = '<div id="field-test2-wrapper">';
$form['field_test2']["#suffix"] = "</div";
$form['field_test2']['widget']['#ajax'] = [
'callback' => 'buangh_test_autofill_date',
'event' => 'autocomple change',
'wrapper' => 'field-test2-wrapper',
];
$eid = $form_state->getValue('field_test2')[0]['target_id'];
$event = Node::load($eid);
$hidrometro = $event->field_hidrometro->value;
// To attach a library from a module.
$form['#attached']['library'][] = 'buangh_test/buanghTest';
// Pass even variable from this function to JS settings
$form['#attached']['drupalSettings']['variable_test'] = $hidrometro;
/**
* Ajax handler.
*/
function buangh_test_autofill_date (array &$form, FormStateInterface $form_state) {
return $form['field_test2'];
}
-----
buangh_test_js.js
/**
* @file
*/
(function ($, Drupal, drupalSettings) {
Drupal.behaviors.buanghTest = {
attach: function (context, settings) {
console.log(drupalSettings.variable_test);
}
};
})(jQuery, Drupal, drupalSettings);
-----
buangh_test.libraries.yml
buanghTest:
version: 1.x
js:
js/buangh_test_js.js: {}
dependencies:
- core/jquery
- core/once
- core/drupal
- core/drupalSettings
- core/drupal.form
Всё понятно, вы сеттинги аттачите к элементу формы, а возвращаете элемент без сеттингов.
Нужно
<?php
// Pass even variable from this function to JS settings
$form['#attached']['drupalSettings']['variable_test'] = $hidrometro;
?>
заменить на
<?php
// Pass even variable from this function to JS settings
$form['field_test2']['#attached']['drupalSettings']['variable_test'] = $hidrometro;
?>
Thank you very much.
Works.
Добрый.
Спасибо большое.
Сейчас проверю.
Хорошого дня вам.