<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zorta &#187; PHP</title>
	<atom:link href="http://www.zorta.de/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zorta.de</link>
	<description>Nähkästchen eines Webentwicklers</description>
	<lastBuildDate>Sat, 29 Oct 2011 20:08:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Ein Widget-System</title>
		<link>http://www.zorta.de/frameworks/ein-widget-system/</link>
		<comments>http://www.zorta.de/frameworks/ein-widget-system/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 20:06:09 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SukaSys]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Codebeispiele]]></category>
		<category><![CDATA[Widgets]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=169</guid>
		<description><![CDATA[Ein Widget-System wirft zu vorderst die Frage auf: &#8220;Hä? Wozu? Was ist das&#8221;, doch dahinter verbirgt sich eine einfache Logik. Das Zend Framework bietet bereits Action- und ViewHelper, die natürlich in ihren jeweiligen Bereichen sehr praktisch sind. Wenn es aber an ein CMS-System geht in dem man den Usern die Möglichkeit bieten möchte ebenso Helper [...]]]></description>
			<content:encoded><![CDATA[<p>Ein Widget-System wirft zu vorderst die Frage auf: &#8220;Hä? Wozu? Was ist das&#8221;, doch dahinter verbirgt sich eine einfache Logik. Das Zend Framework bietet bereits Action- und ViewHelper, die natürlich in ihren jeweiligen Bereichen sehr praktisch sind. Wenn es aber an ein CMS-System geht in dem man den Usern die Möglichkeit bieten möchte ebenso Helper in die Seiten einzubinden, dann kann man ihnen unmöglich erlauben einfach auf diese normalen Helper zuzugreifen. Für diesen Fall benötigt man ein eigenständiges System um die Stabilität des Gesamtsystems zu garantieren. Konsistenz ist nur einer der Vorteile, die natürlich wahrlich Subjektiv und Einsatzabhängig sind. </p>
<p><span id="more-169"></span></p>
<p>Da ich derzeit an einem CMS-System arbeite habe ich mir natürlich diese Gedanken gemacht und mich daran gemacht ein Widget-System zu errichten, dass neben den anderen Helfern arbeitet. Dieses bietet die Möglichkeit in einer CMS-Seite einen String einzubinden, der das Laden auslöst. </p>
<p><code>{widget:Test}<br />
{widget:Test|Google,Yahoo,Bing}</code></p>
<p>Über diese einfache Syntax wird das Widget übergeben. Natürlich auch mit der Möglichkeit Parameter einzusetzen um die Widgets Variabel aufzubauen. Zu dieser Synatx gibt es einen ActionHelper, der ihn aus einem String heraussucht und dann das Rendern des Helpers beginnt. </p>
<p><code>$this->content = $this->_helper->widget->convert($content);</code></p>
<pre class="brush: php">&lt;?php

/**
 * Der Actionhelper läd View Helper indem er entsprechende Stellen aus einem String sucht.
 *
 * @see         Zend_Controller_Action_Helper_Abstract
 * @uses        Zend_Controller_Action_Helper_Abstract
 * @category    Suka
 * @package     Suka_Controller
 * @subpackage  Action_Helper
 * @author      Denis Zunke &lt;denis.zunke@zorta.de&gt;;
 * @version     0.1
 * @copyright   2010 zorta.de
 * @link        http://www.zorta.de/SukaSys
 * @license     http://opensource.org/licenses/gpl-license.php GNU Public License v3
 */

class Suka_Controller_Action_Helper_Widget extends Zend_Controller_Action_Helper_Abstract {

    /**
     * Sucht ein Widget aus einem Text und ersetzt es durch die Ausgabe eines View Helpers
     *
     * @param   string      $content    Der Seiteninhalt
     * @return  string
     */
    public function convert($content)
    {
        // Heraussuchen der vorhandenen Widgets
        $matches = array();
        preg_match_all(&#039;|{widget:([^\|]*)(\|.*)?}|U&#039;,$content,$matches,PREG_SET_ORDER);

        // Lade die gefundenen Widgets und ersetze den entsprechenden Content
        foreach ($matches as $widget) {
            try {
            	// Sollte es Parameter geben, dann trenne diese auf
            	if (!empty($widget[2])) {
            	   $paramsString = str_replace(&#039;|&#039;,&#039;&#039;,$widget[2]);
            	   $params = explode(&#039;,&#039;,$paramsString);
            	   $widgetOutput = (string) Suka_Widget::load($widget[1],$params);
            	} else {
            	   $widgetOutput = (string) Suka_Widget::load($widget[1]);
            	}
                $content       = str_replace($widget[0],$widgetOutput,$content);
            } catch (CLib_Widget_Exception $e) {
                continue;
            }
        }

        return $content;
    }
}</pre>
<p>Wie schön zu sehen ist wird über einen Regex die Syntax aus dem Text gesucht und entsprechend aufgeteilt, dass am Ende entweder das Widget mit oder ohne Parameter geladen werden kann. Das Widget selber basiert auf einer Abstrakten Klasse, die die Grundfunktionalitäten mitbringt und in der die Methode <code>draw()</code> überschrieben werden muss. Ich habe die Widgets in <code>application/views/widgets</code> untergebracht und den Autoloader entsprechend konfiguriert, so dass sie dem Namensschema <code>App_Widget_MyWidget</code> folgen. Probiert es einfach auf, für Rückfragen stehe ich gerne zur Verfügung. Natürlich gibt es im Folgenden noch die entsprechenden Klassen.</p>
<p>Eine Überlegung für die Zukunft ist es noch den Inhalt des Widgets in phtml Dateien auszulagern. So lange aber lagert er in der <code>draw()</code> Methode.</p>
<pre class="brush: php">&#039;resourceAutoloader&#039; =&gt; array (
            &#039;basePath&#039;   =&gt; APPLICATION_PATH,
            &#039;namespace&#039;     =&gt; &#039;App_&#039;,
            &#039;resourceTypes&#039; =&gt; array (
                &#039;widget&#039;   =&gt; array(
                    &#039;path&#039;      =&gt; &#039;views/widgets&#039;,
                    &#039;namespace&#039; =&gt; &#039;Widget_&#039;
                )
            )
        )</pre>
<pre class="brush: php">&lt;?php

/**
 * Widgetklasse
 *
 * Enthällt funktionalitäten rund um Widgets.
 *
 * @category    Suka
 * @package     Suka
 * @author      Denis Zunke &lt;denis.zunke@zorta.de&gt;;
 * @version     0.1
 * @copyright   2010 zorta.de
 * @link        http://www.zorta.de/SukaSys
 * @license     http://opensource.org/licenses/gpl-license.php GNU Public License v3
 */

class Suka_Widget
{

    /**
     * Läd ein Widget aus den vorgegebenen Verzeichnissen
     *
     * @param   string  $widget     Name des Widgets
     * @return  CLib_Widget_Abstract | boolean
     */
    public static function load($widget, $params = null)
    {
        # Erstmal prüfen, ob es ein normales Widget ist
        $loader = Zend_Loader_Autoloader::getInstance();
        $autoloadWidget = &#039;App_Widget_&#039; . $widget;
        if(@$loader-&gt;autoload($autoloadWidget))
        {
            return new $autoloadWidget($params);
        }
        else
        {
           # Wenn nicht, dann prüfe, ob es ein Widget aus einam Modul ist
            $pfad_imp = explode(&#039;_&#039;,$widget);
            $pfad_imp[0] = strtolower($pfad_imp[0]);
            if (isset($pfad_imp[1])) {
                $pfad = APPLICATION_PATH .&quot;/modules/{$pfad_imp[0]}/views/widgets/{$pfad_imp[1]}.php&quot;;
                if (file_exists($pfad)) {
                    require_once $pfad;

                    $widget = ucfirst($pfad_imp[0]) .&#039;_Views_Widgets_&#039;. $pfad_imp[1];

                    return new $widget($params);
                }
            }
        }

       return null;
    }
}</pre>
<pre class="brush: php">&lt;?php

/**
 * Basisklasse für Widgets
 *
 * Über diese KLasse werdne den Widgets funktionalitäten hinzugefügt,
 * die jedes Widget im Standard aufweisen muss.
 *
 * @category    Suka
 * @package     Suka_Widget
 * @author      Denis Zunke &lt;denis.zunke@zorta.de&gt;;
 * @version     0.1
 * @copyright   2010 zorta.de
 * @link        http://www.zorta.de/SukaSys
 * @license     http://opensource.org/licenses/gpl-license.php GNU Public License v3
 */

abstract class Suka_Widget_Abstract
{

    /**
     * Enthält die Optionen, die für das Widget mitgegeben wurden
     *
     * @var array
     */
    protected $_options = array();

    /**
     * Erstellt diese Klasse, alles was für das Widget abgearbeitet werden soll
     * bei der Erstellung muss eine Unterkunft in dieser Methode finden
     *
     * @param   array   $params     Ein Array mit Parametern für das Widget
     */
    public function __construct($params = null)
    {
        if (!empty($params) AND is_array($params)) {
            $this-&gt;setOptions($params);
        }
    }

    /**
     * Ausgeben des generierten Contents
     *
     * @return string
     */
    public function __toString()
    {
        return (string) $this-&gt;draw();
    }

    /**
     * Setzt die Optionen dieses Widgets
     *
     * @param   array   $options    Ein Array mit Optionen
     * @return  Suka_Widget_Abstract
     */
    public function setOptions($options)
    {
        $this-&gt;_options = $options;
        return $this;
    }

    /**
     * Gibt eine Option des Widgets zurück
     *
     * @param   string  $option     Welche Option ausgegeben werdne soll
     * @return  mixed
     */
    public function getOption($option)
    {
        if (isset($this-&gt;_options[$option])) {
            return $this-&gt;_options[$option];
        }

        return false;
    }

    /**
     * Erstellen des Contents. Muss in einem Widget vorkommen um
     * den Content darstellen zu können.
     *
     * @return  string
     */
    abstract protected function draw();

}</pre>
<pre class="brush: php">&lt;?php

/**
 * Fehlermeldungen des Widgetsystems
 *
 * @category    Suka
 * @package     Suka_Widget
 * @author      Denis Zunke &lt;denis.zunke@zorta.de&gt;;
 * @version     0.1
 * @copyright   2010 zorta.de
 * @link        http://www.zorta.de/SukaSys
 * @license     http://opensource.org/licenses/gpl-license.php GNU Public License v3
 */

class Suka_Widget_Exception extends Zend_Exception {}</pre>
<pre class="brush: php">&lt;?php

/**
 * Test
 *
 * @category    Views
 * @package     Views_Helpers
 * @author      Denis Zunke &lt;denis.zunke@zorta.de&gt;
 * @version     0.1
 * @copyright   2010 zorta.de
 * @link        http://www.zorta.de/SukaSys
 * @license     http://opensource.org/licenses/gpl-license.php GNU Public License v3
 */

class App_Widget_MyWidget extends Suka_Widget_Abstract {

    protected function draw()
    {
        return &#039;&lt;p&gt;Ich bin ein Text aus einem Widget&lt;/p&gt;&#039; . &#039; &#039; . $this-&gt;getOption(0) . &#039; &#039; . $this-&gt;getOption(1) . &#039; &#039; . $this-&gt;getOption(2) . &#039; &#039;;
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/frameworks/ein-widget-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPUnit &amp; Zend Studio for Eclipse</title>
		<link>http://www.zorta.de/frameworks/zend-framework/phpunit-zend-studio-for-eclipse/</link>
		<comments>http://www.zorta.de/frameworks/zend-framework/phpunit-zend-studio-for-eclipse/#comments</comments>
		<pubDate>Sun, 10 May 2009 13:06:50 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=13</guid>
		<description><![CDATA[Das Zend Studio 6, also jenes, das auf Eclipse und PDT basiert, unterstüzt PHPUnit. Mit diesem kann man seine Anwendungen Testen. Nun ist aber die Frage der Anwendung. Wie ich haben auch viele anere Nutzer des Zend Studios anfängliche Probleme sich in das umfangreiche Debugging einzufinden. Ich gehe jetzt einmal von einer frischen Installation des [...]]]></description>
			<content:encoded><![CDATA[<p>Das Zend Studio 6, also jenes, das auf Eclipse und PDT basiert, unterstüzt PHPUnit. Mit diesem kann man seine Anwendungen Testen. Nun ist aber die Frage der Anwendung. Wie ich haben auch viele anere Nutzer des Zend Studios anfängliche Probleme sich in das umfangreiche Debugging einzufinden. </p>
<p>Ich gehe jetzt einmal von einer frischen Installation des Zend Studio aus. Wir legen uns zunächst ein einfaches Zend Framework Projekt an. Das ganze bekommt einen Namen und den gewünschten Workspace. Die ZF Version auswählen und dann gleich auf &#8220;Fertig&#8221; klicken. </p>
<p>Ein einfaches Zend Framework Projekt wird jetzt inkl. Sturktur und einigen Basisdateien angelegt. Dazu auch ein Verzeichnis Test. Dies öffnen wir und sehen die Datei &#8220;AllTests.php&#8221;. Mit einem Rechtsklick auf die Datei rufen wir das Context Menü dieser Datei auf und gehen auf &#8220;Debug As&#8221;. Wie wir sehen steht dort nichts vom PHPUnit Test. Also klicken wir auf &#8220;Debug Configurations&#8221;. Es öffnet sich ein Fenster. Mit einem Rechtsklick auf &#8220;PHPUnit&#8221; gibt es ein neues Contextmenü indem wir auf &#8220;New&#8221; klicken. </p>
<p>So wird gleich ein neuer PHPUnit Test mit dem Namen &#8220;AllTests.php&#8221; angezeigt. Klickt diesen an. Nun ist eigentlich nur wichtig, dass ihr die 2. Option ausgewählt habt, dass alle Tests gestartet werden. Nicht wie die erste Option es angibt &#8220;Run as single Test&#8221;. Das wollen wir nicht. Noch nicht.</p>
<p>Nun noch ein klick auf &#8220;Debug&#8221; und das Fenster schließt sich. Es kommt die Frage, ob ihr in eine ander ePerspektive wechseln wollt. Das müsst ihr für euch Entscheiden. Ich mache es eher seltener, da ich nicht alle die Fenster aus der Debug Ansicht brauche. Rechts im Zend Studio hat sich nun ein neuer Bereich geöffnet für die PHPUnit Tests. Dort seht ihr, ob es Errors gab usw. eigentlich recht simple zu verstehen.</p>
<p>Wenn ihr nun auch in der Dateileiste wieder auf &#8220;AllTests.php&#8221; geht, dann findet ihr nun im Contectmenü auch den Punkt &#8220;Debug As PHPUnit Test&#8221;. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/frameworks/zend-framework/phpunit-zend-studio-for-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

