<?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>WEBPIRATEN &#187; PHP</title>
	<atom:link href="http://webpiraten.de/index.php/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://webpiraten.de</link>
	<description>TECHNOLOGIE-BLOG</description>
	<lastBuildDate>Sun, 20 Jun 2010 19:00:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Agavi Custom Logger implementieren</title>
		<link>http://webpiraten.de/index.php/2010/05/agavi-custom-logger-implementieren/</link>
		<comments>http://webpiraten.de/index.php/2010/05/agavi-custom-logger-implementieren/#comments</comments>
		<pubDate>Fri, 07 May 2010 15:15:57 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[agavi]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[logger]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=252</guid>
		<description><![CDATA[Um in Agavi custom logfiles zu erstellen, benötigt man einen eigens erstellten logger + appender in der app/config/logger.xml. &#60;!-- logs only custom messages in a custom log --&#62; &#60;logger name=&#34;custom&#34; class=&#34;AgaviLogger&#34; level=&#34;'custom'&#34;&#62; &#60;appenders&#62; &#60;appender&#62;CustomLogAppender&#60;/appender&#62; &#60;/appenders&#62; &#60;/logger&#62; &#60;appender name=&#34;CustomLogAppender&#34; class=&#34;AgaviFileLoggerAppender&#34; layout=&#34;DateTimeLayout&#34;&#62; &#60;ae:parameters&#62; &#60;ae:parameter name=&#34;file&#34;&#62;%core.app_dir%/log/custom.log&#60;/ae:parameter&#62; &#60;/ae:parameters&#62; &#60;/appender&#62; Dann kann man den Logger quasi überall wo der LoggerManager [...]]]></description>
			<content:encoded><![CDATA[<p>Um in Agavi custom logfiles zu erstellen, benötigt man einen eigens erstellten logger + appender in der <strong>app/config/logger.xml</strong>.</p>
<pre class="brush: xml;">
&lt;!-- logs only custom messages in a custom log --&gt;
&lt;logger name=&quot;custom&quot; class=&quot;AgaviLogger&quot; level=&quot;'custom'&quot;&gt;
    &lt;appenders&gt;
        &lt;appender&gt;CustomLogAppender&lt;/appender&gt;
    &lt;/appenders&gt;
&lt;/logger&gt;

&lt;appender name=&quot;CustomLogAppender&quot; class=&quot;AgaviFileLoggerAppender&quot; layout=&quot;DateTimeLayout&quot;&gt;
    &lt;ae:parameters&gt;
        &lt;ae:parameter name=&quot;file&quot;&gt;%core.app_dir%/log/custom.log&lt;/ae:parameter&gt;
    &lt;/ae:parameters&gt;
&lt;/appender&gt;
</pre>
<p>Dann kann man den Logger quasi überall wo der LoggerManager verfügbar ist benutzen.</p>
<pre class="brush: php;">
$message = 'Custom logging message';
$this-&gt;getContext()-&gt;getLoggerManager()-&gt;log(new AgaviLoggerMessage($message, 'custom'), 'custom');
</pre>
<p>Und in der bash das logfile einsehen.</p>
<pre class="brush: bash;">
tail -f app/log/custom.log
</pre>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2010/05/agavi-custom-logger-implementieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDF Dokumente mit Zend LiveDocx</title>
		<link>http://webpiraten.de/index.php/2009/11/pdf-dokumente-mit-zend-livedocx/</link>
		<comments>http://webpiraten.de/index.php/2009/11/pdf-dokumente-mit-zend-livedocx/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 09:01:18 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[docx]]></category>
		<category><![CDATA[dokument]]></category>
		<category><![CDATA[livedocx]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[pdf2html]]></category>
		<category><![CDATA[phphatesme]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=218</guid>
		<description><![CDATA[Ein sehr interessanter Ansatz zur Erzeugung von Dokumenten im Web wird bei phphatesme.com beschrieben. HTML-zu-PDF-Konvertierung und programmatischer Ansatz sind ja bekannt. Der neue Ansatz bedient sich einer SOAP Schnittstelle und Templates. Unter folgender URL gibts mehr dazu: phphatesme.com &#8211; PDF Dokumente mit Zend LiveDocx]]></description>
			<content:encoded><![CDATA[<p>Ein sehr interessanter Ansatz zur Erzeugung von Dokumenten im Web wird bei <a href="http://phphatesme.com" target="_blank">phphatesme.com</a> beschrieben. HTML-zu-PDF-Konvertierung und programmatischer Ansatz sind ja bekannt. Der neue Ansatz bedient sich einer SOAP Schnittstelle und Templates. Unter folgender URL gibts mehr dazu: </p>
<p><a href="http://www.phphatesme.com/blog/webentwicklung/pdf-erzeugung-mit-dem-zend-framework/" target="_blank">phphatesme.com &#8211; PDF Dokumente mit Zend LiveDocx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/11/pdf-dokumente-mit-zend-livedocx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPBench &#8211; PHP auf dem Prüfstand</title>
		<link>http://webpiraten.de/index.php/2009/11/phpbench-php-auf-dem-pruefstand/</link>
		<comments>http://webpiraten.de/index.php/2009/11/phpbench-php-auf-dem-pruefstand/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 14:02:30 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[phpbench]]></category>

		<guid isPermaLink="false">http://webpiraten.de/index.php/2009/11/phpbench-php-auf-dem-prufstand/</guid>
		<description><![CDATA[Hier der Link zu PHPBench. Benchmarks für PHP Funktionen. phpbench.com]]></description>
			<content:encoded><![CDATA[<p>Hier der Link zu PHPBench. Benchmarks für PHP Funktionen.</p>
<p><a href="http://phpbench.com" target="_blank" title="phpbench.com">phpbench.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/11/phpbench-php-auf-dem-pruefstand/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging mit XDebug und KCachegrind</title>
		<link>http://webpiraten.de/index.php/2009/11/debugging-mit-xdebug-und-kcachegrin/</link>
		<comments>http://webpiraten.de/index.php/2009/11/debugging-mit-xdebug-und-kcachegrin/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 17:42:52 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[XDebug]]></category>
		<category><![CDATA[code coverage]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[kcachegrind]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[stacktrace]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[var_dump]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=204</guid>
		<description><![CDATA[XDebug ist das sehr beliebte und allseits bewährte Tool, das nicht nur Stacktrace und var_dumps ausgeben kann, sondern ebenso für CodeCoverage, echtes Debuggen, Profiling und Testen mit PHPUnit gedacht ist. XDebug kann Profiler Dateien erzeugen, die man mit KCacheGrind perfekt auswerten kann. So bleibt kein Flaschenhals in der Applikation unbemerkt. xdebug.org kcachegrind.sourceforge.net]]></description>
			<content:encoded><![CDATA[<p>XDebug ist das sehr beliebte und allseits bewährte Tool, das nicht nur Stacktrace und var_dumps ausgeben kann, sondern ebenso für CodeCoverage, echtes Debuggen, Profiling und Testen mit PHPUnit gedacht ist.</p>
<p>XDebug kann Profiler Dateien erzeugen, die man mit KCacheGrind perfekt auswerten kann. So bleibt kein Flaschenhals in der Applikation unbemerkt.</p>
<p><a href="http://xdebug.org" target="_blank">xdebug.org</a><br />
<a href="http://kcachegrind.sourceforge.net">kcachegrind.sourceforge.net</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/11/debugging-mit-xdebug-und-kcachegrin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eigene Configs in Agavi nutzen</title>
		<link>http://webpiraten.de/index.php/2009/11/eigene-configs-in-agavi-nutze/</link>
		<comments>http://webpiraten.de/index.php/2009/11/eigene-configs-in-agavi-nutze/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 00:15:31 +0000</pubDate>
		<dc:creator>graste</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[agavi]]></category>
		<category><![CDATA[ConfigHandler]]></category>
		<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Schema]]></category>
		<category><![CDATA[Validierung]]></category>
		<category><![CDATA[XSD]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=191</guid>
		<description><![CDATA[Eigene XML-Konfigurationsdateien mit Agavi definieren, validieren und verwenden. Eine kurze Einführung mit Beispielnutzung des AgaviReturnArrayConfigHandler.]]></description>
			<content:encoded><![CDATA[<p>Für diverse Aufgaben in größeren Projekten ist es notwendig, eigene XML-Konfigurationsdateien zu nutzen. Die Definition umfangreicher Einstellungen in der settings.xml wird schnell anstrengend und das Holen der Werte per <code>AgaviConfig::get('setting.name', 'default');</code> unübersichtlich. Agavi bietet es aber an, eigene Konfigurationsdateien zu erstellen und diese nicht nur zu validieren, sondern auch zur Wiederverwendung zu cachen.<br />
In der <a href="http://www.mivesto.de/agavi/agavi-faq.html#general_22">Agavi FAQ</a> habe ich dazu mal ein Beispiel verfasst.</p>
<p>Einfach einen Config-Handler in der <code>config_handlers.xml</code> definieren:</p>
<pre class="brush: xml;">
&lt;handler pattern=&quot;%core.config_dir%/project/foo/*.xml&quot; class=&quot;AgaviReturnArrayConfigHandler&quot; /&gt;
</pre>
<p>und dann direkt in den Actions, Views und Models benutzen:</p>
<pre class="brush: php;">
if (!isset($config['baz']))
{
    throw new LogicException('baz is missing!');
}

if (isset($config['bars']))
{
    foreach ($config['bars'] as $foo =&gt; $data)
    {
        $this-&gt;doSomethingWithEach($foo, $data);
    }
}
</pre>
<p>Die XML-Datei für den obigen Code könnte beispielweise so aussehen:</p>
<pre class="brush: xml;">
&lt;ae:configurations&gt;
    &lt;ae:configuration&gt;
        &lt;baz&gt;asdf&lt;/baz&gt;
        &lt;foo&gt;-1&lt;/foo&gt;
        &lt;bars&gt;
            &lt;some&gt;...more data and xml...&lt;/some&gt;
            &lt;more&gt;...more data and xml...&lt;/more&gt;
            &lt;deep&gt;...more data and xml...&lt;/deep&gt;
            &lt;structs&gt;...more data and xml...&lt;/structs&gt;
        &lt;/bars&gt;
    &lt;/ae:configuration&gt;
    &lt;ae:configuration environment=&quot;production.*&quot;&gt;
        &lt;baz&gt;bleh&lt;/baz&gt;
        &lt;foo&gt;1&lt;/foo&gt;
    &lt;/ae:configuration&gt;
&lt;/ae:configurations&gt;
</pre>
<p>Gut zu erkennen ist der Vorteil eigener Configs: Man kann die Agavi-Features für Konfigurationsdateien nutzen und auf einfache Art und Weise environmentspezifische Einstellungen vornehmen (z.B. in &#8220;Production&#8221; andere Werte für Logdateien, URLs oder Einstellungen nutzen als während der Entwicklung oder beim Testen).</p>
<p>Ebenfalls gut zu erkennen im PHP-Code ist, dass man lauter Abfragen über die Existenz bestimmer Elemente macht, die man sich mit vernünftiger Validierung sparen kann, da invalide XML-Dokumente gar nicht erst als korrekt angesehen werden von Agavi. Um seine XML-Strukturen zu validieren definiert man per <code>validation</code> Parameter ein XML-Schema und definiert noch gleich einen eigenen ConfigHandler, den man schreibt und per <code>autoload.xml</code> bekannt macht:</p>
<pre class="brush: xml;">
&lt;handler pattern=&quot;%core.config_dir%/project/foo/*.foo.xml&quot; class=&quot;FooDefinitionConfigHandler&quot;&gt;
    &lt;validation&gt;%core.config_dir%/xsd/foo_definition.xsd&lt;/validation/&gt;
&lt;/handler&gt;
</pre>
<p>Der ConfigHandler könnte so beginnen:</p>
<pre class="brush: php;">
class FooDefinitionConfigHandler extends AgaviXmlConfigHandler
{
    // notwendige Methoden implementieren und XML-Struktur validieren...
}
</pre>
<p>Für Beispiele einfach in die in Agavi verwendeten XSDs und entsprechende ConfigHandler sehen. Viel Spaß. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/11/eigene-configs-in-agavi-nutze/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPUnit Manual &#8211; Sebastian Bergmann</title>
		<link>http://webpiraten.de/index.php/2009/10/phpunit-manual-sebastian-bergmann/</link>
		<comments>http://webpiraten.de/index.php/2009/10/phpunit-manual-sebastian-bergmann/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 22:48:25 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[bergmann]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[sebastian]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=179</guid>
		<description><![CDATA[Hier der komplette PHPUnit Guide um entsprechende Tests zu seiner Applikation zu schreiben. PHPUnit Manual]]></description>
			<content:encoded><![CDATA[<p>Hier der komplette PHPUnit Guide um entsprechende Tests zu seiner Applikation zu schreiben. </p>
<p><a href="http://phpunit.de/manual/current/en/" target="_blank" title="PHPUnit Manual - Sebastian Bergmann">PHPUnit Manual</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/10/phpunit-manual-sebastian-bergmann/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Professionelle Softwareentwicklung mit PHP 5</title>
		<link>http://webpiraten.de/index.php/2009/10/professionelle-softwareentwicklung-mit-php-5/</link>
		<comments>http://webpiraten.de/index.php/2009/10/professionelle-softwareentwicklung-mit-php-5/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 22:40:56 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[datenbanken]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=174</guid>
		<description><![CDATA[Der ultimative Guide für Objektorientierung, Entwurfsmuster und Modellierung sowie fortgeschrittene Datenbankprogrammierung von Sebastian Bergmann Professionelle Softwareentwicklung mit PHP 5]]></description>
			<content:encoded><![CDATA[<p>Der ultimative Guide für Objektorientierung, Entwurfsmuster und Modellierung sowie fortgeschrittene Datenbankprogrammierung von Sebastian Bergmann</p>
<p><a href="http://professionelle-softwareentwicklung-mit-php5.de" target="_blank" title="Professionelle Softwareentwicklung mit PHP 5 - Sebastian Bergmann">Professionelle Softwareentwicklung mit PHP 5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/10/professionelle-softwareentwicklung-mit-php-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>der Kohana Script Collector Helper</title>
		<link>http://webpiraten.de/index.php/2009/10/der-kohana-script-collector-helper/</link>
		<comments>http://webpiraten.de/index.php/2009/10/der-kohana-script-collector-helper/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 19:26:49 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[collector]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[helper]]></category>
		<category><![CDATA[kohana]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[stylesheet]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=89</guid>
		<description><![CDATA[Um modular und agil in Kohana zu entwickeln, wurde ein Skript Kollektor notwendig, der aus allen Controllern (Template- oder Standard-Controllern) Skripte (CSS, Javascript) sammeln kann. Diese Scripte werden dann auf den jeweiligen Mastertemplates wieder an den richtigen Stellen eingebunden. Dazu habe ich einen neuen Helper unter application/helpers/collector.php eingerichtet. class Collector_Core { /** * Arrays containing [...]]]></description>
			<content:encoded><![CDATA[<p>Um modular und agil in Kohana zu entwickeln, wurde ein Skript Kollektor notwendig, der aus allen Controllern (Template- oder Standard-Controllern) Skripte (CSS, Javascript) sammeln kann.</p>
<p>Diese Scripte werden dann auf den jeweiligen Mastertemplates wieder an den richtigen Stellen eingebunden.<br />
Dazu habe ich einen neuen Helper unter application/helpers/collector.php eingerichtet.</p>
<pre class="brush: php;">

class Collector_Core
{
    /**
     * Arrays containing URL's to scripts/styles (fill with standards)
     * @var string
     */
    static protected $scripts       = array();
    static protected $styles        = array();

    /**
     * Adds a url to store
     * @param string $file the local path to file
     * @return void
     */
    static public function addJs($file)
    {
        self::$scripts[] = $file;
    }

    /**
     * Adds a url to store
     * @param string $file the local path to file
     * @return void
     */
    static public function addCss($file)
    {
        self::$styles[] = $file;
    }

    /**
     * Generates/renders collectors items
     * @param boolean      $print whether to echo the output or just return rendered string
     * @return string      the rendered output
     */
    static public function renderJs($print = false)
    {
        $scripts    = array_unique(self::$scripts);
        $output     = html::script($scripts);
        if ($print)
        {
            echo $output;
        }
        else
        {
            return $output;
        }
    }

    /**
     * Generates/renders collectors items
     * @param boolean      $print whether to echo the output or just return rendered string
     * @param string|array $media type for this style (all, screen, print, media)
     * @return string      the rendered output
     */
    static public function renderCss($print = false, $media = 'all')
    {
        $styles = array_unique(self::$styles);
        $output = html::stylesheet($styles, $media);
        if ($print)
        {
            echo $output;
        }
        else
        {
            return $output;
        }
    }
} // end of Collector_Core
</pre>
<p>Dieser Helper kann nun aus allen Controllern heraus befüllt werden.</p>
<pre class="brush: php;">

class Welcome_Controller extends Template_Controller
{
    /**
     * set master template
     */
    public $template = 'master_default.tpl';

    /**
     * default constructor
     * @param void
     * @return void
     */
    public function __construct()
    {
        // load parent constructor
        parent::__construct();

        // collect scripts and styles
        collector::addCss('/css/fancybox');
        collector::addJs('/js/jquery.1.3.2');
        collector::addJs('/js/jquery.fancybox');
    }
    /** more code here */
} // end of Welcome_Controller
</pre>
<p>Nachdem nun alle relevanten Skripte eingesammelt wurden, kann man diese auf dem Template wieder ausgeben lassen.</p>
<pre class="brush: xml;">

&lt;?php collector::renderCss(true, 'all'); ?&gt;

&lt;!-- html code here --&gt;

&lt;?php collector::renderJs(true); ?&gt;
</pre>
<p>Der Kollektor sorgt dafür das keine doppelten Skripte geladen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/10/der-kohana-script-collector-helper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOAP Service mit Kohana und Zend AutoDiscover</title>
		<link>http://webpiraten.de/index.php/2009/10/soap-service-mit-kohana-und-zend-autodiscover/</link>
		<comments>http://webpiraten.de/index.php/2009/10/soap-service-mit-kohana-und-zend-autodiscover/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 13:48:04 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[autodiscover]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[kohana]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[wsdl]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=43</guid>
		<description><![CDATA[Eine einfache all-in-one Lösung für Standard SOAP Services kann man mit dem Kohana Framework und der Zend Bibliothek realisieren. Dazu bedarf es lediglich eines Kohana Frontcontrollers über den wir den Service und die WSDL ansprechen können. Zur automatischen Generierung der WSDL, bedienen wir uns hier der Zend AutoDiscover Klasse. Dieser Klasse übergibt man lediglich die [...]]]></description>
			<content:encoded><![CDATA[<p>Eine einfache all-in-one Lösung für Standard SOAP Services kann man mit dem Kohana Framework und der Zend Bibliothek realisieren.</p>
<p>Dazu bedarf es lediglich eines Kohana Frontcontrollers über den wir den Service und die WSDL ansprechen können.</p>
<p>Zur automatischen Generierung der WSDL, bedienen wir uns hier der Zend AutoDiscover Klasse. Dieser Klasse übergibt man lediglich die ServiceModel-Klasse mit enthaltenen Annotationen, die die Servicefunktionen enthält.</p>
<p>Aus den Annotationen generiert Zend AutoDiscover eine passende WSDL.</p>
<pre class="brush: php;">

/**
 * include libs and models
 *
 */
include('Zend/Soap/AutoDiscover.php');
include(APPPATH . 'models/service.php');

/**
 * this class represents a controller
 * application/controllers/soap.php
 *
 * @package     SOAPService
 * @subpackage  ...
 * @author      saegefisch (xxx@xxx.xx)
 * @copyright   (c) 2009 xxx
 */
class Soap_Controller extends Controller
{
    /**
     * default constructor
     *
     * @param void
     * @return void
     */
    public function __construct()
    {
        // load parent constructor
        parent::__construct();
    }

    /**
     * service to call
     *
     * @param void
     * @return void
     */
    public function service()
    {
        // disable wsdl cache
        ini_set('soap.wsdl_cache_enabled', '0');

        // set auth settings if needed
        $settings   = array(
                          'login'              =&gt; 'user',
                          'password'        =&gt; 'password',
                          'authentication' =&gt; SOAP_AUTHENTICATION_BASIC,
                          'soap_version'   =&gt; SOAP_1_2,
                          'encoding'         =&gt; 'UTF-8',
                          'cache_wsdl'     =&gt; WSDL_CACHE_NONE
                          );

        // include user:password if needed
        $wsdl = 'http://user:password@' . $_SERVER['HTTP_HOST'] . '/soap/wsdl';
        $server = new SoapServer($wsdl, $settings);
        $server-&gt;setClass('Service_Model');
        $server-&gt;handle();
    }

    /**
     * wsdl to call
     *
     * @param void
     * @return void
     */
    public function wsdl()
    {
        // disable wsdl cache
        ini_set('soap.wsdl_cache_enabled', '0');

        $wsdl = new Zend_Soap_AutoDiscover();
        $wsdl-&gt;setUri('http://' . $_SERVER['HTTP_HOST'] . '/soap/service');
        $wsdl-&gt;setClass('Service_Model');
        $wsdl-&gt;handle();
    }
}
</pre>
<p>Hier stellen wir das Standard Model für unseren SOAP Service zusammen.</p>
<pre class="brush: php;">

/**
 * this class represents a model
 * application/models/service.php
 *
 * @package     SOAPService
 * @subpackage  ...
 * @author      saegefisch (xxx@xxx.xx)
 * @copyright   (c) 2009
 */
class Service_Model extends Model
{
    /**
     * default constructor
     *
     * @param   void
     * @return  void
     */
    public function __construct()
    {
        // load database library into $this-&gt;db (can be omitted if not required)
        parent::__construct();
    }

    /**
     * dummy function
     *
     * @param   int $int
     * @param   string $string
     * @param   array $arr
     * @param   object $obj
     * @param   bool $bool
     * @return  array
     */
    public function get_dummy_array($int, $string, $arr, $obj, $bool)
    {
        return array();
    }

    /**
     * dummy function
     *
     * @param   int $int
     * @param   string $string
     * @param   array $arr
     * @param   object $obj
     * @param   bool $bool
     * @return  bool
     */
    public function get_dummy_boolean($int, $string, $arr, $obj, $bool)
    {
        return true;
    }

    /**
     * dummy function
     *
     * @param   int $int
     * @param   string $string
     * @param   array $arr
     * @param   object $obj
     * @param   bool $bool
     * @return  string
     */
    public function get_dummy_string($int, $string, $arr, $obj, $bool)
    {
        return 'foo=bar';
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/10/soap-service-mit-kohana-und-zend-autodiscover/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>der Criteria Builder für Propel ORM Criterias</title>
		<link>http://webpiraten.de/index.php/2009/10/criteria-builder-propel-orm/</link>
		<comments>http://webpiraten.de/index.php/2009/10/criteria-builder-propel-orm/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 12:58:24 +0000</pubDate>
		<dc:creator>sägefisch</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Propel ORM]]></category>
		<category><![CDATA[builder]]></category>
		<category><![CDATA[criteria]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://webpiraten.de/?p=31</guid>
		<description><![CDATA[Die Propel ORM für PHP bedient sich einer eigenen Syntax (Criterias) um Queries zusammenzustellen. Hier gibt es einen Criteria Builder, den man mit Standard SQL füttern kann. Der Criteria Builder konvertiert sodann das eingegebene SQL Statement in ein Propel Criteria. So wird aus diesem kleinen SQL Statement: SELECT user.* FROM user WHERE user.state = 100 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://propel.jondh.me.uk/" target="_blank" title="der Criteria Builder für Propel ORM Criterias"><img src="http://webpiraten.de/wp-content/uploads/2009/10/propel_criteria_builder-300x183.png" alt="propel_criteria_builder" title="propel_criteria_builder" width="300" height="183" class="alignleft size-medium wp-image-33" /></a></p>
<p>Die Propel ORM für PHP bedient sich einer eigenen Syntax (Criterias) um Queries zusammenzustellen. </p>
<p>Hier gibt es einen Criteria Builder, den man mit Standard SQL füttern kann.</p>
<p>Der Criteria Builder konvertiert sodann das eingegebene SQL Statement in ein Propel Criteria. </p>
<p>So wird aus diesem kleinen SQL Statement:</p>
<pre class="brush: sql;">

SELECT user.*
FROM user
WHERE user.state = 100
AND (user.name = 'user' OR user.email = 'user@domain.tld')
</pre>
<p>diese Propel Criteria:</p>
<pre class="brush: php;">

$c = new Criteria();
$crit0 = $c-&gt;getNewCriterion(UserPeer::STATE, 100);
$crit1 = $c-&gt;getNewCriterion(UserPeer::NAME, 'user');
$crit2 = $c-&gt;getNewCriterion(UserPeer::EMAIL, 'user@domain.tld');

// Perform OR at level 1 ($crit1 $crit2 )
$crit1-&gt;addOr($crit2);

// Perform AND at level 0 ($crit0 $crit1 )
$crit0-&gt;addAnd($crit1);

// Remember to change the peer class here for the correct one in your model
$c-&gt;add($crit0);
$result = TablePeer::doSelect($c);

// This loop will of course need to be edited to work
foreach ($result as $obj)
{
	//$val = $obj-&gt;getValue();
}
</pre>
<p>Einen Versuch ist es Wert.</p>
<p><a href="http://propel.jondh.me.uk/" target="_blank" title="der Criteria Builder für Propel ORM Criterias">Hier gehts zum Propel ORM Criteria Builder</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webpiraten.de/index.php/2009/10/criteria-builder-propel-orm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
