Bir model haline, Zend_Controller_Action_Helper_FlashMessenger kullanan bir Zend_View_Helper_Action Widget üstlenmeden

3 Cevap php

Ben giriş gerektirir uygulamanın içeriğinin dışında herhangi bir eylem irade dahil edilebilir bir giriş aracı oluşturmak için çalıştık. Benim buradaki düşünce ben bir önceki oturum açma girişimi herhangi bir hata mesajları ile giriş kutusu render için KURU yaklaşım istedim oldu. Bunu etkinleştirmek için ben başarısız oturum açma-girişimi sonucu tasarrufu için FlashMessenger kullanılmaktadır. Widget da tarayıcı arka düğme kullanarak verileri birden çok kez gönderme sorunu önlemek için Post/Redirect/Get-pattern kullanır.

Şimdi, sorun ben daha ziyade bu yardımcı klonlarının isteği beri Zend_View_Helper_Action kullanın ve yoğun oldukça kaynaktır gönderme-döngü, başka çalıştırmak oluşturur olmaz olmasıdır. Yani, aşağıdaki kodu bakarak, bana öyle ki kod refactor konusunda bazı tavsiyeler verebilir:

  1. The widget can be included in an arbitrary view script
  2. Results from a previous login attempt is rendered
  3. The widget does not invoke a run in the dispatch-loop

Şu anda, giriş Widget görünümü komut dosyalarında, arayarak işlenir:

echo $this->action('auth', 'login-widget');

AuthController.php:

class AuthController extends Zend_Controller_Action {    
    // This method is invoked by Zend_View_Helper_Action to render the
    // login widget
    public function loginWidgetAction () {
        $flashMessenger = $this->_helper->flashMessenger->setNamespace('login');
        $this->view->messages = $flashMessenger->getMessages();
    }

    public function loginAction () {
        if($this->getRequest()->isPost()) {
            $result = Auth::doLogin($this->getRequest()->getPost());
            if($result->isValid()) {
                $this->_redirect('user');
            } 
            else {
                $flashMessenger = $this->_helper->flashMessenger->
                                                  setNamespace('login');
                foreach($result->getMessages() as $message) {
                    $flashMessenger->addMessage($message);    
                }
            }
        }
        // This will be changed to redirect either to the index page,
        // or the page the request originated from if available.
        $this->_redirect('');
    }
    [...]
}

/ Modelleri / Auth.php:

/**
 * Model for encapsulating the actions that deals with authentication,
 * such as registering and activating users, as well as logging in and
 * logging out.
 * @todo: Refactor this to remove static methods
 */
class Auth {

    /**
     * 
     * @return Zend_Auth_Result
     */
    public static function doLogin ($credentials) {
        $authAdapter = new Auth_Adapter_DbTable(
            Zend_Db_Table::getDefaultAdapter(),
            'Users',
            'username',
            'pwdHash',
            'SHA1(CONCAT(?, salt))'
        );
        $authAdapter->setIdentity($credentials['username']);
        $authAdapter->setCredential($credentials['password']);
        $auth = Zend_Auth::getInstance();
        return $auth->authenticate($authAdapter);
}
[...]
}

/ Modelleri / Auth / Adaptör / DbTable.php:

class Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable {    

    /**
     * authenticate() - defined by Zend_Auth_Adapter_Interface.  This method 
     * is called to attempt an authenication.  Previous to this call, this
     * adapter would have already been configured with all necessary 
     * information to successfully connect to a database table and attempt
     * to find a record matching the provided identity.
     *
     * @throws Zend_Auth_Adapter_Exception if answering the authentication 
     * query is impossible
     * @see library/Zend/Auth/Adapter/Zend_Auth_Adapter_DbTable#authenticate()
     * @return MedU_Auth_Result
     */
    public function authenticate() {
        return parent::authenticate();
    }

    /**
     * _authenticateValidateResult() - This method attempts to validate that
     * the record in the result set is indeed a record that matched the 
     * identity provided to this adapter.
     * 
     * Additionally it checks that the user account is activated. 
     *
     * @param array $resultIdentity
     * @return MedU_Auth_Result
     */
    protected function _authenticateValidateResult($resultIdentity)
    {
        $result = parent::_authenticateValidateResult($resultIdentity);
        if(!$result->isValid()) { return $result; }

        $this->_checkAccountIsActivated($resultIdentity);
        $this->_checkAccountIsSuspended($resultIdentity);

        // Overwrite the username supplied by the user and instead
        // use the name supplied upon registration, i.e if the
        // user signs in as uSERNAME and registered as Username,
        // the identity is Username
        $this->_authenticateResultInfo['identity'] = 
            $resultIdentity[$this->_identityColumn]; 

        return $this->_authenticateCreateAuthResult();
    }

