2012-04-07 12 views
1

Ich versuche mein Bestes, um MVC und CakePHP zu lernen, und ich hatte eine Frage zum Übergeben von Arrays an die Ansicht. Momentan habe ich unten einen Basiscode.Übergeben von zwei Arrays vom Controller in CakePHP

Klasse AwarenesscampaignsController erweitert AppController {

public function view($id = null) { 
    $this->Awarenesscampaign->id = $id; 
    $this->set('data', $this->Awarenesscampaign->read()); 
} 

Dies ist, was ich "denken" zur Zeit geschieht.

AwarenesscampaignsController ist eingerichtet. Der View-Parameter fordert die ID an und gleicht sie mit der Model, Awareness-Kampagne ab. Dies stimmt mit der Datenbank überein und gibt ein Array zurück, das auf die Variable "$ data" gesetzt ist, und dann wird die Ansicht geladen.

Meine erste Frage: Ist mein Verständnis genau?

Was ich tun möchte, ist damit in der Lage sein, ein anderes Array von einem anderen Modell zu übergeben. Zum Beispiel möchte ich die Tabelle Posts (Controller: PostsController/Model: Post) abfragen.

Zum Beispiel war mein erster Versuch, den folgenden innerhalb der Funktion zu tun:

$ this-> post-> finden ('all');

Aber das ergibt den Fehler:

Indirekte Änderung von überladenen Eigenschaft AwarenesscampaignsController :: $ Beitrag hat keine Auswirkung [APP/Controller/AwarenesscampaignsController.php, Zeile 20]

Außerdem bin ich nicht sicher Wie würde ich beide Variablen an die Ansicht senden.

Zur Erinnerung:

  1. War mein Verständnis richtig?
  2. Wie frage ich eine Variable von einem anderen Controller/Modell?
  3. Wie sende ich dieses Array an die entsprechende Ansicht für diesen Controller?

Danke, -M

Antwort

2

Sie auf dem richtigen Weg sind, und tun es nicht per se falsch. Ich würde sagen, Ihr Verständnis ist ziemlich gut für einen Anfänger.

Standardmäßig lädt Cake automatisch ein Modell, von dem es denkt, dass es direkt mit dem Controller verknüpft ist. So können Sie in AwarenesscampaignController automatisch auf Awarenesscampaign (das Modell) zugreifen.

Es kennt jedoch kein anderes Modell. Eine Möglichkeit, könnte dies lösen ist, indem Sie die folgende Eigenschaft auf Ihrem Controller:

// This has to contain ALL models you intend to use in the controller 
public $uses = array('Awarenesscampaign', 'Post'); 

Das geht an der Spitze der Klasse, bevor Sie die Funktionen beginnen zu erklären. Es teilt Cake mit, dass Sie andere Modelle als die Standardversion verwenden möchten, aber Sie müssen diese auch zum Array hinzufügen, sonst verlieren Sie den Zugriff darauf.

Sie können auch loadModel in Ihrer Aktion verwenden, wenn es eine einmalige ist.Es zugegriffen dann die gleiche Art und Weise, wie Sie ein Modell normalerweise zugreifen würde:

public function view($id = null) { 
    $this->loadModel('Post'); 
    $posts = $this->Post->find('all'); 
    ... 
} 

Senden Sie dies Ihrer Ansicht nach können Sie set wieder anrufen, aber Sie möchten vielleicht data etwas besser lesbar, verändern und Verwirrung zu vermeiden :

public function view($id = null) { 
    ... 
    $this->set('campaign', $this->Awarenesscampaign->read()); 
    $this->set('posts', $this->Post->find('all')); 
} 

Sie werden als $campaign und $post bzw. zugänglich sein.

Eine Änderung, die ich machen würde, ist, nicht 'lesen' zu verwenden, es sei denn, Sie beabsichtigen, etwas zu bearbeiten. Sie können findByColumnName verwenden, um die gleichen Daten zu erhalten. Da Sie gerade einen id verwenden, können Sie findById nennen:

$campaign = $this->Awarenesscampaign->findById($id); 

Es gibt eine ganze Menge Magie los dort. Es bedeutet nur, dass Sie nach einem bestimmten Wert in einem kürzeren Format suchen können.

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html

Schließlich

, während Sie andere Modelle zugreifen können (wie gezeigt), können Sie nicht, oder im Allgemeinen sollte nicht, versuchen und Zugriff ein Controller von einem anderen. Wenn Sie Code haben, den Sie in mehr als einem Controller verwenden möchten, aber nicht in das Modell wechseln können, können Sie Components erstellen.

http://book.cakephp.org/2.0/en/controllers/components.html#creating-a-component

Das Handbuch ist ziemlich umfangreich. Obwohl manchmal schwierig zu navigieren, wird es oft eine Antwort auf die meisten Ihrer Fragen haben.

http://book.cakephp.org/2.0/en/

+0

Vielen Dank, dass Sie sich die Zeit genommen haben, die Fragen gründlich zu beantworten und mich weiter zu lesen. Ich schätze es sehr. – user1319580

2

1) Ihr Verständnis ist gut genug. Was dies tut, ist im Grunde eine Zeile der Datenbanktabelle mit Objekt zuzuordnen. Nach dem Festlegen der Modell-ID $this->Awarenesscampaign->id = $id verweist nun Model auf die Zeile der Datenbanktabelle, deren ID mit dem Wert übereinstimmt, der zum Anzeigen der Aktion übergeben wurde.

2) Sie können eine andere Tabelle abfragen, indem Sie die Methoden dieses bestimmten Modells aufrufen. Wenn Ihr Modell irgendwie mit dem aktuellen Modell verknüpft ist, in dem Sie sich befinden, können Sie die Aktion dieses Modells mit der Verkettung aufrufen. z.B. Wenn Ihr Post-Controller und Post-Modell mit dem Kommentar-Modell verknüpft ist, erhalten Sie die Daten, die Sie ketten können.

$comments = $this->Post->Comment->find(); 

Wenn jedoch Ihr Modell von Interesse nicht mit aktuellem Modell zugeordnet ist, gibt es mehr Möglichkeiten, Operationen von anderem Modell durchzuführen. Eine gute Option ist die Verwendung der Klassenregistrierung. Sagen Sie beispielsweise, dass Sie das Kundenmodell verwenden möchten, das nicht mit Ihrem aktuellen Modell zusammenhängt. In Ihrem Controller tun Sie

$customer= ClassRegistry::init("Customer"); 
    $customers= $customer->find(); 

3) mehr Variablen für die Ansicht setzen Sie sie über compact Funktion oder mit zugehöriger Zeile einstellen.

$posts = $this->Post->find(); 
    $comments = $this->Post->Comment->find(); 

    $this->set(compact('posts', 'comments')); 
    // or 
    $this->set('posts' => $posts, 'comments' => $comments); 
Verwandte Themen