这是我当前模块的目录结构
在我的DefaultController.php我有这个
<?php
class DefaultController extends Controller
{
//set default action if nessesary
public $defaultAction = 'index'; //default is index
/**
* Declares class-based actions.
*/
public function actions() {
// page action renders "static" pages stored under '/views/default/pages'
// They can be accessed via: index.php?r=default/page&view=FileName
return array(
'pages' => array('class' => 'CViewAction'),
);
}
public function actionIndex()
{
$this->render('index');
}
/**
* Catch all action - used as a workaround to support dashed action names like my-action => actionMyAction
* @param string $action Action that was not found within this controller
*/
public function missingAction($action){
$action = explode('-', $action);
$action = array_map('strtolower', $action);
$action = array_map('lcfirst', $action);
$action = implode('',$action);
if(method_exists($this,'action'.$action) || array_key_exists('action'.$action, $this->actions())){
$this->setAction($action);
$this->run($action);
}else{
throw new CHttpException(404, Yii::t('main','Action "{action}" does not exist in "{controller}".', array(
'{action}' => 'action'.$action,
'{controller}' => get_class($this),
)));
}
}
public function actionLoanCalculator()
{
$model=new CalculatorsForm();
// uncomment the following code to enable ajax-based validation
/*
if(isset($_POST['ajax']) && $_POST['ajax']==='loan-calculator-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
*/
if(isset($_POST['loan-calculator-form']))
{
$model->attributes=$_POST['loan-calculator-form'];
if($model->validate())
{
// form inputs are valid, do something here
print_r($_REQUEST);
return;
}
}
$this->render('loan-calculator',array('model'=>$model));
}
}
这是我的网址管理器
'<view:(about|terms|faq|privacy)>' => 'site/page',
'<action:(contact|login|logout)>' => 'site/<action>',
'<action:(loan-calculator)>' => 'calculators/default/pages/view/<action>',
'<action:(registration|create)>' => 'user/<action>',
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
我尝试在我的默认控制器中添加 missingAction() 函数以允许带有破折号的操作。但当我访问 domain.com/dev/loan-calculator
时,我仍然收到此错误我得到的错误是
Undefined variable: model
它会转到视图中的loan-calculator.php。但在我的默认控制器中没有通过
function actionLoanCalculator()
。知道如何解决这个问题吗?
通过 UrlManager 配置,您可以使用“页面”操作来呈现贷款计算器。这是针对静态页面的,没有预先加载模型。看起来您的视图期望控制器加载模型,因此出现错误。
我认为你在 urlManager conf 的第三行中重定向应该是
'<action:(loan-calculator)>' => 'calculators/default/loanCalculator',
那么你就不需要包罗万象了。或者使用
'' => '计算器/默认/贷款计算器',
让你的missingActions方法发挥作用。 但也许您应该在使用 urlManager 之前通过简单地输入您想要的路线来测试您的控制器。模块操作的路线如下所示:
moduleID/controllerID/actionID
,所以就你而言:
calculators/default/loan-calculator
处理带有破折号的操作的另一种方法可以是实现
beforeAction()
方法,并从那里的操作 ID 中删除破折号。