• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

viewRenderer Erweiterung - mehrere Layouts usw

dinok

New member
Hallo,

erstmal entschuldigung für die dumme Überschrift :p
Aber ich habe mir gedacht, dass es keinen Sinn macht 100 Lösungen für Layouts zu haben, weshalb ich mir einfach eine gute selber geschrieben habe.
Auf Basis von http://akrabat.com/2007/06/02/extending-viewrenderer-to-support-layout-templates/
diesem kleinen Codeschnipsel.

Funktionen
  • Mehrere Layouts im Controller noch auswählbar via Schlüssenwort^^
  • Eigener View / Pfade wählbar
  • Default Layout wählbar
  • Layout aus Controller "abschalten" für eine einzelne Aktion
So hier mal ein kleines Beispiel
bootstrap.php
PHP:
require_once 'Extension/Controller/Action/Helper/ViewRenderer.php';
$viewRenderer = new Extension_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setLayoutScriptPath(ZF_PATH_ROOT . '/modules/frontend/default/views/scripts/_layouts/');
$viewRenderer->setDefaultLayoutScript('mylayout.phtml');
$viewRenderer->addLayoutScript('red.phtml', 'red');
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
controller
PHP:
// wähle Layout mit dem Tag 'red' statt 'default'
$this->_helper->viewRenderer->setCurrentLayoutName('red');
// deaktiviere das Layout (Bsp für XML Ausgabe o.ä.)
$this->_helper->viewRenderer->setNoLayout();
layout.phtml
PHP:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <title><?php echo $this->escape($this->pageTitle);?></title>
</head>
<body>
<div id="header" style="height: 100px; margin: 0; background-color: lightgrey; border: 1px solid black">
    ...header...
</div>

<div id="content" style="margin: 20px;">
<? echo $this->render($this->actionScript); ?>
</div>

<div id="footer" style="height: 25px; margin: 0; background-color: lightgrey; border: 1px solid black">
    ...footer...
</div>
</body>
</html>
Beispiele finden sich unten im Thread (http://www.zfforum.de/showpost.php?p=4216&postcount=9)

Ich hoffe ihr könnt es gebrauchen, konstruktive Kritik erwünscht :)
Gruß
 

Anhänge

Zuletzt bearbeitet:

dinok

New member
Naja stell dir mal vor, du musst in jedem ViewScript immer den Header / Footer von Hand einfügen, zB in 10 ViewScripts... Jetzt fällt dir aber ein, du brauchst ihn gar nicht immer in jeder Aktion (oder eben nicht den gleichen, sondern einen anderen...). Dann darfst du 10 Dateien ändern :D Oder wenn man eben aus der Aktion heraus etwas ändern will (bsp andere Stylesheets weil der User ein anderes Layout gewählt hat). So lädst du einfach das Layout neu (eine Zeile im Controller). Sag mir mal wie du dafür zB eine schnelle Lösung findest (okay, viewHelper der Layouts je nach Parameter rendert, aber das ist auch schonwieder viel komplizierter).
Hier hat man eine eine einfach zu überschauende Lösung...
Hoffe ich konnte dir helfen
 

marce23

New member
Also wenn ich das richtig verstanden hab, dann kann man somit vermeiden, dass man in jedem Action-Template
EDIT: dinok war schneller deswegen dieser Doppelpost

PHP:
<?php echo $this->render('header.phtml'); ?>
...
<?php echo $this->render('footer.phtml'); ?>
stehen hat.
Man hat also eine Grundlayout-Datei die Header und Footer zusammenführt und dann noch das Action Template automatisch reinsetzt...

Oder?
 

dinok

New member
Ja, ich lade nachher mal noch ein Zip mit Beispielen hoch was man so alles machen kann^^ Muss jetzt aber los
 

jpieper

New member
Also wenn ich das richtig verstanden hab, dann kann man somit vermeiden, dass man in jedem Action-Template
EDIT: dinok war schneller deswegen dieser Doppelpost

PHP:
<?php echo $this->render('header.phtml'); ?>
...
<?php echo $this->render('footer.phtml'); ?>
stehen hat.
Man hat also eine Grundlayout-Datei die Header und Footer zusammenführt und dann noch das Action Template automatisch reinsetzt...

