Zend_Form - несколько форм на одной странице

Имея несколько форм на одной странице, когда я отправляю одну из них, как я могу узнать, какая из них была отправлена?

Я подумал о создании уникальных идентификаторов для каждого из и сохранении их как скрытых полей и в сеансе пользователя - хотя это решение, проблема в том, что нет подходящего места для удаления старых идентификаторов из сеанса.

Любые лучшие идеи, как решить эту проблему?

Заранее спасибо!


person smoove    schedule 23.07.2009    source источник


Ответы (2)


Прежде всего: рассматривали ли вы возможность отправки двух форм в два разных действия? Таким образом, вы можете обрабатывать каждую форму отдельно в каждом действии. Это должно быть «лучшей практикой», если вы используете компонент Zend MVC.

Другой вариант — проверить значение кнопки отправки, которая будет включена в запрос, например.

<input type="submit" name="save" value="form1" />
// in PHP:
// $_POST["save"] will contain "form1"

<input type="submit" name="save" value="form2" />
// in PHP:
// $_POST["save"] will contain "form2"

Будьте осторожны, так как атрибут value будет отображаться как метка кнопки.

Итак, возможно, вы хотите различать формы по разным именам кнопок отправки:

<input type="submit" name="save-form1" value="Submit" />
// in PHP:
// $_POST["save-form1"] will contain "Submit"

<input type="submit" name="save-form2" value="Submit" />
// in PHP:
// $_POST["save-form2"] will contain "Submit"

ИЗМЕНИТЬ:

Во время диалога комментариев между ОП и мной возможным решением кажется следующее:

class My_Form_Base extends Zend_Form
{
    private static $_instanceCounter = 0;

    public function __construct($options = null)
    {
        parent:: __construct($options);

        self::$_instanceCounter++;
        $this->addElement('hidden', 'form-id', 
            sprintf('form-%s-instance-%d', $this->_getFormType(), self::$_instanceCounter);
    }

    protected _getFormType()
    {
        return get_class($this);
    }
}

class My_Form_Type1 extends My_Form_Base
{
    public function init()
    {
        // more form initialization
    }
}

class My_Form_Type2 extends My_Form_Base
{
    public function init()
    {
        // more form initialization
    }
}
person Stefan Gehrig    schedule 23.07.2009
comment
Два действия: не могу этого сделать, потому что я хочу отображать форму + ошибки на той же странице, если она не проверяется. Кнопка «Отправить»: на одной странице может быть несколько экземпляров одной и той же формы. Кроме того, я не хочу передавать параметр в форму при создании. это было бы слишком просто ;) - person smoove; 23.07.2009
comment
Я думаю, вы должны более подробно описать, чего вы пытаетесь достичь. Вы хотите сгенерировать страницу с несколькими формами (некоторые из них являются экземплярами одной и той же формы), вы не хотите добавлять что-то особенное в каждую форму, но, тем не менее, хотите иметь возможность различать формы при отправке? - person Stefan Gehrig; 23.07.2009
comment
И я не понимаю, почему публикация в разных действиях не будет решением... Вы можете визуализировать все, что хотите, из каждого из этих действий. - person Stefan Gehrig; 23.07.2009
comment
С. Геринг: 1-й комментарий: это именно то, что я хочу. 2-й комментарий: Представьте себе следующее: количество форм на этой странице не определено, может быть одна, может быть 50, поэтому я никак не могу дать каждой отдельное действие. - person smoove; 23.07.2009
comment
Я прошу общее решение этой проблемы, а не то, которое работает на данный момент. - person smoove; 23.07.2009
comment
Ах, ладно, хотя мы говорим о двух формах. 50 форм должны быть чем-то другим. Можете ли вы объяснить, почему добавление скрытого поля с каким-либо идентификатором формы (например, form-1-instance-2) не является решением? - person Stefan Gehrig; 23.07.2009
comment
это было бы отличным решением, но как мне автоматизировать часть instance-2? :D - person smoove; 23.07.2009
comment
Хотя я мог бы реализовать переменную статического счетчика в Zend_Form, это было бы довольно рискованно, представьте себе такую ​​ситуацию: у меня есть список из 50 записей, каждая из которых имеет свою форму. страница загружается, каждая форма получает свой идентификатор. теперь, прежде чем я отправлю одну из форм, записи меняются, например, одна запись удаляется (это означает, что где-то посередине на одну форму меньше), теперь идентификаторы больше не совпадают. - person smoove; 23.07.2009
comment
Я только что отредактировал свой ответ, но ваше требование привязки форм к конкретным экземплярам модели делает решение статического счетчика, которое я добавил выше, устаревшим. - person Stefan Gehrig; 23.07.2009
comment
Не могли бы вы просто заменить счетчик экземпляров идентификатором объекта базовой модели при заполнении формы значениями из вашей модели? Как вы передаете объект модели в свои формы? - person Stefan Gehrig; 23.07.2009
comment
Да, у меня тоже была идея статического счетчика, но мне действительно нужно надежное решение. - person smoove; 23.07.2009
comment
в этом конкретном случае действительно нет модели, представьте себе формы как формы рекомендаций, где пользователь просто вводит адрес электронной почты, затем я добавляю скрытое поле с идентификатором, ссылающимся на запись. Но, как говорится, мне нужно общее решение, которое будет работать все время, совершенно независимо от того, какая форма у меня есть или какие данные в ней устанавливаются. - person smoove; 23.07.2009
comment
Я думаю, что это невозможно... Я попытаюсь выразить это так: вы пытаетесь соединить свою форму с некой сущностью, о которой вы ничего не знаете. Не существует даже общего базового контракта между сущностью и формой или общего предположения о сущности. Я бы сказал, что это невозможно сделать с требуемой общностью. - person Stefan Gehrig; 23.07.2009
comment
Спасибо за ваши усилия, если я когда-нибудь найду решение, я дам вам знать :) - person smoove; 23.07.2009

некоторые ошибки в вашем коде должны быть примерно такими:

class Application_Form_Idee_Base extends Zend_Form
{
    private static $_instanceCounter = 0;

    public function __construct($options = null)
    {
        parent::__construct($options);

        self::$_instanceCounter++;
        $this->addElement('hidden', 'form-id', array(
            'value' => sprintf('form-%s-instance-%s', $this->_getFormType(), self::$_instanceCounter))
        );
    }

    protected function _getFormType()
    {
        return get_class($this);
    }

}
person kurt    schedule 08.07.2011