Привет Сообщество.
Это слишком много, чтобы просить примеры кода о: Drupal behaviors a way to attach JavaScript functionality.
С переменными, выполненными с помощью php из/в javascript.
Если кто-то может поделиться конкретными случаями, чтобы понять, как это работает.
Комментарии
Напишите вопрос на английском, пожалуйста, через переводчик совсем не понятно
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.
Добрый.
Спасибо большое.
Сейчас проверю.
Хорошого дня вам.