Вызов JS-функции из модуля Drupal?

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

Аватар пользователя Lord of Cats Lord of Cats 13 апреля 2018 в 13:14

Добрый день.

Подскажите, пожалуйста, можно ли вызвать JS-функцию из модуля Drupal?

Пример ниже.

В модуле Drupal прописано:

<?php
/**
 * Реализация hook_init()
 */
function mymodule_init() {
    
drupal_add_js(drupal_get_path('module''mymodule') . '/js/script.js');
}
?>

В файле script.js например так:

function myjsfunc_1() {
    console.log('run myjsfunc_1');
}

Или так:

jQuery.fn.myjsfunc_2 = function() {
    console.log('run myjsfunc_2');
};

Можно ли вызвать JS-функцию из hook_form?

<?php
function my_form($form, &$form_state) {
    
// Можно ли здесь вызвать JS-функцию???
    
return $form;
}
?>

Лучший ответ

Аватар пользователя Lord of Cats Lord of Cats 18 апреля 2018 в 13:37

Решил следующим образом:

function selectedMaxOption() {
    var selector = 'select';
    var elements = [];
    jQuery(selector + ' option').each(function () {
         var elem = jQuery(this).val();
         elements.push(elem);
    });
    var max = Math.max.apply(Math, elements);
    jQuery(selector).val(max);
    jQuery(document).unbind('ajaxSuccess', selectedMaxOption);
}
function eventChangeInput() {
    var selector = 'input';
        jQuery(selector).live('change', function () {
            jQuery(document).bind('ajaxSuccess', selectedMaxOption);
        });
    });
}
jQuery(document).ready(function () {
    eventChangeInput();
});

Комментарии

Аватар пользователя Lord of Cats Lord of Cats 13 апреля 2018 в 16:25

Прикольно, но не совсем то что мне нужно. Здесь мы вызываем функцию в каком-то callback'е. Проблема в том что у меня на элемент формы уже навешен другой callback и мне хотелось бы вызвать функцию именно в hook_form. Судя по статье, мне проще было бы написать callback с использованием ajax_command_invoke().

Аватар пользователя bumble bumble 13 апреля 2018 в 16:32

Ну, во первых, это не hook_form. Это просто процедура для формирования формы.

Во-вторых, очень вероятно, что Вам вообще не нужны AJAX-команды, достаточно просто модифицировать форму (а то и вовсе, обойтись только JS-скриптом).

И в-третьих, Вам нужно просто написать на листочке алгоритм, который Вы хотите реализовать. Опишите все что должно происходить, обоснуйте каждый пункт подходя к нему с критикой и Вам должна нарисоваться картина нужной реализации.

Аватар пользователя Lord of Cats Lord of Cats 18 апреля 2018 в 13:37

Решил следующим образом:

function selectedMaxOption() {
    var selector = 'select';
    var elements = [];
    jQuery(selector + ' option').each(function () {
         var elem = jQuery(this).val();
         elements.push(elem);
    });
    var max = Math.max.apply(Math, elements);
    jQuery(selector).val(max);
    jQuery(document).unbind('ajaxSuccess', selectedMaxOption);
}
function eventChangeInput() {
    var selector = 'input';
        jQuery(selector).live('change', function () {
            jQuery(document).bind('ajaxSuccess', selectedMaxOption);
        });
    });
}
jQuery(document).ready(function () {
    eventChangeInput();
});
Аватар пользователя ivnish ivnish 18 апреля 2018 в 13:54

Посмотрите стандарты кодирования js drupal. Нужно оформить код по стандартам и через бихейвиоры, иначе рано или поздно он сломает другой код в другом месте. Постоянно с таким сталкиваюсь