2011-06-14 28 views
13

Komutunuzun size olan gereksinimi.Yii'nin bir denetleyicinin altındaki tüm eylemleri denetlemek için sihir yöntemi

Ben yii bir kontrol cihazı: Tüm İstek içi altında/sayfayı kontrol etmek için Yii CController altında bazı sihirli yöntemi gerekir

class PageController extends Controller { 
    public function actionSOMETHING_MAGIC($pagename) { 
     // Commando will to rendering,etc from here 
    } 
} 

|| Sayfa denetleyicisi.

Bu şekilde mümkün mü Yii?

Teşekkürler!

cevap

19

Tabii gerekenleri alabilir. En kolay yol, missingAction yöntemini geçersiz kılmaktır.

public function missingAction($actionID) 
{ 
    throw new CHttpException(404,Yii::t('yii','The system is unable to find the requested action "{action}".', 
     array('{action}'=>$actionID==''?$this->defaultAction:$actionID))); 
} 

Sadece mesela ile değiştirin olabilir: Burada

varsayılan uygulamadır Yukarıda
public function missingAction($actionID) 
{ 
    echo 'You are trying to execute action: '.$actionID; 
} 

, $actionID sen $pageName dediğimiz şeydir.

Bunun yerine biraz daha fazla ilgili ancak daha güçlü bir yaklaşım, createAction yöntemini geçersiz kılmak olacaktır. İşte varsayılan uygulama görebilirsiniz:

/** 
* Creates the action instance based on the action name. 
* The action can be either an inline action or an object. 
* The latter is created by looking up the action map specified in {@link actions}. 
* @param string $actionID ID of the action. If empty, the {@link defaultAction default action} will be used. 
* @return CAction the action instance, null if the action does not exist. 
* @see actions 
*/ 
public function createAction($actionID) 
{ 
    if($actionID==='') 
     $actionID=$this->defaultAction; 
    if(method_exists($this,'action'.$actionID) && strcasecmp($actionID,'s')) // we have actions method 
     return new CInlineAction($this,$actionID); 
    else 
    { 
     $action=$this->createActionFromMap($this->actions(),$actionID,$actionID); 
     if($action!==null && !method_exists($action,'run')) 
       throw new CException(Yii::t('yii', 'Action class {class} must implement the "run" method.', array('{class}'=>get_class($action)))); 
     return $action; 
    } 
} 

İşte örneğin, ağır eli şey

public function createAction($actionID) 
{ 
    return new CInlineAction($this, 'commonHandler'); 
} 

public function commonHandler() 
{ 
    // This, and only this, will now be called for *all* pages 
} 

olarak yapabileceği Ya da ihtiyaçlarına göre, yol daha ayrıntılı bir şeyler yapabilirdi.

10

CController veya Controller (sonuncusu genişletilmiş sınıfınız) mu demek istiyorsunuz? Böyle Eğer genişletilmiş ise CController sınıfı:

class Controller extends CController { 
    public function beforeAction($pagename) { 

    //doSomeMagicBeforeEveryPageRequest(); 

    } 
} 

Eğer orada