如何减少CakePHP中的表单代码重复

时间:2011-02-04 17:12:12

标签: cakephp

我在CakePHP中有一个表单,里面有几十个字段。从我看到的所有示例中,添加视图和编辑视图都有重复的表单代码。

是否有任何技巧可以防止重复? CakePHP中最好的方法是什么?

6 个答案:

答案 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