<?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>Блог Виталия Степаненко &#187; php</title>
	<atom:link href="http://www.nayjest.ru/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.nayjest.ru</link>
	<description>Веб-разработка за чашечкой кофе</description>
	<lastBuildDate>Sat, 25 Jun 2011 09:53:07 +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>Пишем свой рейтинг популярных записей русскоязычных блогов на базе Яндекс.API, часть 1</title>
		<link>http://www.nayjest.ru/php/blogpostrating#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.nayjest.ru/php/blogpostrating#comments</comments>
		<pubDate>Thu, 17 Dec 2009 19:03:58 +0000</pubDate>
		<dc:creator>Nayjest</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[урок]]></category>
		<category><![CDATA[Яндекс]]></category>

		<guid isPermaLink="false">http://www.nayjest.ru/?p=129</guid>
		<description><![CDATA[Жил-был в составе поиска по блогам Яндекса рейтинг популярных записей, который для многих был такой себе ежедневной газеткой. Но решили в Яндексе его закрыть да предоставили API, чтобы каждый желающий мог сделать свой рейтинг популярных записей по блогам, чем мы собственно сегодня и займемся. Писать будем на PHP. Итак, для начала ознакомимся с API статистики записей [...]]]></description>
			<content:encoded><![CDATA[<p>Жил-был в составе поиска по блогам Яндекса рейтинг популярных записей, который для многих был такой себе ежедневной газеткой. Но <a title="Рейтинг популярных записей закрывается, или да здравствуют новые рейтинги" href="http://clubs.ya.ru/company/replies.xml?item_no=20164" target="_blank">решили в Яндексе его закрыть</a> да предоставили <a title="API статистики записей Поиска по блогам" href="http://blogs.yandex.ru/faq/entriesapi" target="_blank">API</a>, чтобы каждый желающий мог сделать свой рейтинг популярных записей по блогам, чем мы собственно сегодня и займемся. Писать будем на PHP.</p>
<p><span id="more-129"></span>Итак, для начала ознакомимся с API статистики записей Поиска по блогам.</p>
<p>Тут все просто, мы имеем RSS ленту статистики записей по блогам за последние 24 часа, разбитую на страницы по 50 записей.</p>
<p>На первой странице выводятся самые свежие записи. Номер страницы, которую нам нужно получить задается параметром p=&lt;номер страницы&gt; в URL адресе, по которому мы обращаемся к API, например: <a href="http://blogs.yandex.ru/entriesapi">http://blogs.yandex.ru/entriesapi?p=1</a>.</p>
<p>Перейдите по  ссылке выше и посмотрите на исходный код этой страницы (<em>Вид-&gt;просмотреть источник</em> или <em>Ctrl+U</em>, если у вас FireFox/Opera/Chrome).  Мы видим обычный XML документ, который будем читать и анализировать с помощью PHP.  Нас интересуют информация о записях, находящаяся внутри тегов &lt;item&gt;. Названия вложенных элементов говорят сами за себя, это:</p>
<ul>
<li><strong>author –</strong> ссылка на блог/страницу автора;</li>
<li><strong>description </strong><strong>– </strong>короткое описание (обычно пусто);</li>
<li><strong>link</strong> <strong>– </strong>ссылка на пост;</li>
<li><strong>pubDate</strong> <strong>– </strong>дата и время публикации;</li>
<li><strong>title</strong> <span style="font-weight: bold;">– заголовок поста;</span></li>
<li><span style="font-weight: bold;"><strong>yablogs:commenters</strong><span style="font-weight: normal;"> – </span></span><span style="font-weight: bold;">количество разных русскоязычных комментаторов у записи за все время ее существования;</span></li>
<li><span style="font-weight: bold;"><strong>yablogs:commenters24</strong><span style="font-weight: normal;"> – количество разных русскоязычных комментаторов у записи;</span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:comments</strong><span style="font-weight: normal;"> – общее количество комментариев к записи за все время ее существования;</span></span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:comments24</strong><span style="font-weight: normal;"> – количество комментариев к записи за последние 24 часа;</span></span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:links</strong><span style="font-weight: normal;"> – общее количество ссылок на запись за все время ее существования;</span></span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:links24</strong><span style="font-weight: normal;"> – количество ссылок на запись за последние 24 часа;</span></span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:links24weight</strong><span style="font-weight: normal;"> – взвешенное количество ссылок на запись за последние 24 часа(с отфильтрованными накрутками и спамными ссылками);</span></span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:linksweight</strong><span style="font-weight: normal;"> – общее взвешенное количество ссылок на запись (с отфильтрованными накрутками и спамными ссылками);</span></span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:visits24</strong><span style="font-weight: normal;"> – примерное количество посетителей записи за последние 24 часа;</span></span></span></li>
<li><span style="font-weight: bold;"><span style="background-color: #ffffff;"><strong>yablogs:ppb_username</strong><span style="font-weight: normal;"> – имя (nickname) автора поста.</span></span></span></li>
</ul>
<p>Ну что ж, читать такие записи мы научились, теперь давайте научим читать их наш скрипт.</p>
<p>Для начала нужно определиться с инструментом для работы с  XML. В PHP manual есть просто таки огромный раздел <a title="PHP Manual: XML Manipulation" href="http://www.php.net/manual/en/refs.xml.php" target="_blank">XML manipulation</a>, где вы можете найти массу различных средств для работы с XML документами. Одним из самых простых, удобных и в то же время мощных решений является расширение <a title="PHP manual: SimpleXML extension" href="http://www.php.net/manual/en/book.simplexml.php" target="_blank">SimpleXML</a>, которое поставляется с PHP начиная с 5-й версии и включено по умолчанию. С ним мы и будем работать. Поверьте мне, это действительно очень хороший инструмент, позволяющий просто и удобно работать с XML документами.  Продемонстрирую это:</p>
<blockquote><p><code><span style="font-family: Consolas, 'Courier New', Courier, monospace; color: black; font-size: x-small;"><br />
<span style="color: #cc6633;">$xml</span> = simplexml_load_file(<span style="color: #008000;">'http://blogs.yandex.ru/entriesapi'</span>);<br />
<span style="color: #0000ff;">echo</span> <span style="color: #008000;">'&lt;b&gt;Это заголовок канала:&lt;/b&gt; '</span>,<br />
<span style="color: #cc6633;">$xml</span>-&gt;channel-&gt;title, <span style="color: #008000;">'&lt;br&gt;'</span>,<br />
<span style="color: #008000;">'&lt;b&gt;А это заголовок последнего поста:&lt;/b&gt; '</span>,<br />
<span style="color: #cc6633;">$xml</span>-&gt;channel-&gt;item[<span style="color: #008000;">0</span>]-&gt;title, <span style="color: #008000;">'&lt;br&gt;'</span>,<br />
<span style="color: #008000;">'&lt;b&gt;Время публикации последнего поста: &lt;/b&gt; '</span>,<br />
<span style="color: #cc6633;">$xml</span>-&gt;channel-&gt;item[<span style="color: #008000;">0</span>]-&gt;pubDate;<br />
</span></code></p></blockquote>
<p>Думаю, тут все понятно: в первой строке мы загружаем первую страницу ленты популярных записей в переменную $xml (функция simplexml_load_file возвращает экземпляр класса <a title="PHP Manual: The SimpleXMLElement class" href="http://www.php.net/manual/en/class.simplexmlelement.php" target="_blank">SimpleXMLElement</a>), которую далее можем интерпретировать как объект, соответствующий нашему XML документу, что мы собственно и делаем.</p>
<p>Если мы обращаемся к произвольному полю такого объекта, выполняется поиск дочернего элемента XML дерева с именем, соответствующим имени запрошенного поля и если такой элемент найден, возвращается объект, являющийся также экземпляром класса SimpleXMLElement, или массив таких объектов.</p>
<p>Благодаря такой логике работы мы можем выполнять цепочки запросов вида: <span style="color: #cc6633;">$xml</span>-&gt;someElement-&gt;children-&gt;childrenOfChildren.</p>
<p>Обратите внимание, что элементов item в нашем XML документе много, поэтому <span style="color: #cc6633;">$xml</span>-&gt;channel-&gt;item возвращает не один объект, а массив объектов, предоставляющих доступ к этим элементам. В примере мы обратились к самому первому в документе элементу item по индексу [0], и вывели его заголовок и дату публикации на экран (в браузер).</p>
<p>Альтернативный способ получить нужную ветвь XML документа в SimpleXML — это использование <a title="Wikipedia: XPath (XML Path Language)" href="http://ru.wikipedia.org/wiki/XPath" target="_blank">XPath</a>, языка запросов к элементам XML дерева. В классе SimpleXMLElement для этого имеется метод xpath(<span><span>string</span> <tt>$path</tt></span>), возвращающий массив экземпляров класса SimpleXMLElement или FALSE в случае ошибки.</p>
<p>Пример использования XPath:</p>
<p><span id="ctl00_InnerContent_ctl00_Label1"><code><span style="font-family: Consolas, 'Courier New', Courier, monospace; color: black; font-size: x-small;">$items=<span style="color: #cc6633;">$xml</span>-&gt;xpath(<span style="color: #008000;">'channel/item'</span>); </span></code></span></p>
<p>Чтобы получить аналогичный набор элементов без XPath, нужно выполнить:</p>
<p><span id="ctl00_InnerContent_ctl00_Label1"><code><span style="font-family: Consolas, 'Courier New', Courier, monospace; color: black; font-size: x-small;">$items=<span style="color: #cc6633;">$xml</span>-&gt;channel-&gt;item;</span></code></span></p>
<p>Использование XPath или цепочек вызовов полей  — это дело вкуса, в нашем случае мы будем использовать XPath, чтобы обратиться к элементам типа yablogs:links, где есть символ &laquo;:&raquo;, так как он мешает интерпретировать эти элементы как поля объекта в PHP.</p>
<p>Ну давайте уже что-нибудь сделаем. Например функцию, получающую информацию о всех записях за 24 часа. Собственно, вот:</p>
<blockquote>
<p><code></p>
<ol>
<li><a href="http://www.php.net/manual/en/function.define.php">define</a> (<span style="color: #008000;">'MAX_PAGES'</span>,<span style="color: #008000;">200</span>);</li>
<li><span style="color: #0000ff;">function</span> load_all() {</li>
<li> <span style="color: #cc6633;">$all_items</span>=<span style="color: #0000ff;">array</span>();</li>
<li> <span style="color: #0000ff;">for</span> (<span style="color: #cc6633;">$i</span>=<span style="color: #008000;">1</span>; <span style="color: #0000ff;">true</span>;<span style="color: #cc6633;">$i</span>++) {</li>
<li> <span style="color: #cc6633;">$xml</span> = simplexml_load_file(<span style="color: #008000;">'http://blogs.yandex.ru/entriesapi?p='</span> . <span style="color: #cc6633;">$i</span>);</li>
<li> <span style="color: #cc6633;">$items</span>=<span style="color: #cc6633;">$xml</span>-&gt;xpath(<span style="color: #008000;">'channel/item'</span>);</li>
<li> <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">empty</span>(<span style="color: #cc6633;">$items</span>)) {</li>
<li> <span style="color: #0000ff;">break</span>;</li>
<li> }</li>
<li> <span style="color: #cc6633;">$all_items</span>=<a href="http://www.php.net/manual/en/function.array-merge.php">array_merge</a>(<span style="color: #cc6633;">$all_items</span>,<span style="color: #cc6633;">$items</span>);</li>
<li> <span style="color: #0000ff;">if</span> (<span style="color: #cc6633;">$i</span>&gt;=MAX_PAGES) <span style="color: #0000ff;">break</span>;</li>
<li> }</li>
<li> <span style="color: #0000ff;">return</span> <span style="color: #cc6633;">$all_items</span>;</li>
<li>}</li>
</ol>
<p></code></p></blockquote>
<p>Такая функция конечно же будет работать очень медленно и скорее всего упрется в ограничение на время выполнения php скриптов: по умолчанию — 30 секунд, поэтому полученные данные нужно обязательно кэшировать, а само их получение выполнять не при открытии страницы, а через планировщик задач crontab. Мы будем сохранять полученную информацию в базу данных, использовать будем MySQL, но об этом в следующей части, а пока вернемся к  работе с XML.</p>
<p>Давайте уже в этом уроке соберем наш рейтинг популярных записей русскоязычных блогов с минимальным функционалом и отложим на потом кэширование, расширение функционала, придание ООП&#8217;шности и MVC&#8217;шности нашему коду.</p>
<p>Чтобы долго и нудно не ждать результата выполнения функции load_all(), давайте зададим ей ограничение: будем обрабатывать только первые 4 страницы RSS ленты, выдаваемой Яндексом. Специально для этого я ввел константу MAX_PAGES, заменяем значение 200 в первой строчке на 4.</p>
<p>Наш рейтинг должен уметь сортировать записи по количеству комментариев, количеству ссылок и количеству посещений. Мы уже имеем функцию, с помощью которой можем получить список записей. Значит задача состоит в сортировке этого списка.</p>
<p>Если бы мы заносили информацию о всех  записях в базу данных скриптом, вызываемым через планировщик задач, а при выдаче информации пользователю, брали бы ее из БД, то мы бы воспользовались возможностями SQL для сортировки, но это мы будем делать во второй части урока, а сейчас сделаем по-быстрому сортировку средствами PHP.</p>
<p>Поможет нам в этом стандартная функция PHP usort, позволяющая сортировать массивы с использованием своей функции для сравнения элементов массива.</p>
<p>Элементами массива у нас являются экземпляры класса SimpleXMLElement, инициализированные элементами XML дерева &lt;item&gt;.</p>
<p>Рассмотрим, как мы можем получить к примеру количество комментариев записи:</p>
<blockquote>
<p><code></p>
<ol>
<li>$xml = simplexml_load_file(<span style="color: #008000;">'http://blogs.yandex.ru/entriesapi'</span>);</li>
<li><span style="color: #cc6633;">$item</span>=$xml-&gt;channel-&gt;item[<span style="color: #008000;">12</span>];<span style="color: #696969;">//Получаем какой-нибуть XML элемент item, например 13-й.</span></li>
<li><span style="color: #cc6633;">$comments_arr</span>=<span style="color: #cc6633;">$item</span>-&gt;xpath(<span style="color: #008000;">'yablogs:comments'</span>);<span style="color: #696969;">//получаем массив объектов</span></li>
<li><span style="color: #cc6633;">$comments_obj</span>=<span style="color: #cc6633;">$comments_arr</span>[<span style="color: #008000;"> 0</span>];<span style="color: #696969;">//объект у нас должен быть один, это мы знаем</span></li>
<li><span style="color: #cc6633;">$comments</span>=(int)<span style="color: #cc6633;">$comments_obj</span>;<span style="color: #696969;">//приводим его тип к целочисленному (int), чтобы можно было выполнить сравнение </span></li>
</ol>
<p></code></p></blockquote>
<p>А теперь можно написать и функцию сравнения, причем универсальную.</p>
<blockquote>
<p><code></p>
<ol>
<li><span style="color: #cc6633;">$cmp</span>=<span style="color: #008000;">'yablogs:comments'</span>;<span style="color: #696969;">//по этому параметру сравниваем, </span></li>
<li><span style="color: #696969;">//к функции сравнения при использовании в usort есть требование: </span></li>
<li><span style="color: #696969;">//она должна принимать два только параметра, </span></li>
<li><span style="color: #696969;">//соответствующие сравниваемым элементам массива, </span></li>
<li><span style="color: #696969;">//поэтому делаем $cmp просто глобальной переменной</span></li>
<li><span style="color: #0000ff;">function</span> cmp(<span style="color: #cc6633;">$a</span>, <span style="color: #cc6633;">$b</span>)</li>
<li>{</li>
<li> <span style="color: #0000ff;"> global</span> <span style="color: #cc6633;">$cmp</span>;</li>
<li> <span style="color: #cc6633;"> $a</span>=<span style="color: #cc6633;">$a</span>-&gt;xpath(<span style="color: #cc6633;">$cmp</span>);</li>
<li> <span style="color: #cc6633;"> $b</span>=<span style="color: #cc6633;">$b</span>-&gt;xpath(<span style="color: #cc6633;">$cmp</span>);</li>
<li> <span style="color: #cc6633;"> $a</span>=(int)<span style="color: #cc6633;">$a</span>[<span style="color: #008000;">0</span>];</li>
<li> <span style="color: #cc6633;"> $b</span>=(int)<span style="color: #cc6633;">$b</span>[<span style="color: #008000;">0</span>];</li>
<li> <span style="color: #0000ff;"> if</span> (<span style="color: #cc6633;">$a</span> == <span style="color: #cc6633;">$b</span>) {</li>
<li> <span style="color: #0000ff;"> return</span> <span style="color: #008000;"> 0</span>;</li>
<li> }</li>
<li> <span style="color: #0000ff;">return</span> (<span style="color: #cc6633;">$a</span> &gt; <span style="color: #cc6633;">$b</span>) ? -<span style="color: #008000;">1</span> : <span style="color: #008000;">1</span>;</li>
<li>}</li>
</ol>
<p></code></p></blockquote>
<p>У нас будет функция sort_by, в которую будем передавать ссылку на массив и строку, соответствующую XML элементу, по которому будем сортировать (критерий сравнения).  sort_by в свою очередь будеть вызывать стандартную функцию usort, передавая ей ссылку на массив и присваивать глобальной переменной $cmp критерий сравнения.</p>
<blockquote>
<p><code></p>
<ol>
<li><span style="color: #0000ff;">function</span> sort_by(<span style="color: #cc6633;">$sort_by</span>,<span style="color: #cc6633;">$i</span>)</li>
<li>{</li>
<li> <span style="color: #0000ff;">global</span> <span style="color: #cc6633;">$cmp</span>;</li>
<li> <span style="color: #cc6633;">$cmp</span>=<span style="color: #cc6633;">$sort_by</span>;</li>
<li> <a href="http://www.php.net/manual/en/function.usort.php">usort</a>(<span style="color: #cc6633;">$i</span>,<span style="color: #008000;">'cmp'</span>);</li>
<li>}</li>
</ol>
<p></code></p></blockquote>
<p>Почти готово, теперь мы можем к примеру вывести отсортированные по количеству комментариев записи вот так:</p>
<blockquote>
<p><code></p>
<ol>
<li><span style="color: #cc6633;">$items</span>=load_all();</li>
<li>sort_by(<span style="color: #008000;">'yablogs:comments'</span>,&amp;<span style="color: #cc6633;">$items</span>);</li>
<li><span style="color: #0000ff;">foreach</span> (<span style="color: #cc6633;">$items</span> <span style="color: #0000ff;">as</span> <span style="color: #cc6633;">$item</span>) {</li>
<li> <span style="color: #cc6633;">$comments</span>=<span style="color: #cc6633;">$item</span>-&gt;xpath(<span style="color: #008000;">'yablogs:comments'</span>);</li>
<li> <span style="color: #cc6633;">$links</span>=<span style="color: #cc6633;">$item</span>-&gt;xpath(<span style="color: #008000;">'yablogs:links'</span>);</li>
<li> <span style="color: #cc6633;">$visits</span>=<span style="color: #cc6633;">$item</span>-&gt;xpath(<span style="color: #008000;">'yablogs:visits24'</span>);</li>
<li> <span style="color: #0000ff;">echo</span> <span style="color: #008000;">"&lt;a href='$item-&gt;link'&gt;$item-&gt;title&lt;/a&gt;&lt;br&gt;"</span>,</li>
<li> <span style="color: #008000;">"Комментариев: $comments[0]&lt;br&gt;"</span>,</li>
<li> <span style="color: #008000;">"Ссылок: $links[0]&lt;br&gt;"</span>,</li>
<li> <span style="color: #008000;">"Просмотров: $visits[0]&lt;hr&gt;"</span>;</li>
<li>}</li>
</ol>
<p></code></p></blockquote>
<p>Как именно сортировать наш список, будем передавать параметром URI sort_by, который будет доступен в php как $_GET['sort_by']. Создадим три ссылки для разных типов сортировки, для этого перед тегом &lt;?php, обозначающим начало php кода, пишем:</p>
<blockquote>
<p><code></p>
<ol>
<li><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div</span> <span style="color: #ff0000;">style</span><span style="color: #0000ff;">="text-align:center;"&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a</span> <span style="color: #ff0000;">href</span><span style="color: #0000ff;">="index.php/?sort_by=comments"&gt;</span>Самые комментируемые<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a</span> <span style="color: #ff0000;">href</span><span style="color: #0000ff;">="index.php/?sort_by=visits24"&gt;</span>Самые посещаемые<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a</span> <span style="color: #ff0000;">href</span><span style="color: #0000ff;">="index.php/?sort_by=links"&gt;</span>Самые цитируемые<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span></li>
<li><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></li>
</ol>
<p></code></p></blockquote>
<p>Нам осталось только получить в PHP критерий сортировки и отсортировать все соответствующим образом. Для этого строку с  sort_by(<span style="color: #008000;">&#8216;yablogs:comments&#8217;</span>,&amp;<span style="color: #cc6633;">$items</span>)  заменяем на это:</p>
<blockquote>
<p><code></p>
<ol>
<li><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #cc6633;">$_GET</span>[<span style="color: #008000;">'sort_by'</span>])){</li>
<li> <span style="color: #cc6633;">$crit</span>=<span style="color: #cc6633;">$_GET</span>[<span style="color: #008000;">'sort_by'</span>];</li>
<li>}<span style="color: #0000ff;">else</span>{</li>
<li> <span style="color: #cc6633;">$crit</span>=<span style="color: #008000;">'comments'</span>;</li>
<li>}</li>
<li>sort_by(<span style="color: #008000;">'yablogs:'</span> . <span style="color: #cc6633;">$crit</span> ,&amp;<span style="color: #cc6633;">$items</span>);</li>
</ol>
<p></code></p></blockquote>
<p>И напоследок добавим немного оформления с помощью CSS, чтобы наш рейтинг смотрелся получше:</p>
<blockquote>
<p><code></p>
<ol>
<li><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">style</span><span style="color: #0000ff;">&gt;</span></li>
<li> div{padding:20px; background-color:#EEE;}</li>
<li> hr{border:none; border-bottom:1px dashed yellow;}</li>
<li><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">style</span><span style="color: #0000ff;">&gt;</span></li>
</ol>
<p></code></p></blockquote>
<p>Исходник того, что мы сделали вы можете скачать здесь: <a href="http://www.nayjest.ru/userfiles/yabdex.blograting.by.nayjest.zip#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">http://www.nayjest.ru/userfiles/yabdex.blograting.by.nayjest.zip</a></p>
<p>В следующих уроках я расскажу, как сделать из этого полноценный веб-сервис, где все будет ООП&#8217;шненько, будет работа с БД, архитектура MVC, валидный HTML, кэширование, может даже AJAX и вообще все, что захотите (предлагайте в комментариях!).</p>
<p>Надеюсь, было интересно и полезно. Чтобы не пропустить следующие уроки, <a title="RSS канал сайта Nayjest.ru" href="http://feeds.feedburner.com/nayjest">подписывайтесь на мой RSS</a>, follow me on <a title="Мой twitter" href="http://twitter.com/nayjest">Twitter</a>. Спасибо за внимание, жду ваших комментариев!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nayjest.ru/php/blogpostrating/feed</wfw:commentRss>
		<slash:comments>119</slash:comments>
		</item>
		<item>
		<title>Вот он какой, Doctrine 2 (Приурочено к релизу Doctrine 2.0 alpha 3)</title>
		<link>http://www.nayjest.ru/php/doctrine2orm#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.nayjest.ru/php/doctrine2orm#comments</comments>
		<pubDate>Sun, 15 Nov 2009 10:27:50 +0000</pubDate>
		<dc:creator>Nayjest</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.nayjest.ru/?p=68</guid>
		<description><![CDATA[Поздравляю, коллеги! 3 дня назад увидела свет треться альфа-версия самого мощного на сегодняшний день ORM-фреймворка для PHP: Doctrine. И эта новость по большему счету заслуживает внимания потому что в Doctrine 2.0 произошли очень существенные изменения в сравнении с предыдущими версиями. Сразу замечу, что вкусности эти потребуют от нас ни много ни мало &#8212; поддержку php [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.symfony-project.org/uploads/assets/doctrine/logo.png" alt="image" align="left" style="border:none" /><br />
Поздравляю, коллеги! 3 дня назад увидела свет треться альфа-версия самого мощного на сегодняшний день ORM-фреймворка для PHP: Doctrine.</p>
<p>И эта новость по большему счету заслуживает внимания потому что в Doctrine 2.0 произошли очень существенные изменения в сравнении с предыдущими версиями. Сразу замечу, что вкусности эти потребуют от нас ни много ни мало &#8212; поддержку php 5.3.</p>
<p><span id="more-68"></span></p>
<p>Официальный тизер Doctrine 2.0 выглядит так:</p>
<blockquote>
<ol>
<li><span style="color: #cc6633;">&lt;?php</span></li>
<li><span style="color: #0000ff;">namespace</span> Doctrine\Tests\Models\CMS;</li>
<li><span style="color: #696969;">/**</span><br />
<span style="color: #696969;">* @DoctrineEntity(tableName=&raquo;cms_articles&raquo;)</span><br />
<span style="color: #696969;">*/</span></li>
<li><span style="color: #0000ff;">class</span> CmsArticle</li>
<li>{</li>
<li> <span style="color: #696969;">/**</span><br />
<span style="color: #696969;"> * @DoctrineId</span><br />
<span style="color: #696969;"> * @DoctrineColumn(type=&raquo;integer&raquo;)</span><br />
<span style="color: #696969;"> * @DoctrineIdGenerator(&laquo;auto&raquo;)</span><br />
<span style="color: #696969;"> */</span></li>
<li> <span style="color: #0000ff;">public</span> <span style="color: #cc6633;">$id</span>;</li>
<li> <span style="color: #696969;">/**</span><br />
<span style="color: #696969;"> * @DoctrineColumn(type=&raquo;varchar&raquo;, length=255)</span><br />
<span style="color: #696969;"> */</span></li>
<li> <span style="color: #0000ff;">public</span> <span style="color: #cc6633;">$topic</span>;</li>
<li> <span style="color: #696969;">/**</span><br />
<span style="color: #696969;"> * @DoctrineColumn(type=&raquo;varchar&raquo;)</span><br />
<span style="color: #696969;"> */</span></li>
<li> <span style="color: #0000ff;">public</span> <span style="color: #cc6633;">$text</span>;</li>
<li> <span style="color: #696969;">/**</span><br />
<span style="color: #696969;"> * @DoctrineManyToOne(targetEntity=&raquo;Doctrine\Tests\Models\CMS\CmsUser&raquo;,</span><br />
<span style="color: #696969;"> joinColumns={&laquo;user_id&raquo; = &raquo;id&raquo;})</span><br />
<span style="color: #696969;"> */</span></li>
<li> <span style="color: #0000ff;">public</span> <span style="color: #cc6633;">$user</span>;</li>
<li> <span style="color: #696969;">/**</span><br />
<span style="color: #696969;"> * @DoctrineOneToMany(targetEntity=&raquo;Doctrine\Tests\Models\CMS\CmsComment&raquo;, mappedBy=&raquo;article&raquo;)</span><br />
<span style="color: #696969;"> */</span></li>
<li> <span style="color: #0000ff;">public</span> <span style="color: #cc6633;">$comments</span>;</li>
<li>}</li>
</ol>
</blockquote>
<p>Итак, на что нам здесь следовало бы обратить здесь внимание:</p>
<p>1) Мы задаем мета-данные для меппинга класса с помощью комментариев DocBlock (XML-меппиг и YAML-меппинг никуда не делся)</p>
<p>2) Мы не наследуем наш класс CmsArticle от встроенных класов Doctrine.</p>
<p>3.) Свойства класса не обязаны быть объявлены как public, они могут быть приватными или защищенными. Doctrine не требует от вас наличия getter&#8217;od и setter&#8217;ов для каждого свойства. Вы полностью свободны в том, как вы будете проектировать ваши классы.</p>
<p>Друзья, по-моему это великолепно!</p>
<p>Смею предположить, что чтение комментариев DocBlock реализовано с помощью <a href="http://docs.php.net/manual/en/book.reflection.php">Reflection</a> (там есть метод getDocComment).<br />
Довольно интересное применение Reflection.<br />
Кстати, еще более активно и более элегантно(имхо) это используется в <a href="http://www.recessframework.org/">Recess php framework</a>. Случайно наткнулся на него и был поражен, увидел там именно то, что хотел делать в собственном велосипеде. Вещь однозначно заслуживает внимания.</p>
<p><strong>Производительность:</strong><br />
Doctrine 2.0 на php5.3 кушает на 31% меньше памяти и выполняется на 17% быстрее, чем Doctrine 1.0 на PHP 5.2.8<br />
(информация из предварительных тестов в блоге разработчиков)</p>
<p><strong>Что нового в Doctrine 2.0 Alpha 3:</strong><br />
Самое существенное с моей точки зрения это функционал для конвертирования схем из Doctrine 1.0 в 2.0.<br />
А также более 60 фиксов, рефакторинг кода, работа над драйверами для меппинга и экспорта, как говорят разработчики, код начинает становиться стабильным.</p>
<p><strong>Чего нам ждать:</strong><br />
11 декабря 2009 будет еще один альфа-релиз, а 8-го января выйдет уже первая бета.</p>
<p><strong>Ссылки:</strong><br />
<a href="http://www.doctrine-project.org/">Здесь живет Doctrine PHP ORM</a><br />
<a href="http://www.doctrine-project.org/documentation/2_0/en">Вот документация по версии 2.0:</a><br />
<a href="http://www.doctrine-project.org/blog/tags/2-0">Посты из блога разработчиков с тегом 2.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nayjest.ru/php/doctrine2orm/feed</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>CMS в 40 строк кода! (PHP и RedBean ORM)</title>
		<link>http://www.nayjest.ru/php/php-redbean-small-cms#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.nayjest.ru/php/php-redbean-small-cms#comments</comments>
		<pubDate>Sun, 04 Oct 2009 18:56:37 +0000</pubDate>
		<dc:creator>Nayjest</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.nayjest.ru/php/cms-v-40-strok-php-redbean-orm-dlya-rabotyi-s-bd</guid>
		<description><![CDATA[Это пример того, какой мощной может быть RedBean PHP ORM. Ниже вы можете ознакомиться с исходным кодом системы управления контентом(CMS) для веб-сайтов размером всего в 40 строк кода. Чтобы запустить эту CMS, вам нужно только настроить соединение с БД! После того, как вы впишите свои данные для подключения к базе данных, это будет работать прямо [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:left; margin:10px; border:none;" src="/userfiles/cms40lines.jpg" alt="CMS в 40 строк на PHP и RedBean ORM"  title="CMS в 40 строк на PHP и RedBean ORM" />Это пример того, какой мощной может быть <a href="http://www.redbeanphp.com">RedBean PHP ORM</a>.</p>
<p>Ниже вы можете ознакомиться с исходным кодом системы управления контентом(CMS) для веб-сайтов размером всего в 40 строк кода. Чтобы запустить эту CMS, вам нужно только настроить соединение с БД!</p>
<p>После того, как вы впишите свои данные для подключения к базе данных, это будет работать прямо &laquo;из коробки&raquo;.</p>
<p>Никаких настроек больше не нужно, никакого начального содержания в БД, никакого XML mapping&#8217;а, никаких шаблонов, ничего! Все что вам нужно &#8212; только файл с этим кодом на PHP и библиотека для работы с БД: RedBean ORM.<br />
<span id="more-58"></span></p>
<blockquote>
<pre style="font-size: 9px;"><code>&lt;html&gt;&lt;head&gt;&lt;title&gt;Пример очень маленькой CMS на PHP&lt;/title&gt;&lt;/head&gt;&lt;body color='black'&gt;
&lt;h1&gt;CMS Example&lt;/h1&gt;
&lt;?php
$self = $_SERVER["PHP_SELF"]."?";
require("../redbean/allinone.php");
RedBean_Setup::kickstartDev("Page","mysql:host=localhost;dbname=tutorial");
if (!R::exists("page",1)) { $page = new Page; $page-&gt;setTitle("root"); $page-&gt;save(); }
?&gt;
&lt;?php if($_GET["type"]=="editpage"): $page = new Page($_GET["id"]); ?&gt;
	&lt;form action="&lt;?=$self?&gt;type=savepage&amp;id=&lt;?php echo $_GET["id"]; ?&gt;&amp;pid=&lt;?php echo $_GET["pid"]; ?&gt;" method="post"&gt;
		&lt;input type="text" name="title" value="&lt;?php echo $page-&gt;getTitle(); ?&gt;" /&gt;
		&lt;br /&gt;&lt;textarea name="intro" &gt;&lt;?php echo $page-&gt;getIntro(); ?&gt;&lt;/textarea&gt;
		&lt;br /&gt;&lt;textarea name="body" &gt;&lt;?php echo $page-&gt;getBody(); ?&gt;&lt;/textarea&gt;
		&lt;hr /&gt;&lt;input type="submit" name="save" value="save" /&gt;
	&lt;/form&gt;
&lt;?php else: ?&gt;
	&lt;?php if($_GET["type"]=="savepage"):
			$parent = new Page( max($_GET["pid"],1) );
			$page = new Page( $_GET["id"] );
			$page-&gt;importFromPost("title,intro,body");
			$page-&gt;save();
			$parent-&gt;attach( $page );
	endif; ?&gt;
	&lt;?php
		$currentparent = new Page(max($_GET["pid"],1));
		$pages = $currentparent-&gt;children();
	?&gt;
	&lt;?php foreach($pages as $page): ?&gt;
		&lt;br /&gt;&lt;a href="&lt;?=$self?&gt;type=editpage&amp;id=&lt;?php echo $page-&gt;getID(); ?&gt;&amp;pid=&lt;?php echo $_GET["pid"]; ?&gt;"&gt;edit&lt;/a&gt;
		&lt;a href="&lt;?=$self?&gt;type=overview&amp;pid=&lt;?=$page-&gt;getID();?&gt;"&gt;beneath&lt;/a&gt;
		&lt;span&gt;&lt;?=$page-&gt;getTitle()?&gt;&lt;/span&gt;
		&lt;br /&gt;
	&lt;?php endforeach; ?&gt;
		&lt;hr /&gt;
	&lt;?php if ($_GET["pid"] &gt; 1): ?&gt;
		&lt;a href="&lt;?=$self?&gt;type=overview&amp;pid=&lt;?=$currentparent-&gt;parent()-&gt;getID()?&gt;"&gt;page up&lt;/a&gt;
	&lt;?php endif; ?&gt;
	&lt;a href="&lt;?=$self?&gt;type=editpage&amp;pid=&lt;?=$currentparent-&gt;getID()?&gt;&amp;id=0"&gt;add new page&lt;/a&gt;
&lt;?php endif; ?&gt;
&lt;/body&gt;&lt;/html&gt;

</code></pre>
</blockquote>
<p>На английском об этом <a href="http://www.redbeanphp.com/?url=redbean#/example">здесь</a>.<br />
В ближайшее время я планирую написать серию статей об RedBean ORM.  Это самая замечательная оbject-relational mapping system для php, которую я когда-либо видел, и она колоссально экономит время и нервы веб-разработчикам.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nayjest.ru/php/php-redbean-small-cms/feed</wfw:commentRss>
		<slash:comments>84</slash:comments>
		</item>
		<item>
		<title>Переход хостеров на php 5.3, статистика</title>
		<link>http://www.nayjest.ru/php/perehod-hosterov-na-php-5-3-statistika#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.nayjest.ru/php/perehod-hosterov-na-php-5-3-statistika#comments</comments>
		<pubDate>Tue, 28 Jul 2009 09:55:05 +0000</pubDate>
		<dc:creator>Nayjest</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[веб-хостинг]]></category>

		<guid isPermaLink="false">http://www.nayjest.ru/?p=49</guid>
		<description><![CDATA[Наверняка многих веб-разработчиков на php мучает вопрос: использовать вкусности php 5.3, или еще рановато. Особо это актуально для разработчиков CMS/CMF. Ведь так, коллеги? :) И вот я решил провести маленькое исследование, чтобы немного прояснить ситуацию с поддержкой php 5.3 у популярнх хостеров и разослал на ящики тех. поддержки вопрос по поводу поддержки php 5.3 на [...]]]></description>
			<content:encoded><![CDATA[<p>Наверняка многих веб-разработчиков на php мучает вопрос: использовать вкусности php 5.3, или еще рановато.<br />
Особо это актуально для разработчиков CMS/CMF. Ведь так, коллеги? :)<br />
И вот я решил провести маленькое исследование, чтобы немного прояснить ситуацию с поддержкой php 5.3 у популярнх хостеров и разослал на ящики тех. поддержки вопрос по поводу поддержки php 5.3 на их виртуальном хостинге, а также их планов по переходу на эту версию, если в данный момент поддержки нет.<br />
Итак, перейдем сразу к результатам:</p>
<p style="text-align: center;"><img class="aligncenter" title="Поддержка php 5.3 у хостеров, диаграмма" src="/userfiles/external/php5.3_hosting_diagram.png" alt="Поддержка php 5.3 у хостеров, диаграмма" width="366" height="413" /><br />
<span id="more-49"></span></p>
<p>Всего опрошено около 40 хостеров, ответы поступили от 31 (остальные возможно еще просто не успели ответить). Какой-либо сложной методологии в выборе хостеров не было. Это первые в Google, первые в Яндексе, первые в различных каталогах хостинга, те, которыми пользовался лично я, русские и украинские. Я делал все исключительно из-за личного интереса в этом вопросе, цели пропиарить какого-то хостера не было и нет.<br />
Всех хостеров я сразу же просил не предлагать VPS/VDS.</p>
<p>Далее привожу непосредственно списки хостеров, у которых есть/нет/планируется поддержка php5.3</p>
<p><strong>Установка php 5.3 в ближайшее время не планируется у:</strong></p>
<ul>
<li> caravan.ru</li>
<li> mirohost.net</li>
<li> hosting.ua</li>
<li> hc.ua</li>
<li> masterhost.ru</li>
<li> freehost.com.ua</li>
<li> agava.com</li>
<li> majordomo.ru</li>
<li> sky-host.com: &laquo;переход на 5.3 не планируется, поскольку в постоянных переустановках ПО на сервере нет никакого смысла&raquo;</li>
<li> avahost.ru</li>
<li> hoster.ru</li>
<li> ht-systems.ru</li>
<li> hosting.ru</li>
<li> belihost.ru: &laquo;Очень не скоро в виду обратной не совместимости&raquo;</li>
<li> zenon.net: &laquo;Мы рассматриваем переход на версию php 5.2.8 в ближайшем будущем. Переход на php 5.3 мы пока не планируем&raquo;</li>
<li> bizhost.ru: &laquo;Сейчас мы проводим тестирование, потому ввод php5.3 в течении ближайшего месяца не планируется&raquo;</li>
<li> valuehost.ru</li>
<li> hostland.ru</li>
</ul>
<p>(всего 18 хостеров)</p>
<p><strong>Обещают скоро поставить:</strong></p>
<ul>
<li> tanhost.com.ua: Как только Cpanel будет поддерживать php 5.3</li>
<li> hostpro.ua: Как только Cpanel будет поддерживать php 5.3</li>
<li> dinohost.ru: Как только Cpanel будет поддерживать php 5.3</li>
<li> 1gb.ua: Возможно в течении месяца, но это не точно</li>
<li> peterhost.ru: Обновление возможно будет осенью</li>
</ul>
<p>(всего 5 хостеров)</p>
<p><strong>Есть поддержка php 5.3</strong></p>
<ul>
<li> sweb.ru: нужно указать, что нужен php 5.3 при оформлении заказа)</li>
<li> diphost.ru: на тарифе PARMA</li>
<li> ukraine.com.ua: в панели управления можно переключить на версию 4.4, 5.2, 5.3, и даже 6.0</li>
<li> komtet.ru: предлагают самому собрать любую версию php на тарифах, где есть SSH</li>
<li> centre.ru: начиная с тарифного плана R3 в режиме CGI</li>
<li> 100mb.ru: есть возможность собрать свой php</li>
<li> leaderhost.ru: только в режиме CGI</li>
<li> 604.ru</li>
</ul>
<p>(всего 8 хостеров)</p>
<p>Идея опубликовать это пришла уже после того, как я опросил многих хостеров.<br />
Если у Вас есть информация о поддержке php 5.3 на виртуальном хостинге у фирм, которые не вошли в список &#8212; пишите, я опубликую это в конце своего поста.<br />
Надеюсь, мое маленькое исследование будет кому-то полезно.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nayjest.ru/php/perehod-hosterov-na-php-5-3-statistika/feed</wfw:commentRss>
		<slash:comments>54</slash:comments>
		</item>
	</channel>
</rss>

