Zend-форма во всплывающем окне (fancybox, lightbox ....) - PullRequest
2 голосов
/ 08 апреля 2011

Я разрабатываю веб-приложение с помощью 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 ]

2 голосов
/ 08 апреля 2011

Я бы предложил внедрить проверку AJAX. Это позволило бы проверить форму перед ее отправкой. ZendCasts имеет хороший учебник о том, как это сделать: http://www.zendcasts.com/ajaxify-your-zend_form-validation-with-jquery/2010/04/

0 голосов
/ 17 апреля 2011

Я нашел «вероятно, не самое красивое» рабочее решение, это действительно использовать ajax, как упомянуто в предыдущем Zendcast для проверки, чтобы остановить реальную проверку (предотвращение ошибок), обработать данные, вернуть результат и, если все в порядке, перезапустить его..

0 голосов
/ 09 апреля 2011

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

...