Oder?
Eigentlich habe ich für sowas in einer zentralem ViewScript, dann brauch man auch ned mehr in allen Dateien rumfuschen, wenn mal ne Änderung kommt. Wenn ich dann ein anderes ViewScript für solche Ausgaben haben muss/will, dann habe ich dafür eine mainScript Variable in der Standard "main.phtml" steht, was ich dann im Skript ändern kann.
 

SRIT

New member
Eigentlich habe ich für sowas in einer zentralem ViewScript, dann brauch man auch ned mehr in allen Dateien rumfuschen, wenn mal ne Änderung kommt. Wenn ich dann ein anderes ViewScript für solche Ausgaben haben muss/will, dann habe ich dafür eine mainScript Variable in der Standard "main.phtml" steht, was ich dann im Skript ändern kann.
Ich mache es ähnlich und denke auch, dass es die sinnvollste Lösung ist, anstatt da nen extra Controller für herzunehmen (nur wieder unnütz Resourcen), aber wers braucht...
 

dinok

New member
Für alle die hier ihre konstruktive Kritik mit einem extra Controller oder sonst was bringen, wär es wohl mal angebracht den Beitrag genau zu lesen, worauf man wohl auf einen Link klicken sollte und das ganze durchlesen sollte ohne gleich irgend einen sinnlosen Kommentar abzugeben :rolleyes: Es steht hier nichts von einem extra Controller, SRIT. Es ist lediglich ein ActionHelper und keine neue Action (also neuer Controller).
Und in dem Link oben steht auch nichts von einem neuen Controller -_-

PHP:
<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';

class LayoutController extends Zend_Controller_Action
{
    // default layout, nothing to do :-)
    public function indexAction() {
        $this->view->pageTitle = 'default layout';
    }
    
    // red layout
    public function redAction() {
        $this->_helper->viewRenderer->setCurrentLayoutName('red');
        $this->view->pageTitle = 'red layout';
    }

    // no layout
    public function noAction() {
        $this->_helper->viewRenderer->setNoLayout();
        $this->view->pageTitle = 'no layout';
    }    
    
    // add layout in a action
    public function addAction() {
        $this->_helper->viewRenderer->addLayoutScript('blue.phtml', 'blue');
        $this->_helper->viewRenderer->setCurrentLayoutName('blue');
        $this->view->pageTitle = 'blue layout';
    }    
        
}
Aufgrund des Updates auf RC2 geht der ViewRenderer derzeit nicht 100% richtig und ich werde es morgen mal noch anschauen woran es liegt.

Ps: Versteht mich nicht falsch, aber mich nervt es echt wenn man sich etwas Mühe gibt bei dem was man Codet und dann irgendjemand seinen Senf hinzu gibt, ohne alles gelesen zu haben.

Edit: Und das ist nur ein BeispielController wie z.B. für einen NewsController usw und kein extra Controller
 

KingCrunch

New member
Mich persönlich nervt es zudem, wenn immer von "unnötige Ressourcen" und "Effizienz" geredet wird, ohne die Größenordnung zu kennen .... Aber seit in einem anderen Forum jemand der festen und unbeugbaren Überzeugung war alles in Funktionen programmieren zu müssen, weil Klassen und Objekte "voll Speicher und Performance" brauchen, sag ich dazu nichts mehr, ausser: Programmierts lieber gleich in Assembler!

@dinok: Das spricht nicht gegen deine Implementation ;) Mir is das Argument bloss etwas zuwider.
 

Blackflash

New member
Ich finde, du bist auf 'nem guten Weg. Leider fehlen mir noch einige Features, weshalb ich (noch) bei meiner eigenen Lösung bleibe, die allerdings eher ein Relikt aus alten Tagen und noch nicht mal als ActionHelper implementiert ist.
Mir fehlen Features mit denen ich mehr im Header steuern kann, z.B. dynamisch Stylesheets/Scripts und Meta-Tags hinzufügen. So kann es durchaus sinnvoll sein, wenn man die nicht irrelevanten Keywords für jede Seite dynamisch einfügt.
 