    protected function _checkAccountIsActivated ($resultIdentity) {
        if(!$resultIdentity['activated']) {
            $this->_authenticateResultInfo['code'] = 
                MedU_Auth_Result::FAILURE_NOT_ACTIVATED;
            $this->_authenticateResultInfo['messages'] = 
                array('The account has not yet been activated. 
                       Please click on the link provided in the 
                       activation email.');
        }
    }

    protected function _checkAccountIsSuspended ($resultIdentity) {
        if($resultIdentity['suspended']) {
            $this->_authenticateResultInfo['code'] = 
                MedU_Auth_Result::FAILURE_SUSPENDED;
            $this->_authenticateResultInfo['messages'] = 
                  array('The account has been suspended. 
                         If you feel this is a mistake, 
                         please contact our support: support@meduniverse.com');
        }
    }

    /**
     * _authenticateCreateAuthResult() - This method creates a 
     * MedU_Auth_Result object from the information that has 
     * been collected during the authenticate() attempt.
     *
     * @return MedU_Auth_Result
     */
    protected function _authenticateCreateAuthResult()
    {
        return new MedU_Auth_Result(
            $this->_authenticateResultInfo['code'],
            $this->_authenticateResultInfo['identity'],
            $this->_authenticateResultInfo['messages']
           );
    }
}

/ Views / scripts / auth / Partials / login-widget.phtml

// The fetchForm-view helper returns a Zend_Form object. 
// The form definition (xml) is attached below in the
// code box below this one.
<div class="box">
    <h3>Login</h3>
    <?php if($this->messages) : ?>
            <ul class="errors">
                <?php foreach($this->messages as $message) : ?>
                    <li><?php echo $message ?></li>

                <?php endforeach; ?>
            </ul>
    <?php endif; ?>
    <div>
        <?php echo $this->fetchForm('user', 'login') ?>
    </div>
</div>

/ Uygulama / yapılandırmaları / forms.xml

// Configuration of the Login form. 'user' and 'login' are 
// just keys for the view helper to return the correct form
<forms>
    <user>
        <login>
            <action value="/auth/login" />
            <method value="post" />
            <elements>
                <username>
                    <type value="text"></type>
                    <options>
                        <label value="Username" />
                        <required value="true" />
                        <validators>
                            <alnum validator="alnum" />
                            <strlen validator="StringLength">
                                <options min="6" max="45" />
                            </strlen>
                        </validators>
                    </options>
                </username>

                <password>
                    <type value="password" />
                    <options>
                        <label value="Password" />
                        <required value="true" />
                        <validators>
                            <strlen validator="StringLength">
                                <options min="6" max="20" />
                            </strlen>
                        </validators>
                    </options>
                </password>

                <submit>
                    <type value="submit" />
                    <options>
                        <label value="Log in" />
                    </options>
                </submit>
            </elements>
    </login>

3 Cevap

Bildiğim kadarıyla sizin çözüm anlaşıldığı gibi, Zend_View_Helper_Action helper'a Geçerli çağrı giriş formu render daha fazla bir şey yok. Neden sizin flash messenger oturum açma ile ilgili mesajları alır ve giriş formu işler görünümü yardımcısı hakkında yazmıyorsun?

EDIT:

  1. Bunu statik komisyoncu flaş messenger alabilirsiniz:

    $flashMessenger = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');
    $flashMessenger->setNamespace('login');
    $messages = $flashMessenger->getMessages();
    
  2. Sen görünümü yardımcısı yeni bir flaş-haberci instatiate gerekmez, sadece (bkz 1). Bunun geçerli örneğini alabilirsiniz. Görünümünde bir tasarım açısından ben (Zend_View_Helper_Url, örneğin statik ön denetleyicisi yönlendirici alır) sizin bakış yardımcıları içinde uygulama bileşenlerini almak için kesinlikle mümkün olduğunu söyleyebilirim. Odaklanırken azaltmak ve ben (Zend_View_Helper_Translate çevirmen almak için benzer bir desen kullanır) aşağıdaki öneririm bir setter-bağımlılık-enjeksiyon-desen uygulamak için:

    class My_View_Helper_Login extends Zend_View_Helper_Abstract
    {
        // [...]
        /**
         * @var Zend_Controller_Action_Helper_FlashMessenger
         */
        protected $_flash;
        /**
         * @param Zend_Controller_Action_Helper_FlashMessenger $flash
         * @return My_View_Helper_Login Provides a fluent interface
         */
        public function setFlashMessenger(Zend_Controller_Action_Helper_FlashMessenger $flash)
        {
            $this->_flash = $flash;
            return $this;
        }
        /**
         * @return Zend_Controller_Action_Helper_FlashMessenger
         */
        public function getFlashMessenger()
        {
            if ($this->_flash === null) {
                $this->_flash = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');
            }
            return $this->_flash;
        }
        /**
         *
         */
        public function login()
        {
            $flashMessenger = $this->getFlashMessenger();
            $flashMessenger->setNamespace('login');
            $messages = $flashMessenger->getMessages();
            // [...]
         }
    }
    
  3. Değil flaş haberci ihtiyacınız işlevselliği sağlar zaman. Eğer hata ayırt etmek gerekirse, örneğin bilgilendirme ve başarı mesajları ev yetişkin çözüm belki de daha iyi bir yolu olacaktır.

Başka bir ek Eğer ANY veri depolamak için FlashMessenger kullanabilirsiniz olmasıdır. Yani yapabilirsiniz

$flash->addMessage(array('status'=>'error','message'=> 'oops'));

ve daha sonra foreach kullanımda

foreach($messages as $message){
echo '<div class="message '. $message['status'] .'">' . $message['message'] . '</div>'
}

Maybe you should use ViewHelper to render form and ActionController for authentication? This frees you from second dispatch-loop. I can show you some little example, if you want.

P.S. Emin formu için doğrulayıcılar gerekiyor? Ben `t örnekte herhangi bir kullanım göremiyorum.