PHP Sammelthread: Zend Framework und alles was dazugehört

so.. habe die nacht drüber geschlafen :D
leider war es gestern das ein oder andere bier zu viel.. demnach geht heute in richtung konzeption gar nix.. ich setze den von mir geposteten ansatz erstmal um.. fürs erste werden es nur 3 models sein.. mit denen bin ich schonmal gut beschäftigt..

die ordnerstruktur habe ich ein wenig abgeändert.. in den jeweiligen model ordnern gibt es 3 unterordner:
- Mapper
- Interface
- DbTable

ansonsten müsste ich für jedes model nen einzelnen ordner machen.. das sind mir irgendwie zu viele ordner :D

wenn ich jetzt beim umsetzen der 3 models, die ich fürs erste ins auge gefasst habe, entscheide, dass ich doch ne factory methode für die models möchte, dann hält sich das refactoring auch in grenzen, da es ja nur 3 stück sind..

edit: die ordnerstruktur hab ich nochmal minimal überarbeitet.. aus "Mapper" wird "DbMapper".. so bekommen die mapper je nach backend nen eigenen ordner.. mit so einer ordnerstruktur kann man auch ziemlich problemlos ne factory erstellen.. die factory kann man dann über statische variablen so konfigurieren, dass man die mapper aus den gewünschten ordner bekommt.. langsam bin ich doch zufrieden :D

edit2: und noch ein geistesblitz! in der factory gebe ich als default verhalten vor, dass die mapper aus dem ordner DbMapper kommen.. dieses verhalten kann man ändern, indem man für model XY den mapper ordner angibt.. das läuft dann über ne statische funktion.. so kann man dann mit einer einfachen zeile das backend ändern.. und der controller weiß von nix! jetzt bin ich glücklich.

edit3: mist. wenn ich die objekte über die factory erzeuge, dann weiß eclipse nich, um was für nen objekt es sich handelt.. deswegen fällt die autovervollständigung und so weg.. aber da muss ich jetzt wohl durch..
 
Zuletzt bearbeitet:
Ich moechte euren Zirkel nur kurz stoeren:

Ich verwende Zend_Translate zur Uebersetzung. Zum Teil beinhalten die zu uebersetzenden Saetze jedoch html-Tags, die bei der Uebersetzung durch htmlspecialchars oder aehnlichem zerstoert werden. Das soll nicht passieren.

Auf die schnelle Fallen mir zwei Dinge ein:

1.) BBCode statt html-Tags verwenden + parsen saemtlicher Ausgaben.

2.) Entsprechender Abschnitt in Zend_Translate ueberschreiben. (Auf die Schnelle habe ich die entsprechende Stelle nicht gefunden...)

Was ist der gewuenschte Weg? Oder ist es eine Suende, html-Tags mit Inhalt zu mixen? ;)
 
ich habe mal nen kleinen klassenbaum gemacht, der den aufbau meines models darstellt.. ich habe mich dabei an keine standards à la uml gehalten sondern das ganze einfach auf die schnelle so zusammengebaut, dass ich mir das ganze ein wenig besser veranschaulichen kann..


(zum vergrößern anklicken ;) )

meinungen würden mich interessieren!

ich werde wohl noch eine abstrakte klasse einführen, von der der service layer erbt.. diese abstrakte klasse implementiert das allgemeine MapperInterface und implementiert dann die dort vorgeschriebenen methoden.. also mit validierung und den ganzen schönen sachen.. mit den validierten daten werden dann die entsprechenden methoden des mappers aufgerufen..

um bei einer änderung des datenspeichers nicht jeden konstruktor ändern zu müssen werde ich noch einen MapperLoader schreiben.. dessen funktionsweise habe ich ja in meinem letzten post am ende schon beschrieben ;)

meinungen sind erwünscht! ich hoffe es ist kein vollkommener stuss ;)

edit:
wie kann ich den autoloader so konfigurieren, dass er zb die klasse Admin_Models_Roles in der datei APPLICATION_PATH . "/modules/admin/models/Roles.php sucht?
 
Zuletzt bearbeitet:
Bennen Deine Klasse einfach mit "Admin_Model_Roles" dann sollte der immer in [modul]/models/ suchen und auch finden entsprechends dazu z.B. "Admin_Model_Roles_User" in APP_PATH/admin/models/roles/user.php

