RSS-подписка

RSS-лента

Новые статьи

Последние комментарии


Получать обновления на эл. почту

Ваш e-mail:

Рассылка новостей от Loco

Quick Login Widget для расширения Yii-user

Нет картинки Если вы хотите отобразить форму для входа в личный кабинет не в отдельном представлении, а в любом месте на желаемой странице, то нужно создать специальный виджет. Назовём его Quick Login Widget (виджет быстрого входа)

Чтобы показать этот виджет, вызываем в представлении файл этого виджета следующим кодом

<?php $this->widget('application.modules.user.widget.LoginWidget'); >

Создать папку widgets (можно и в components, кто к какой структуре привычен) в modules/user

<?php
/**
* Login widget for Yii-user
*
* Usage:
*
* <code>
*   # Basic:
*       $this->widget('LoginWidget');
* </code>
*
* @author Vitaliy Stepanenko <mail@vitaliy.in>
* @license BSD
* @package yii-user.widgets
* @version $Id:$
* @since File available since revision 91
*/

/**
* Login widget for Yii-user
*/
class LoginWidget extends CWidget {
        
        /**
        * List of Urls, on which this widget will be not rendered.
        *
        * @var array
        */
        public $ignoredUrls = array(
                'user/registration',
                'user/login',
                'user/profile'
        );
        
        /**
        * Checks that current Url is not in ignore list
        * @see ignoredUrls
        * @return bool
        *
        */
        protected function isCurrentUrlAllowed()
        {               
                if (!empty($this->ignoredUrls)) {
                        $route = Yii::app()->urlManager->parseUrl(Yii::app()->request);
                        foreach ($this->ignoredUrls as $url){                   
                                if (strpos($route,$url) === 0){
                                        return false;
                                }
                        }
                }
                return true;
        }

        /**
        * Publish widget assets
        */
        protected function publishAssets()
        {
                if(($theme = Yii::app()->getTheme()) !== null) {
                                        
                        $className = str_replace('\\', '_', ltrim(get_class($this), '\\')); # Possibly namespaced class
                        $path = $theme->getViewPath() . DIRECTORY_SEPARATOR . $className;
                        if (!is_dir($path)) $path = $this->getViewPath();
                        
                }else{                                          
                        $path = $this->getViewPath();                   
                }   
                
                return Yii::app()->assetManager->publish(
                        $path . DIRECTORY_SEPARATOR . 'assets',
                        false,
                        -1,
                        YII_DEBUG
                );             
        }

    /**
        * Executes the widget.
        * This method is called by {@link CBaseController::endWidget}.
        */
        public function run()
        {  
                if (!$this->isCurrentUrlAllowed()) {
                        return;
                }       
            
                $assetUrl       =       $this->publishAssets();
                $module         =       Yii::app()->getModule('user');  # Call this before using any other classes from Yii-user
                $model          =       new UserLogin;                                  # to provide import of all needed classes in UserModule::init()
                $viewName       =       'loginWidgetForm';              
                
                if (Yii::app()->user->isGuest) {            
                        if(isset($_POST['UserLogin'])){
                                $model->attributes = $_POST['UserLogin'];                
                                if($model->validate()) {        
                                        //$user = $module->user();
                                        //$user->lastvisit = time();
                                        //$user->save();
                                        #Not shure, that we need this code, coz redirecting can be controlled in RBAC system
                                        //if ($actionId == 'login') Yii::app()->controller->redirect('/');                    
                                        //$viewName = 'loginWidgetDone';
                                        $controller=$this->getController();
                                        if (Yii::app()->user->returnUrl=='/index.php')
                                            $controller->redirect('/');
                                        else
                                            $controller->redirect(Yii::app()->user->returnUrl);
                                }
                        }
                } else {
                        //$viewName = 'loginWidgetDone';
                        $this->redirect(Yii::app()->controller->module->returnUrl);
                }  


                /*if (Yii::app()->user->isGuest) {
                    $model=new UserLogin;
                    // collect user input data
                    if(isset($_POST['UserLogin']))
                    {
                        $model->attributes=$_POST['UserLogin'];
                        // validate user input and redirect to previous page if valid
                        if($model->validate()) {
                            $this->lastViset();
                            if (Yii::app()->user->returnUrl=='/index.php')
                                $this->redirect(Yii::app()->controller->module->returnUrl);
                            else
                                $this->redirect(Yii::app()->user->returnUrl);
                        }
                    }
                    // display the login form
                    $this->render('/user/login',array('model'=>$model));
                } else
                    $this->redirect(Yii::app()->controller->module->returnUrl);
                */
                        
                $this->render($viewName,array(
                        'model'         =>      $model,
                        'user'          =>      $module->user(),
                        'assetUrl'      =>      $assetUrl,
                        'module'        =>      $module,
                ));       
        }
}

 

В папке modules/user/views файл loginWidgetDone.php

<?php
        Yii::app()->clientScript
                ->registerCssFile( $assetUrl . '/userLogin.css' )
                ->registerScriptFile( $assetUrl . '/userLogin.js' )    
?>

<div class="login">

        <div class="row">                
                <?php echo UserModule::t('Hello, {username}!',array('{username}'=>CHtml::link($user->username,$module->profileUrl)))?><br>              
        <?php echo CHtml::link(UserModule::t('Logout'),$module->logoutUrl)?>
    </div>              

</div>

и файл loginWidgetForm.php (у меня добавлено своё оформление)

<?php
        Yii::app()->clientScript
                ->registerCssFile( $assetUrl . '/userLogin.css' )
                ->registerScriptFile( $assetUrl . '/userLogin.js' )    
?>

<div class="login form">
    
    <div id="harrisNewsHeader">
        <div id="HarrisNews">
        <h3><?php echo UserModule::t("Login"); ?></h3>

        <?php if(Yii::app()->user->hasFlash('loginMessage')): ?>
                <div class="success"><?php echo Yii::app()->user->getFlash('loginMessage'); ?></div>
        <?php endif; ?>

        <?php echo CHtml::beginForm(); ?>

        <div class="row">
        <?php echo      CHtml::activeLabelEx($model,'username'),
                                CHtml::activeTextField($model,'username'),
                                CHtml::error($model,'username') ?>
        </div>
        <div class="row">
        <?php echo      CHtml::activeLabelEx($model,'password'),
                                CHtml::activePasswordField($model,'password'),
                                CHtml::error($model,'password') ?>
        </div>

        <div class="row">
                <p class="hint">
                        <?php echo CHtml::link(UserModule::t("Register"),Yii::app()->getModule('user')->registrationUrl); ?> | <?php echo CHtml::link(UserModule::t("Lost Password?"),Yii::app()->getModule('user')->recoveryUrl); ?>
                </p>
        </div>

        <div class="row rememberMe">
                <?php echo CHtml::activeCheckBox($model,'rememberMe'); ?>
                <?php echo CHtml::activeLabelEx($model,'rememberMe'); ?>
        </div>

        <div class="row submit">
                <?php echo CHtml::submitButton(UserModule::t("Login")); ?>
        </div>

        <?php echo CHtml::endForm(); ?>
        </div>
        <div id="HarrisNewsFooter"></div>
    </div>

</div>

 

 

 

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.