PHP Sammelthread: Zend Framework und alles was dazugehört

@DeathAngel2001

Das gleiche Prob hatte ich auch, wenn Du Windows Vista hast lasse Eclipse als Admin ausführen. Habe bemerkt das er es bei mir macht wenn ich beim schließen noch Dateien offen hatte, seit dem schließe ich alle vor den beenden.

Du musst nicht im AdminController in der init() Methode nochmal das Layout setzen. Du kannst es einmal in deiner Bootstrap setzen bzw wie bei mir im Front Controller Plugin und dazu nochmal einen Layout Controller Plugin "oder wie sich des schimpft" registrieren.

Bei mir habe ich es so und habe es so geändert das jedes Modul sein eigenes Layout haben kann, aber nicht muss. Genauso habe ich es mit den Menü Dateien gemacht. So kann jedes Modul ein eigenständiges Menü einbinden und wenn keins gefunden wird, wird einfach ein leerer String zurück gegeben.

Wenn Bedarf besteht kann ich auch mal hier meinen Layout Controller Posten, der ist net wirklich spektakulär und teils aus dem Einsteigerforum abgeschaut. Fand die Idee klasse.

*edit
Habe auch noch ne Frage an euch, seit ich Aptana drauf habe kann ich die tmx auch öffnen, allerdings möchte ich die Standartmäßig mit UTF-8 öffnen, sonst habe ich so komische Zeichen in der Datei. Ich finde aber die Einstellung dazu nicht.

XML Dateien können bei mir generell mit uft-8 aufgemacht werden, das würde mich nicht stören.
 
Habe auch noch ne Frage an euch, seit ich Aptana drauf habe kann ich die tmx auch öffnen, allerdings möchte ich die Standartmäßig mit UTF-8 öffnen, sonst habe ich so komische Zeichen in der Datei. Ich finde aber die Einstellung dazu nicht.
Also ich kann auch in der PDT Persoektive tmx-Dateien öffnen :roll:

In PDT zum umstelle: File auswählen --> Properties --> Text File Encoding
 
Hallo,
ich schalte mich auch mal ein ;)

Ich habe vor ein paar Tagen mit Zend angefangen, und hab jetzt mal ne kleine Frage:
Ich will ein Design einbinden, und bin dann so vorgegangen wie im Quickstart-Guide beschrieben. Jedoch ist meine komplette Struktur etwas anders aufgebaut wie im Tutorial.

Meine Bootstrap ist komplett in der index und den autoLoader hab ich nicht eingeschaltet.

hier mal die Index:
PHP:
//Error Reporting
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors','on');

//Modify include Path
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '../library/' );

//Zend Framework include
require_once("Zend/Loader.php");

Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Layout');

//Get Frontcontroller instance
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory('../application/controllers');
$front->throwExceptions(true);

//Render
$front->dispatch();

Zend_Layout::startMvc('../application/layouts/scripts');

$view = Zend_Layout::getMvcInstance()->getView();
$view->doctype('XHTML1_STRICT');

unset($view);
unset($front);
?>

und hier die /application/layouts/scripts/layout.phtml
PHP:
<?= $this->doctype() ?>
<html xmlns="https://www.w3.org/1999/xhtml"> 
<head>  
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <title>Zend Framework Quickstart Application</title>
  <?= $this->headLink()->appendStylesheet('/css/global.css') ?>
</head> 
<body>

<!-- 
    Layouts are a great place to put header and footer content that will be
    needed on all pages that share the same layout.  To understand fully what
    having layouts inside a MVC application mean, check out the Zend_Layout
    section of the manual.
    https://framework.zend.com/manual/en/zend.layout.html
    -->
<div id="header" style="background-color: #EEEEEE; height: 30px;">
    <div id="header-logo" style="float: left">
        <b>ZF Quickstart Application</b>
    </div>
    <div id="header-navigation" style="float: right">
        <!-- To keep urls consistent with the applications router (right now we
             are using the default router), we will employ the use of the url
             view helper
             https://framework.zend.com/manual/en/zend.view.helpers.html
             -->
        <a href="<?= $this->url(
            array('controller'=>'guestbook'), 
            'default', 
            true) ?>">Guestbook</a>
    </div>
</div>

<!-- This next call will now include any content that was generated in the
     dispatching of a controllers action (or series of actions).  -->

<?= $this->layout()->content ?>

<!-- If your application requires it, this would be a great place to put a
     footer for all pages. -->

