2011-02-04 7 views

Odpowiedz

14

Co zrobić, to umieścić wszystkie pola formularza w elemencie, a następnie wstawić element w add.ctp i edit.ctp

nie zapomnij dodać pole ukryte z identyfikatorem w edit.ctp

ten sposób wszystkie widoczne elementy są w jednym pliku, łatwiejsze w utrzymaniu.

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 Podoba mi się ... – Leo

+0

to działało dokładnie! Formowy helper + elementy czyni to śmiesznie prostym! –

+0

To rozwiązanie jest tak oczywiste, że jest genialne. To znaczy, że powinienem był o tym pomyśleć, ale nie! Biorę tutaj do serca zastrzeżenia innych komentujących - łączenie tych form może doprowadzić do bałaganu, którego stwierdzeń chcę uniknąć, ale to najlepsze z nich. Dwie całkowicie oddzielne formy, które nakładają się na siebie, to zbyt wiele powielania dla mojego upodobania, więc jest to fajna sztuczka, aby usunąć większość z tego i ułatwić utrzymanie w przyszłości (zaktualizuj jedną, a nie dwie). –

6

Zrobiłem to wcześniej, ale wróciłem do posiadania oddzielnych poglądów, głównie dla mojego własnego zdrowia psychicznego.

Łatwo to zrobić. Edycja wymaga danych wejściowych dla identyfikatora rekordu. Zazwyczaj jest to ukryte. Wszelkie domyślne wartości formularzy dla formularza dodawania będą musiały być zawarte w warunkach warunkowych, aby zapisane wartości nie były nadpisywane wartościami domyślnymi podczas edytowania rekordu

Po stronie kontrolera potrzebne jest wyrażenie warunkowe zdecyduj, czy chcesz dodać lub edytować w zależności od tego, czy ustawiono $this->data['MyModel']['id'].

myślę, że obejmuje go. - jeśli myślę o niczym innym dodam go w

Mój wzór praca wydaje się być budowanie widoku edycji, a następnie skopiować i wkleić do stworzenia podstaw dla dodatku widok.

+0

można mieć identyfikator w postaci dodania – dogmatic69

+0

@dogmatic - tak, ale nie zwykle . W takim przypadku musisz przefiltrować w inny sposób. Nie sugeruję ogólnego sposobu robienia tego. – Leo

7

Należy NIE scalić te poglądy, bo dodawać/edytować różne działania i zasługują na oddzielne pliki widoku. Wraz z rozwojem aplikacji zdasz sobie sprawę, że dobrze jest mieć oddzielne widoki, aby zmniejszyć złożoność if else conditions.

Jeśli nadal chcesz uniknąć oddzielnych plików, użyj

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

ten kod sprawdzi czy masz admin_form.ctp lub form.ctp które uczynią go użyć tego samego kodu do dodawania/edycji

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

1.3 podnosi formularzy automatycznie do miejsca, gdzie są z tego powodu, gdy przejdziesz do/edit/1, zostanie tam opublikowany, a/add doda do dodania.

to wszystko, co musisz zrobić. jeśli masz edycję znacznie różniącą się od dodania, po prostu utwórz 2 pliki. kiedy chcesz, żeby były takie same, po prostu zrób to samo.

0

w aplikacji sterownika

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); 
} 

iw widoku zawsze można sprawdzić, czy jego edycji lub dodać

if ($this->request->params['action'] == 'admin_edit') { 
    //do something 
} 
if ($this->request->params['action'] == 'admin_add') { 
    //do something 
} 
0

w edycji.CTP

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

// create rest of the fields 

kontroler :: add()

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

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

ma potrzeby tworzenia add.ctp