<?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>engoyan &#187; php</title>
	<atom:link href="http://www.engoyan.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.engoyan.com</link>
	<description>engoyan&#039;s stikers ^-^</description>
	<lastBuildDate>Mon, 12 Dec 2011 05:18:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>toArray for simplexml</title>
		<link>http://www.engoyan.com/613/toarray-for-simplexml.html</link>
		<comments>http://www.engoyan.com/613/toarray-for-simplexml.html#comments</comments>
		<pubDate>Wed, 02 Feb 2011 06:48:03 +0000</pubDate>
		<dc:creator>vadim engoyan</dc:creator>
				<category><![CDATA[общие]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[simplexml]]></category>
		<category><![CDATA[simplexml_load_string]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.engoyan.com/?p=613</guid>
		<description><![CDATA[

// defining class for simplexml_load_string result which extends SimpleXMLElement
$obj = simplexml_load_string($xml, &#039;xmlArray&#039;);

var_dump($obj-&#62;toArray());

&#8230;.


class xmlArray extends SimpleXMLElement{

    public function toArray(){
        return $this-&#62;simpleXMLToArray($this);
    }

    private function simpleXMLToArray($xml,
                [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush: php">

// defining class for simplexml_load_string result which extends SimpleXMLElement
$obj = simplexml_load_string($xml, &#039;xmlArray&#039;);

var_dump($obj-&gt;toArray());
</pre>
<p>&#8230;.<span id="more-613"></span></p>
<pre class="brush: php">

class xmlArray extends SimpleXMLElement{

    public function toArray(){
        return $this-&gt;simpleXMLToArray($this);
    }

    private function simpleXMLToArray($xml,
                    $flattenValues=true,
                    $flattenAttributes = true,
                    $flattenChildren=true,
                    $valueKey=&#039;@value&#039;,
                    $attributesKey=&#039;@attributes&#039;,
                    $childrenKey=&#039;@children&#039;){

        $return = array();
        if(!($xml instanceof SimpleXMLElement)){return $return;}
        $name = $xml-&gt;getName();
        $_value = trim((string)$xml);
        if(strlen($_value)==0){$_value = null;};

        if($_value!==null){
            if(!$flattenValues){$return[$valueKey] = $_value;}
            else{$return = $_value;}
        }

        $children = array();
        $first = true;
        foreach($xml-&gt;children() as $elementName =&gt; $child){
            $value = $this-&gt;simpleXMLToArray($child, $flattenValues, $flattenAttributes, $flattenChildren, $valueKey, $attributesKey, $childrenKey);
            if(isset($children[$elementName])){
                if($first){
                    $temp = $children[$elementName];
                    unset($children[$elementName]);
                    $children[$elementName][] = $temp;
                    $first=false;
                }
                $children[$elementName][] = $value;
            }
            else{
                $children[$elementName] = $value;
            }
        }
        if(count($children)&gt;0){
            if(!$flattenChildren){$return[$childrenKey] = $children;}
            else{$return = array_merge($return,$children);}
        }

        $attributes = array();
        foreach($xml-&gt;attributes() as $name=&gt;$value){
            $attributes[$name] = trim($value);
        }
        if(count($attributes)&gt;0){
            if(!$flattenAttributes){$return[$attributesKey] = $attributes;}
            else{$return = array_merge($return, $attributes);}
        }

        return $return;
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.engoyan.com/613/toarray-for-simplexml.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>overloaded zend_db fetchAll for multi-language designed db</title>
		<link>http://www.engoyan.com/489/overloaded-zend_db-fetchall-for-multi-language-websites.html</link>
		<comments>http://www.engoyan.com/489/overloaded-zend_db-fetchall-for-multi-language-websites.html#comments</comments>
		<pubDate>Mon, 31 May 2010 07:53:04 +0000</pubDate>
		<dc:creator>vadim engoyan</dc:creator>
				<category><![CDATA[общие]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[fra]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.engoyan.com/?p=489</guid>
		<description><![CDATA[part of multi-language logic of my Engine v4.9 php 5.3 sweet framework. example: 

public function fetchAll($lang = null){
    $select = new Zend_Db_Table_Select($this);

    $ml_fileds = array(&#039;*&#039;);
    $lang = Engine::web()-&#62;getLang();

    foreach(self::$mult_fields as $name =&#62; $field){
        $ml_fileds[$name] = &#34;(select [...]]]></description>
			<content:encoded><![CDATA[<p>part of multi-language logic of my Engine v4.9 php 5.3 sweet framework. example: <span id="more-489"></span></p>
<pre class="brush: php">
public function fetchAll($lang = null){
    $select = new Zend_Db_Table_Select($this);

    $ml_fileds = array(&#039;*&#039;);
    $lang = Engine::web()-&gt;getLang();

    foreach(self::$mult_fields as $name =&gt; $field){
        $ml_fileds[$name] = &quot;(select text from ml_data WHERE pid = t.id AND `table` = &#039;{$this-&gt;_name}&#039; AND lang = &#039;{$lang}&#039; AND field = &#039;{$name}&#039;)&quot;;
    }

    $select-&gt;setIntegrityCheck(false)
        -&gt;from(array(&quot;t&quot; =&gt; $this-&gt;_name), $ml_fileds);

    return parent::fetchAll($select);
}
</pre>
<p>$ml_fileds -array with multi-language fields of current object structure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.engoyan.com/489/overloaded-zend_db-fetchall-for-multi-language-websites.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Engine: Router</title>
		<link>http://www.engoyan.com/206/web-engine-router.html</link>
		<comments>http://www.engoyan.com/206/web-engine-router.html#comments</comments>
		<pubDate>Sun, 29 Nov 2009 17:27:52 +0000</pubDate>
		<dc:creator>vadim engoyan</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web engine]]></category>

		<guid isPermaLink="false"> http://www.engoyan.com/?p=206</guid>
		<description><![CDATA[

			     
                 
				

Итак, для начала создадим задачу Router под нужным проектом в системе управления проектами TaskUP  и запустим эту задачу (про TaskUP будет отдельная статья). Начнем с простого, а именно с рутера — класса [...]]]></description>
			<content:encoded><![CDATA[<p>

			    <a href="/wp-content/uploads/2009/11/router2.png" class="highslide"  onclick="return hs.expand(this, {captionId: 'caption-for-P2060'})"> 
                <img src="/wp-content/uploads/2009/11/router2-150x150.png" alt="Router" border="0" id="P2060" title="Router" align="right" style="" /></a> 
				

Итак, для начала создадим задачу Router под нужным проектом в системе управления проектами <a href="http://www.TaskUP.com" target="_blank" title="TaskUP Projects Management System" >TaskUP</a>  и запустим эту задачу (про TaskUP будет отдельная статья). Начнем с простого, а именно с рутера — класса отвечающего за обработку URI. К тому же Router в движке, согласно нашей схемы, будет загружаться после конфигурации.</p>
<p>К конфигурации отдельно на будем уделять времени, а будем его касаться по мере надобности.</p>
<p>Класс должен уметь обрабатывать адреса следующего вида:<br />
<img src=" http://www.engoyan.com/wp-content/uploads/2009/11/route.jpg" alt="Типичный URL" title="Типичный URL" width="501" height="72" class="alignnone size-full wp-image-256" /><br />
<span id="more-206"></span></p>
<p>Как мы уже договорились наш класс Engine будет состоять из статических методов, которые будут возвращать синглтон вспомогательных классов. Наш класс Router один из таких классов.</p>
<p>Файл <strong>Engine.php</strong>:</p>
<pre class="brush: php">
class Engine {

	protected static $_conf;
	protected static $_route;

	public static function conf(){
		if(self::$_conf===NULL){
			self::$_conf =  Array();
		}
		return self::$_conf;
	}

	public static function route(){
		if(self::$_route===NULL){
			self::loadClass(&#039;Router&#039;);
			self::$_route = new Router;
		}
		return self::$_route;
	}	

	public static function loadClass($class_name){
		require_once(&quot;lib/&quot; .&quot;$class_name&quot;.&quot;_class.php&quot;);
	}
}
</pre>
<p>Как видим из файла в данном случае это статический метод <strong>route()</strong>. Внутри него подгружается класс <strong>Router</strong>.</p>
<p>Подгружаемый класс Router:</p>
<pre class="brush: php">
class Router {

	protected static $_URL;
	protected static $_N;
	protected static $_TAIL;

	function __construct(){
	  $uri = $_SERVER[&#039;REQUEST_URI&#039;];

	  $uri = explode(&#039;/&#039;,$uri);
	  if(!$uri[0]) array_shift($uri);

	  foreach($uri as $id =&gt; $u){
	  	if(is_numeric($u)){
	  		self::$_N[]=$u;
	  	}elseif(!self::$_TAIL &amp;&amp; !self::$_N){
	  		self::$_URL[]=$u;
	  	}else{
	  		self::$_TAIL[]=$u;
	  	}
	  }
	}

	public static function u($pos){
		return array_shift(array_slice(self::$_URL,$pos,1));
	}

	public static function n($pos){
		return array_shift(array_slice(self::$_N,$pos,1));
	}

	public static function t($pos){
		return array_shift(array_slice(self::$_TAIL,$pos,1));
	}
}
</pre>
<p>Переменные $_URL, $_N, $_TAIL защищены. В них складываются элементы адресной строки. Вспомогательные публичные методы u(), n() и t() дают доступ к этим переменным соответственно.</p>
<p>Пример использования:</p>
<pre class="brush: php">
public static function run(){
	self::route()-&gt;u(2); //  list 

	self::route()-&gt;n(0); // 49

	self::route()-&gt;t(-1); // desc
}
</pre>
<p>Конечно это не окончательное содержание этих файлов. Оно будет измяться и пополняться по мере наращивания функционала фреймфорка. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.engoyan.com/206/web-engine-router.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>web engine: структура</title>
		<link>http://www.engoyan.com/137/web-engine-%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d1%83%d1%80%d0%b0.html</link>
		<comments>http://www.engoyan.com/137/web-engine-%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d1%83%d1%80%d0%b0.html#comments</comments>
		<pubDate>Sun, 22 Nov 2009 22:06:12 +0000</pubDate>
		<dc:creator>vadim engoyan</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[общие]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web engine]]></category>

		<guid isPermaLink="false"> http://www.engoyan.com/?p=137</guid>
		<description><![CDATA[

			     
                 
				

Итак, движок-цмс будем называть Web Engine, пока в голову не придет что-то по оригинальнее.
Главные цели которые будем ставить при проектировании движка:

скорость и простота разработки (при его помощи)
минимальный но легко расширяемый функционал
скорость работы

Из этого [...]]]></description>
			<content:encoded><![CDATA[<p>

			    <a href="/wp-content/uploads/2009/11/Web-Engine.png" class="highslide"  onclick="return hs.expand(this, {captionId: 'caption-for-P1370'})"> 
                <img src="/wp-content/uploads/2009/11/Web-Engine-300x219.png" alt="Web Engine: структура" border="0" id="P1370" title="Web Engine: структура" align="right" style="padding:0px" /></a> 
				

Итак, <em>движок-цмс</em> будем называть <strong>Web Engine</strong>, пока в голову не придет что-то по оригинальнее.</p>
<p>Главные цели которые будем ставить при проектировании движка:</p>
<ul>
<li><strong>скорость</strong> и простота разработки (при его помощи)</li>
<li>минимальный но легко расширяемый функционал</li>
<li>скорость работы</li>
</ul>
<p>Из этого всего следует, что будем использовать <strong>ООП</strong> и схему <strong><a href="http://ru.wikipedia.org/wiki/MVC">MVC</a></strong>.</p>
<blockquote><p><strong><a href="http://ru.wikipedia.org/wiki/MVC"><u>Model-view-controller</u></a></strong> (<strong>MVC</strong>, «Модель-представление-поведение», «Модель-представление-контроллер») — архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.
</p></blockquote>
<p>MVC схема нам поможет достичь первую и вторую цель, а именно: продуманная структура позволит легко изменять дизайн, вносить изменения в функционал, легко разбираться в коде новым разработчикам.    </p>
<p><span id="more-137"></span><br />
Будет использовано объектно-ориентированное программирование с описанной ниже структурой, которая может, и скорее всего будет меняться во время разработки.</p>
<p>Также, будем использовать <a href="http://en.wikipedia.org/wiki/Rewrite_engine">mod_rewrite</a> модуль Apache, для получения <em>красивых</em> url адресов. Он будет включен в файле .htaccess следующим образом:</p>
<pre class="brush: plain">
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule .* index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</pre>
<p>В index.php, на который будут направляться все нужные нам запросы, будет создан экземпляр некого класса <strong>Engine</strong> внутри которого будут статические методы, которые будут возвращать синглтон вспомогательных классов (Config, Router, Users..).</p>
<p><img src="/wp-content/uploads/2009/11/Web-Engine.png" style="padding:0;" alt="Структура Web Engine"  align="center" /></p>
<p>Класс <em>UniversalStructureClass </em>(или, что то похожее) будет уметь работать с некими структурами описанными в конфигурации системы. Он получает имя структуры, ее схему и позволяет работать с данными этой структуры (get, set, выборки и другие операции). Предполагается, что некий рефлектор с помощью <em>Relations</em> будет, при необходимости, подгружать или модифицировать дополнительные данные для текущей страницы с помощью этого универсального класса.</p>
<p>После тестирования всего этого <em>добра</em> на скорость, скорее всего добавим возможность кеширования:  <a href="http://ru.wikipedia.org/wiki/Memcached">Memcached</a> и файловый. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.engoyan.com/137/web-engine-%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d1%83%d1%80%d0%b0.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

