2016-04-28 39 views
12

Saluti Non sono abbastanza sicuro su come realizzare la mia visione verso il mio progetto.Controller Design - multi sottomenu - tentativo di aggiungere un master

Iniziare, consente solo di concentrarsi sul controller Ordine.

Quindi il mio ordine è composto da molte sottoview. Ad esempio, dettagli, cronologia, indirizzo, file allegati, note, ecc. Li ho messi su un'interfaccia della scheda jQuery.

Mostriamo un po 'di codice.

layout.php

<div class="page-content"> 
     <div class="row"> 
     <div class="col-md-12"> 
     <ul class="nav nav-tabs responsive hidden-xs hidden-sm"> 

     <li class="<?php echo ($activeTabSub === "1") ? "active" : ""; ?>"> 
      <a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Master details</a> 
     </li> 
     <li class="<?php echo ($activeTabSub === "2") ? "active" : ""; ?>"> 
      <a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">History</a> 
     </li> 
     <li class="<?php echo ($activeTabSub === "wyk") ? "active" : ""; ?>"> 
      <a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Address</a> 
     </li> 
     <li class="<?php echo ($activeTabSub === "3") ? "active" : ""; ?>"> 
      <a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Files</a> 
     </li> 
     <li class="<?php echo ($activeTabSub === "4") ? "active" : ""; ?>"> 
      <a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Notes</a> 
     </li> 
     <li class="<?php echo ($activeTabSub === "7") ? "active" : ""; ?>"> 
      <a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a> 
     </li> 
      <li class="<?php echo ($activeTabSub === "8") ? "active" : ""; ?>"> 
      <a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a> 
     </li> 
     <li class="<?php echo ($activeTabSub === "9") ? "active" : ""; ?>"><a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a> 
     </li> 
     </ul> 
     </div> 
     </div> 
     <?PHP $this->load->view($widget,$activeTabSub); ?> 
     <?PHP $this->load->view($main_content,$activeTabSub); ?> 
</div> 

Nel mio esempio, la vista $ widget è una visualizzazione secondaria, che è un widget con gli strumenti, come diverso modificare/aggiungere i pulsanti per ogni singolo activeTabSub. $ Main_content è una vista html per ogni individuo.

E ora per il controller [Ordine]

public function functiontolink1() 
    { 
     $data['main_content'] = 'x/y'; 
     $data['widget'] = 'x/widget'; 
     $data['heading'] = ""; 
     $data['activeTab'] = 'pzlec'; 
     $data['activeTabSub'] = '2'; 
     $data['strona'] = 'text'; 
     $data['dzial'] = 'text'; 
     $seg= $this->uri->segment(3); 
     $data['zgl'] = $seg; 
     if(isset($seg)){ 
      $data['pracownicy'] = $this->Zlecenia_model->pracownicy($zgloszenie); 
      switch($this->userGroup){ 
        case 1 : 
          $data['main_content'] = 'x/y'; 
        break; 
        case 2 : 
          $data['main_content'] = 'x/y'; 
        break; 
        case 3 : 
         $data['widget'] = 'Client/x/widget'; 
         $data['main_content'] = 'Client/x/y'; 
        break; 
        default: show_404(); break; 

       } 
       $this->load->view('Client/x/layout',$data); 

     }else{ 
      show_404(); 
     } 
    } 

    public function functiontolink2() 
    { 

     $data['widget'] = 'x/widget'; 
     $data['heading'] = ""; 
     $data['activeTab'] = 'pzlec'; 
     $data['activeTabSub'] = '2'; 
     $data['strona'] = 'text'; 
     $data['dzial'] = 'text'; 
     $seg= $this->uri->segment(3); 
     if(isset($seg)){ 
      $data['zgl'] = $seg; 
      $data['json'] = $this->Zlecenia_model->getSingle($zgloszenie); 
      $vvv= json_decode($data['json']); 
      $data['client'] = $this->Order_model->getclient($vvv[0]->klient); 
      switch($this->userGroup){ 
        case 1 : 
          $data['main_content'] = 'x/y'; 
        break; 
        case 2 : 
          $data['main_content'] = 'x/y'; 
        break; 
        case 3 : 
         $data['widget'] = 'Client/x/widget'; 
         $data['main_content'] = 'Client/x/y'; 
        break; 
        default: show_404(); break; 

       } 
       $this->load->view('Client/x/layout',$data); 
      $this->load->view('zgloszenie/layout',$data); 
     }else{ 
      show_404(); 
     } 
    } 

Come potete immaginare, io ho 9 di queste funzioni di visualizzazione per ogni link. Il problema inizia quando desidero avere alcuni dati i dati dei clienti in tutte queste 9 sottoview - chiamato solo una volta non tutte le pagine colpite [scheda]. Non sono del tutto sicuro se il mio tentativo di progettazione è buono. Hai qualche suggerimento?

+0

Puoi cancellare questo con un esempio. È difficile da capire. –

+0

Purtroppo nop, questo è il meglio che potrei descrivere –

+0

Generalmente un'idea di più sottopagine che possono ereditare i dati dal contenuto principale senza eseguire la query principale su ogni sottopagina direi così –

risposta

2

