动态填充PHP Cake中的下拉菜单。从另一个模型访问模型?

时间:2013-06-03 12:53:00

标签: php cakephp cakephp-appmodel

我正在构建一个Cake PHP应用程序。不同的用户具有不同的属性,因此我使用两个对象来存储用户,例如

  • 用户hasOne学生/学生属于用户
  • 用户hasOne Lecturer / Lecturer属于User

配置文件编辑页面将允许用户编辑这两个对象的所有详细信息。我已经设置了表单并使用了saveAll,因此保存了两个对象。我的问题是根据用户的角色动态填充下拉菜单。

例如县领域。管理员没有地址,而学生和讲师也有。我已经设置了我的国家模型以查找我的所有县并将它们放入选择框中的选项组(按国家/地区排序,如Dropdown list with dyanmic optgroup所示)

我可以在Students / LecturersController中做得很好,因为他们允许我在设置$ uses变量时访问Country模型。我不想在UsersController中执行此操作,因为并非所有用户角色都有一个地址,并且地址永远不会存储在User对象中。我尝试将代码放在模型中,但后来我不知道如何访问模型中的其他模型。到目前为止,构建应用程序没有任何问题,我觉得我可能在某个地方做出了糟糕的设计决定,或者有些事情我不能正确理解。

基本上我问的是如何实现下面的setForForm()功能。

public function edit() {
    //get user
    $user = $this->Auth->user();
    //get role
    $role = $user['User']['role'];
    if ($this->request->is('post') || $this->request->is('put')) {
        //get IDs
        $userID = $user['User']['id'];
        $roleID = $user[$role]['id'];
        //set IDs
        $this->request->data[$role]['user_id'] = $userID;
        $this->request->data[$role]['id'] = $roleID;
        $this->request->data['User']['id'] = $userID;
        //delete data for role that is not theirs
        foreach ($this->request->data as $key => $value) {
            if($key !== 'User' && $key !== $role) {
                unset($this->request->data[$key]);
            }
        }
        if ($this->User->saveAll($this->request->data)) {
            //update logged in user
            $this->Auth->login($this->User->$role->findByUserId($userID));
            $this->Session->setFlash('Changes saved successfully.');
        } else {
            $this->Session->setFlash(__('Please try again.'));
        }
    }
    //set role for easy access
    $this->set(compact('role'));
    //sets required variables for role form
    $this->User->$role->setForForm();
    //fills in form on first request
    if (!$this->request->data) {
        $this->request->data = $user;
    }
    //render form depending on role
    $this->render(strtolower('edit_' . $role));
}

//this is the method I would like to implement in the Student/Lecturer model somehow
public function setForForm() {
    $counties = $this->Country->getCountiesByCountry();
    $homeCounties = $counties;
    $termCounties = $counties;
    $this->set(compact('homeCounties', 'termCounties'));
}

3 个答案:

答案 0 :(得分:0)

不确定我的问题是否正确,但我认为您想要的是以下内容:

User hasOne Student / Student belongs to User

Student hasOne Country / Country belongsTo Student

(和Lectureres一样)

然后从您的UsersController中可以执行以下操作:

$this->User->Student->Country->findCountiesByCountry();

希望有所帮助

- 编辑:

如果您想要使用$ role而不是Student / Lecturer,您必须这样做:

$this->User->{$role}->Country->findCountiesByCountry();

答案 1 :(得分:0)

尝试这样的事情:

public function setForForm() {
    App::import('model', 'Country');
    $Country = New Country();
    $counties = $Country->getCountiesByCountry();
    $homeCounties = $counties;
    $termCounties = $counties;
    $this->set(compact('homeCounties', 'termCounties'));
}

我不知道这是否是最好的解决方案,但它至少起作用了:)

被修改

这是另一个错误。它不建议从模型到视图设置变量,你可以返回将被设置然后在编辑功能中的数据,通常将其设置为视图,但无论如何,如果你需要从模型设置到视图,你可以将控制器类加载到你的模型使用App::import();并使用set function。

答案 2 :(得分:0)

最后,我决定只在用户控制器中加载县,无论表单是否需要它们,因为Admin是唯一不需要它们的用户。