3

我正在寻找解决“使用 Yii 和 PHP 第 2 版进行 Web 应用程序开发”书籍示例时遇到的问题的解决方案。从书中的所有内容来看,我得到的错误(来自标题)不应该出现。好吧,这就是我想要做的。在一个 Project.php 模型中,我定义了一个方法,它应该使用 Yii 的 CHtml 助手来创建一个“可接受的”数组,以与 Yii 的 CActiveForm 的 dropDownList() 方法(在视图文件中使用)一起使用。看起来像这样

public function getUserOptions() {
    // $this->users refers to the defined relationship of this class
    $usersArray = CHtml::listData($this->users, 'id', 'username');
    return $usersArray;
} 

关系在同一类的关系()方法中定义

public function relations() {
 // NOTE: you may need to adjust the relation name and the related
 // class name for the relations automatically generated below.
 return array(
    'issues' => array(self::HAS_MANY, 'Issue', 'project_id'),
    'users' => array(self::MANY_MANY, 'User', 'tbl_project_
    user_assignment(project_id, user_id)'),
 );
}

以及我想如何使用 getUserOptions() 为用户提供一个下拉列表,以使用 Yiis dropDownList() 方法生成 key => value 对中的选项,就像这样。_form.php 是 IssueControler.php 控制器的视图文件,应该生成下拉列表的部分代码是这样的:

<div class="row">
    <?php echo $form->labelEx($model,'owner_id'); ?>
    <?php echo $form->dropDownList($model,'owner_id', $model->project-      >getUserOptions()); ?>
    <?php echo $form->error($model,'owner_id'); ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model,'requester_id'); ?>
    <?php echo $form->dropDownList($model,'requester_id', $model->project->getUserOptions()); ?>
    <?php echo $form->error($model,'requester_id'); ?>
</div>

就像我说的那样,_form.php 会一直渲染,直到它到达两个下拉列表中的第一个,然后出现此错误:

致命错误:在第 44 行对 E:\Programi\XAMP\htdocs\trackbar\protected\views\issue_form.php 中的非对象调用成员函数 getUserOptions()

任何帮助将不胜感激:)顺便说一句,在书中它表明一切都应该工作......

编辑:这里是 IssueController.php 的 actionCreate() 方法,它调用这个 _form.php 视图来渲染,供参考。

public function actionCreate() {
    $model=new Issue;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST['Issue'])) {
        $model->attributes=$_POST['Issue'];
        $model->project_id = $this->_project->id;
        if($model->save())
            $this->redirect(array('view','id'=>$model->id));
    }

    $this->render('create',array(
        'model'=>$model,
    ));
}
4

1 回答 1

3

您需要先获取当前项目实例。比基于该项目实例,您可以获得该特定项目的用户列表。添加这个

public function getProject()
{
   return $this->_project;
}

并将其用作。

<div class="row">
    <?php echo $form->labelEx($model,'owner_id'); ?>
    <?php echo $form->dropDownList($model,'owner_id', $model->getProject()-      >getUserOptions()); ?>
    <?php echo $form->error($model,'owner_id'); ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model,'requester_id'); ?>
    <?php echo $form->dropDownList($model,'requester_id', $model->getProject()->getUserOptions()); ?>
    <?php echo $form->error($model,'requester_id'); ?>
</div>

希望这会奏效

于 2013-07-17T10:27:31.390 回答