</body>
</html>

Aber bei mir tut sich nix. Weiß einer worans liegt?

mfg Raze
 
PHP:
//Render
$front->dispatch();
Startet die Ausgabe der Daten an den Browser. Du musst also erst dein Layout setzen und dann den Output starten.

Edit: Ich glaube auch in layout.phtml musste es statt "<?= $this->layout()->content ?>" "<?= $this->content ?>" heißen.
 
So, nun hab ichs endlich geschafft, die Quicksteps mal komplett durchzusehen und ich bin jetzt so langsam dabei, mir die einzelnen Teile des ZFs mal durchzusehen, nun hab ich aber mal ein wenig geschaut, ob ich ein bisheriges Projekt ein wenig umbauen kann, so, dass es das ZF nach Möglichkeit durchgehen nutzt (nur zum Testen vorerst).

Nun meine Frage:
Bei ZendView wird ja im Prinzip der komplette <head>-Tag durch das ZF darstellbar gemacht, inwieweit ist es nun sinnvoll dies zu verwenden und wenn es sinnvoll ist, was füg ich beim Anfügen eines Stylesheets als Variable $conditionalStylesheet an, um nur den IE auf diese CSS loszulassen?:-?

[EDIT]
Ah, okay, war irgendwie zu einfach, ein einfaches "IE" reinzuschreiben, die Frage nach der Sinnhaftigkeit stellt sich trotzdem noch?
Und ne andere Frage hab ich auch noch:

Wenn ich
PHP:
$this->headLink()->appendStylesheet( 'style.css'));
mache, dann funktioniert das Stylesheet ja nur auf der Standardsite, jetzt will ich das Stylesheet aber natürlich auf allen Sites gültig machen, also dachte ich mir: Nimmste mal $this->url also folgendes:
PHP:
$this->headLink()->appendStylesheet($this->url(array('../..' => 'style.css')));
Aber dadurch werden die Pfade dann etwas sehr unschön, wenn dann z.B. folgendes rauskommt:
HTML:
style="height:35px; background-image:url(/index/index/../../images/footer.png);"
Lässt sich das irgendwie umgehen? :-?
[/EDIT]

Mfg
Sebmaster
 
Zuletzt bearbeitet:
Aber dadurch werden die Pfade dann etwas sehr unschön, wenn dann z.B. folgendes rauskommt:
HTML:
style="height:35px; background-image:url(/index/index/../../images/footer.png);"
Lässt sich das irgendwie umgehen? :-?

Theoretisch sollte sich das mit realpath() lösen lassen:
PHP:
$this->headLink()->appendStylesheet(realpath($this->url(array('../..' => 'style.css'))));
Wie immer ungetestet aber voller Zuversicht :ugly:

BTW: Meine ZF-Gehversuche lassen immernoch auf sich warten... :roll:
 
In deiner Layoutdatei:
PHP:
<?php echo $this->baseUrl() . '/' . $this->headLink(); ?>
Und dann im Ordner "views/helpers" eine BaseUrl.php
PHP:
<?php
class Zend_View_Helper_BaseUrl
{
	function baseUrl()
	{
		$fc = Zend_Controller_Front::getInstance();
		return $fc->getBaseUrl();
	}
}
 
Also wenn man sich mal die Zend-Startseite anschaut (umgesetzt mit dem ZF) dann sieht man, dass dort alle Bilder usw absolut zum public-Verzeichnis referenziert werden, das ist ein ganz netter Trick:
Code:
<img src="/images/somImage.png" />

Da ich auch gerne das Zf mal in Unterverzeichnisse packe gehe ich da einen etwas anderen Weg:
Ich setze das Html-Base-Element und referenziere meine Bilder dann relativ (ka warum das Beispiel es absolut macht):

Code:
<base href="https://example.com/someZfApp/" />

<img src="/images/somImage.png" />
Das lässt sich dann auch denke ich mit der baseUrl kombinieren
 


Danke für eure Vorschläge, auf solche Dinge muss man erstmal kommen, wobei mir deiner DeathAngel2001 besonders gefällt, weil
1. Was neues gelernt
2. Jetzt weiß ich wo ich meine Helpers reinpacken muss, ohne extra ein addPath zu machen:biggrin:

