2012-07-24 13 views
9

Sto lavorando su un CMS in Codeigniter e una parte principale è un modulo per la creazione e la modifica di post.Codeigniter: una vista per aggiungere e modificare un post

Ho intenzione di utilizzare lo stesso file di visualizzazione per entrambi poiché tutti gli elementi sono condivisi. L'unica differenza sarebbe che il modulo è vuoto durante la creazione e viene popolato durante la modifica. È questa la strada giusta da fare?

Stavo pensando di avere un metodo per ciascuno, quindi postare/creare e pubblicare/modificare ($ id).

Nel metodo creare nel controller dopo ho tutti i dati del modulo come questo (per gli errori):

$this->data['item_title'] = array(
    'name' => 'item_title', 
    'id' => 'item_title', 
    'type' => 'text', 
    'value' => $this->form_validation->set_value('item_title'), 
); 

sto pensando solo modificando il valore per contenere il valore database invece di SET_VALUE (), quindi qualcosa come:

public function edit($id) { 

$post_data = $this->post_model->get_post_data($id) 

     $this->data['item_title'] = array(
     'name' => 'item_title', 
     'id' => 'item_title', 
     'type' => 'text', 
     'value' => $post_data['post_title'], 
    ); 
} 

Sono sulla strada giusta o c'è un modo migliore per avvicinarsi a questo? Dovrei solo usare 2 visualizzazioni?

risposta

7

uso uno _form.php parziale condiviso da una nuova azione di modifica e modifica.su entrambe le azioni ho le stesse validazioni quindi le ho spostate al costruttore del controllore, quindi per ogni input ho appena usato un operatore ternario che dice se il valore esistente $title è stato compilato, quindi utilizzare il valore <input>, altrimenti utilizzare l'helper codeigniter set_value() per popolare con il valore di convalida.

<input type="text" name="title" value="<?php echo isset($title) ? set_value("title", $title) : set_value("title"); ?>" /> 
+0

Non funziona quando si modifica post e si restituisce la convalida del modulo falso. – Hossein

+0

' "/>' – Hossein

2

Di solito uso una vista con alcune variabili al suo interno. I valori dei campi possono essere impostati dai dati dal server oppure possono essere lasciati vuoti. A seconda che i dati vengano forniti o meno, cambio l'azione che verrà utilizzata dal modulo perché potrebbe essere aggiunta o modificata.

questo dovrebbe essere il metodo più efficiente, in quanto utilizza il concetto di riutilizzabilità :)

Un esempio veloce

<form action="<?php echo !$data ? "admin/add" : "admin/edit" ?> method="post"> 
    <input type="text name="test" value="<?php echo $data['test'] ? $data['test'] : "" ?>" /> 
</form> 
1

Io non sono pro a CodeIgniter (molto meglio a CakePHP), ma nel cuore di MVC è che una azione ha una vista.

Non hai motivo di inserirlo in un'unica visualizzazione. :)

+1

in rubino su rotaie, nel codice di ponteggio generato ci sono due viste con nomi diversi ma internamente utilizzano un partial che contiene la stessa forma. questo è il principio Dont Repeat Yourself (DRY). se si guardano le viste di aggiunta e modifica, è possibile duplicare un bel po 'di codice, soprattutto quando diventano più complessi. –

0

È certamente possibile, come faccio tutto il tempo.

Normalmente, vorrei avere:

azione

function edit($PageID = -1) 
{ 
    $Page = new stdClass(); 
    if($PageID === -1) 
    { 
     $Page->Title = $Page->Description = $Page->Keywords = ''; 
     $Page->PageID = -1; 
    } 
    else 
    { 
     $this->load->model('page_model'); 
     $Page = $this->page_model->GetByPageID($PageID); 
     if(empty($Page)) 
     { 
      show_404(); 
      return; 
     } 
    } 
    if($this->input->post('Save', true) !== false) 
    { 
     // perform validation 
     if($PageID === -1) 
     { 
      // insert 
     } 
     else 
     { 
      // update 
     } 
    } 
    $data = array 
    (
     'Page' => $Page 
    ); 
    $this->load->view('edit_page', $data); 
} 

View

<?= form_open(); ?> 
    <fieldset> 
     <label for="title">Title: </label> 
     <input type="text" name="title" id="title" value="<?= Form::Get('title', $Page->Title); ?>" /> 
     <br /> 
     <label for="description">Description: </label> 
     <input type="text" name="description" id="description" value="<?= Form::Get('description', $Page->Description); ?>" /> 
     <br /> 
     <label for="keywords">Keywords: </label> 
     <input type="text" name="keywords" id="keywords" value="<?= Form::Get('keywords', $Page->Keywords); ?>" /> 
     <br /> 
     <input type="submit" name="Save" value="Save" /> 
    </fieldset> 
</form> 

Modifica

Spiacente, avrei dovuto menzionare, Form::Get non è una funzione CodeIgniter, ma una che ho creato. Semplicemente, prende il percorso del valore Post che devi leggere. Se non esiste, cioè non hai postato, allora mostrerà semplicemente il valore dal secondo parametro.

Se riesco a estrarre il codice per te, lo posterò.

Problemi correlati