Как перенаправить форму входа Zend в фанкбокс iframe с PHP (без JS) только при *** успешном *** входе - PullRequest
1 голос
/ 21 февраля 2012

Используя только PHP (т.е. без JS), как перенаправить форму Zend из fancybox iframe на родительскую страницу, только если форма была успешной? Например, я устанавливаю setAttrib ("target", "_ parent") в форме Zend, но это заставляет действие submit перенаправлять на iframe, а не на родительскую страницу. Я хочу, чтобы он возвращался на родительскую страницу только в случае неудачной отправки. Если вход в систему не был успешным, он остается на fancybox, если iframe успешно отображает сообщение об ошибке. Я использую Zend Framework. Вот некоторый код:

login.php

class Application_Form_Login extends Zend_Form
{

    public function init()
    {
        $this->setAction('/auth/login')
             ->setAttrib('id', 'login_form')
             ->setAttrib('target', '_parent')
             ->setName('login_form')
                     ->setMethod('post');

    ----->added all elements here
    }

}

loginAction (внутри authController.php)

    public function loginAction()
    {

        $request = $this->getRequest();
        $form = new Application_Form_Login();
        //$form->setAttrib('target','_parent');
        //$this->view->login_form = $form;

        if($request->isPost()){
            if($form->isValid($request->getPost())){
                $data = $form->getValues();

                if ($this->_processLogin($data)) {
                    // We're authenticated! Redirect to the home page
                    $auth = Zend_Auth::getInstance();
                    $id = $auth->getIdentity()->id;
                        //this is where I need some logic to redirect on parent page only if successful login 
                    $this->_redirect('/user/'.$id.'/home');  
                } else {
                    $form->setAttrib('target','_self');
                    $this->view->errorMessage = "Invalid credentials. Try again";
                    $form = new Application_Form_Login();
                    $this->view->login_form = $form;
                }         
            }else{
                    $form->setAttrib('target','_self');
                    $this->view->errorMessage = "Can't be empty. Please try again.";
                    $form = new Application_Form_Login();
                    $this->view->login_form = $form;
            }
        }else{
        }

        $this->view->login_form = $form;
    } 

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Я думаю, что вы не можете делать такие вещи.

В этом случае JavaScript будет ссылаться на родительскую страницу.На стороне сервера нет способа установить в заголовках эти инструкции.

Лучшее, что вы можете сделать, - это перенаправить страницу на другую с помощью инструкции javascript, ссылающейся на родительскую страницу.

ИспользованиеЦелевой атрибут он будет перенаправлять в любом случае.

Пример:

AuthController.php

public function loginAction() {
    // ...
    if(/* is password correct */) {
        //...
        // After a successfull login, just render the view
        $this->render('auth/redirect.phtml');
    }
    // ...
}

redirect.phtml

<!-- Redirect to the parent page, thus closing the fancybox -->
<script type="text/javascript">
    parent.window.location.href = '<?php echo $this->url(/* url params */) ?>';
</script>
0 голосов
/ 25 февраля 2012

Вот что я в итоге сделал:

<form id="login"> regular stuff here, elements, etc</form>



<script type="text/javascript">

$(document).ready(function() {

    $('#loginbtn').live('click',function(event){

        var em = $("#useremail").val();
        var pwd = $("#userpassword").val();

        $.ajax({
            type: "POST",
            dataType: 'json',
            url: "/auth/login",
            data: { email: em, password: pwd },
            success: function(result){
                if(result.msg == "success"){
                    window.location = "/user/" + result.id + "/home";
                }else{
                    $(".errormsg").html(result.msg);
                }
            },
            error: function(jqXHR, exception) {
                if (jqXHR.status === 0) {
                    alert('Not connect.\n Verify Network.');
                } else if (jqXHR.status == 404) {
                    alert('Requested page not found. [404]');
                } else if (jqXHR.status == 500) {
                    alert('Internal Server Error [500].');
                } else if (exception === 'parsererror') {
                    alert('Requested JSON parse failed.');
                } else if (exception === 'timeout') {
                    alert('Time out error.');
                } else if (exception === 'abort') {
                    alert('Ajax request aborted.');
                } else {
                    alert('Uncaught Error.\n' + jqXHR.responseText);
                }
            }       
        });

        return false;
    });
});

И в моем действии контроллера:

public function loginAction()

{

    $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(TRUE); // suppress auto-rendering and displaying a view
    $data['email'] = $_POST['email'];
    $data['password'] = $_POST['password'];

    if ($this->_processLogin($data)) {
            // We're authenticated!
        $auth = Zend_Auth::getInstance();
        $id = $auth->getIdentity()->id;
        echo Zend_Json::encode(array('msg' => 'success', 'id' => $id));
    } else {
                  $this->_helper->json(array('msg' => 'Invalid credentials. Try again'));
        } 

    }
...