с использованием класса "extends CAction" платформы Yii - PullRequest
4 голосов
/ 05 марта 2012

в этом руководстве по Yii Framework http://www.yiiframework.com/doc/guide/1.1/en/basics.controller#action

я хочу поместить свои Действия из контроллера в отдельные файлы действий, а в инструкциях сказано "создать класс действий"

иэто мой файл класса действий

class LoginAction extends CAction
{

    private $contents = array();
    public function run(){
        $loginmodel = new LoginForm;

        //answer ajax validating request
        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form'){
            echo CActiveForm::validate($loginmodel);
            Yii::app()->end();
        }

        //collect user input data to do login
        if(isset($_POST["LoginForm"]))
        {
            $loginmodel->attributes = $_POST["LoginForm"];
            // validate user input and redirect to the previous page if valid
            if($loginmodel->validate() && $loginmodel->login()){ //<--invoking here the login and validate function
                $this->redirect(Yii::app()->user->returnUrl);
            }
        }

        $this->contents["loginmodel"] =  $loginmodel;
        $this->render('index',$this->contents); 
    }    

}

и в моем контроллере

class SandboxController extends Controller{       
    public function actions(){
        // return external action classes, e.g.:
            return array(
            'authlog'=>'application.controllers.authentication.LoginAction',
            // page action renders "static" pages stored under 'protected/views/site/pages'
            // They can be accessed via: index.php?r=site/page&view=FileName
            'page'=>array(
                'class'=>'CViewAction',
            ),
        );   
    }
}

, и я просматриваю отдельный контроллер действий, используя

http://localhost/mysite/index.php/sandbox/authlog/login

и моя ошибка

У LoginAction и его поведения нет метода или замыкания с именем "render".

я ошибсячто-то?спасибо.

вот трассировка стека

CException LoginAction и его поведение не имеют метода или замыкания с именем "render".

D: \ xampp \ htdocs\ mysite \ framework \ base \ CComponent.php (266)

254 открытая функция __call ($ name, $ parameters) 255 {256
if ($ this -> _ m! == null) 257 {258 foreach ($ this -> _ m как $ object) 259 {260
if ($ object-> getEnabled () && method_exists ($ object, $ name)) 261
return call_user_func_array (array ($ object, $имя), параметры $);262
} 263} 264 if (class_exists ('Closure', false) && $ this-> canGetProperty ($ name) && $ this -> $ name instanceof Closure) 265
return call_user_func_array ($ this -> $имя, $ параметры);266
throw new CException (Yii :: t ('yii', '{class} и его поведение не имеют метода или замыкания с именем "{name}".', 267
array ('{class}'=> get_class ($ this),' {name} '=> $ name)));268} 269 270 / ** 271 * Возвращает именованный объект поведения.272 * Имя «аса» означает «как».273 * @param string $ поведение имя поведения 274 * @return IBehavior объект поведения или ноль, если поведение не существует 275 * / 276 открытая функция asa ($ поведение) 277 {278 возвращение isset ($ this -> _ m [$ поведение])?$ this -> _ m [$ поведение]: ноль;Трассировка стека

0

  • D: \ xampp \ htdocs \ mysite \ protected \ controllers \ authentication \ LoginAction.php (26): CComponent -> __ call ("render", array (" index ", array (" loginmodel "=> LoginForm)))

    1

  • D: \ xampp \ htdocs \ mysite \ protected \ controllers\ authentication \ LoginAction.php (26): LoginAction-> render ("index", массив ("loginmodel" => LoginForm))

    2

  • D:\ xampp \ htdocs \ mysite \ framework \ web \ actions \ CAction.php (75): LoginAction-> run ()

    3

  • D: \ xampp \htdocs \ mysite \ framework \ web \ CController.php (309): CAction-> runWithParams (array ("login" => ""))

    4

  • D: \ xampp \ htdocs \ mysite \ framework \ web \ CController.php (287): CController-> runAction (LoginAction)

    5

  • D: \ xampp\ htdocs \ mysite \ framework \ web \ CController.php (266): CController-> runActionWithFilters (LoginAction, array ())

    6

  • D: \ xampp\ HTDOCS \ MySite\ framework \ web \ CWebApplication.php (276): CController-> run ("authlog")

    7

  • D: \ xampp \ htdocs \ mysite \ framework\ web \ CWebApplication.php (135): CWebApplication-> runController («песочница / authlog / login»)

    8

  • D: \ xampp \ htdocs \ mysite\ framework \ base \ CApplication.php (162): CWebApplication-> processRequest ()

    9

  • D: \ xampp \ htdocs \ mysite \ index.php (13): CApplication-> run () 2012-03-05 09:37:43 Apache / 2.2.21 (Win32) mod_ssl / 2.2.21 OpenSSL / 1.0.0e PHP / 5.3.8 mod_perl / 2.0.4 Perl / v5.10.1 Yii Framework / 1.1.10

Ответы [ 2 ]

7 голосов
/ 05 марта 2012

Проблема с этой строкой кода:

$this->render('index',$this->contents);

Это было бы хорошо, если бы он был внутри контроллера, но как только код перемещен в выделенный класс действия, больше нет renderметод, вызываемый на $this, отсюда и ошибка.

Вам просто нужно сначала получить ссылку на контроллер и вызвать render для этого:

$controller=$this->getController();
$controller->render('index',$this->contents);
2 голосов
/ 26 декабря 2012

Вы можете расширить свое действие для доступа к любому методу контроллера:

//MyAction.php
<?php

class MyAction extends CAction
{
    public function render($view, array $options=array())
    {
        $this->getController()->render($view, $options);
    }
}

//LoginAction.php:
<?php

class LoginAction extends MyAction
{
(...)
...