Archive for the ‘Zend Framework’ Category

Zend Framework 2 – Exception fangen

25. November 2014

Klingt trivial, ist es auch, aber man muss es halt doch mal wissen. Zend Framework baut sich sein ganz eigenes Errorhandling und als ich versuchte, eine Exception mit try und catch(Exception $e) aufzufangen, bewirkte das genau gar nichts. Warum? Man muss catch(\Exception $e) schreiben. Konkret versuchte ich mich an einer IMAP Verbindung zu einem Mailserver:

  1. $mail = new \Zend\Mail\Storage\Imap(array(
  2.     'host'     => 'imap.gmail.com',
  3.     'user'     => 'USERNAME@gmail.com',
  4.     'password' => 'PASSWORD',
  5.     'ssl'      => 'SSL',
  6.     'port'     => 993
  7. ));

Wenn die Logindaten nicht stimmen, dann wirft das einen Fehler. Um diesen zu fangen und im Falle falscher Logindaten zu reagieren, fange ich das ganze so auf:

  1. try{
  2.     $mail = new \Zend\Mail\Storage\Imap(array(
  3.         'host'     => 'imap.gmail.com',
  4.         'user'     => 'USERNAME@gmail.com',
  5.         'password' => 'PASSWORD',
  6.         'ssl'      => 'SSL',
  7.         'port'     => 993
  8.     ));
  9. }catch(\Exception $e){
  10.     die("wrong credentials!");
  11. }

Und mit \Exception klappts dann auch im Zend Framework.

Zend Framework 2 – doctrine: Umlautproblem

08. Juli 2014

Alle meine Tabellen und die Datenbank sind auf utf8_general_ci eingestellt, und dennoch tauchte plötzlich im ZF2 das Problem beim Speichern von Umlauten auf. Aus dem Eintrag “höhöhöhö” wurde in der Datenbank folgendes:
db

