2011-02-04 5 views
5

CakePHPには数十のフィールドを持つフォームがあります。私が見たすべての例から、追加ビューと編集ビューのフォームコードが重複しています。CakePHPでフォームコードの重複を減らす方法

複製を保持する手口はありますか?これのためにCakePHPの中で最も良い方法は何ですか?

答えて

14

は、要素内のすべてのフォームフィールドを配置し、その後、add.ctpとedit.ctpに要素を挿入することです

はedit.ctp

にidを持つすべての可視要素を1つのファイルである。この方法で、保守が容易に隠しフィールドを追加することを忘れないでください。

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

この解決法は非常に明白です。私はこれを考えていたはずですが、そうしなかったのです!ここで他のコメント作成者のコメントを心に留めておきます。これらのフォームを完全に組み合わせることで、if文の混乱を避けることができますが、これは両方の利点が得られます。重複しない2つの完全に別々のフォームは、私の好きなほど重複しているので、これは大部分を削除し、メンテナンスを容易にします(2つではなく1つのフォームを更新する)。 –

6

私は以前これをやっていましたが、主に自分自身のために、別々のビューを持つように戻ってきました。

これは簡単です。編集にはレコードIDの入力が必要です。これは通常隠されています。レコードを編集するときに、格納された値がデフォルトで上書きされないように、addフォームのデフォルトのフォーム値を条件に含める必要があります。

コントローラの側では、 $this->data['MyModel']['id']が設定されているかどうかに応じて、追加または編集として機能するかどうかを決定します。

私はそれをカバーだと思う - 私はそれを追加します何かを考える場合

私の仕事パターンがアドオンの基礎を作成するためにコピーして貼り付け、編集ビューを構築する傾向にあります。ビュー。

+0

を作成する必要はありませんあなたは追加のフォーム – dogmatic69

+0

@dogmaticでIDを持つことができる - そうではなく、通常は。その場合は、別の方法でフィルタリングする必要があります。私はこれを行う一般的な方法を示唆していません。 – Leo

7

/編集アドオンが異なるアクションており、別のビューファイルに値するので、あなたは、は、これらのビューをマージしないでください。アプリケーションが大きくなるにつれて、複雑さを軽減するために別々のビューを持つことが良いと認識します。if else conditions

あなたはまだ別のファイルを避けたい場合は、使用

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

あなたは

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

1.3がどこに自動的にフォームを提出し、それは追加/編集のために同じコードを使用するようになりますadmin_form.ctpまたはform.ctpを持っている場合、このコードがチェックされますあなたが/ 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

関連する問題