0

在本例中,我使用两个模型:部门和用户。

部门属于用户(在这种情况下,用户是部门经理 [允许为空]。)

使用 FormHelper,我简单地将用户 ID 的选择定义为:

echo $this->Form->input('user_id', array('label'=>'Department/Group Manager (leave blank if none)', 'empty' => true));

默认情况下,FormHelper 似乎按 User.id ASC(HTML 选择元素的“值”属性)对选择项进行排序。为了使 add.ctp 表单中的内容更好,我创建了一个虚拟字段作为“姓氏,名字”,用作用户模型的显示字段:

public $virtualFields = array(
  'name' => "CONCAT(User.lastName, ', ', User.firstName)"
);
public $displayField = 'name';

这很好用。不幸的是,我希望能够按虚拟字段的值(或在本例中为 User.lastName)而不是按 User.id 对呈现的选择框中的项目进行排序。我无法找到使用 FormHelper 的方法。有没有其他方法可以做到这一点(如果 FormHelper 做不到)?

4

1 回答 1

1

MVC:模型检索数据(业务逻辑)。

CONTROLLER 为视图 [$this->set()] 设置数据。

VIEW 只处理您的输出,以及任何其他地方无法处理的逻辑。

根据cake bake输出的创建方式使用 Cake 约定,您需要在控制器中对模型的 find() 方法的调用中设置与特定视图相关的 ORDER BY 子句。在这种情况下,您部门的 add() 方法。

public function add(){
    // ... other code ...

    $users = $this->Department->User->find('list', array('order' => array('lastName' => 'asc'));
    $this->set(compact('users'));
}

请注意,如果您使用的是 Containable Behavior,您可能需要调整其设置以实现上述默认(最有可能工作的)代码示例。

于 2013-09-26T22:12:09.173 回答