Серверная часть Magento, захват событий onclick для разных элементов

У меня есть рабочий бэкэнд-модуль с различными формами для управления несколькими разными таблицами. В одной из форм у меня есть группа переключателей (элемент radios в Magento). Вот фрагмент кода для этой радиогруппы:

//radio group
$fieldset->addField('radio_group', 'radios', array(
        'label'     => Mage::helper('banners')->__('Select campaign type'),
        'name'      => 'title',
        'onclick'   => '',
        'onchange'  => '',
        'value'     => '1',
        'values'    => array(
                        array('value'=>'1','label'=>'Imagen'),
                        array('value'=>'2','label'=>'HTML'),
                        array('value'=>'3','label'=>'Producto'),
                        ),
        'disabled'  => false,
        'readonly'  => false,
        'tabindex'  => 3
));

Я никак не могу найти, как управлять событиями onclik и onchange. Куда мне нужно добавить код? Действия, которые необходимо выполнить, просты, я просто включу/отключу другие элементы управления на той же странице в соответствии с выбранным переключателем.

Любое предложение, пример кода, учебник? Я много погуглил безуспешно, я нашел много примеров, но все они ссылались на то, как настроить новую форму администратора, что я уже делал не один, а несколько раз.


person Yaroslav    schedule 08.11.2012    source источник


Ответы (2)


Один из способов обойти эту проблему — добавить update layout.xml в ваш модуль (или local.xml).

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

Расположение Javascript: /js/your_js_file.js

<adminhtml_xxx_yyy>
    <reference name="head">
        <action method="addJs"><script>your_js_file.js</script></action>
    </reference>
</adminhtml_xxx_yyy>

or

Расположение Javascript: /skin/adminhtml/default/default/your_js_file.js

<adminhtml_xxx_yyy>
    <reference name="head">
        <action method="addItem"><type>skin_js</type><name>your_js_file.js</name></action>
    </reference>
</adminhtml_xxx_yyy>

Добавьте имя класса css к каждому переключателю

$fieldset->addField('radio_group', 'radios', array(
   ......
   'class'     => 'campaign_type',
   ....
));

В your_js_file.js ( http://fiddle.jshell.net/hX2u3/ )

$$('.campaign_type').each(function(curInput) {
   Event.observe(curInput, 'click', function() {
        alert('some click logic goes here');
    });
   Event.observe(curInput, 'change', function() {
        alert('some change logic goes here');
    });
});​
person Renon Stewart    schedule 08.11.2012
comment
Проголосовал за то, что он более удобен для MVC (и современного JS), чем встроенный JS. - person Jscti; 09.11.2012
comment
ок... проверю оба варианта завтра утром в офисе, у меня дома нет Magento - person Yaroslav; 09.11.2012
comment
Хммм... не работает... У меня уже был файл banners.xml в папке \design\adminhtml\default\default\template\banners. Это тот файл макета, о котором вы говорите? Затем я добавил 1-й фрагмент кода, заменив <adminhtml_xxx_yyy> на <adminhtml_banners_edit>, правильно ли это? Затем файл js я добавляю в папку magento\js\banner. У меня есть сомнения, следует ли заменить ('someForm') именем моей формы? Dts_Banners_Block_Adminhtml_Banners_Edit_Form например? Или просто Form или оставить так? схожу с ума от этого, не могу продолжать работу без решения этой проблемы - person Yaroslav; 09.11.2012
comment
Просмотр исходного кода страницы... включен ли файл js? Если он включен, откройте его в браузере, загружается ли содержимое файла? - person Renon Stewart; 09.11.2012
comment
Нет, не включен в исходный код страницы. - person Yaroslav; 09.11.2012
comment
Это кажется неверным ‹adminhtml_xxx_yyy›... какой у вас URL (после .com) - person Renon Stewart; 09.11.2012
comment
После этого SO answer удалось включить js в исходный код страницы. Но теперь не отвечает на клик. - person Yaroslav; 09.11.2012
comment
Получил работу с помощью jQuery благодаря моему партнеру, сидящему рядом со мной. Не примет в качестве ответа, но добавит +1, как указано в правильном направлении. - person Yaroslav; 09.11.2012
comment
Моя концепция верна, вам просто нужно было закодировать ее способом записи, используя прототип, но я думаю, что в следующий раз я применю ту же концепцию и узнаю, чей вопрос пропустить. Было бы неплохо, если бы вы обновили сообщение своим ответом, чтобы следующему человеку, у которого возникнет эта проблема, также пришлось бы потратить 2 дня, пытаясь понять это. - person Renon Stewart; 09.11.2012
comment
Взгляните на мой обновленный код выше (который объясняет разницу между двумя методами). Должны ли вы помещать js для конкретного модуля в глобальную папку /js, которая содержит только библиотеки??? Так был ли мой код неправильным, или вы просто не нашли время, чтобы посмотреть, куда вы должны поместить свой js? - person Renon Stewart; 10.11.2012

$fieldset->addField('use_color_filter', 'select', array(
            'label'     => Mage::helper('gtfilter')->__('Usar filtro de cores'),
            'class'     => 'required-entry',
            'required'  => true,
            'name'      => 'use_color_filter',
            'onclick' => "javascript: alert('a');",
            'onchange' => "",
            'value'  => Mage::registry("use_color_filter"),
            'values' => array("0" => "Não", "1" => "Sim"),
            'after_element_html' => '<small style="color : red; font-weight : bold;" >Requer que o módulo de cores esteja instalado! Lembrando que o atributo de cores deve estar habilitado para buscas avan�adas! </small>',
            'tabindex' => 1
    ));

Я пробовал это и хорошо работает для меня.

person Guerra    schedule 08.11.2012
comment
Это работает только для выбора типа ввода, а не для радио, как указано выше. - person Renon Stewart; 08.11.2012