SRIT

New member
Für alle die hier ihre konstruktive Kritik mit einem extra Controller oder sonst was bringen, wär es wohl mal angebracht den Beitrag genau zu lesen, worauf man wohl auf einen Link klicken sollte und das ganze durchlesen sollte ohne gleich irgend einen sinnlosen Kommentar abzugeben :rolleyes: Es steht hier nichts von einem extra Controller, SRIT. Es ist lediglich ein ActionHelper und keine neue Action (also neuer Controller).
Und in dem Link oben steht auch nichts von einem neuen Controller -_-

PHP:
<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';

class LayoutController extends Zend_Controller_Action
{
    // default layout, nothing to do :-)
    public function indexAction() {
        $this->view->pageTitle = 'default layout';
    }
    
    // red layout
    public function redAction() {
        $this->_helper->viewRenderer->setCurrentLayoutName('red');
        $this->view->pageTitle = 'red layout';
    }

    // no layout
    public function noAction() {
        $this->_helper->viewRenderer->setNoLayout();
        $this->view->pageTitle = 'no layout';
    }    
    
    // add layout in a action
    public function addAction() {
        $this->_helper->viewRenderer->addLayoutScript('blue.phtml', 'blue');
        $this->_helper->viewRenderer->setCurrentLayoutName('blue');
        $this->view->pageTitle = 'blue layout';
    }    
        
}
Aufgrund des Updates auf RC2 geht der ViewRenderer derzeit nicht 100% richtig und ich werde es morgen mal noch anschauen woran es liegt.

Ps: Versteht mich nicht falsch, aber mich nervt es echt wenn man sich etwas Mühe gibt bei dem was man Codet und dann irgendjemand seinen Senf hinzu gibt, ohne alles gelesen zu haben.

Edit: Und das ist nur ein BeispielController wie z.B. für einen NewsController usw und kein extra Controller
Weil ich den Helper/ Controller oder was auch immer sinnlos finde, sind meine Comments auch sinnlos? Wieso das? Ich habe nur nach außen getragen , was ich davon halte und das ist einfach, dass ich das sinnlos finde, darf ich das nicht? Das ist am Ende nun mal so, dass man bei einigen Sachen, die man so macht nicht immer gleich mit Blumen beschmissen wird, ob man sich nun Mühe gegeben hat oder nicht...
Die Jungs die Zend_Form in den Core haben wollten, haben sich sicher auch Mühe gegeben, mit dem was sie gemacht haben, trotzdem flog das Teil ins Lab - Repo...

@KingCrunch ich kann leider kein Assembler :D
 

dinok

New member
So also es geht jetzt wieder alles, war ein Fehler bei mir und nicht vom Update :p

Ich finde, du bist auf 'nem guten Weg. Leider fehlen mir noch einige Features, weshalb ich (noch) bei meiner eigenen Lösung bleibe, die allerdings eher ein Relikt aus alten Tagen und noch nicht mal als ActionHelper implementiert ist.
Mir fehlen Features mit denen ich mehr im Header steuern kann, z.B. dynamisch Stylesheets/Scripts und Meta-Tags hinzufügen. So kann es durchaus sinnvoll sein, wenn man die nicht irrelevanten Keywords für jede Seite dynamisch einfügt.
Wie würdest du denn die Stylesheets/Scripts setzen wollen? Also im Controller oder wie?! Ist aber vom Prinzip her kein Problem, da man hierfür wohl sowieso selber seine Lösung nehmen sollte.
Aber wie es geht:

ViewRenderer.php
PHP:
/**
* Add your custom stuff here!
*/
public function createMetaTags() {
     // get meta tags (for example via simple xml, array...)
     $metaTagsSource = array('Content-Type' => 'text/html; charset=UTF-8');
     // ...
     $this->view->metaTags = $result;
}
Und dann im Layout einfach $this->metaTags im Header.
Ist halt auch die Frage von wo aus man es setzen will (bootstrap oder Controller?)