zu finden im Module_Autoloader:
PHP:
    /**
     * Initialize default resource types for module resource classes
     *
     * @return void
     */
    public function initDefaultResourceTypes()
    {
        $basePath = $this->getBasePath();
        $this->addResourceTypes(array(
            'dbtable' => array(
                'namespace' => 'Model_DbTable',
                'path'      => 'models/DbTable',
            ),
            'form'    => array(
                'namespace' => 'Form',
                'path'      => 'forms',
            ),
            'model'   => array(
                'namespace' => 'Model',
                'path'      => 'models',
            ),
            'plugin'  => array(
                'namespace' => 'Plugin',
                'path'      => 'plugins',
            ),
            'service' => array(
                'namespace' => 'Service',
                'path'      => 'services',
            ),
            'viewhelper' => array(
                'namespace' => 'View_Helper',
                'path'      => 'views/helpers',
            ),
            'viewfilter' => array(
                'namespace' => 'View_Filter',
                'path'      => 'views/filters',
            ),
        ));
        $this->setDefaultResourceType('model');
    }
 
Hi Blandorin,

nutzt du den View Translation Helper?? Bei dem besteht die Möglichkeit Platzhalter für sprintf zu übergeben, wenn ich den Code richtig interpretiert habe.

ps bekommt heute Abend mal noch ne pn
 
argh! warum geht das mit dem bescheuerten autoloader nicht?

meine klasse heißt:
Admin_Form_Roles und befindet sich in modules/admin/forms/Roles.php

wenn ich versuche ein objekt der klasse zu erzeugen (new Admin_Form_Roles() ), dann bekomme ich nur die fehlermeldung, dass die klasse nicht gefunden wird..

ich habe mir jetzt nochmal den code in Zend_Application_Module_Autoloader angeschaut (ohne in die tiefe zu gehen) und die docu (ganz unten, hier: https://framework.zend.com/manual/en/zend.loader.autoloader-resource.html ) und sehe keinen fehler :/

(wie es mich nervt, wenn es an solch popligen dingen hängt..)
 
@Wizzler
Versuch es mal mit folgendem Code in deiner Bootstrap.php
PHP:
	/**
	 * Start Autoloader for Module
	 * 
	 * @return Zend_Application_Module_Autoloader
	 */
	protected function _initAutoload()
	{
		$moduleloader = new Zend_Application_Module_Autoloader(array(
			'namespace' => 'Default',
			'basePath'  => implode(DIRECTORY_SEPARATOR, array(
								dirname(__FILE__),
								'module',
								'default'
							))
		));
		return $moduleloader;
	}
Wenn es dann immer noch nicht funktioniert musst Du mal deine Admin Modul Bootstrap anpassen.
Da habe ich folgendes:
PHP:
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
{
	/**
	 * Start Autoloader
	 * 
	 * @access protected
	 * @return Zend_Application_Module_Autoloader
	 */
	protected function _initAutoload()
	{
		$autoloader = new Zend_Application_Module_Autoloader(array(
			'namespace' => 'Admin',
			'basePath'  => dirname(__FILE__),
		));

		return $autoloader;
    }
}

Ich vermute bei dir funzt es wegen letzteren nicht.
 
Ah... das Escapen fand statt, da der Text als Beschreibung im Decorator verwendet worden war. Dort gibt es die nette Option:

$decorator->setOption('escape', false);
 
So meine lieben, es gibt neues von der ZF-Front.

Es scheint sich immermehr zu verdichten, bzw. mittlerweile ist es recht sicher, dass das ZF 2.0 auf Namespaces des PHP 5.3 Release aufbauen wird.

Außerdem wird zur Zeit an einer Model-Implementation für das ZF gearbeitet, genauer gesagt wird an einer Integration von Doctrine in das ZF gearbeitet, sowohl die Version 1.1 als auch die Version 2.0 (da die 2.0er bisher immernoch alpha ist).

Der neue Ansatz von Doctrine 2.0 gefällt mir auch ganz gut: Doctrine 2: Enterprise Persistence Layer for PHP
Man sieht gleich, dass man sich viele Ideen aus Hibernate geholt hat, was ein wirklich sehr gutes ORM-Framework ist (Java), die Entitites per Annotations auf Tabellen zu mappen empfinde ich als einen guten Ansatz.



Womit Doctrine 2.0 auch mein Model-Problem lösen würde, was ich in einem meiner letzten Posts angesprochen habe, mal abwarten, wie Doctrine 2.0 genau unter der Haube arbeitet.
 
Auja, Doctrine im ZF fänd ich super.
Bis jetzt hab ich drauf verzichtet, weil mir das Einbinden wenig Freude bereitet.
 
doctrine fände ich auch ne feine erweiterung.. ich habe nur irgendwie angst, dass ich mit dem projekt, an dem ich momentan arbeite nicht mehr zufrieden bin, wenn zf 2.0 rauskommt ;)


