Как уменьшить дублирование кода формы в CakePHP - PullRequest
5 голосов
/ 04 февраля 2011

У меня есть форма в CakePHP с несколькими десятками полей.Из всех примеров, которые я видел, есть дублирующий код формы для представления добавления и представления редактирования.

Есть ли какие-либо приемы, чтобы не допустить дублирования?Каков лучший метод в CakePHP для этого?

Ответы [ 6 ]

14 голосов
/ 05 февраля 2011

Что я делаю, это помещаю все поля формы в элемент, а затем вставляю элемент в add.ctp и edit.ctp

Не забудьте добавить скрытое поле с идентификатором в edit.ctp

Таким образом, все видимые элементы находятся в одном файле, проще в обслуживании.

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
7 голосов
/ 04 февраля 2011

Вы должны НЕ объединить эти представления, потому что добавление / редактирование являются различными действиями и заслуживают отдельных файлов представления. По мере роста вашего приложения вы поймете, что хорошо иметь отдельные представления для уменьшения сложности if else conditions.

Если вы по-прежнему хотите избегать отдельных файлов, используйте

function add() {
    .....
    $this->render('edit')
}
6 голосов
/ 04 февраля 2011

Я делал это раньше, но вернулся к отдельным представлениям, в основном для моего здравомыслия.

Это достаточно легко сделать.Для редактирования требуется ввод идентификатора записи.Это обычно скрыто.Любые значения формы по умолчанию для формы добавления должны содержаться в условных выражениях, чтобы при редактировании записи сохраненные значения не перезаписывались значениями по умолчанию

На стороне контроллера потребуется условное условиезаявление, чтобы решить, действовать ли как дополнение или редактирование в зависимости от того, установлен ли $this->data['MyModel']['id'].

Я думаю, что это покрывает это - если я думаю о чем-то еще, я добавлю его.

Моя рабочая схема, как правило, состоит в том, чтобы создать представление редактирования, а затем скопировать и вставить его, чтобы создать основу для представления добавления.

0 голосов
/ 27 сентября 2013

в edit.ctp

if($this->data[ModelName]['id']) {
   $this->Form->input('id');
}

// create rest of the fields

в контроллере :: add ()

$this->autoRender=false; // at the start of function

$this->render('edit.ctp'); // at the point where you actually want to render

нет необходимости создавать add.ctp

0 голосов
/ 18 сентября 2013

в вашем контроллере приложения

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
}
0 голосов
/ 05 февраля 2011

этот код проверит, есть ли у вас admin_form.ctp или form.ctp, что позволит использовать тот же код для добавления / редактирования

https://github.com/infinitas/infinitas/blob/dev/app_controller.php#L389

1.3 автоматически отправляет формы туда, откуда они, поэтому, когда вы перейдете в / edit / 1, он отправит туда, а / add отправит для добавления.

это все, что тебе нужно сделать. если у вас есть редактирование, которое сильно отличается от надстройки, то вы просто создаете 2 файла. когда вы хотите, чтобы они были одинаковыми, просто сделайте один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...