Как отправить форму Zend с помощью Dojo и XHR, нажав Enter

Во-первых, что я использую:
я использую Dojo 1.6 и Zend Framework 1.11.5 - и нет, я не буду обновляться сейчас.

Во-вторых, моя ситуация:
у меня есть Zend_Form с включенной поддержкой Zend_Dojo. Я создаю формулу в своем контроллере действий и передаю ее представлению, которое отлично отображается. Формула вызывает функцию javascript, которая помещает переменные в URL-адрес, который используется для обновления панели содержимого.

В-третьих, моя проблема:
Формула не отправляется при нажатии [ENTER], только при нажатии кнопки.

В-четвертых, мой код:
Комментарии не включены, код стал проще и приятнее для чтения. Некоторые части отсутствуют.

Вот часть моей Zend_Form/_Dojo:

/application/forms/CommunityDeviceFinderForm.php

class CommunityDeviceFinderForm extends Zend_Form {

public function init(){
    Zend_Dojo::enableForm($this);

    $this->setMethod('post');
    $this->setAttribs(array(
        'name' => 'findDeviceForm'
    ));
}

public function createElements(){
    // some $this->addElement here

    $this->addElement(
        'Button',
        'submitDeviceSearch',
        array(
            'label'    => tr_('Search'),
            'required' => false,
            'ignore'   => true,
            'onClick'  => 'findDevice()'  // the called javascript function
        )
    );

Я оставляю свой контроллер. В любом случае это просто создание формулы и предоставление ее представлению (как «$deviceSearchForm»).

Сценарий моего просмотра. Также сильно сокращено:

/application/modules/default/views/scripts/default/de/community/device-finder.phtml

<script>
    function findDevice(){
        var formular = dijit.byId('<?=$this->deviceSearchForm->getAttrib('name')?>');

        if(formular.isValid()){
            // collecting form vars and creating an URL
            // then refreshing a content pane with the created URL
        } else {
            // error shown
        }
    }
</script>

<!-- some html -->

        <?=$this->deviceSearchForm?>

<!-- some more html -->

Я предполагаю - или знаю - проблема в том, что "Кнопка" не "ОтправитьКнопку". Но я не хочу обновлять страницу. Как подключить что-то вроде onSubmit к формуле? Прослушивание события и предотвращение действий по умолчанию. Вместо вызова моей js-функции findDevice().

Я не могу слушать сам ход клавиш, потому что рядом опять почти точная формула, которая будет работать на своих.

Мне бы хотелось что-то вроде: Добавление имени атрибута «onSubmit» в массив формульных атрибутов, который ссылается на js-функцию findDevice().

И извините за мой плохой английский :(

Большое спасибо!
-Филипп


person Philipp Gächter    schedule 23.05.2013    source источник
comment
Даже если вы можете получить событие отправки без кнопки отправки, у вас все равно есть проблема. Некоторые браузеры (один из них — Safari) не разрешают отправку событий без действительной кнопки отправки в вашей форме.   -  person g00glen00b    schedule 24.05.2013
comment
Спасибо! Хорошо, поэтому я заменяю кнопку кнопкой отправки — и это нормально, если я могу предотвратить обновление страницы событием отправки. Вместо этого он должен вызывать функцию findDevice().   -  person Philipp Gächter    schedule 24.05.2013


Ответы (2)


Попробуйте установить событие onsubmit для вашей формы следующим образом:

$this->setAttribs(array(
    'name' => 'findDeviceForm',
    'onSubmit' => 'findDevice(); return false;'
));

Затем ваша функция findDevice() вызывается при отправке и "return false;" часть предотвращает фактическое обновление отправки/страницы.

person Benedikt Langer    schedule 24.05.2013

Решение было найдено с моим другом - ответ выше. Теперь это полный код.

Добавьте "findDevice(); return false;" как "onSubmit" к атрибутам формулы Zend. Затем вызывается функция findDevice(). «Возвратить ложь»; мешает ему делать обычные вещи, такие как обновление.

Кроме того, больше нет необходимости перезаписывать событие onClick кнопки отправки.

Итак, вот код. Сценарий просмотра остался нетронутым.

/application/forms/CommunityDeviceFinderForm.php

class CommunityDeviceFinderForm extends Zend_Form {

    public function init(){
        Zend_Dojo::enableForm($this);

        $this->setMethod('get')
             ->setAttribs(array('name'     => 'findDeviceForm',
                                'onSubmit' => 'findDevice(); return false;'));
    }

    public function createElements(){

        // [...]

        $this->addElement(
            'SubmitButton',
            'submitDeviceSearch',
            array('label'    => tr_('Search'),
                  'required' => false,
                  'ignore'   => true));

        // [...]
    }
}

Спасибо за вашу помощь!

person Philipp Gächter    schedule 24.05.2013