我在CakePHP中有一个表单,里面有几十个字段。从我看到的所有示例中,添加视图和编辑视图都有重复的表单代码。
是否有任何技巧可以防止重复? CakePHP中最好的方法是什么?
答案 0 :(得分:14)
我所做的是将所有表单字段放在一个元素中,然后将该元素插入add.ctp和edit.ctp
不要忘记在edit.ctp
中添加带有id的隐藏字段这样所有可见元素都在一个文件中,更易于维护。
View/MyModel/add.ctp
echo $this->Form->create('MyModel');
echo $this->element('my_form');
echo $this->Form->end();
View/MyModel/edit.ctp
echo $this->Form->create('MyModel');
echo $this->Form->input('id');
echo $this->element('my_form');
echo $this->Form->end();
View/Elements/my_form.ctp
// your form inputs
// whatever they are
答案 1 :(得分:7)
您应该不合并这些视图,因为添加/编辑是不同的操作,并且需要单独的视图文件。随着应用程序的增长,您将意识到拥有单独的视图可以降低if else conditions
的复杂性。
如果您仍想避开单独的文件,请使用
function add() {
.....
$this->render('edit')
}
答案 2 :(得分:6)
我以前做过这件事,但又回到了单独的观点,主要是为了我自己的理智。
这很容易做到。编辑需要输入记录ID。这通常是隐藏的。添加表单的任何默认表单值都必须包含在条件中,以便在编辑记录时不会使用默认值覆盖存储的值
在控制器方面,您需要一个条件语句来决定是否作为添加或编辑,具体取决于是否设置了$this->data['MyModel']['id']
。
我认为这涵盖了它 - 如果我想到其他任何我会添加它。
我的工作模式往往是构建编辑视图,然后复制并粘贴以创建添加视图的基础。
答案 3 :(得分:0)
此代码将检查您是否有admin_form.ctp或form.ctp,这将使其使用相同的代码进行添加/编辑
https://github.com/infinitas/infinitas/blob/dev/app_controller.php#L389
1.3将表单自动提交到其中的位置,因此当您转到/ edit / 1时它将发布到那里,并且/ add将发布以添加。
这就是你需要做的一切。如果您的编辑与添加有很大不同,那么您只需创建2个文件。当你想要它们时,只需制作一个。
答案 4 :(得分:0)
在您的app控制器中
public function render($view = null, $layout = null) {
$viewPaths = App::path('View', $this->plugin);
$rootPath = $viewPaths[0] . DS . $this->viewPath . DS;
$requested = $rootPath . $view . '.ctp';
if (in_array($this->request->action, array('admin_edit', 'admin_add', 'edit', 'add'))) {
$viewPath = $rootPath . $this->request->action . '.ctp';
if (!file_exists($requested) && !file_exists($viewPath)) {
if (strpos($this->request->action, 'admin_') === false) {
$view = 'form';
} else {
$view = 'admin_form';
}
}
}
return parent::render($view, $layout);
}
并且在您的视图中,您始终可以检查其编辑或添加
if ($this->request->params['action'] == 'admin_edit') {
//do something
}
if ($this->request->params['action'] == 'admin_add') {
//do something
}
答案 5 :(得分:0)
在edit.ctp
中if($this->data[ModelName]['id']) {
$this->Form->input('id');
}
// create rest of the fields
在Controller :: add()
中$this->autoRender=false; // at the start of function
$this->render('edit.ctp'); // at the point where you actually want to render
无需创建add.ctp