@SRIT: Deine Kritik bezog sich lediglich darauf, dass du einen ExtraController für Resourcenverschwendung gehalten hast... Nicht das du einen Helper schlecht findest -_-
 

Blackflash

New member
Z.B. könnte man es so machen. Ich denke, der Controller ist der beste Ort für Dynamisierung des HTML-Headers. Wie man das macht, weiß ich selbst, ich wollte dich nur mit meiner Kritik beglücken. ;-)
 

TeeJay

New member
Huhu, hab mal ne Frage zur Integration von view helpern. Ich würde ganu gerne eigene Viewhelper benutze, dazu muss ich der view jedoch miteilen wo sie suchen muss. Der viewrenderer besitzt anscheinend keine Möglichkeit, die helperpaths zu setzen, der er das Zend_View_Interface implementiert. Habt Ihr da ne Idee wie man in diesem Konzepz view-helper benutzen kann.
Gruß Thomas
 

KingCrunch

New member
Der viewrenderer besitzt anscheinend keine Möglichkeit, die helperpaths zu setzen,
Doof gefragt: Wozu auch? Der viewRenderer untersützt nur die View (zumal der viewRenderer eh nen actionHelper ist und kein viewHelper ;))
der er das Zend_View_Interface implementiert.
Und wie kommst du darauf? Der viewRenderer implementiert Zend_Controller_Action_Helper_Abstract ^^
Habt Ihr da ne Idee wie man in diesem Konzepz
Setz den Helper-Pfad ganz normal in die View ^^
 

TeeJay

New member
ich Instanziere aber keine View da ich den Viewrenderer benutze, und der viewrenderer stellt eben nur eine view Instanz vom type Zend_View_Interface zur Verfügung.

Erstelle ich eine View erweitert die von Zend_View_Abstract, die eben die Helperpath funktionen zur Verfügung stellt. Der view renderer aber nicht. Seh ich das Falsch?

PHP:
public function __construct(Zend_View_Interface $view = null, 
                                array $options = array())
    {
        parent::__construct($view, $options);
    }
meine anliegen bezieht sich darauf, da ich die helperpaths auf Bootstrapebene setzen möchte (in meiner settings.php). Ich versuche mal den Helper, um die Funktionen zu erweitern.

Gruß Tee
 

KingCrunch

New member
ich Instanziere aber keine View da ich den Viewrenderer benutze, und der viewrenderer stellt eben nur eine view Instanz vom type Zend_View_Interface zur Verfügung.
Ja und nein! natürlich nutzt du eine View, wie solln das auch sonst gehen? Wenn du selbst keine View instanzierst, dann macht es der viewRenderer für dich (weiterhin zu finden im Controller-Attribut view). Und was meinst du mit "stellt Interface zu Verfügung"? Oo

Was spricht dagegen den Inhalt deiner Einstellungen an den Controller zu übergeben? Der kann dann problemlos in deinem View-Objekt anhand deiner Einstellungen den Pfad setzen.
 

TeeJay

New member
Sorry , für meine Begriffstutzigkeit steh hier aber voll aufm Schlauch.

Exception --> helper 'getRole' not found in path

imController habe ich der view mitgeteil wo sich der viewHelper befindet
$this->view->setHelperPath('/Applications/mamp/htdocs/WWW/application/helper/','My_Global_View_Helper');


die Pfade die ich jetzt der view mitgebe sind Hundertprozentig richtig. In dem helper Verzeichnis befindet sich eine PHP Datei die folgendermaßen heißt "My_Global_View_Helper_GetRole"

PHP:
class My_Global_View_Helper_GetRole
{
    public function getRole()
    {
        return 2;
    }
}

in meiner view sage ich ---> echo $this->getRole();

kein Plan was ich falsch mache ist alles so wie im Manual !
 

KingCrunch

New member
Öhm ... sehe auf Anhieb auch keinen Fehler... Hmm... Pfad stimmt (ausgehend vom Docroot, weil absolute Angabe)? Schon View-Objekt ausgeben lassen, ob der Pfad drin steht? Wird die Zeile, wo der Pfad übergeben wird, 100%ig ausgeführt? Schonma letzten Slash von der Pfadangabe entfernt?
 
Oben