se il menu della scheda sta lavorando si potrebbe tamponare tutte le viste in uno solo. Suppongo che stiate utilizzando bootstrap dal vostro codice di esempio. Ecco come suggeriscono di scrivere il tuo markup per le schede. http://getbootstrap.com/javascript/#tabs-examples Potrebbe essere necessaria qualche configurazione javascript per farli funzionare, quindi è necessario leggere attentamente i documenti. Io non sono un ragazzo di bootstrap, quindi posso offrire un piccolo aiuto.

<ul class="nav nav-tabs" role='tablist'> 
    <li role="presentation" class='active'> 
     <a href='#widget1' data-toggle="tab">widget1</a> 
    </li> 
    <li role="presentation"> 
     <a href='#widget2' data-toggle="tab">widget2</a> 
    </li> 
</ul> 

<section class='tab-content'> 
    <div class='tab-pane active' id='widget1'> 
     <?php $this->load->view($widget1); ?> 
    </div> 
    <div class='tab-pane' id='widget2'> 
     <?php $this->load->view($widget2); ?> 
    </div> 
</section> 

di costruire un modello principale per avvolgere tutti i vostri punti di vista, si vorrebbe estendere la classe CI_Controller e semplicemente impostare una proprietà denominata modello, che punterà al vostro modello

class MY_Controller extends CI_Controller 
{ 
    public $template; 

    public function __construct(){ 
     parent::__construct(); 
     // set the template in the constructor 
     // as this is where you should assign variables 
     // If you had an admin controller, you would create an admin controller 
     // extending this one, and override the $template variable. 
     $this->template = 'template/index' // views/template/index.php 
    } 
} 

views/template/index.php Questa è la sua opinione padrone abbiamo creato estendendo CI_Controller

<html> 
    <head></head> 
    <body> 
    <?php 
     // load "view" variable ANY controller sends us 
     $this->load->view($view); 
    ?> 
    </body> 
</html> 

class Controller extends MY_Controller //extending the MY_Controller 
{ 
    public function index() 
    { 
     $data = array('username'=>'stackoverflow'); 

     return $this->load->view($this->template, array(
      'view' => 'your_main_view_with_tab_menu', 
      // the next two views are buffered as a string 
      // so you can easily inject them into your main tab menu view 
      // by setting the third paramter as true 
      'widget1' => $this->load->view('widget1_view', array('data' => $data), true), 
      'widget2' => $this->load->view('widget2_view', array('data' => $data), true) 
     )); 
    } 
} 
+0

Questa mi sembra la soluzione migliore, puoi aggiungere più codice per questo? Non so da dove viene il tema $ this->. Inoltre, quando si tratta della query, desidero accedere a globaly nell'indice delle funzioni. Diciamo che ho cliccato su #first_link, la query è stata eseguita e quando ho cliccato su #second_link probabilmente lo farà anche, è probabile che si chiami una volta se possibile –

2

ok - prefazione questo disclaimer che stile di codifica è personale, e alcune persone non saranno affatto d'accordo con quello che sto per suggerire.

la mia impressione di ciò che si sta facendo - è che si sta tentando di fare tutto nel controller o nella vista.proprio qui questo codice nel controller

$data['main_content'] = 'x/y'; 
     $data['widget'] = 'x/widget'; 
     $data['heading'] = ""; 
     $data['activeTab'] = 'pzlec'; 
     $data['activeTabSub'] = '2'; 
     $data['strona'] = 'text'; 
     $data['dzial'] = 'text'; 

questo è troppo specifico. un controller dovrebbe essere un boss di alto livello - che non ti preoccupi dei dettagli di basso livello. "Prendimi dal database - è tornato? Se sì, allora fallo, se non lo fai allora."

in un altro modo: i dettagli di basso livello cambieranno costantemente. devi pianificare per quei cambiamenti. e non si desidera modificare costantemente i controller in quanto qualsiasi errore causerà l'arresto dell'applicazione.

questo è quello che i modelli sono per. di nuovo la gente discuterà con questo e dirà no dovrebbe essere Biblioteche o Aiutanti o qualsiasi altra cosa. il punto è che vuoi isolare questi dettagli di basso livello e vuoi metterli in un posto dove ha senso. quindi tra sei mesi puoi guardare i nomi dei file e avere un'idea decente dove devi andare per fare aggiornamenti. è meglio avere 10 modelli con nomi specifici e compiti specifici, quindi alcuni super-modelli che stanno cercando di fare troppo.

e parlando di provare a fare troppo - refactoring quei metodi di controller in modo che non stanno cercando di fare tante cose diverse. per esempio, perché dovresti inserire una serie di dati se stai per mostrare un 404 perché $ seg non c'è? controllare se $ seg è valido dovrebbe essere il primo compito. se è valido, vai al metodo successivo. e se non è valido, allora non mostrare un 404 - mostra una pagina educata specifica dell'errore. poi quando succede, hai la possibilità di capire qual è il problema.

infine vorrei suggerire - rendere il modello di layout completamente neutro - in altre parole nessun codice html. chiama solo altre visualizzazioni. ancora che cosa fa? spinge i dettagli di basso livello, come il codice di layout html e css, ai propri file. il modello di layout chiama solo le viste di layout. quindi quando è necessario apportare modifiche, è chiaro dove andare e se si commette un errore non si abbassa improvvisamente il modello - lo si è limitato a un file di visualizzazione, che sarà molto più facile da gestire.