Archive for the ‘php patterns’ category

Zend_View_Helper einrichten und returnvalues als Objekte in einem Layouttemplate nutzen

December 19th, 2009

Ich stand vor dem Problem, in meinem Headerlayout einen Helper für jedes Modul contextbezogen aufrufen zu wollen, um jeder seite einen entsprechenden header zu präsentieren. Dabei wollte ich in meinem Actioncontroller einfach eine variable $headline setzen, die dann vom viewhelper ins layout geschrieben wird.

Wer sich einen Viewhelper einrichten will und in diesem auf die Viewvariablen zugreifen möchte sollte 2 Dinge beachten.
1) Der Viewhelper muss von Zend_View_helper_Abstract abgeleitet sein oder das Zend_View_Helper_Interface implementieren
2) Es wird empfohlen. das Viewobject explizit zu setzen und setView zu überschreiben.

ist ganz einfach.
1) Ihr legt den Viewhelper im Ordner “views/helpers” ab. Ich habe einen Helper “getMyViewHelper.php” verwendet.

2) Ihr definiert die Helperklasse. Sie heist demnach Zend_View_Helper_getMyViewHelper

<?php
/**
 * Description of getMyViewHelper
 *
 * @author peter
 */
class Zend_View_Helper_getMyViewHelper  extends Zend_View_Helper_Abstract {
protected $returnObject=NULL; // soll in einen ViewScript (siehe unten) ausgegeben werden.
    function  __construct() {
                //do some stuff
    }
        //den aktuellen view setzen
        public function setView(Zend_View_Interface $view)
        {
           $this->view = $view;
        }
        //diese methode wird aufegrufen, wenn ihr im layout $this->getMyViewHelper() einbindet. Beispiel siehe "headerlayout"
        function getViewPortItems()
    {
       $this->returnObject=(object)$empty; //wir wollen kein array oder eine einzelne variable , wir wollen ein object
       $this->returnObject->eintest="erster Test";
       $this->returnObject->nocheintest="noch ein Test";
       //hier werden die Variablen aus dem ActionController verwendet
       $this->returnObject->headline=$this->view->eindrittertest;

       return $this->returnObject;
    }
}
?>

Das layouttemplate “header.phtml”

<h1><?php echo this->getMyViewHelper()->eintest?></h1> //variable aus dem helper
<h2><?php echo this->getMyViewHelper()->nocheintest?></h2> //variable aus dem helper
<h3><?php echo this->getMyViewHelper()->headline?></h3> // und da ist die headline aus dem view

im controller cann man dann einfach die headline setzen.

<?php
class Admin_IndexController extends Zend_Controller_Action {
    public function init() {
        $this->translate=Zend_Registry::get("translate_mod");
    }
    /**
     * @desc generates and populates the Adminpanelform
     */
    public function indexAction() {

        $this->view->headline  = $this->translate->_("modHeadline");

    }
}

Zend_Form_Element_Textarea. HTML content wird in setValue() entfernt

December 15th, 2009

Wer FCK oder Tiny einsetzt wird merken, dass der HTML Content, den man versucht mit setValue() auf de Textarea setzen möchte entfernt wird.

Die Viewhelperklasse Zend_View_Helper_Textarea macht ein escape() auf den Value und stript die Tags sauber raus. Es gibt imo keine Möglichkeit über den Decorator den _escape bool dafür  zu setzen.

Daher ist es nötig sich einen Helper zu schreiben, der das escape() nicht macht.

Den Helper speichert man im Modul unter “views/helpers”. Es wird eine Klasse Zend_View_Helper_Deinname gesucht. Also nennen wir die Klasse

Zend_View_Helper_CustomFormTextarea {} und speichern ihn unter CustomFormTextarea.php im obigen Ordner (application/modules/deinmodul/views/helpers).

Wichtig ist auch, dass die Methode die aufgerufen wird, heist wie der letzte Suffix des Klassennamens also “CustomFormTextarea

