{"id":164397,"date":"2012-12-30T23:21:05","date_gmt":"2012-12-30T19:21:05","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=164397"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=164397","title":{"rendered":"<span class=\"post_title\">Easyweb: \u041d\u043e\u0432\u043e\u0433\u043e\u0434\u043d\u0435\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u0412 \u043c\u043e\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c <a href=\"http:\/\/habrahabr.ru\/post\/162997\/\">\u043f\u043e\u0441\u0442\u0435<\/a>, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0435 \u0432\u0435\u0431-\u0434\u0432\u0438\u0436\u043e\u043a Easyweb, \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e:  <\/p>\n<blockquote><p>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u044e\u0437\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0439, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0433\u043e\u0434\u0430.<\/p><\/blockquote>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0433\u043e\u0434\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u0435\u0435 \u0441\u0443\u0442\u043e\u043a, \u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0449\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443.<\/p>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>XML facilities<\/h4>\n<p>  \u0421\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434 Easyweb-\u043e\u043c, \u0431\u044b\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 XML \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 PHP \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442\u043e\u0439, \u0438\u0437\u044f\u0449\u043d\u043e\u0439, \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b XML-\u0444\u0430\u0441\u0438\u043b\u0438\u0442\u0435\u0439. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:  <\/p>\n<ul>\n<li>XML document: <a href=\"https:\/\/github.com\/nyan-cat\/easyweb\/wiki\/class-xml\">github.com\/nyan-cat\/easyweb\/wiki\/class-xml<\/a><\/li>\n<li>XML node set: <a href=\"https:\/\/github.com\/nyan-cat\/easyweb\/wiki\/class-nodeset\">github.com\/nyan-cat\/easyweb\/wiki\/class-nodeset<\/a><\/li>\n<li>XML node: <a href=\"https:\/\/github.com\/nyan-cat\/easyweb\/wiki\/class-node\">github.com\/nyan-cat\/easyweb\/wiki\/class-node<\/a><\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u0438 \u0432\u0441\u0435\u0433\u0434\u0430, \u043b\u044e\u0431\u0443\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 feature request \u043d\u0430 <nobr>GitHub-\u0435.<\/nobr><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c PHP DOM API, \u0438 \u043d\u0430 Easyweb XML facilities. \u0421\u0443\u0442\u044c \u0442\u0430\u043a\u043e\u0432\u0430. \u041d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043a\u043d\u0438\u0433, \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043d\u0438\u0433\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u044c \u0446\u0435\u043d\u0443, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u0432\u0430\u043b\u044e\u0442\u044b \u043d\u0430 \u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 \u043d\u0438\u0436\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0430 \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043a\u043d\u0438\u0433\u0438 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a).<\/p>\n<p>  \u0411\u044b\u043b\u043e:  <\/p>\n<pre><code class=\"php\">&lt;?php function replace($author_id, $category_id) {     $xml = new DOMDocument();     if(!$xml-&gt;load('\/var\/www\/html\/mywebsite\/xml\/library.xml'))     {         throw new Exception('Error loading XML file');     }     $xpath = new DOMXPath($xml);     foreach($xpath-&gt;query('\/books\/book') as $book)     {         $price = $xpath-&gt;query('price', $book);         if($price-&gt;length != 1)         {             throw new Exception('Node &quot;price&quot; should be unique for the book');         }         $price-&gt;item[0]-&gt;nodeValue = 0;          $currency = $price-&gt;getAttribute('currency');         if($currency)         {             $book-&gt;setAttribute('currency', strtolower($currency));         }         else         {             throw new Exception('Attribute &quot;currency&quot; not found');         }          $book-&gt;setAttribute('author_id', $author_id);         $book-&gt;setAttribute('category_id', $category_id);     } } ?&gt; <\/code><\/pre>\n<p>  \u0421\u0442\u0430\u043b\u043e:  <\/p>\n<pre><code class=\"php\">&lt;?php function replace($author_id, $category_id) {     $xml = xml::load('\/xml\/library.xml');     foreach($xml-&gt;query('\/books\/book') as $book)     {         $book['price'] = 0;         $book['price\/@currency'] = strtolower($book['price\/@currency']);         $book['@author_id'] = $author_id;         $book['@category_id'] = $category_id;     } } ?&gt; <\/code><\/pre>\n<p>  Easyweb XML \u0444\u0430\u0441\u0438\u043b\u0438\u0442\u0438 \u0443\u043c\u0435\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 PHP DOM resource handle, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043c\u0431\u0435\u0440-\u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>::get()<\/code>, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 PHP DOM \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<p>  <\/p>\n<h4>XPath-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 www:paginate<\/h4>\n<p>  <code>www:paginate($page, $count, $size)<\/code><\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0430\u0433\u0438\u043d\u0430\u0442\u043e\u0440\u0430.<br \/>  <code>$page<\/code> \u2014 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.<br \/>  <code>$count<\/code> \u2014 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<br \/>  <code>$size<\/code> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u0433\u0438\u043d\u0430\u0442\u043e\u0440\u0430.<br \/>  \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>current<\/code>. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u0434\u044b <code>&lt;previous \/&gt;<\/code>, \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u2014 \u043d\u043e\u0434\u044b <code>&lt;next \/&gt;<\/code>.<\/p>\n<p>  \u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>www:paginate(15, 85, 10)<\/code> \u0432\u0435\u0440\u043d\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 XML:  <\/p>\n<pre><code class=\"xml\">&lt;pages&gt;     &lt;previous&gt;14&lt;\/previous&gt;     &lt;page&gt;10&lt;\/page&gt;     &lt;page&gt;11&lt;\/page&gt;     &lt;page&gt;12&lt;\/page&gt;     &lt;page&gt;13&lt;\/page&gt;     &lt;page&gt;14&lt;\/page&gt;     &lt;page current=&quot;current&quot;&gt;15&lt;\/page&gt;     &lt;page&gt;16&lt;\/page&gt;     &lt;page&gt;17&lt;\/page&gt;     &lt;page&gt;18&lt;\/page&gt;     &lt;page&gt;19&lt;\/page&gt;     &lt;next&gt;16&lt;\/next&gt; &lt;\/pages&gt; <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0442\u043a\u0438:  <\/p>\n<pre><code class=\"xml\">&lt;xsl:template match=&quot;\/&quot;&gt;     &lt;xsl:apply-templates select=&quot;www:paginate(15, 85, 10)\/pages\/*&quot; \/&gt; &lt;\/xsl:template&gt; &lt;xsl:template match=&quot;previous&quot;&gt;     &lt;a href=&quot;\/page\/{.}\/&quot; class=&quot;page&quot;&gt;\u2190 Previous&lt;\/a&gt; &lt;\/xsl:template&gt; &lt;xsl:template match=&quot;next&quot;&gt;     &lt;a href=&quot;\/page\/{.}\/&quot; class=&quot;page&quot;&gt;Next \u2192&lt;\/a&gt; &lt;\/xsl:template&gt; &lt;xsl:template match=&quot;page[@current]&quot;&gt;     &lt;span class=&quot;page current&quot;&gt;&lt;xsl:value-of select=&quot;.&quot; \/&gt;&lt;\/span&gt; &lt;\/xsl:template&gt; &lt;xsl:template match=&quot;page&quot;&gt;     &lt;a href=&quot;\/page\/{.}\/&quot; class=&quot;page&quot;&gt;&lt;xsl:value-of select=&quot;.&quot; \/&gt;&lt;\/a&gt; &lt;\/xsl:template&gt; <\/code><\/pre>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/cbe\/d48\/9e2\/cbed489e2d0db4dd0ba08518052fd85c.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<h4>\u041a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u043e\u0432<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 XSL-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>www:xslt<\/code> \u043c\u043e\u0436\u043d\u043e \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>cache=&quot;true&quot;<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 <code>cache-args<\/code> \u0438 <code>cache-lifetime<\/code>, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:  <\/p>\n<pre><code class=\"xml\">&lt;www:xslt     xsl=&quot;\/books.xsl&quot;     xml=&quot;book:list(author_id -&gt; {$author_id})&quot;     args=&quot;page -&gt; {$page}, count -&gt; 10&quot;     cache=&quot;true&quot;     cache-args=&quot;domain -&gt; '{$domain}'&quot;     cache-lifetime=&quot;600&quot; \/&gt; <\/code><\/pre>\n<h4>XQuery<\/h4>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 XQuery \u0432 Easyweb. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b: \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c XSL- \u0438 XPath-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f Easyweb-\u0430. \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0443\u044e XQuery-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f PHP \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043c\u043e\u0447\u044c \u043c\u0443\u0434\u0440\u044b\u043c \u0441\u043e\u0432\u0435\u0442\u043e\u043c, \u0442\u043e \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u0435\u0433\u043e \u0437\u0434\u0435\u0441\u044c: <a href=\"http:\/\/habrahabr.ru\/qa\/31087\/\">habrahabr.ru\/qa\/31087\/<\/a><\/p>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 XQuery \u0441\u0434\u0435\u043b\u0430\u043d \u0447\u0435\u0440\u0435\u0437 XQuery Lite (<a href=\"http:\/\/phpxmlclasses.sourceforge.net\/xquery_lite.html\">http:\/\/phpxmlclasses.sourceforge.net\/xquery_lite.html<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d \u0438 \u0437\u0430\u0431\u0440\u043e\u0448\u0435\u043d \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u0435\u0449\u0435 \u0432 2002-\u043c \u0433\u043e\u0434\u0443. XQuery Lite \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Easyweb \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u043f\u0438\u043b\u0438\u0442\u044c \u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 PHP5.<\/p>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 XQuery \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438 XSL-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>www:xquery<\/code>:  <\/p>\n<pre><code class=\"xml\">&lt;div&gt;     &lt;h1&gt;External Resources&lt;\/h1&gt;     &lt;www:xquery src=&quot;\/tpl\/links.xq&quot; \/&gt; &lt;\/div&gt; <\/code><\/pre>\n<h4>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 XSL-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 XSL-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0433\u043e URI. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 XSL-\u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 XSL-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0432\u043e\u044f \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430):  <\/p>\n<pre><code class=\"php\">$www = www::create('en', 'us');  $www-&gt;register_xsl('http:\/\/supermarkup.com\/about', 'sm', 'block', function($node) {     $xml = new xml();     foreach($node-&gt;children() as $child)     {         $xml-&gt;append($xml-&gt;import($child));     }     foreach($xml-&gt;query('\/\/text()') as $text)     {         $parent = $text-&gt;parent();         $parent-&gt;append(supermarkup($text-&gt;value()));         $parent-&gt;remove($text);     }     return $xml; }); <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435:  <\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;  &lt;xsl:stylesheet version=&quot;1.0&quot;     xmlns:xsl=&quot;http:\/\/www.w3.org\/1999\/XSL\/Transform&quot;     xmlns:php=&quot;http:\/\/php.net\/xsl&quot;     xmlns:www=&quot;https:\/\/github.com\/nyan-cat\/easyweb&quot;     xmlns:sm=&quot;http:\/\/supermarkup.com\/about&quot;     exclude-result-prefixes=&quot;php www sm&quot;&gt;     &lt;xsl:template match=&quot;\/&quot;&gt;         &lt;sm:block&gt;             &lt;xsl:copy-of select=&quot;message&quot; \/&gt;         &lt;\/sm:block&gt;     &lt;\/xsl:template&gt; &lt;\/xsl:stylesheet&gt; <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 Easyweb XML \u0444\u0430\u0441\u0438\u043b\u0438\u0442\u0438. \u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 XML-\u043d\u043e\u0434\u0443, \u044f\u0432\u043b\u044f\u044e\u0449\u0443\u044e\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u0438\u0431\u043e XML-\u043d\u043e\u0434\u0443, \u043b\u0438\u0431\u043e XML-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u0430 \u043d\u043e\u0434\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0447\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u0435 \u0434\u0432\u0438\u0436\u043a\u0430? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Easyweb \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 (\u043d\u0443 \u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442), \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0430 \u0432\u043e\u0442 \u043d\u0435\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u043b\u0435\u043d\u044b.<\/p>\n<p>  <\/p>\n<h4>GeoIP<\/h4>\n<p>  \u0412 \u0434\u0432\u0438\u0436\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 GeoIP. \u0414\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c PHP PECL GeoIP. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 GeoIP \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 Easyweb-\u0430. \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f GeoIP-\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0441\u0430\u0439\u0442\u0430:  <\/p>\n<pre><code class=\"xml\">&lt;procedure name=&quot;geoip:record&quot; datasource=&quot;geoip&quot; method=&quot;record&quot; root=&quot;record&quot;&gt;     &lt;param name=&quot;host&quot; type=&quot;string&quot; \/&gt; &lt;\/procedure&gt; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0443 \u043f\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u0438\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b Easyweb-\u0430: \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435 \u0431\u043b\u043e\u043a\u0430, \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0433\u0440\u0443\u043f\u043f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 XPath-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>www:query<\/code>, \u0438\u043b\u0438 \u0436\u0435 \u0438\u0437 PHP \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 Easyweb. \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0437\u043e\u0432\u0430:  <\/p>\n<pre><code class=\"php\">$record = $www-&gt;query('geoip:record', array (     'host' =&gt; $www-&gt;variable('user:ip') )); <\/code><\/pre>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:  <\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt; &lt;record&gt;     &lt;country&gt;         &lt;alpha2&gt;US&lt;\/alpha2&gt;         &lt;alpha3&gt;USA&lt;\/alpha3&gt;         &lt;name&gt;United States&lt;\/name&gt;     &lt;\/country&gt;     &lt;region&gt;NC&lt;\/region&gt;     &lt;city&gt;Charlotte&lt;\/city&gt;     &lt;latitude&gt;35.206001281738&lt;\/latitude&gt;     &lt;longitude&gt;-80.829002380371&lt;\/longitude&gt; &lt;\/record&gt; <\/code><\/pre>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435, \u0447\u0442\u043e GeoIP-\u0431\u0430\u0437\u0443 \u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:  <\/p>\n<ul>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u0431\u0430\u0437\u044b: <a href=\"http:\/\/www.maxmind.com\/en\/installation?city=1\">http:\/\/www.maxmind.com\/en\/installation?city=1<\/a><\/li>\n<li>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f: <a href=\"http:\/\/www.maxmind.com\/en\/city\">http:\/\/www.maxmind.com\/en\/city<\/a><\/li>\n<li>\u041d\u0443, \u0438\u043b\u0438 \u043d\u0430 \u0442\u043e\u0440\u0440\u0435\u043d\u0442\u0430\u0445 \ud83d\ude09<\/li>\n<\/ul>\n<h4>\u041f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0438 \u0444\u0430\u0441\u0435\u0442\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a<\/h4>\n<p>  \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0438 \u0444\u0430\u0441\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u041f\u043e\u0438\u0441\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Apache Solr (<a href=\"http:\/\/lucene.apache.org\/solr\/\">http:\/\/lucene.apache.org\/solr\/<\/a>). \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Java, Servlet container (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 Tomcat \u0438\u043b\u0438 Jetty), \u0441\u0430\u043c Solr, \u0430 \u0442\u0430\u043a\u0436\u0435 PHP PECL SolrClient. \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 Solr-\u0430 \u043d\u0430 CentOS: <a href=\"http:\/\/blog.nexcess.net\/2011\/12\/30\/installing-apache-solr-on-centos\/\">http:\/\/blog.nexcess.net\/2011\/12\/30\/installing-apache-solr-on-centos\/<\/a>.<\/p>\n<p>  \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 GeoIP, Solr-\u043f\u043e\u0438\u0441\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0435\u0440\u0435\u0437 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b Easyweb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u0432\u0438\u0436\u043a\u0430. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0430:  <\/p>\n<pre><code class=\"xml\">&lt;datasource     name=&quot;metadata&quot;     type=&quot;solr&quot;     server=&quot;localhost&quot;     port=&quot;8080&quot;     url=&quot;\/solr\/&quot;     username=&quot;admin&quot;     password=&quot;samplepassword&quot; \/&gt; &lt;!-- ... --&gt; &lt;procedure name=&quot;guestbook:add&quot; datasource=&quot;guestbook&quot; core=&quot;guestbook&quot; method=&quot;add&quot;&gt;     &lt;param name=&quot;author_id&quot; type=&quot;natural&quot; \/&gt;     &lt;param name=&quot;message&quot; type=&quot;author&quot; \/&gt;     &lt;param name=&quot;host&quot; type=&quot;ipv4&quot; \/&gt; &lt;\/procedure&gt; &lt;!-- ... --&gt; &lt;procedure     name=&quot;guestbook:list&quot;     datasource=&quot;guestbook&quot;     core=&quot;guestbook&quot;     method=&quot;query&quot;     root=&quot;messages&quot;     item=&quot;message&quot;&gt;     *:* &lt;\/procedure&gt; <\/code><\/pre>\n<p>  \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0442\u044c Solr \u043d\u0443\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0445\u0435\u043c\u044b Solr-\u0430 \u043d\u0430\u043b\u0435\u0442\u0443.<\/p>\n<p>  <\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u044f\u0434\u0440\u0430, \u043a\u043e\u0442\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0412 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u043d\u0430\u0445 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f LL(1)-\u043f\u0430\u0440\u0441\u0435\u0440\u044b, ORM-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  \u041f\u043b\u0430\u043d\u044b \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0433\u043e\u0434\u0430 \u2014 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u043e\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0411\u043e\u043b\u044c\u0448\u043e\u0433\u043e\u00ae \u041a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e\u00a9 \u0421\u0430\u0439\u0442\u0430\u2122, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Easyweb-\u0430, \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u0432\u0438\u0436\u043a\u0430, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0447\u0435\u043c \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>  \u0421 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043c\u0443 \u0432\u0430\u0448\u0438 \u0444\u0438\u0447\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b, \u0431\u0430\u0433\u0440\u0435\u043f\u043e\u0440\u0442\u044b, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e Easyweb-\u0430.<\/p>\n<p>  \u0421 \u041d\u043e\u0432\u044b\u043c \u0433\u043e\u0434\u043e\u043c!    \t \t\t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/164397\/\"> http:\/\/habrahabr.ru\/post\/164397\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u0412 \u043c\u043e\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c <a href=\"http:\/\/habrahabr.ru\/post\/162997\/\">\u043f\u043e\u0441\u0442\u0435<\/a>, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0435 \u0432\u0435\u0431-\u0434\u0432\u0438\u0436\u043e\u043a Easyweb, \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e:  <\/p>\n<blockquote><p>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u044e\u0437\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0439, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0433\u043e\u0434\u0430.<\/p><\/blockquote>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0433\u043e\u0434\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u0435\u0435 \u0441\u0443\u0442\u043e\u043a, \u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0449\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-164397","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/164397","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=164397"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/164397\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=164397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=164397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=164397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}