bin momentan auch schon wieder nen wenig am verzweifeln mit zend_form.. ich will, dass die formulare in tabellen angezeigt werden.. habe ich soweit auch schon hinbekommen.. ich habe aber noch keine möglichkeit gefunden, um noch eine kopfzeile mit einer überschrift für das formular einzufügen..

und wie bekomme ich es hin, dass nur die fehlermeldungen angezeigt werden, die auch tatsächlich zutreffen? momentan werden bei mir noch alle fehlermeldungen angezeigt, die für das element spezifiziert wurden.. im prinzip möchte ich die fehlermeldung also an den validator koppeln.. habe in der docu leider nix dazu gefunden
 
doctrine fände ich auch ne feine erweiterung.. ich habe nur irgendwie angst, dass ich mit dem projekt, an dem ich momentan arbeite nicht mehr zufrieden bin, wenn zf 2.0 rauskommt ;)
Das geht mir ständig so, egal ob ich nen Update gemacht habe oder net ;)

bin momentan auch schon wieder nen wenig am verzweifeln mit zend_form.. ich will, dass die formulare in tabellen angezeigt werden.. habe ich soweit auch schon hinbekommen.. ich habe aber noch keine möglichkeit gefunden, um noch eine kopfzeile mit einer überschrift für das formular einzufügen..
Ist da nicht eher ein Action / View Helper angebracht? Andernfalls evtl. ein hidden Feld mit ner Description. Ich weis ja nicht ob Du zufällig als erstes Element ein CSRF Token Feld hast, mit dem könnte man das verknüpfen.

und wie bekomme ich es hin, dass nur die fehlermeldungen angezeigt werden, die auch tatsächlich zutreffen? momentan werden bei mir noch alle fehlermeldungen angezeigt, die für das element spezifiziert wurden.. im prinzip möchte ich die fehlermeldung also an den validator koppeln.. habe in der docu leider nix dazu gefunden
Dazu müsstest Du mal deinen Code posten, also normalerweise funktioniert das Problemlos. Anbei mal ein Login Form Code von mir.
PHP:
	public function loginAction()
	{		
		$this->setTitle('Account Login');
		$form = new Default_Form_User_Login;
		if($this->_request->isPost()) {
			if($form->isValid($this->_request->getPost())) {
				$res = new Project_Auth_Controll(
					$this->_request->getParam(Form_User_Login::FIELD_NICK),
					$this->_request->getParam(Form_User_Login::FIELD_PW)
				);
				if($res->isSucceed()) {
					$this->addSuccess($res->getMessages());
				} else {
					$this->addError($res->getMessages());
				}
				$this->_redirect($res->getRedirectUrl());
			}
		}

		$this->view->form = $form;
	}
 
Ist da nicht eher ein Action / View Helper angebracht? Andernfalls evtl. ein hidden Feld mit ner Description. Ich weis ja nicht ob Du zufällig als erstes Element ein CSRF Token Feld hast, mit dem könnte man das verknüpfen.

ah.. dann schau ich mir nochmal die view helper und action helper an.. irgendwie fehlt es wohl nach wie vor am verständnis der einzelnen komponenten und dem jeweiligen einsatzgebiet.. nuja.. wird schon werden.. irgendwann :D

deinen code zu den fehlermeldungen schau ich mir danach an ;)
danke auf jeden fall (mal wieder.. )
 
