CakePHPには数十のフィールドを持つフォームがあります。私が見たすべての例から、追加ビューと編集ビューのフォームコードが重複しています。CakePHPでフォームコードの重複を減らす方法
複製を保持する手口はありますか?これのためにCakePHPの中で最も良い方法は何ですか?
CakePHPには数十のフィールドを持つフォームがあります。私が見たすべての例から、追加ビューと編集ビューのフォームコードが重複しています。CakePHPでフォームコードの重複を減らす方法
複製を保持する手口はありますか?これのためにCakePHPの中で最も良い方法は何ですか?
は、要素内のすべてのフォームフィールドを配置し、その後、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
私は以前これをやっていましたが、主に自分自身のために、別々のビューを持つように戻ってきました。
これは簡単です。編集にはレコードIDの入力が必要です。これは通常隠されています。レコードを編集するときに、格納された値がデフォルトで上書きされないように、addフォームのデフォルトのフォーム値を条件に含める必要があります。
コントローラの側では、 $this->data['MyModel']['id']
が設定されているかどうかに応じて、追加または編集として機能するかどうかを決定します。
私はそれをカバーだと思う - 私はそれを追加します何かを考える場合
私の仕事パターンがアドオンの基礎を作成するためにコピーして貼り付け、編集ビューを構築する傾向にあります。ビュー。
を作成する必要はありませんあなたは追加のフォーム – dogmatic69
@dogmaticでIDを持つことができる - そうではなく、通常は。その場合は、別の方法でフィルタリングする必要があります。私はこれを行う一般的な方法を示唆していません。 – Leo
/編集アドオンが異なるアクションており、別のビューファイルに値するので、あなたは、は、これらのビューをマージしないでください。アプリケーションが大きくなるにつれて、複雑さを軽減するために別々のビューを持つことが良いと認識します。if else conditions
あなたはまだ別のファイルを避けたい場合は、使用
私は何function add() {
.....
$this->render('edit')
}
あなたは
https://github.com/infinitas/infinitas/blob/dev/app_controller.php#L389
1.3がどこに自動的にフォームを提出し、それは追加/編集のために同じコードを使用するようになりますadmin_form.ctpまたはform.ctpを持っている場合、このコードがチェックされますあなたが/ edit/1に行くとそこに投稿され、/ addが追加する投稿になります。
これだけです。あなたが追加と大きく異なる編集をしているならば、2つのファイルを作成するだけです。あなたがそれらを同じにしたいときは、ただそれを作るだけです。
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
}
を追加します。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
+1私はそれが好き... – Leo
これは正確に働いた!フォームのヘルパー+要素はこれをばかげて簡単にします! –
この解決法は非常に明白です。私はこれを考えていたはずですが、そうしなかったのです!ここで他のコメント作成者のコメントを心に留めておきます。これらのフォームを完全に組み合わせることで、if文の混乱を避けることができますが、これは両方の利点が得られます。重複しない2つの完全に別々のフォームは、私の好きなほど重複しているので、これは大部分を削除し、メンテナンスを容易にします(2つではなく1つのフォームを更新する)。 –