2011-02-04 2 views
5

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

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

ответ

14

Что я могу сделать, это поставить все поля формы в элементе, а затем вставить элемент в 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 
+1

+1 Мне это нравится ... – Leo

+0

это сработало! Элемент-помощник формы + делает это смехотворно простым! –

+0

Это решение настолько очевидно, что оно блестящее. Смысл я должен был подумать об этом, но не сделал! Я беру оговорки других комментаторов здесь к сердцу - объединение этих форм полностью может привести к беспорядку, если заявления, которые я хочу избежать, но это дает лучшее из того и другого. Две полностью отдельные формы, которые перекрывают больше, чем это не слишком много дублирования для моей симпатии, так что это аккуратный трюк, чтобы удалить большую часть этого и упростить техническое обслуживание (обновить одну форму, а не две). –

6

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

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

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

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

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

+0

вы можете иметь идентификатор в форме добавления – dogmatic69

+0

@dogmatic - да, но не всегда , В этом случае вам придется фильтровать другой способ. Я не предлагаю общий способ сделать это. – Leo

7

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

Если вы все еще хотите, чтобы избежать отдельных файлов, используйте

function add() { 
    ..... 
    $this->render('edit') 
} 
0

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

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

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

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

0

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

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

в редактировании.CTP

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

// create rest of the fields 

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

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

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

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

Смежные вопросы