Also wenn man sich mal die Zend-Startseite anschaut (umgesetzt mit dem ZF) dann sieht man, dass dort alle Bilder usw absolut zum public-Verzeichnis referenziert werden, das ist ein ganz netter Trick:
Code:
<img src="/images/somImage.png" />
Da ich auch gerne das Zf mal in Unterverzeichnisse packe gehe ich da einen etwas anderen Weg:
Ich setze das Html-Base-Element und referenziere meine Bilder dann relativ (ka warum das Beispiel es absolut macht):

Code:
<base href="https://example.com/someZfApp/" />

<img src="/images/somImage.png" />
Das lässt sich dann auch denke ich mit der baseUrl kombinieren

Ach Mist, auf sowas muss man erstmal kommen, den base tag kannte ich noch gar nicht8O

Die Lösung gefällt mir aber auch am besten8)
 
Ich mache es auch so wie Ice aber ohne den <base href... also in CSS-Dateien und im Layout einfach nur absolute Pfade mit / beginnend. Geht genauso.

Den Sinn hinter <base href=... sehe ich bis heute nicht, weil ich noch nie Probleme hatte.
 
Den Sinn hinter <base href=... sehe ich bis heute nicht, weil ich noch nie Probleme hatte.

Ich denke, da geht es darum, das Projekt nicht mehr im Root-Ordner, sondern in einem etwaigen Unterordner zu erstellen also:

musterdomain.tld/Unterordner

und da kannst du dann nicht mehr mit "/" u. ohne <base> arbeiten.

EDIT:
Sinnhaftigkeit endlich erkannt, er ändert dann die Metas entsprechend auf XHTML bzw. HTML4 etc. um.

Da hab ich gleich nochmal eine Frage zu:
Reicht es (noch) in validem HTML4 zu programmieren, oder sollte ich mir gleich die Mühe geben, auf XHTML umzusteigen/umzulernen?
 
Zuletzt bearbeitet:
[..]Da hab ich gleich nochmal eine Frage zu:
Reicht es (noch) in validem HTML4 zu programmieren, oder sollte ich mir gleich die Mühe geben, auf XHTML umzusteigen/umzulernen?

So lange du mit deinem HTML4 alles darstellen kannst was du möchtest, warum nicht? ;)
Dennoch ist es immer praktisch sich der Zeit anzupassen und daher kann ein umstieg auf XHTML nicht schaden. Kannst dir ja immer mal ein wenig anschauen ;)
Ich denke nicht das da nun soo großartig viel anders ist.
Stell einfach mal einen XHTML 1.0 Transitional Doctype z.B. ein und lass die Seite durch den Validator jagen. Der sagt dir dann auch was falsch ist und daran erkennt man meist was nun genau Unterschiede zwischen HTML4 und XHTML (1.0 Transitional) sind.
 
Auweh, Doppelpost, bitte nicht hauen:-?

Aber hab wieder mal eine Frage: Gibt es eine Möglichkeit, einen "Controller" vor alle andern zu schalten (ohne den Bootstrapper zu verwenden) um z.B. einen Einlog-Vorgang zu realisieren?

Bzw. ist es möglich, das Layout dafür zu verwenden? (Womit mir eig. auch geholfen wäre)
 
Zuletzt bearbeitet:
Für solche Sachen habe ich mir einen Project_Controller geschrieben der bei mir in der library liegt. Von dem erben alle anderen Controller und dieser "Master Controller" erbt von Zend_Controller_Action.

In dieser init() vom "Master.." kannst Du sowas unterbringen. Du must nur aufpassen das Du in einer evtl. vorhanden init() Methode von den eigentlichen Controllern ein parent::init() aufrufst.

Es geht sicher eleganter, aber meine Variante ist mehr oder weniger in meinen Augen Quick and dirty, war ne fixe Idee von mir durch eine Überlegung von Ice mit static Views.

Das Layout ist für sowas nicht geeignet denke ich. Das einzige was man sich dazu anschauen könnte wenn es Dir doch helfen sollte ist der Action-View-Helfer
PHP:
$this->action(....
 
Heißt, ich müsste es also doch noch in den Front-Controller integrieren? (Ich wills nicht in jeden einzelnen Controller reinschreiben :biggrin:)

ein Front-Controller-Plugin hat den Sinn es nicht in jeden controller schreiben zu müssen, die Plugins agieren "neben" den Controllern.
Du könntest also dein code in die preDispatch des Plugins packen und könntest somit den Code aus den Controllern rauslassen

Edit: schau dir das mal an, um zu verstehen wann was ausgeführt wird ;)