doctrine fände ich auch ne feine erweiterung.. ich habe nur irgendwie angst, dass ich mit dem projekt, an dem ich momentan arbeite nicht mehr zufrieden bin, wenn zf 2.0 rauskommt ;)
damit habe ich mich schon abgefunden, finde momentan bei mir den Model-Part eh noch net so gut umgesetzt, mit Doctrine wäre es genial, also ändere ich mit 2.0 nochmal große Teile.

bin momentan auch schon wieder nen wenig am verzweifeln mit zend_form.. ich will, dass die formulare in tabellen angezeigt werden.. habe ich soweit auch schon hinbekommen.. ich habe aber noch keine möglichkeit gefunden, um noch eine kopfzeile mit einer überschrift für das formular einzufügen..
Ein Formular gehört aber nicht in Tabellen, es gibt im Netz viele schöne Beispiele wie du das gleiche Aussehen mit CSS realisierst aber es semantisch korrekt hast.

und wie bekomme ich es hin, dass nur die fehlermeldungen angezeigt werden, die auch tatsächlich zutreffen?
beschreibe ich weiter unten ;)

Dazu müsstest Du mal deinen Code posten, also normalerweise funktioniert das Problemlos. Anbei mal ein Login Form Code von mir.
PHP:
	public function loginAction()
	{		
		$this->setTitle('Account Login');
		$form = new Default_Form_User_Login;
		if($this->_request->isPost()) {
			if($form->isValid($this->_request->getPost())) {
				$res = new Project_Auth_Controll(
					$this->_request->getParam(Form_User_Login::FIELD_NICK),
					$this->_request->getParam(Form_User_Login::FIELD_PW)
				);
				if($res->isSucceed()) {
					$this->addSuccess($res->getMessages());
				} else {
					$this->addError($res->getMessages());
				}
				$this->_redirect($res->getRedirectUrl());
			}
		}

		$this->view->form = $form;
	}
autsch autsch, niemals nie :!:
Es gibt 3 gute Möglichkeiten:
  1. ihr setzt bei der Definition des Formulars bei den Validatoren das breakChainOnFailure-Flag
  2. ihr schreibt einen eigenen Error-Decorator und fügt diesen dem Formular hinzu
  3. die beste Möglichkeit: die beiden oberen Lösungen zusammen
Beim ZF lieber immer erstmal suchen, ob es sowas schon gibt, die Leute haben an fast alles gedacht, weshalb man sich solle sinnlosen Methoden sparen kann.

ah.. dann schau ich mir nochmal die view helper und action helper an.. irgendwie fehlt es wohl nach wie vor am verständnis der einzelnen komponenten und dem jeweiligen einsatzgebiet.. nuja.. wird schon werden.. irgendwann :D
nicht schlimm, jeder hier hat dafür ewig gebraucht.
Wenn du View-Helper, Action-Helper und die Controller-Plugins verstehst, dann hast du ein sehr mächtiges Werkzeug verstanden, das mächtigste ;)
 
Hallo Ice,

also dein "autsch" kann ich teilweise nachvollziehen, aber ich muss zu meinem Code noch eine Erklärung geben. Die Form wird richtig mit den Validatoren geprüft. Dieses getMessages ist nur um die Zend_Auth Meldungen zu bekommen. Ich wollte den ganzen Login und Logout Kram gekapselt haben, weil ich nicht nur die Identity lösche beim logout.

Ich denke mal das Du das mit autsch meintest, meine Form Klasse ist so wie es der Standard gebietet ;)
 
Dieses getMessages ist nur um die Zend_Auth Meldungen zu bekommen. Ich wollte den ganzen Login und Logout Kram gekapselt haben, weil ich nicht nur die Identity lösche beim logout.

man könnte den LoginChck, der nach dem Formular-Check kommt, aber auch noch als Validator in das Formular einbauen ;)
Dann ist der Code sauber und das Formular tut genau das, was man erwartet, es ist erst dann alles ok, wenn die Angaben auch stimmten, und nicht nur wenn sie gewissen Beschränkungen der Anwendung genügen.
 
Ah, stimmt das ist auch noch ne gute Idee, darauf bin ich gar nicht gekommen weil man immer diese selbst gestrickten Lösungen sieht. Aber im Grunde hast Du Recht, der Login ist auch ne Validierung, und in meiner Auth Controll setze ich dann nur noch die Identity und leite um. Ich schreib mal bei Gelegenheit nen Validator dafür, da kannst ja nochmal drüber schaun.