Hier der Code des Helpers. Wie man sieht ist nicht viel geändert worden.

<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_View
 * @subpackage Helper
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: FormTextarea.php 16541 2009-07-07 06:59:03Z bkarwin $
 */

/**
 * Abstract class for extension
 */
require_once 'Zend/View/Helper/FormElement.php';

/**
 * HelperPlugin  to generate a custom "textarea" element without escaping the values
 *
 * @category   Zend
 * @package    Zend_View
 * @subpackage Helper
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */

class Zend_View_Helper_CustomFormTextarea extends Zend_View_Helper_FormElement {
/**
 * The default number of rows for a textarea.
 *
 * @access public
 *
 * @var int
 */
    public $rows = 24;

    /**
     * The default number of columns for a textarea.
     *
     * @access public
     *
     * @var int
     */
    public $cols = 80;

    /**
     * Generates a 'textarea' element.
     *
     * @access public
     *
     * @param string|array $name If a string, the element name.  If an
     * array, all other parameters are ignored, and the array elements
     * are extracted in place of added parameters.
     *
     * @param mixed $value The element value.
     *
     * @param array $attribs Attributes for the element tag.
     *
     * @return string The element XHTML.
     */
    public function CustomFormTextarea($name, $value = null, $attribs = null) {

        $info = $this->_getInfo($name, $value, $attribs);
        extract($info); // name, value, attribs, options, listsep, disable

        // is it disabled?
        $disabled = '';
        if ($disable) {
        // disabled.

            $disabled = ' disabled="disabled"';
        }

        // Make sure that there are 'rows' and 'cols' values
        // as required by the spec.  noted by Orjan Persson.
        if (empty($attribs['rows'])) {

            $attribs['rows'] = (int) $this->rows;
        }
        if (empty($attribs['cols'])) {
            $attribs['cols'] = (int) $this->cols;
        }

        // build the element
        $xhtml = '<textarea name="' . $this->view->escape($name) . '"'
            . ' id="' . $this->view->escape($id) . '"'
            . $disabled
            . $this->_htmlAttribs($attribs) . '>'
            . htmlspecialchars($value) . '</textarea>'; //thx to robo47 for the top with htmlspecialchars
        return $xhtml;
    }

}

Zend Framework unter Debian

December 7th, 2009

Wer unter Debian arbeitet kann folgendes Tutorial für die Installation verwenden.
Das Framework wird direkt über die CLI bereitgestellt.

Die Installatiion ist von mir getestet.

Tutorial

dynamische Objekte mit Construktorparametern

November 22nd, 2009

Ich stand vor dem Problem eine beliebige Liste mit Objekten zu erstellen. Dabei kann der Konstruktor Parameter haben oder nicht.

hat er welche, wirft eine einfache Instatiierung einen Fehler. Mit dem Umweg über die reflectionklasse kann man die Klassen mit Konstruktorvariable zur Laufzeit instatiieren.

    private function built() {
        $arr_confObject            = array('_survey'=>'C_SURVEY','_statistic' =>'C_Statistitic');
        $arr_confConstructor    = array('_statistic' =>$this);

        //durch die liste zu erstellender Objecte iterieren
        foreach($arr_confObject as $objname=>$class) {
            $className=$class;

            //call helpermethode
            $HelperFunction="factory";

            //reflection class in use
            //wenn kein __constructor -parameter verwendet wird->normale instatiierung
            //ansonsten reflectionclass
            if(isset($arr_confConstructor[$objname])) {
                $_refClass = new ReflectionClass($className);
                $this->$objname = $_refClass->newInstanceArgs(array($this));

            }else {
                $this->$objname = new $className;
            }

            //Helpermethoden aufrufen, wenn das object existiert
            if(is_object($this->$objname)) {
                if(function_exists($HelperFunction))
                    $this->$objname->$HelperFunction();
            }else {
                C_ERROR::object(get_class()."::built()","\$this->$objname",$this->$objname);
            }
        }