Skip to content
März 2012 / admin

Zend Framework 2 beta 3 released

Nun ist bereits das dritte Beta-Release von Zend Framework fertig, man darf also gespannt sein. Für alle Neugierigen habe ich mal ein paar interessante Links zusammengestellt, einfach mal zu reinschauen und vorabinformieren :-)

Juli 2011 / admin

Zend Framework 2 Training mit Rob Allen

Ich bin gerade über folgenden Post in Rob Allens Blog gestolpert:

http://akrabat.com/conferences/zf2-training-at-phpnw-2011/

Für alle die Rob Allen nicht kennen, er ist der Autor des Buches “Zend Framework in Action”, welches ist übrigens nur empfehlen kann. Er bietet auf der php nw conference 2011 ein Training zum Thema Zend Framework 2 an.

Leider ist der Spaß nicht ganz billig und Manchester auch nicht gerade um die Ecke. Ich wollte es euch trotzdem nicht vorenthalten, mich werdet ihr dort allerdings leider nicht treffen :-)

Juli 2011 / admin

Umfrage Zend Framework Cheat Sheets

Wer kennt das nicht, man programmiert und es fällt einem gerade nicht ein, wie man ein bestimmtes Problem löst. Abhilfe können da so genannte “Cheat Sheets” schaffen, also Spickzettel, auf denen die wichtigsten Befehle kompakt zusammengefasst werden.

Da es für Zend Framework keine bis wenige solcher Cheatsheets gibt, würde ich gerne eine ZF-Cheat Sheet-Reihe zum kostenlosen Download rausbringen. Allerdings bin ich mir unschlüssig, welche Themen interessant sind und für die es sich lohnt sie aufs Cheat Sheet zu packen! Also los stimmt ab, damit es bald das erste Cheat Sheet von mir gibt :-)

 

Für welches Zend-Framework Thema sollte es ein Cheat-Sheet geben?

View Results

Loading ... Loading ...
April 2011 / admin

Propel-Adapter für Zend_Paginator

Nachdem ich ja bereits einen Artikel über die Integration von Propel geschrieben habe kommt heute ein weiterers Schmankerl zur einfachen Verwendung von Propel. Bei der Darstellung von Datensätzen aus der Datenbank in einer Liste ist natürlich eine Pagination (Blätternfunktion) super hilfreich. Da es bei den bestehenden Adaptern für Zend_Paginator natürlich keinen passenden Propel-Adapter gibt, habe ich kurzerhand selbst einen geschrieben :-)

<?php
class Zfcoach_Paginator_Adapter_Propel implements
                              Zend_Paginator_Adapter_Interface
{

  protected $_criteria = null;
  protected $_peerName = null;
  protected $_queryMethod;

  /**
   * @param Criteria $criteria The criteria object for the select query
   * @param String $peerName Entity name to query
   * @param String $queryMethod Method for the query
   */
  public function __construct($criteria, $peerName, $queryMethod='doSelect')
  {
      $this->_criteria = $criteria;
      $this->_peerName = $peerName.'Peer';
      $this->_queryMethod = $queryMethod;
  }

  /**
   * Returns an collection of items for a page.
   *
   * @param  integer $offset Page offset
   * @param  integer $itemCountPerPage Number of items per page
   * @return array
   */
  public function getItems($offset, $itemCountPerPage)
  {
      $criteria = clone $this->_criteria;

      $criteria->setLimit($itemCountPerPage);
      $criteria->setOffset($offset);

      $items = call_user_func(
          array($this->_peerName, $this->_queryMethod),
          $criteria
      );

      return $items;
  }

  /**
   * Returns the total number of elements in the result set.
   * Needed by the Countable-Interface
   */
  public function count()
  {
      $count = call_user_func(
          array($this->_peerName, 'doCount'),
          $this->_criteria
      );
      return $count;
  }
}

 

Die Verwendung ist super easy und man hat ganz schnell eine Blätternfunktion für eine beliebige Db-Abfrage gebaut. Einfach eine Propel-Query an den Adapter übergeben und fertig :-) Als View-Skript für die Paginierung selbst kann man auf eins der hier beschriebenen zugreifen: http://framework.zend.com/manual/en/zend.paginator.usage.html

