Форма Zend во всплывающем окне (fancybox, lightbox....)
Я разрабатываю веб-приложение с помощью Zend, и у меня закончились идеи для проблемы, с которой я столкнулся. В нескольких словах, я пытаюсь иметь контактную форму во всплывающем окне (Fancybox, лайтбокс, colorbox или что-то еще...). Все это работает отлично, в том смысле, что оно отображает контактную форму во всплывающем окне и позволяет отправлять электронные письма. Тем не менее, когда бы ни возникали ошибки (незаполненный ввод или заполнение неправильно), я не мог отобразить эти ошибки во всплывающем окне (оно фактически перенаправляет меня обратно в форму на обычном экране (представление + макет), чтобы показать ошибки,
Возможно, это возможно, но теперь я подумал, что, возможно, мне будет проще перенести мое сообщение об ошибке в новое всплывающее окно (страница контакта, заполненная ненадлежащим образом, приведет к появлению страницы с ошибкой...). Я думаю, что эта альтернатива может выглядеть круто, но у меня есть реальные проблемы с этим. Теперь мой реальный вопрос: можем ли мы действительно создать форму во всплывающем окне, используя Facybox (Lighbox или любой другой на самом деле... просто хочу мое всплывающее окно) и Zend? Есть ли гуру где-нибудь?? Большое спасибо, вот код:
ссылка например:
<a class="popLink" href=" <?php echo $this->url(array('module'=>'default', 'controller'=>'contact', 'action'=>'sendmail')).'?ProID='.$this->proProfil->getProID(); ?>">Contact</a>
Действие:
public function sendmailAction()
{
$this->_helper->layout()->setLayout('blank');
$request = $this->getRequest();
$proID = $this->_getParam("ProID");
$professionalsList = new Model_DirPro();
$proName = $professionalsList->getProInfo($proID);
$translate = Zend_Registry::get('translate');
Zend_Validate_Abstract::setDefaultTranslator($translate);
Zend_Form::setDefaultTranslator($translate);
$contactform = new Form_ContactForm();
$contactform->setTranslator($translate);
$contactform->setAttrib('id', 'contact');
$this->view->contactform = $contactform;
$this->view->proName = $proName;
if ($request->isPost()){
if ($contactform->isValid($this->_getAllParams())){
$mailSubject = $contactform->getValue('mailsubject');
if ($contactform->mailattcht->isUploaded()) {
$contactform->mailattcht->receive();
//etc....
форма:
class Form_ContactForm extends Zend_Form
{
public function init ()
{
$this->setName("email");
$this->setMethod('post');
$this->addElement('text', 'mailsubject',
array('filters' => array('StringTrim'),
'validators' => array(), 'required' => true, 'label' => 'Subject:'));
$mailattcht = new Zend_Form_Element_File('mailattcht');
$mailattcht->setLabel('Attach File:')->setDestination(APPLICATION_PATH.'/../public/mails');
$mailattcht->addValidator('Count', false, 1);
$mailattcht->addValidator('Size', false, 8000000);
$mailattcht->addValidator('Extension', false,
'jpg,png,gif,ppt,pptx,doc,docx,xls,xslx,pdf');
$this->addElement($mailattcht, 'mailattcht');
$this->addElement('textarea', 'mailbody',
array('filters' => array('StringTrim'),
'validators' => array(), 'required' => true, 'label' => 'Body:'));
$this->addElement('submit', 'send',
array('required' => false, 'ignore' => true, 'label' => 'Send'));
$this->addElement('hidden', 'return', array(
'value' => Zend_Controller_Front::getInstance()->getRequest()->getRequestUri(),
));
$this->setAttrib('enctype', 'multipart/form-data');
}
}
3 ответа
Я бы предложил реализовать проверку AJAX. Это позволит проверить форму до ее отправки. ZendCasts имеет хороший учебник о том, как это сделать: http://www.zendcasts.com/ajaxify-your-zend_form-validation-with-jquery/2010/04/
Я нашел "вероятно, не самое красивое" рабочее решение, это действительно использовать ajax, как упоминалось в предыдущем Zendcast для проверки, чтобы остановить реальную проверку (предотвращение ошибок), обработать данные, вернуть результат и, если все в порядке, перезапустить его.
Ajax-запросы обрабатываются с помощью помощника действий contextSwitch. Вы можете указать различные контексты, которые нужно обработать действием (xml или json) в методе init контроллера следующим образом:
public function init()
{
$this->_helper->contextSwitch()
->addActionContext('send-mail', 'json')
->initContext()
;
}
URL-адрес запроса должен содержать "format=json", добавленный к строке запроса. Это выполнит действие и отправит ответ в формате json. Поведение JSON по умолчанию заключается в извлечении всех открытых свойств представления и их кодировании в виде JSON. Более подробную информацию можно найти здесь http://framework.zend.com/manual/en/zend.controller.actionhelpers.html