在这个例子中,我正在使用两个模型:Departments和Users。
部门属于用户 (在这种情况下,用户是部门经理[允许空值]。)
使用FormHelper,我只是将用户ID的选择定义为:
echo $this->Form->input('user_id', array('label'=>'Department/Group Manager (leave blank if none)', 'empty' => true));
默认情况下,FormHelper似乎按User.id ASC(HTML select元素的“value”属性)对选择项进行排序。为了使add.ctp表单更好,我创建了一个虚拟字段作为“姓氏,名字”,用作用户模型的显示字段:
public $virtualFields = array(
'name' => "CONCAT(User.lastName, ', ', User.firstName)"
);
public $displayField = 'name';
这很有效。不幸的是,我希望能够通过虚拟字段的值,升序(或本例中的User.lastName)而不是User.id来在渲染的选择框中订购项目。我无法找到使用FormHelper执行此操作的方法。还有另一种方法(如果FormHelper不能这样做)吗?
答案 0 :(得分:1)
MVC: MODEL检索数据(业务逻辑)。
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'));
}
请注意,如果您使用可包含行为,则可能需要调整其设置以实现上述默认(最可能正常工作)的代码示例。