public function retrieveallAction()
{
  $query          = BookQuery::create ();
  $propelAdapter  = new Zfcoach_Paginator_Adapter_Propel($query, 'Book');

  $paginator      = new Zend_Paginator($propeAdapter);
  $paginator->setCurrentPageNumber($this->_getParam('page'));

  Zend_View_Helper_PaginationControl::setDefaultViewPartial(
      'pagination_control.phtml');

  $this->view->paginator = $paginator;
}

Im View-Skript der Action kann einfach das Paginator-Objekt ausgegeben werden um die Navigation anzuzeigen bzw. über das Objekt iteriert werden, um die einzelnen Elemente zu holen:

<?php
echo $this->paginator;
foreach($this->paginator as $item){
    ...
}
?>
Januar 2011 / admin

Zfcoach_Validate_Identical – Ein eigener Validator

Beim Einsatz von Zend_Filter_Input oder Zend_Form sind die mitgelieferten Validatoren des Zend Frameworks der erste Anlaufpunkt zum Validieren von Benutzereingaben. Manchmal gelangt man jedoch an den Punkt, wo diese nicht mehr ausreichen und eigene Validatoren geschrieben werden müssen.

Möchte man ein Registrierungsformular für Benutzer implementieren, muss der User das Passwort eingeben. Meistens muss das eingegebene Passwort in einem zweiten Feld bestätigt werden, um Tippfehler zu verhindern. Dies lässt sich mit dem Validator Zend_Validate_Identical abbilden. Ich muss gestehen, ich habe den Validator leider nicht gekannt und für diesen Zweck einen eigenen Validator geschrieben. Das gleiche Prinzip lässt sich jedoch auf andere Anwendungsbereiche erweitern. Ich werde demnächst einen Validator posten, mit dem sich zwei Datumswerte vergleichen lassen. Damit lässt sich prüfen, ob ein Startdatum vor einem Enddatum liegt.

Ein Validator zum Prüfen zweier Formularwerte auf ist dabei schnell geschrieben. Der nachfolgende Quellcode dient dazu, zwei Formularfelder auf Gleichheit zu überprüfen. Dabei kann der Validator von Zend_Form als auch von Zend_Filter_Input verwendet werden.

<?php

class Zfcoach_Validate_Identical extends Zend_Validate_Abstract
{

    const NOT_IDENTICAL = 'notIdentical';

    /**
     * Message tempates
     *
     * @var array
     */
    protected $_messageTemplates = array (
        self :: NOT_IDENTICAL => "The values are not identical",
    );

   /**
    * Name of the field to compare
    *
    * @var string
    */
    private $referenceName = null;

   /**
    * Constructor
    *
    * @param string $referenceName
    */
   public function __construct($referenceName)
   {
     $this->referenceName = $referenceName;
   }

   /**
    * Validate data. If Zend_Form is used, $context contains an array with all
    * fields of the form. If Zend_Filter_Input is used insted and the
    * "fields" meta command is used, $values is an array with the values
    * specified by the "fields" command.
    *
    * @param mixed $values
    * @param mixed $context
    * @return boolean
    */
    public function isValid($values, $context = null)
    {
        $value = '';
        $referenceValue = '';

        // Zend_Filter_Input Integration
        if(is_array($values)){
            $value = current($values);
            $referenceValue = isset($values[$this->referenceName]) ? $values[$this->referenceName] : '';
        }
        // Zend_Form Integration
        elseif(is_array($context)){
            $value = $values;
            $referenceValue = isset($context[$this->referenceName]) ? $context[$this->referenceName] : '';
        }

        if ($value != $referenceValue)
        {
            $this->_error(self :: NOT_IDENTICAL);
            return false;
        }
        return true;
    }
}

Bei der Verwendung von Zend_Form fügt man den Validator ganz einfach einem der beiden Passwort-Felder hinzu und übergibt im Konstruktur den Namen des zweiten Eingabefeldes:

// Add a first password element
$this->addElement('password', 'password1', array(
    'label'      => 'Password:',
    'required'   => true,
    'filters'    => array('StringTrim'),
    'validators' => array(
        'NotEmpty',
        new Zfcoach_Validate_Identical('password2')
    )
));