Eine Google Recherche brachte erstmal nichts, denn in der config der Datenbankverbindung war SET NAMES ‘UTF8’ bereits eingestellt. Da ich zum Speichern der Daten doctrine benutze (und ich traue doctrine nicht so ganz), habe ich in meiner Doctrine Konfiguration testhalber folgendes hinzugefügt:

  1. 'params' => array(
  2. 'host' => 'localhost',
  3. 'port' => '3306',
  4. 'dbname' => 'table_name',
  5. 'charset' => 'utf8' //<---- hier!
  6. ...

Und plötzlich gings!

Zend Framework 2 – mit annotationbuilder ein dropdown mit den Werten einer Entity anzeigen (mit einer ManyToOne Beziehung)

07. Juli 2014

Mit dem annotationbuilder generiere ich ein Formular basierend auf einer Entity:

  1. $text = new Text();
  2. $builder = new AnnotationBuilder( $entityManager);
  3. $form = $builder->createForm( $text );
  4. $form->setHydrator(new DoctrineHydrator($entityManager,'Backend\Entity\Text'));
  5. $form->bind($text);

Das einzige Problem war das Feld categoryId, das eine manyToOne Beziehung zu einer weiteren Entity namens TextCategory hat. Ich wollte, dass nur anhand der Annotations ein select mit den entsprechenden Werten (aus dem Feld “name” in TextCategory) angezeigt wird. Das geht so:

  1. /**
  2. * @var string $categoryId
  3. *
  4. * @ORM\ManyToOne(targetEntity="Backend\Entity\TextCategory", fetch="EAGER")
  5. * @ORM\JoinColumn(name="categoryId", referencedColumnName="id", nullable=false)
  6. * @Annotation\Type("DoctrineORMModule\Form\Element\EntitySelect")
  7. * @Annotation\Required({"required":"true" })
  8. * @Annotation\Filter({"name":"StripTags"})
  9. * @Annotation\Options({"label":"Class:", "property":"name", "target_class" : "Backend\Entity\TextCategory"})
  10. * @Annotation\Attributes({"value":"0"})
  11. *
  12. */
  13. private $categoryId;

Das Ergebnis ist geradezu berauschend gut.

Zend Framework 2 – annotationbuilder Formular im Nachhinein ändern

07. Juli 2014

Ich erstelle im Zend Framework 2 mit dem annotationbuilder ein Formular. Nun möchte ich aber im Nachhinein gewisse Elemente verstecken (z.B. für bestimmte eingeloggte User). Das geht so:

  1. $form->getElements()['thefieldname']->setAttribute('type', 'hidden');

Zend Framework 2: AnnotationRegistry not found

19. Oktober 2013

Ich wollte nach diesem Tutorial ein einfaches Login erstellen, und da warf Zend Framework 2 mir diese ‘hilfreiche’ Meldung:

  1. Fatal error: Class 'Doctrine\Common\Annotations\AnnotationRegistry' not found in \zendframework\zendframework\library\Zend\Code\Annotation\Parser\DoctrineAnnotationParser.php on line 42

Stellt sich raus, wenn man den blöden Composer so wie im Tutorial benutzt, wird doctrine nicht mit installiert. Man mache also folgendes:

  1. in vendor/compuser/installed.json bei require eine Zeile hinzufügen:
    1. "require": {
    2. "doctrine/common": ">=2.1", //neu
    3. "php": ">=5.3.3"
    4. },
  2. console starten und dort (im root Verzeichnis des Projekts) folgenden Befehl aufrufen:
    1. php composer.phar update

Dann klappt das auch. Das als Neuling rauszufinden is allerdings ungefähr so wahrscheinlich wie einem zweiköpfigen Schaf zu begegnen. Ganz ehrlich, was is verkehrt mit den Zend Framework Leuten? Soll ich mir so eine Information aus dem Arsch ziehen?

Gott das frustriert mich.

Zend Framework: das template eines anderen moduls rendern

05. August 2013

Ich musste in meinem Fall auf die phtml Datei eines anderen Moduls zugreifen, und das geht über das erstellen eines neuen view Objects:

  1. $view = new \Zend_View;
  2. $view->setScriptPath(APPLICATION_PATH . '/modules/MODULNAME/views/scripts/');
  3. $inhalt = $view->render('ordner/template.phtml');

Und das wars!

Zend Framework: SQL Queries auflisten

31. Januar 2013

Whoa, mit Firebug und FirePHP und einem kleinen Codeschnipsel kann man sich alle Queries eines Seitenaufrufs ausgeben lassen! DAS ist so nützlich, es treibt mir fast die Tränen in die Augen!

Diese hilfreiche Anleitung hat mich darauf gebracht!

Zend Framework: Column not found: 1054 Unknown column in field list

08. August 2012

Wenn Zend die Fehlermeldung

Column not found: 1054 Unknown column in field list

ausgibt, heißt das eigentlich, dass es ein Problem mit dem Abfragen von Daten aus der Datenbank gibt. In meinem speziellen Fall ließ ich mir die Query ausgeben und wenn ich sie direkt in phpmyadmin ausführen ließ, klappte alles einwandfrei. Daher eine Warnung: Zend geht nicht wohlwollend mit Groß- und Kleinschreibung um. Ich hatte den Namen einer Spalte versehentlich großgeschrieben, phpmyadmin konnte damit umgehen, Zend allerdings nicht.

Zend Framework: verschiedene Logins für Frontend und Backend

04. Mai 2012

Nachdem die ZF Community endgültig bewiesen hat, dass sie so abgehoben ist, dass sie keine Anfängerfragen sinnig beantworten kann, hab ich mir die Lösung selber zusammengestöpselt. In meinem Projekt sind Front- und Backend Module und im Backend Ordner hab ich mir eine zweite Bootstrap.php angelegt die so aussieht:

  1. class Backend_Bootstrap extends Zend_Application_Module_Bootstrap
  2. {
  3.     public function _initAuth(){
  4.         $auth = Zend_Auth::getInstance();
  5.         $authStorage = new Zend_Auth_Storage_Session('Yourapp_Admin_Auth');
  6.         $auth->setStorage($authStorage);
  7.     }
  8. }

Offenbar reicht das, um das Backend Login unabhängig zu machen, sodass nciht ein im Frontend eingeloggter User auch das Backend sehen kann…

Danke an die ZF Community für nichts.

Die Zend Framework Community

04. Mai 2012

Da war ich letztens gezwungen, mich im Schnellverfahren in Zend Framework einzuarbeiten. Ich wusste nicht mal die einfachsten Dinge und gleich am Anfang stellte sich mir die Frage: Wie erreicht man es, dass bestimmte Werte in jedem Controller verfügbar sind? Ich musste z.B. über die Facebook API getLoginUrl abfragen und hatte absolut keine Lust, das in jedem Controller aufs neue zu machen. Also stellte ich meine Anfängerfrage in einem Forum. Und bekam dafür folgende ausführliche, hilfreiche und verständliche Antwort:

“Layout”

Wer’s nicht glaubt, der möge einen Blick auf dieses Seite werfen….