2016-04-28 4 views
12

Grüße Ich bin mir nicht ganz sicher, wie ich meine Vision in meinem Projekt zu erfüllen.Controller Design - Multi Unteransicht - versuchen, einen Master hinzuzufügen

Beginnen wir, konzentrieren wir uns nur auf den Bestell-Controller.

So besteht meine Bestellung aus vielen Unteransichten. Zum Beispiel, Details, Geschichte, Adresse, angehängte Dateien, Notizen usw. Ich habe sie auf eine jQuery-Registerkarte Schnittstelle.

Lassen Sie uns etwas Code zeigen.

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> 

In meinem Beispiel das $ Widget-Ansicht ist ein Subview, die ein Widget mit Werkzeugen, wie verschiedenen bearbeiten/hinzufügen Schaltflächen für jede einzelne activeTabSub. Der $ main_content ist eine HTML-Ansicht für jede Person.

Und jetzt für den Controller [Auftrag]

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

Wie Sie sich vorstellen können, ich habe 9 dieser Ansicht Funktionen für jeden Link. Das Problem beginnt, wenn ich einige Daten haben möchte, d. H. Client-Daten über alle 9 Subviews - nur einmal nicht jede Seite aufgerufen [Tab]. Ich bin mir nicht ganz sicher, ob mein Design-Versuch überhaupt gut ist. Hast du ein paar Vorschläge?

+0

Können Sie dies mit einem Beispiel löschen. Es ist schwer zu verstehen. –

+0

Leider nein, das ist das Beste, was ich beschreiben könnte –

+0

Es ist im Allgemeinen eine Idee von mehreren Unterseiten, die Daten aus dem Hauptinhalt erben können, ohne die Hauptabfrage auf jeder Unterseite auszuführen, würde ich sagen –

Antwort

2

Wenn Ihre Registerkarte Menü funktioniert, können Sie alle Ihre Ansichten in einem Puffer. Ich nehme an, Sie verwenden bootstrap von Ihrem Beispielcode. Hier ist, wie sie vorschlagen, dass Sie Ihr Markup für die Registerkarten schreiben. http://getbootstrap.com/javascript/#tabs-examples Einige Javascript-Konfiguration erforderlich sein, um sie zum Laufen zu bringen, so dass Sie die Dokumente sorgfältig lesen müssen. Ich bin selbst kein Bootstrap-Typ, also kann ich wenig Hilfe anbieten.

<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> 

eine Mastervorlage bauen alle Ihre Ansichten umschlingen, können Sie die CI_Controller Klasse erweitern möchte und einfach eine Eigenschaft namens Vorlage festgelegt, die auf Ihre Vorlage Punkt

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 Das ist Ihre Masteransicht wir durch die Erweiterung CI_Controller

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

erstellt
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

Dies scheint für mich die beste Lösung zu sein, können Sie mehr Code für diesen hinzufügen? Ich weiß nicht, woher das $ this-> Theme kommt. Wenn es um die Abfrage geht, möchte ich global im Funktionsindex zugreifen. Sagen wir, ich treffe den #first_link, die Abfrage wird ausgeführt und wenn ich den #second_link treffe, wird es wahrscheinlich auch, sollte es wenn möglich einmal aufgerufen werden –

2

ok - Vorwort dies durch Disclaimer, die Codierung Stil persönlich ist, und Manche Leute werden überhaupt nicht zustimmen mit dem, was ich vorschlagen werde.

Mein Eindruck von dem, was Sie tun - ist, dass Sie versuchen, alles entweder in der Steuerung oder der Ansicht zu tun.Hier ist dieser Code in Ihrem Controller

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

das ist viel zu spezifisch. Ein Controller sollte ein High-Level-Boss sein - dass Sie sich nicht mit den Low-Level-Details beschäftigen. "Hol mir das aus der Datenbank - ist es zurück gekommen? Wenn ja, mach das. Wenn du das nicht tust."

anders ausgedrückt - die Low Level Details werden sich ständig ändern. Sie müssen diese Änderungen planen. und Sie möchten Ihre Controller nicht ständig ändern, da ein Fehler Ihre Anwendung zum Absturz bringt.

so das ist was Modelle sind für. Wieder werden sich die Leute dagegen aussprechen und nein sagen, es sollten Bibliotheken oder Helfer sein oder was auch immer. Der Punkt ist, dass Sie diese Details auf niedriger Ebene isolieren möchten und sie an einem Ort platzieren möchten, an dem es Sinn macht. In sechs Monaten können Sie sich also die Dateinamen ansehen und eine gute Idee haben, wo Sie Aktualisierungen vornehmen müssen. es ist besser, 10 Modelle mit spezifischen Namen und spezifischen Aufgaben zu haben, dann ein paar Super-Modelle, die versuchen, zu viel zu tun.

und davon sprechen, zu viel zu tun - Refactor diese Controller-Methoden, so dass sie nicht versuchen, so viele verschiedene Dinge zu tun. zum Beispiel warum würden Sie eine Reihe von Daten einziehen, wenn Sie eine 404 zeigen, weil $ seg nicht da ist? Prüfen, ob $ seg gültig ist, sollte die erste Aufgabe sein. Wenn es gültig ist, dann gehe zur nächsten Methode. und wenn es nicht gültig ist, zeigen Sie keine 404 - zeigen Sie eine höfliche Seite an, die für den Fehler spezifisch ist. Dann, wenn es passiert, haben Sie eine Chance herauszufinden, was das Problem war.

schließlich würde ich vorschlagen - machen Sie Ihre Layout-Vorlage völlig neutral - mit anderen Worten kein HTML-Code. Es ruft nur andere Ansichten auf. wieder was macht das? es verschiebt die Low-Level-Details - wie HTML- und CSS-Layout-Code - in ihre eigenen Dateien. Die Layout-Vorlage ruft nur die Layout-Ansichten auf. Wenn Sie also Änderungen vornehmen müssen, ist klar, wohin Sie gehen müssen. Wenn Sie einen Fehler machen, wird Ihre Vorlage nicht plötzlich ausgeblendet. Sie haben sie auf eine View-Datei beschränkt, die viel einfacher zu handhaben ist.

Verwandte Themen