// Add a seconde password element
$this->addElement('password', 'password2', array(
    'label'      => 'Retype Password:',
    'required'   => true,
    'validators' => array(
        'NotEmpty'
    )
));

Bei der anschließenden Formularvalidierung werden daraufhin beide Werte zur Prüfung herangezogen.
Verwendet man stattdessen Zend_Filter_Input, muss das Metakommando “fields” verwendet werden, um dem Validator beide Werte zu übergeben.

$filters = array();

$validators = array(
    'passwordfields' => array(
        new Zfcoach_Validate_Identical('field2'),
        'fields' => array('field1', 'field2')
    )
);

$data = array('field1' => 'test1', 'field2' => 'test2');

$input = new Zend_Filter_Input($filters, $validators, $data);

Es ist also ganz einfach einen Validator zu schreiben, der mehrere Felder gleichzeit validiert. Natürlich ist das gezeigte Beispiel mit Passwortfeldern nur einer von vielen Anwendungsfällen.

Januar 2011 / admin

Webinare auf Zend.com

Zend Framework Webinars - Zend.com_1295387785168

Allen, die in Sachen Zend Framework weiter kommen wollen, kann ich die Webinare auf zend.com empfehlen. Dort gibt es zu vielen spannenden Themen Aufzeichnungen vergangener Webinare zu sehen.

Einige interessante Themen waren:
– Zend Framework v1 + Doctrine v2
– Testing Your Zend Framework
– Secure Application Development with the ZF
– var_dump: Debugging in Zend Framework

Insgesamt gibt es über 30 Webinare, es lohnt sich also wirklich mal reinzuschauen!

Hier gehts zu den Webinaren.

Januar 2011 / Stephanie

ORM leicht gemacht – Propel und das Zend-Framework

thumb4d2c1f8315d19

PHP Magazin 2/2011

Bei der Umsetzung von MVC-Anwendungen mit dem Zend Framework ist die Erstellung der Models mit Bordmitteln ein aufwändiges Unterfangen mit viel Tipparbeit. Propel unterstützt Sie mit der automatischen Generierung Ihrer Models und lässt sich spielend leicht in Zend-Framework-Anwendungen integrieren. Der folgende Artikel zeigt die allgemeine Funktionsweise von Propel und betrachtet das Zusammenspiel mit dem Zend Framework.

Den ganzen Artikel gibt es im PHP Magazin 2/2011

Januar 2011 / admin

Ein Propel Auth-Adapter

Verwendet man Propel als Datenbankabstraktionslayer anstatt Zend_Db und möchte man eine Authentifzierung der Benutzer über eine Datenbanktabelle lösen, fehlt ein entsprechender Auth-Adapter. Da der Adapter Zend_Auth_Adapter_DbTable nur auf Propel umstellt werden muss, diente er vom Prinzip her als Vorlage für einen eigenen Adapter.

Bei der Erstellung des Adapters muss der Tabellenname für die User-Einträge angegeben werden. Außerdem werden die Spalten für den Benutzernamen und das Passwort definiert. Anhand dieser Information wird das entsprechende ModelCriteria-Objekt erstellt und die Abfrage durchgeführt. Ergebnis der Authenticate-Methode ist immer ein Zend_Auth_Result-Objekt, welches im Erfolgsfall auch das Userobjekt enthält. Diese ist später in der Session verfügbar.

<?php
class Zfcoach_Auth_Adapter_Propel implements Zend_Auth_Adapter_Interface
{

  protected $_tableName = null;
  protected $_identityColumn = null;
  protected $_credentialColumn = null;
  protected $_identity = null;
  protected $_credential = null;

  public function __construct($tableName, $identityColumn, $credentialColumn)
  {
    $this->_tableName         = ucfirst($tableName);
    $this->_identityColumn    = ucfirst($identityColumn);
    $this->_credentialColumn  = ucfirst($credentialColumn);
  }

  public function setIdentity($value)
  {
    $this->_identity = $value;
    return $this;
  }

  public function setCredential($credential)
  {
    $this->_credential = $credential;
    return $this;
  }

