Drupal behaviors.

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

Аватар пользователя ady1503 ady1503 14 ноября 2022 в 11:34

Привет Сообщество.

Это слишком много, чтобы просить примеры кода о: Drupal behaviors a way to attach JavaScript functionality.

С переменными, выполненными с помощью php из/в javascript.

Если кто-то может поделиться конкретными случаями, чтобы понять, как это работает.

Лучший ответ

Аватар пользователя gun_dose gun_dose 24 ноября 2022 в 9:37

Всё понятно, вы сеттинги аттачите к элементу формы, а возвращаете элемент без сеттингов.
Нужно

<?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;
?>

Комментарии

Аватар пользователя ady1503 ady1503 14 ноября 2022 в 12:46

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.

Спасибо.

Аватар пользователя ady1503 ady1503 22 ноября 2022 в 11:30

Я извиняюсь но есть у кого-то рабочий пример как из hook_form_alter передать переменную в drupal behaviors?

Спасибо.

Аватар пользователя ady1503 ady1503 22 ноября 2022 в 12:53

Спасибо за ответ.

Но, мне нужно переменная.

Ваш вариант только покажет кек

Мне нужно понять как передать $кек, что изменится.

Спасибо большое

Аватар пользователя ady1503 ady1503 22 ноября 2022 в 13:50

Спасибо.

$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;
}

Везде разные ответы

Спасибо

Аватар пользователя gun_dose gun_dose 22 ноября 2022 в 14:09

drupalSettings - это просто объект в javascript. Имя модуля добавляют только с той целью, чтобы ключи сеттингов не пересекались, а то ведь случайно можно написать такой ключ, который перепишет настройки другого модуля и что-нибудь сломается. То есть имя модуля желательно конечно добавить, но
это не является обязательным.

Аватар пользователя ady1503 ady1503 23 ноября 2022 в 1:44

Привет.

Проверил все возможные варианты.

Но динамическая переменная не передаётся в js.

Объясню:

Всё что загружается с drupal-а работает, скажем user name, node id, user email.

Но переменную с reference field нет.
У меня reference field типа content, и хочу передать имя в js. Но не получается, первая загрузка показывает null. И всегда только null. Данные передаю через field->value. И они передаётся, передал через messenger drupal-а и загрузка идёт в переменную. Только вот в js нет.

В чём фишка?

Что не дочитал.

Спасибо.

Аватар пользователя gun_dose gun_dose 23 ноября 2022 в 9:54

Это потому что в Entity reference полях нет свойства value. Если нужно название сущности, на которую ссылаются, то обращаться нужно так:

<?php
$node
->field_ololo->entity->label();
?>
Аватар пользователя ady1503 ady1503 23 ноября 2022 в 11:10

Добрый.

Я извиняюсь, не хорошо объяснил.

У меня есть поле entity reference, загружаю её через ajax, чтобы получить ID сущность при выборе. Так имею массив, и из этого массива загружаю те поля что мне нужны для логики в форме. Поля загружаются с теми данными с entity reference. Выбераю любую сущность из списка и загрузка работает. Но одно поле string мне нужно её value передать в js. Вот здесь и проблема оно не загружается в js. Ваш пример работает только с переменными что имеет что-то в value а не динамически.

Что-то мне не хватает добавлять.

Вся информация идёт через hook_form_alter.

Если есть идея подскажите пожалуйста.

Спасибо.

Аватар пользователя ady1503 ady1503 24 ноября 2022 в 1:14
buangh_test.module

<?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

Аватар пользователя gun_dose gun_dose 24 ноября 2022 в 9:37

Всё понятно, вы сеттинги аттачите к элементу формы, а возвращаете элемент без сеттингов.
Нужно

<?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;
?>