  /**
   * authenticate() - defined by Zend_Auth_Adapter_Interface.  
   * This method is called to attempt an authentication.  
   * Previous to this call, this adapter would have already
   * been configured with all necessary information to successfully
   * connect to a database table and attempt to find a record
   * matching the provided identity.
   *
   * @throws Zend_Auth_Adapter_Exception
   * @return Zend_Auth_Result
   */
  public function authenticate()
  {
    // get criteria
    $className = $this->_tableName."Query";
    if(class_exists($className)){
      $criteria = new $className();
    }
    else{
      throw new Zend_Auth_Adapter_Exception("Class $className not found");    
    }

    $expr = sprintf('(CASE WHEN %s.%s = "%s" THEN 1 ELSE 0 END)',
      $this->_tableName,
      $this->_credentialColumn,
      $this->_credential
    );
    $criteria->withColumn($expr, 'CredentialMatch');
    $criteria->where($this->_tableName . '.'.$this->_identityColumn . ' = ?', $this->_identity);

    try {
      $resultIdentities = $criteria->find();
    } catch (Exception $e) {
      throw new Zend_Auth_Adapter_Exception(
        'The supplied parameters to Criteria failed to '
        . 'produce a valid sql statement, please check table and column names '
        . 'for validity.', 0, $e);
    }

    if ($resultIdentities->count() != 1) {
      return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, null, array('A record with the supplied identity could not be found.'));
    }

    $identity = $resultIdentities->getFirst();

    if ($identity->getCredentialMatch() != '1') {
      return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, null, array('Supplied credential is invalid.'));
    }

    return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity, array('Authentication successful.'));
 }
}
Dezember 2010 / admin

Tipps zur Zend Framework Zertifizierung

Im Sommer diesen Jahres habe mich für die Zend Framework-Zertifizierung angemeldet und auch bestanden :-)

Außer dem offziellen Study-Guide von Zend gibt es leider recht wenig Material, um sich auf die Zertifizierung vorzubereiten. Im Gegensatz zur PHP5-Zertifzierung gibt es auch keine Mock-Up-Tests oder ähnliches.

Allen, die sich auf die Prüfung vorbereiten wollen, kann ich aber die Slides von Rob Allen zu einem Vortrag auf der ZendCon 09 empfehlen. Dort hat er einen Talk mit dem Thema “Zend Framework Certification Refresher” gehalten.

Folgende Aussagen von Rob Allen kann ich nur voll und ganz bestätigen:

What you need to know:
• Know your configuration options
• Know the available constants
• If there are interfaces involved, learn them!
• Know method names
• If there is more than one way to do something,
know them all!

Whatʼs not in it?
• To be clear: ZF 1.5, not 1.9!
• No Zend_Application, Zend_Dojo, etc
• No writing reams of code
• Questions are one component each

Daneben kann ich auch den Reference-Guide sehr empfehlen, allerdings muss man hier drauf achten auch die 1.5er-Version zu verwenden. Dort steht wirklich alles zu den wichtigen Prüfungsthemen drin. Man sollte aber schauen, dass man den Rat von Rob Allen beherzigt, Dinge nicht nur auf einem Weg lösen zu können, sondern alle Wege kennt.

Dezember 2010 / Stephanie

Zend Framework Schulung

Ich wurde schon öfter angesprochen ob ich nicht mal eine Zend Framework Schulung halten möchte.

Während meiner Zeit bei Mayflower habe ich bereits die ein oder andere Gelegenheit gehabt, meinen Kollegen in Sachen Zend Framework neues Wissen zu vermitteln. Da ich nicht weiß, inwieweit eine Schulung interessant ist, kann das untenstehende Kontaktformular genutzt werden um mir eine unverbindliche Schlungsanfrage zukommen zu lassen.

Wenn sich genügend Teilnehmer (ca. 5-8 Personen) finden würden, könnte ich eine entsprechende Schulung organisieren. Details zu Terminen, Themen, Zeiten, Preisen etc. würde ich dann rechtzeitig bekanntgeben.

Ihre Name (Pflichtfeld)

Ihre Email (Pflichtfeld)

Anzahl Teilnehmer (voraussichtlich)

Welche Inhalte sind von besonderem Interesse?

sonstige Themenwünsche/Vorschläge etc.

Einschätzung Ihrer Zend-Framework-Kenntnisse

Gewünschte Dauer: