<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Все для начинающего веб-программиста</title>
	
	<link>http://www.web-junior.net</link>
	<description>На сайте вы найдете авторские статьи и переводы по php, JavaScript, Wordpress, Zend Framework, jQuery, dojo, которые могут пригодиться как новичкам так и профессионалам.</description>
	<lastBuildDate>Fri, 23 Mar 2012 17:21:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/web-junior" /><feedburner:info uri="web-junior" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>web-junior</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/web-junior" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fweb-junior" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Кириллические формулы в PHPExcel</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/RF7KuZhMpSA/</link>
		<comments>http://www.web-junior.net/kirillicheskie-formuly-v-phpexcel/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 16:17:43 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[PHPExcel]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=295</guid>
		<description><![CDATA[<p align="JUSTIFY"><a href="http://www.web-junior.net/wp-content/uploads/2012/03/logo_cyrillic.jpg"><img src="http://www.web-junior.net/wp-content/uploads/2012/03/logo_cyrillic-300x120.jpg" style="margin: 5px;" alt="" title="logo_cyrillic" width="300" height="120" class="alignleft size-medium wp-image-296" /></a><span style="font-size: small;"><strong>Формула</strong> (от лат. formula — образ, вид) является выражением <strong>логического суждения</strong> в математике, физике и др. прикладных науках. Формулы применяются повсеместно и в Excel они имеют очень <strong>большое значение</strong>, поскольку используются для проведения вычислений над данными ячеек. А тот факт, что формулы записываются <strong>на национальном языке</strong>, придает еще большую популярность Excel. Ведь легче запомнить формулу, которая написана на знакомом языке. Кроме того, <strong>понять</strong> назначение незнакомой формулы <strong>легче</strong>, когда понимаешь слова из которых состоит формула. Сегодня рассмотрим возможность установки <strong>кириллических формул в PHPExcel</strong>.</span></p>]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/YuKK_EkhYK8Byvuc0g-kUAFxpqM/0/da"><img src="http://feedads.g.doubleclick.net/~a/YuKK_EkhYK8Byvuc0g-kUAFxpqM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/YuKK_EkhYK8Byvuc0g-kUAFxpqM/1/da"><img src="http://feedads.g.doubleclick.net/~a/YuKK_EkhYK8Byvuc0g-kUAFxpqM/1/di" border="0" ismap="true"></img></a></p><p align="JUSTIFY"><a href="http://www.web-junior.net/wp-content/uploads/2012/03/logo_cyrillic.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2012/03/logo_cyrillic-300x120.jpg" style="margin: 5px;" alt="" title="logo_cyrillic" width="300" height="120" class="alignleft size-medium wp-image-296" /></a><span style="font-size: small;"><strong>Формула</strong> (от лат. formula — образ, вид) является выражением <strong>логического суждения</strong> в математике, физике и др. прикладных науках. Формулы применяются повсеместно и в Excel они имеют очень <strong>большое значение</strong>, поскольку используются для проведения вычислений над данными ячеек. А тот факт, что формулы записываются <strong>на национальном языке</strong>, придает еще большую популярность Excel. Ведь легче запомнить формулу, которая написана на знакомом языке. Кроме того, <strong>понять</strong> назначение незнакомой формулы <strong>легче</strong>, когда понимаешь слова из которых состоит формула. Сегодня рассмотрим возможность установки <strong>кириллических формул в PHPExcel</strong>.</span></p>
<p align="JUSTIFY"><span style="font-size: medium;"><strong>Предыстория</strong></span></p>
<p align="JUSTIFY"><span style="font-size: small;">Когда я впервые увидел <strong>PHPExcel</strong>, то очень обрадовался, <strong>широким возможностям</strong>, которые предоставляла библиотека. Но был слегка разочарован тем, что не было полноценной возможности работы с <strong>кириллическими формулами</strong>. Наконец такая возможность появилась.</span></p>
<p align="JUSTIFY"><span style="font-size: small;">Я уже давно знал, что работы над этим вопросом ведутся. Когда два года назад, я написал первые статьи по PHPExcel, со мной связался один из разработчиков. Он попросил тогда список кириллических функций. </span></p>
<p align="JUSTIFY"><span style="font-size: small;">С тех пор я больше ничего серьезного по этому поводу не слышал, пока наконец <strong>осенью прошлого года</strong> один человек в комментариях сказал, что можно использовать кириллические формулы через <strong>установку setLocale(«ru»)</strong>. Но он отказался привести пример и мне пришлось самостоятельно искать подтверждение этому.</span></p>
<p align="JUSTIFY"><span style="font-size: small;">Вот что удалось найти.</span></p>
<p align="JUSTIFY"><span style="font-size: medium;"><strong>Слухи</strong></span></p>
<p align="JUSTIFY"><span style="font-size: small;">Все знают, что <strong>слухи</strong> распространяются с невероятной <strong>быстротой</strong>. А повсеместное развитие сети Интернет этому только <strong>способствует</strong>. На основе заявления этого комментатора (а может быть на другом основании) некоторые сайты <strong>стали распространять</strong> на своих страницах <strong>ложные примеры</strong> работы с кириллическими формулами. Вот один из <strong>таких примеров</strong>.</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">&quot;1.7.6/Classes/PHPExcel.php&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">&quot;1.7.6/Classes/PHPExcel/Writer/Excel2007.php&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$objPHPExcel</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PHPExcel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$objPHPExcel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setActiveSheetIndex</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">=</span><span style="color: #000088;">$objPHPExcel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getActiveSheet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'A1'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'B2'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'C1'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;=CONCATENATE(A1,B2,C1)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCell</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCalculatedValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br/&gt;'</span><span style="color: #339933;">;</span>
PHPExcel_Settings<span style="color: #339933;">::</span><span style="color: #990000;">setLocale</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ru'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'=СЦЕПИТЬ(A1,B2,C1)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCell</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCalculatedValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p align="JUSTIFY"><span style="font-size: small;">Этот код <strong>создает ощущение</strong>, что кириллическая формула о<strong>трабатывает нормально</strong>. НО! Есть два простых способа <strong>продемонстрировать ошибку</strong> работы этого кода:</span></p>
<ul>
<li>
<p align="JUSTIFY"><span style="font-size: small;">поставить кириллическую формулу в ячейку, </span><span style="font-size: small;"><strong>отличную от D2</strong></span><span style="font-size: small;">;</span></p>
</li>
<li>
<p align="JUSTIFY"><span style="font-size: small;">или вызвать этот код PHPExcel_Calculation::getInstance()-&gt;clearCalculationCache(); </span><span style="font-size: small;"><strong>перед установкой</strong></span><span style="font-size: small;"> кириллической формулы.</span></p>
</li>
</ul>
<p align="JUSTIFY"><span style="font-size: small;">В обоих случаях результат будет тот же.</span></p>
<div id="attachment_297" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.web-junior.net/wp-content/uploads/2012/03/exception.jpg"  class="fancybox"><img src="http://www.web-junior.net/wp-content/uploads/2012/03/exception-300x64.jpg" alt="" title="Ошибка говорит сама за себя" width="400" height="78" class="size-medium wp-image-297" /></a><p class="wp-caption-text">Ошибка говорит сама за себя</p></div>
<p align="JUSTIFY"><span style="font-size: small;">Почему же <strong>так происходит</strong> и почему код <strong>вроде бы</strong> отрабатывает верно? Все дело <strong>в кэшировании</strong>. Не секрет, что PHPExcel производит очень <strong>много работы</strong> и поэтому требует <strong>огромное</strong> количество <strong>памяти</strong>. Поэтому разработчики применяют кэширование везде, где только возможно, чтобы <strong>снизить нагрузку</strong> на память. Именно из-за кэширования <strong>результат работы</strong> закешированной формулы CONCATENATE выводится во второй раз, несмотря на установку <strong>кириллической формулы</strong>. Поэтому сброс кэша или установка формулы в другую ячейку <strong>приводит к ошибке</strong>, поскольку PHPExcel <strong>не знает</strong> формулу СЦЕПИТЬ.</span></p>
<p align="JUSTIFY"><span style="font-size: small;">Я не стану обсуждать верно ли в этом случае использовать кэширование. Я только хочу сказать, что именно из-за кэширования возникают такие проблемы.</span></p>
<p align="JUSTIFY"><span style="font-size: medium;"><strong>Кириллические формулы</strong></span></p>
<p align="JUSTIFY"><span style="font-size: small;">Теперь рассмотрим <strong>правильный способ </strong>работы с кириллическими формулами в PHPExcel.</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">&quot;1.7.6/Classes/PHPExcel.php&quot;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">&quot;1.7.6/Classes/PHPExcel/Writer/Excel2007.php&quot;</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$objPHPExcel</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PHPExcel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$objPHPExcel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setActiveSheetIndex</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">=</span><span style="color: #000088;">$objPHPExcel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getActiveSheet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'A1'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'B2'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'C1'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;=CONCATENATE(A1,B2,C1)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCell</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCalculatedValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br/&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Сбрасываем кэш</span>
PHPExcel_Calculation<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clearCalculationCache</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Устанавливаем локаль</span>
PHPExcel_Settings<span style="color: #339933;">::</span><span style="color: #990000;">setLocale</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ru'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$formula</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;=СЦЕПИТЬ(A1,B2,C1)&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Транслируем формулу в английскую</span>
<span style="color: #000088;">$formula</span> <span style="color: #339933;">=</span> PHPExcel_Calculation<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_translateFormulaToEnglish<span style="color: #009900;">&#40;</span><span style="color: #000088;">$formula</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//проверяем ее работу</span>
<span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCellValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'C2'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$formula</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCell</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'C2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCalculatedValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br/&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Теперь обратный процесс</span>
<span style="color: #666666; font-style: italic;">//Получаем формулу</span>
<span style="color: #000088;">$formula</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCell</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'C2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Транслируем из английской в локальную версию</span>
<span style="color: #000088;">$translated</span> <span style="color: #339933;">=</span> PHPExcel_Calculation<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_translateFormulaToLocale<span style="color: #009900;">&#40;</span><span style="color: #000088;">$formula</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Выводим</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$translated</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p align="JUSTIFY"><span style="font-size: small;">В результате получаем</span></p>
<div id="attachment_298" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.web-junior.net/wp-content/uploads/2012/03/formula.jpeg"  class="fancybox"><img src="http://www.web-junior.net/wp-content/uploads/2012/03/formula-300x91.jpg" alt="" title="Капитан Очевидность говорит, что все сделано верно" width="400" height="115" class="size-medium wp-image-298" /></a><p class="wp-caption-text">Капитан Очевидность говорит, что все сделано верно</p></div>
<p align="JUSTIFY"><span style="font-size: small;">Суть проста как пять копеек. Берем <strong>формулу</strong>, преобразовываем ее <strong>в английскую версию</strong> с помощью метода PHPExcel_Calculation::getInstance()-&gt;_translateFormulaToEnglish(), после чего <strong>устанавливаем</strong> ее в ячейку. Для <strong>обратного процесса</strong> используется метод PHPExcel_Calculation::getInstance()-&gt;_translateFormulaToLocale().</span></p>
<p align="JUSTIFY"><span style="font-size: small;">Перед выполнением этих процессов должна быть <strong>установлена локаль</strong>. Доступные локали можно <strong>найти в папке</strong> Classes/PHPExcel/locale. Там же можно посмотреть <strong>список доступных функций</strong>.</span></p>
<p>Читайте все статьи цикла:</p>
<ul>
<li><a href="http://www.web-junior.net/sozdanie-excel-fajjlov-s-pomoshhyu-phpexcel/" >Создание Excel-файлов с помощью PHPExcel</a></li>
<li><a href="http://www.web-junior.net/chtenie-excel-fajjlov-s-pomoshhyu-phpexcel/" >Чтение Excel-файлов с помощью PHPExcel</a></li>
<li><a href="http://www.web-junior.net/chasto-zadavaemye-voprosy-po-phpexcel/" >Часто задаваемые вопросы по PHPExcel</a></li>
<li>Кириллические формулы в PHPExcel</li>
</ul><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_run/?ref_id=850394791" >Пройди головоломку, получи приз ! Бесплатно !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=295&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/RF7KuZhMpSA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/kirillicheskie-formuly-v-phpexcel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/kirillicheskie-formuly-v-phpexcel/</feedburner:origLink></item>
		<item>
		<title>TOP 5 lightbox-плагинов для WordPress</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/z97wvZy8WOI/</link>
		<comments>http://www.web-junior.net/top-5-lightbox-plaginov-dlya-wordpress/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 16:40:38 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[lightbox]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=284</guid>
		<description><![CDATA[<a href="http://www.web-junior.net/wp-content/uploads/2012/01/main_logo.jpg"><img src="http://www.web-junior.net/wp-content/uploads/2012/01/main_logo-300x225.jpg" alt="" title="main_logo" width="300" height="225" class="alignleft size-medium wp-image-285" /></a>Интерфейс пользователя (UI) начал свое изменение вместе с первым созданным сайтом. Чем больше отдалялась точка времени от первого созданного сайта, тем большие изменения претерпевал интерфейс пользователя. Теперь он стал практически не похожим на первый сайт. Если современному дизайнеру показать элементы UI тех первых сайтов, то он, наверное, упадет в обморок от подобной демонстрации. Прогресс не стоит на месте и сейчас развитие сайтов идет так быстро, что не успеваешь сделать вдох, как появляются новые фишки и элементы UI. Про один из таких элементов и пойдет сегодня речь.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/C4MWqm09k_Udr40xYHTPkbNXTAQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/C4MWqm09k_Udr40xYHTPkbNXTAQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/C4MWqm09k_Udr40xYHTPkbNXTAQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/C4MWqm09k_Udr40xYHTPkbNXTAQ/1/di" border="0" ismap="true"></img></a></p><style type="text/css">
  .stars{
    width:32px;
    height:32px;
    background:url(/wp-content/themes/patagonia/images/stars.png);
    display:block;
    float:left;
  }
</style>
<p><a href="http://www.web-junior.net/wp-content/uploads/2012/01/main_logo.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2012/01/main_logo-300x225.jpg" alt="" title="main_logo" width="300" height="225" class="alignleft size-medium wp-image-285" /></a>Интерфейс пользователя (UI) начал свое изменение вместе с первым созданным сайтом. Чем больше отдалялась точка времени от первого созданного сайта, тем большие изменения претерпевал интерфейс пользователя. Теперь он стал практически не похожим на первый сайт. Если современному дизайнеру показать элементы UI тех первых сайтов, то он, наверное, упадет в обморок от подобной демонстрации. Прогресс не стоит на месте и сейчас развитие сайтов идет так быстро, что не успеваешь сделать вдох, как появляются новые фишки и элементы UI. Про один из таких элементов и пойдет сегодня речь.</p>
<h2>Что это такое</h2>
<p>Большинству читателей блога объяснения что такое <strong>lightbox-плагин</strong>, я думаю, не понадобяться. Но некоторая часть может не понять значения этого термина. Именно для этих читателей следующий текст.<br />
Под lightbox-плагинами я понимаю <strong>js-скрипты</strong>, оформленные в виде <strong>плагинов для WordPress</strong>, которые в удобном виде отображают различный контент. Преимущественно мультимедиа-контент: изображения, видео, флеш и т.д. Обычно такие скрипты реагируют на действие пользователя: нажатие на изображение или ссылку. Контент, преимущественно, <strong>отображается в модальных окнах</strong>, т.е. в окнах, которые лишают пользователя возможности работы с родительским окном до закрытия модального окна.</p>
<h2>Основные требования</h2>
<p>Требования, которые обычно выдвигаются к таким плагинам, следующие:</p>
<ul>
<li>отображение мультимедийного контента (изображения, флеш, видео) в модальном окне;</li>
<li>удобство при навигации;</li>
<li>удобство настройки в админке;</li>
<li>максимальная интеграция плагина с функциональностью js-скрипта;</li>
<li>минимальное количество багов и глюков.</li>
</ul>
<h2>TOP</h2>
<p>Теперь собственно сам TOP lightbox-плагинов, которые, по моему мнению, являются лучшими в этой области.</p>
<h2>5.LIGHTBOX 3</h2>
<p><a href="http://www.web-junior.net/wp-content/uploads/2012/01/lightbox.jpeg" class="fancybox" ><img src="http://www.web-junior.net/wp-content/uploads/2012/01/lightbox-300x199.jpg" alt="" title="lightbox" width="300" height="199" class="alignleft size-medium wp-image-286" style="margin:5px" /></a><strong>Краткое описание:</strong> плагин, основанный на всем известном скрипте Lightbox. Плагин предоставляет практически всю функциональность оригинального js-скрипта. Но, к сожалению, недостаточную для выхода на первое место.<br/><br/><br/><br/><br />
<strong>Версии:</strong></p>
<ul>
<li>плагина 3</li>
<li>js-скрипта 2.03.3</li>
</ul>
<p><strong>Плюсы:</strong></p>
<ul>
<li>может автоматически группировать изображения в галерею</li>
<li>удобная навигация</li>
<li>хорошая интеграция с оригинальным js-скриптом</li>
<li>есть админка (только английская)</li>
</ul>
<p><strong>Минусы:</strong></p>
<ul>
<li>работает только с изображениями</li>
</ul>
<p><strong>Ссылки:</strong></p>
<ul>
<li>js-скрипт <a target="_blank" href="http://www.web-junior.net/goto/http://huddletogether.com/projects/lightbox2/" >http://huddletogether.com/projects/lightbox2/</a></li>
<li>плагин <a target="_blank" href="http://www.web-junior.net/goto/http://www.boiteaweb.fr/lightbox3" >http://www.boiteaweb.fr/lightbox3</a></li>
<li>скачать <a target="_blank" href="http://www.web-junior.net/goto/http://wordpress.org/extend/plugins/lightbox-3/" >http://wordpress.org/extend/plugins/lightbox-3/</a></li>
</ul>
<p><span style="float:left;font-size:150%;position:relative;top:10px"><strong>Оценка от web-junior.net:</strong></span> <span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars"></span><span class="stars"></span><br/><br/><br/></p>
<h2>4.FANCYBOX FOR WORDPRESS</h2>
<p><a href="http://www.web-junior.net/wp-content/uploads/2012/01/fancybox.jpeg" class="fancybox" ><img src="http://www.web-junior.net/wp-content/uploads/2012/01/fancybox-300x233.jpg" alt="" title="fancybox" width="300" height="233" class="alignleft size-medium wp-image-287" style="margin:5px" /></a><strong>Краткое описание:</strong> плагин, основанный на js-скрипте fancybox. Один из самых популярных скриптов. Плагин впитал в себя всю мощь этой разработки. На мой взгляд один из самых лучших скриптов в этой области.<br />
<br/><br/><br/><br/><br/><br />
<strong>Версии:</strong></p>
<ul>
<li>плагина 3.0.1</li>
<li>js-скрипта 1.3.4</li>
</ul>
<p><strong>Плюсы:</strong></p>
<ul>
<li>может весь поддерживаемый контент группировать в галерею</li>
<li>удобная навигация</li>
<li>открывает изображения, iframe, swf</li>
<li>хорошая интеграция с оригинальным js-скриптом</li>
<li>есть админка (английская)</li>
</ul>
<p><strong>Минусы:</strong></p>
<ul>
<li>не поддерживает видео</li>
<li>в стандартной поставке хорошо работает только с изображениями, для открытия других типов данных необходимо вставлять дополнительный код</li>
</ul>
<p><strong>Ссылки:</strong></p>
<ul>
<li>js-скрипт <a target="_blank" href="http://www.web-junior.net/goto/http://fancybox.net/" >http://fancybox.net/</a></li>
<li>плагин <a target="_blank" href="http://www.web-junior.net/goto/http://plugins.josepardilla.com/fancybox-for-wordpress/" >http://plugins.josepardilla.com/fancybox-for-wordpress/</a></li>
<li>скачать <a target="_blank" href="http://www.web-junior.net/goto/http://wordpress.org/extend/plugins/fancybox-for-wordpress/" >http://wordpress.org/extend/plugins/fancybox-for-wordpress/</a></li>
</ul>
<p><span style="float:left;font-size:150%;position:relative;top:10px"><strong>Оценка от web-junior.net:</strong></span> <span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;width:16px"></span><span class="stars" style="background-position:-16px 0px;width:16px"></span><span class="stars"></span><br/><br/><br/></p>
<h2>3.ORANGEBOX</h2>
<p><a href="http://www.web-junior.net/wp-content/uploads/2012/01/orangebox.jpeg" class="fancybox" ><img src="http://www.web-junior.net/wp-content/uploads/2012/01/orangebox-300x199.jpg" alt="" title="orangebox" width="300" height="199" class="alignleft size-medium wp-image-288" style="margin:5px" /></a><strong>Краткое описание:</strong> когда я впервые увидел этот плагин, то решил, что это очередная поделка на FancyBox. Дизайн и элементы управления у этих скриптов настолько схожи, что спутать их очень легко. Но рассмотрев повнимательнее, я пришел к выводу, что это разные скрипты, поэтому сегодня третье место за OrangeBox.<br/><br/><br />
<strong>Версии:</strong>
<ul>
<li>плагина 1.0.0</li>
<li>js-скрипта 2.0.3</li>
</ul>
<p><strong>Плюсы:</strong>
<ul>
<li>может весь поддерживаемый контент(кроме iframe) группировать в галерею</li>
<li>удобная навигация</li>
<li>открывает изображения, видео, iframe, swf</li>
<li>хорошая интеграция с оригинальным js-скриптом</li>
<li>есть админка (английская)</li>
</ul>
<p><strong>Минусы:</strong>
<ul>
<li>плагин требует WordPress 3.1 или выше</li>
</ul>
<p><strong>Ссылки:</strong>
<ul>
<li>js-скрипт <a target="_blank" href="http://www.web-junior.net/goto/http://orangebox.davidpaulhamilton.net" >http://orangebox.davidpaulhamilton.net</a></li>
<li>плагин <a target="_blank" href="http://www.web-junior.net/goto/http://wordpress.org/extend/plugins/orangebox/" >http://wordpress.org/extend/plugins/orangebox/</a></li>
<li>скачать <a target="_blank" href="http://www.web-junior.net/goto/http://wordpress.org/extend/plugins/orangebox/" >http://wordpress.org/extend/plugins/orangebox/</a></li>
</ul>
<p><span style="float:left;font-size:150%;position:relative;top:10px"><strong>Оценка от web-junior.net:</strong></span> <span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars"></span><br/><br/><br/></p>
<h2>2. EASY FANCYBOX</h2>
<p><a href="http://www.web-junior.net/wp-content/uploads/2012/01/easy_fancybox.jpeg" class="fancybox" ><img src="http://www.web-junior.net/wp-content/uploads/2012/01/easy_fancybox-300x197.jpg" alt="" title="easy fancybox" width="300" height="197" class="alignleft size-medium wp-image-289" style="margin:5px" /></a><strong>Краткое описание:</strong> на втором месте еще один плагин, основанный на FancyBox. Этот плагин предоставляет больше возможностей по сравнению с FANCYBOX FOR WORDPRESS.<br/><br/><br/><br/><br/><br />
<strong>Версии:</strong>
<ul>
<li>плагина 1.3.4.9</li>
<li>js-скрипта 1.3.4</li>
</ul>
<p><strong>Плюсы:</strong>
<ul>
<li>может автоматически группировать изображения в галерею</li>
<li>хорошая интеграция с оригинальным скриптом по изображениям, также можно настроить открытие swf, pdf, youtube, iframe. Может открывать обычные видео файлы в режиме youtube</li>
<li>удобная навигация (как впрочем и у всех fancybox-плагинов)</li>
<li>есть админка(английская, расположена в Настройки-&gt;Медиафайлы)</li>
</ul>
<p><strong>Минусы:</strong>
<ul>
<li>в стандартной поставке хорошо работает только с изображениями, для открытия других типов данных нужно вставлять дополнительный код</li>
</ul>
<p><strong>Ссылки:</strong>
<ul>
<li>js-скрипт <a target="_blank" href="http://www.web-junior.net/goto/http://fancybox.net/" >http://fancybox.net/</a></li>
<li>плагин <a target="_blank" href="http://www.web-junior.net/goto/http://4visions.nl/en/wordpress-plugins/easy-fancybox/" >http://4visions.nl/en/wordpress-plugins/easy-fancybox/</a></li>
<li>скачать <a target="_blank" href="http://www.web-junior.net/goto/http://wordpress.org/extend/plugins/easy-fancybox/" >http://wordpress.org/extend/plugins/easy-fancybox/</a></li>
</ul>
<p><span style="float:left;font-size:150%;position:relative;top:10px"><strong>Оценка от web-junior.net:</strong></span> <span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;width:16px"></span><span class="stars" style="background-position:-16px 0px;width:16px"></span><br/><br/><br/></p>
<h2>1.SHADOWBOX <acronym title="JavaScript">JS</acronym></h2>
<p><a href="http://www.web-junior.net/wp-content/uploads/2012/01/shadowbox.jpeg" class="fancybox" ><img src="http://www.web-junior.net/wp-content/uploads/2012/01/shadowbox-300x197.jpg" alt="" title="shadowbox" width="300" height="197" class="alignleft size-medium wp-image-290" style="margin:5px" /></a><strong>Краткое описание:</strong> плагин, основанный на <a href="http://www.web-junior.net/otobrazhenie-kontenta-v-shadowbox/" >js-скрипте Shadowbox</a>. Еще месяц назад был доступен в репозитории WordPress. Как утверждает <a target="_blank" href="http://www.web-junior.net/goto/http://sivel.net/2011/12/shadowbox-js-plugin-pulled-from-the-wordpress-org-repository/" >автор плагина</a>, его исключили за использование модуля с лицензией несовместимой с <acronym title="GNU General Public License">GPL</acronym> (Shadowbox распространяется по собственной лицензии). Открыл практически все, что можно открыть. За что и получил первое место в топе.<br/><br />
<strong>Версии:</strong>
<ul>
<li>плагина 3.0.3.9</li>
<li>js-скрипта 3.0.3</li>
</ul>
<p><strong>Плюсы:</strong>
<ul>
<li>может автоматически группировать изображения и flash в галерею</li>
<li>удобная навигация</li>
<li>открывает изображения, видео, swf, iframe</li>
<li>хорошая интеграция с оригинальным скриптом</li>
<li>есть админка (английская)</li>
</ul>
<p><strong>Минусы:</strong>
<ul>
<li>практически отсутствуют</li>
</ul>
<p><strong>Ссылки:</strong>
<ul>
<li>js-скрипт <a target="_blank" href="http://www.web-junior.net/goto/http://www.shadowbox-js.com" >http://www.shadowbox-js.com</a></li>
<li>плагин <a target="_blank" href="http://www.web-junior.net/goto/http://sivel.net/wordpress/shadowbox-js/" >http://sivel.net/wordpress/shadowbox-js/</a></li>
<li>скачать <a target="_blank" href="http://www.web-junior.net/goto/http://dl.sivel.net/wordpress/plugin/shadowbox-js.3.0.3.9.zip" >http://dl.sivel.net/wordpress/plugin/shadowbox-js.3.0.3.9.zip</a></li>
<li>статья на web-junior.net: <a href="http://www.web-junior.net/otobrazhenie-kontenta-v-shadowbox/" >Отображение контента в Shadowbox</a></li>
</ul>
<p><span style="float:left;font-size:150%;position:relative;top:10px"><strong>Оценка от web-junior.net:</strong></span> <span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><span class="stars" style="background-position:0 -64px;"></span><br/><br/><br/><br />
Если вы <strong>не согласны с местами</strong>, которые отведены для каждого <strong>плагина в топе</strong>, то вы можете <strong>выбрать</strong> своего лидера.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Если вы считаете, что какой-либо <strong>достойный плагин</strong> не попал в топ, то <strong>напишите об этом в комментариях</strong> и, возможно, в следующий раз именно ваш плагин получит наивысшую оценку в топе.</p><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_puzzle/?ref_id=850394791" >Собери пазл, получи приз !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=284&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/z97wvZy8WOI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/top-5-lightbox-plaginov-dlya-wordpress/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/top-5-lightbox-plaginov-dlya-wordpress/</feedburner:origLink></item>
		<item>
		<title>Как настроить многоязычность в Joomla! 1.7</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/vNvLAehA-dI/</link>
		<comments>http://www.web-junior.net/kak-nastroit-mnogoyazychnost-v-joomla-1-7/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 13:50:59 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[Joomla]]></category>
		<category><![CDATA[faq]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=273</guid>
		<description><![CDATA[<p align="left"><a href="http://www.web-junior.net/wp-content/uploads/2011/10/logo.png"><img class="size-medium wp-image-274 alignleft" style="margin: 5px;" title="Joomla! 1.7" src="http://www.web-junior.net/wp-content/uploads/2011/10/logo-300x201.png" alt="Joomla! 1.7" width="300" height="201" /></a><span style="font-size: small;">Наша жизнь есть ни что иное как <strong>совокупность взлетов и падений</strong>. Сейчас мы на <strong>«гребне волны»</strong>, а завтра можем упасть в пропасть неизвестности. Жизнь сайтов <strong>пульсирует точно так же</strong>, поскольку они созданы и управляются человеком. Мало кто из владельцев сайтов на вершине успеха не <strong>задумывается над расширением своей аудитории</strong>. Но если для привлечения пользователей на одном языке уже сделано все что можно, то почему бы не отъесть кусок аудитории у конкурентов на другом языке? Для этого необходимо <strong>создать несколько версий сайтов</strong> на разных языках. В последнее время, разработчики Joomla! сделали большой шаг вперед в этом направлении. Сегодня рассмотрим техническую сторону <strong>настройки многоязычности в Joomla! 1.7</strong>, которая поможет привлечь пользователей на других языках. Для примера, установим три языка: английский, русский и украинский.</span></p>]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/XQVpsEOBw0ofgc2q2Wz_FobNUWs/0/da"><img src="http://feedads.g.doubleclick.net/~a/XQVpsEOBw0ofgc2q2Wz_FobNUWs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/XQVpsEOBw0ofgc2q2Wz_FobNUWs/1/da"><img src="http://feedads.g.doubleclick.net/~a/XQVpsEOBw0ofgc2q2Wz_FobNUWs/1/di" border="0" ismap="true"></img></a></p><p align="left"><a href="http://www.web-junior.net/wp-content/uploads/2011/10/logo.png" ><img class="size-medium wp-image-274 alignleft" style="margin: 5px;" title="Joomla! 1.7" src="http://www.web-junior.net/wp-content/uploads/2011/10/logo-300x201.png" alt="Joomla! 1.7" width="300" height="201" /></a><span style="font-size: small;">Наша жизнь есть ни что иное как <strong>совокупность взлетов и падений</strong>. Сейчас мы на <strong>«гребне волны»</strong>, а завтра можем упасть в пропасть неизвестности. Жизнь сайтов <strong>пульсирует точно так же</strong>, поскольку они созданы и управляются человеком. Мало кто из владельцев сайтов на вершине успеха не <strong>задумывается над расширением своей аудитории</strong>. Но если для привлечения пользователей на одном языке уже сделано все что можно, то почему бы не отъесть кусок аудитории у конкурентов на другом языке? Для этого необходимо <strong>создать несколько версий сайтов</strong> на разных языках. В последнее время, разработчики Joomla! сделали большой шаг вперед в этом направлении. Сегодня рассмотрим техническую сторону <strong>настройки многоязычности в Joomla! 1.7</strong>, которая поможет привлечь пользователей на других языках. Для примера, установим три языка: английский, русский и украинский.</span></p>
<p align="left"><span style="font-size: medium;"><strong><acronym title="Content Management System">CMS</acronym></strong></span></p>
<p align="left"><span style="font-size: small;">В свое время первая версия Joomla! была ни чем иным как переименованной Mambo. Мало кто, кроме разработчиков, верил в то, что еще одна Мамба будет успешной. Но разработчики выбрали верную стратегию развития и теперь мы видим очень неплохую <acronym title="Content Management System">CMS</acronym>, на которой стоят тысячи сайтов. На данный момент, в <a target="_blank" href="http://www.web-junior.net/goto/http://ratings.cmsmagazine.ru/cms_analytics/?sk=_works&amp;so=desc&amp;box=&amp;ctl=2&amp;st=&amp;bt=&amp;cpp=50" >рейтинге cmsmagazine.ru</a> Joomla! занимает почетное второе место среди бесплатных <acronym title="Content Management System">CMS</acronym>.</span></p>
<p align="left"><span style="font-size: medium;"><strong>Скачать</strong></span></p>
<p align="left"><span style="font-size: small;">Скачать русифицированную версию Joomla! можно на сайте <a target="_blank" href="http://www.web-junior.net/goto/http://www.joomlaportal.ru/" >http://www.joomlaportal.ru</a>. На момент написания статьи, последней доступной версией была 1.7.1. На ней и будем проводить все тесты. Официальный украинский перевод для этой версии можно <a target="_blank" href="http://www.web-junior.net/goto/http://www.joomla-ua.org/content/view/22/30/#joomla_1.7" >найти здесь</a>.</span></p>
<p align="left"><span style="font-size: medium;"><strong>Установка</strong></span></p>
<p align="left"><span style="font-size: small;">Начальная инсталляция Joomla! проста и удобна. Я думаю ни у кого не возникнет проблем с начальной установкой. Если все-же возникнут какие-то проблемы, то в сети есть отличные статьи на тему установки и начальной настройки этой <acronym title="Content Management System">CMS</acronym>.</span></p>
<p align="left"><span style="font-size: small;">Первое, что нужно сделать после инсталляции &#8211; это <strong>установить все языковые пакеты</strong></span><span style="font-size: small;">. В русифицированной сборке Joomla! уже установлены следующие языки: английский (en-<acronym title="Gigabyte">GB</acronym>) и русский (ru-RU). Украинский язык (uk-UA) устанавливаем через </span><span style="font-size: small;"><strong>Менеджер Расширений(</strong></span><strong>Extension Manager</strong><span style="font-size: small;"><strong>)</strong></span><span style="font-size: small;"> путем закачки языкового пакета. После установки украинского языка, нужно создать новый язык в разделе </span><span style="font-size: small;"><strong>Языки Контента(Content Languages)</strong></span><span style="font-size: small;">. Попасть в этот раздел можно зайдя в <strong>Расширения(Extensions)-&gt;Менеджер Языков(Language Manager)-&gt;вкладка Языки Контента(Content)</strong>.</span></p>
<div id="attachment_275" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.web-junior.net/wp-content/uploads/2011/10/uk-language_small.png" class="fancybox" ><img class="size-medium wp-image-275" title="Нужно заполнить все обязательные поля и нажать «Сохранить и закрыть»" src="http://www.web-junior.net/wp-content/uploads/2011/10/uk-language_small-300x189.png" alt="" width="300" height="189" /></a><p class="wp-caption-text">Нужно заполнить все обязательные поля и нажать «Сохранить и закрыть»</p></div>
<p align="left"><span style="font-size: small;">Теперь для контента будут доступны три языка: украинский, русский и английский.</span></p>
<p align="left"><span style="font-size: medium;"><strong>Модули и плагины</strong></span></p>
<p align="left"><span style="font-size: small;">Следующим важным шагом будет настройка модулей и плагинов.</span></p>
<p align="left"><span style="font-size: small;">Модуль </span><span style="font-size: small;"><strong>Переключение яызков (Language Switcher)</strong></span><span style="font-size: small;"> ответственен за вывод специального переключателя, с помощью которого можно выбирать язык контента на фронтенде. Если его нет в списке в разделе <strong>Расширения (Extensions)-&gt;Менеджер модулей (Module Manager)</strong>, то создайте его, нажав на кнопку <strong>Создать(New)</strong>. В появившемся окне нужно задать тип модуля. Выберите пункт </span>Переключение языков<span style="font-size: small;">. После этого откроется страничка создания модуля. Для начала можно задать только Заголовок и Позицию.</span></p>
<div id="attachment_279" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.web-junior.net/wp-content/uploads/2011/10/language_switcher1.png" class="fancybox" ><img class="size-medium wp-image-279" title="Для начала достаточно ввести имя и выбрать позицию" src="http://www.web-junior.net/wp-content/uploads/2011/10/language_switcher1-300x225.png" alt="" width="300" height="225" /></a><p class="wp-caption-text">Для начала достаточно ввести имя и выбрать позицию</p></div>
<p align="left"><span style="font-size: small;">Плагин </span><span style="font-size: small;"><strong>Система &#8211; Фильтр языков (</strong></span><strong>System &#8211; Language Filter</strong><span style="font-size: small;"><strong>)</strong></span><span style="font-size: small;"> является непосредственно реализацией многоязычности в Joomla! Поэтому его нужно опубликовать, найдя в списке </span><span style="font-size: small;"><strong>Расширения(Extentions) -&gt;Менеджер плагинов(Plug-in Manager)</strong></span><span style="font-size: small;">. У плагина есть несколько важных настроек, которые можно увидеть, зайдя на страницу редактирования. Для этого достаточно нажать на ссылку в списке <strong>Менеджера плагинов (Plug-in Manager)</strong>. Все опции рассматривать не будем. Остановимся лишь на опции <strong>Связь пунктов меню (Menu associations)</strong>. Она предназначена для того, чтобы переключая язык на фронтенде вы не попадали на главную, а оставались на той же странице, но уже на другом языке. Эту опцию нужно установить в <strong>Да (Yes)</strong>.</span></p>
<p align="left"><span style="font-size: medium;"><strong>Материалы</strong></span></p>
<p align="left"><span style="font-size: small;">Теперь подготовим к тестированию материалы, т. е. по одной статье на каждом языке. При этом в каждой статье нужно установить соответствующий язык.</span></p>
<div id="attachment_280" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.web-junior.net/wp-content/uploads/2011/10/article1.png" class="fancybox" ><img class="size-medium wp-image-280" title="Не забываем поставить состояние в Опубликовано" src="http://www.web-junior.net/wp-content/uploads/2011/10/article1-300x225.png" alt="" width="300" height="225" /></a><p class="wp-caption-text">Не забываем поставить состояние в Опубликовано</p></div>
<p align="left"><span style="font-size: small;">Теперь, когда материалы готовы, возьмемся за меню. </span></p>
<p align="left"><span style="font-size: small;">Все пункты меню нужно создавать для всех трех языков. При этом не забывать указывать связи с пунктами меню других языков.</span></p>
<p align="left"><span style="font-size: small;">Для начала нужно создать типы пунктов меню. Для этого заходим в раздел <strong>Меню(Menus)-&gt;Менеджер меню(Menu Manager)-&gt;Создать меню(Add New Menu)</strong> и создаем типы меню для всех языков. Для каждого задаем уникальный заголовок и тип меню. При этом тип Main Menu, который был создан по умолчанию, мы не трогаем.</span></p>
<div id="attachment_281" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.web-junior.net/wp-content/uploads/2011/10/mainmenu.png" class="fancybox" ><img class="size-medium wp-image-281" title="Меню для русской версии" src="http://www.web-junior.net/wp-content/uploads/2011/10/mainmenu-300x91.png" alt="" width="300" height="91" /></a><p class="wp-caption-text">Меню для русской версии</p></div>
<p align="left"><span style="font-size: small;">После создания типов меню, можно приступить к пунктам меню. Сначала нужно создать главные страницы для каждого языка. Рассмотрим пример для русского языка. Заходим в меню <strong>Меню(Menus)-&gt;Main Menu (RU)</strong> и нажимаем на кнопку <strong>Создать (New)</strong>. Чтобы разместить на главной статью, которую мы написали, выбираем <strong>Тип пункта меню(Menu Item Type) с названием Материал (Single Article)</strong>. Задаем Заголовок меню (Menu Title), Алиас(Alias), если нужно, Меню ( Menu Location) устанавливаем в Main Menu (RU), Главная страница (Default Page) устанавливаем в Да (Yes) и выбираем русский язык. Справа в пункте <strong>Обязательные параметры (Required Settings)</strong> выбираем статью, которую мы уже написали. Ниже, в <strong>Связи пункта меню (Menu Item Assocations)</strong> выбираем главные страницы на английском и украинском языках.</span></p>
<p align="CENTER">
<div id="attachment_282" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.web-junior.net/wp-content/uploads/2011/10/menuitem.png" class="fancybox" ><img class="size-medium wp-image-282" title="Главная страница на русском" src="http://www.web-junior.net/wp-content/uploads/2011/10/menuitem-300x183.png" alt="" width="300" height="183" /></a><p class="wp-caption-text">Главная страница на русском</p></div>
<p align="CENTER"><span style="font-size: x-small;"><br />
</span></p>
<p align="left"><span style="font-size: small;">Характерным признаком того, что все сделано верно будет значок флага рядом с <strong>Main Menu (RU) в меню Меню (Menus)</strong>. То же самое проделываем и для других языков.</span></p>
<p align="left"><span style="font-size: small;">Дальше можно создавать все остальные пункты меню, <strong>которые требуются для вашего сайта</strong>. Только не забывайте <strong>выставлять связи с меню</strong> других языков. Иначе при переключении языков будете попадать на главную.</span></p><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_mario/?ref_id=850394791" >Пройди игру, получи приз ! Без регистрации !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=273&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/vNvLAehA-dI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/kak-nastroit-mnogoyazychnost-v-joomla-1-7/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/kak-nastroit-mnogoyazychnost-v-joomla-1-7/</feedburner:origLink></item>
		<item>
		<title>XML-RPC: организация сервера с помощью Zend Framework</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/EtmPoVuUREs/</link>
		<comments>http://www.web-junior.net/xml-rpc-organizaciya-servera-s-pomoshhyu-zend-framework/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 16:36:53 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=272</guid>
		<description><![CDATA[<a href="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc.jpg"><img src="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc-300x172.jpg" alt="" title="zf-xml-rpc" style="margin-right: 5px;" width="300" height="172" class="alignleft size-medium wp-image-265" /></a>В <a href="http://www.web-junior.net/xml-rpc-rabota-s-pomoshhyu-zend-framework/">предыдущей статье</a> мы рассмотрели как <strong>посылать XML-RPC запросы</strong> с помощью Zend Framework. Дело не из легких, но слава богу в ZF все отлажено достаточно хорошо и поэтому работает как часы. Сегодня научимся организовать <strong>собственный XML-RPC сервер</strong>, используя функционал Zend Framework.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/5aTVxTCAHcsQ1OqnabaPkqN_d10/0/da"><img src="http://feedads.g.doubleclick.net/~a/5aTVxTCAHcsQ1OqnabaPkqN_d10/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5aTVxTCAHcsQ1OqnabaPkqN_d10/1/da"><img src="http://feedads.g.doubleclick.net/~a/5aTVxTCAHcsQ1OqnabaPkqN_d10/1/di" border="0" ismap="true"></img></a></p><p><a href="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc-300x172.jpg" alt="" title="zf-xml-rpc" style="margin-right: 5px;" width="300" height="172" class="alignleft size-medium wp-image-265" /></a>В <a href="http://www.web-junior.net/xml-rpc-rabota-s-pomoshhyu-zend-framework/" >предыдущей статье</a> мы рассмотрели как <strong>посылать <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> запросы</strong> с помощью Zend Framework. Дело не из легких, но слава богу в ZF все отлажено достаточно хорошо и поэтому работает как часы. Сегодня научимся организовать <strong>собственный <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервер</strong>, используя функционал Zend Framework.<br />
<span id="more-272"></span></p>
<p align="JUSTIFY">
<p align="JUSTIFY"><span style="font-size: medium;"><strong>Фреймворк</strong></span></p>
<p align="JUSTIFY"><span style="font-size: small;"><strong>Последнюю версию</strong> Zend Framework можно скачать на странице <a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/download/current/" >Downloads</a> официального сайта. На момент написания статьи последней была <strong>версия 1.11.10</strong>.</span></p>
<p align="LEFT"><span style="font-size: small;">Далее предполагается, что <strong>читатель знаком</strong> с шаблоном проектирования <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/MVC" >MVC</a>, его реализацией в Zend Framework и основами создания проектов. Поэтому все подробности о создании и настройки проектов в этой статье мы рассматривать не будем.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: medium;"><strong>Быстрый старт</strong></span></p>
<p align="LEFT"><span style="font-size: small;">Начнем, пожалуй, с самого простого. С <strong>кода функций</strong>, которые будут <strong>доступны для вызова</strong> через сервер. Для этого в папке library создадим еще <strong>одну папку</strong> и назовем ее <strong>Service</strong>. В ней разместим пару файлов с кодом тестовых функций.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Для начала рассмотрим, как сервер справляется с обработкой обычных функций.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;"><strong>library/Service/functions.php</strong></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Test function
* @param int value1
* @param int value2
* @return array
**/</span>
<span style="color: #000000; font-weight: bold;">function</span> testFunction<span style="color: #009900;">&#40;</span><span style="color: #000088;">$var1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$var2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$var2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">С кодом функции, я думаю, всем понятно. Она возвращает переданные параметры в виде массива. Более важным здесь является <strong>комментарий функции</strong>. Он должен быть оформлен <strong>в стиле PHPDoc</strong>. В комментарии нужно написать <strong>тип передаваемых параметров</strong> и <strong>тип возвращаемого значения</strong>. Замечание: если функция возвращает ассоциативный массив, то тип нужно указывать <strong>struct</strong>.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Теперь напишем контроллер, в котором расположим <strong>код самого сервера</strong> и сразу же добавим функцию, описанную выше, к серверу.</span></p>
<p align="LEFT"><span style="font-size: small;"><strong>application/controllers/ServerController.php</strong></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ServerController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action<span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//подключаем файл с функцией</span>
    <span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Service/functions.php'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//создаем объект сервера</span>
    <span style="color: #000088;">$server</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_XmlRpc_Server<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//добавляем функцию</span>
    <span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addFunction</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testFunction'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'webjunior'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//начинаем работу сервера</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Теперь, обратившись к серверу, мы можем вызвать функцию <strong>webjunior.testFunction</strong>. О том, как работать с <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> клиентом в ZF вы можете почитать в <a href="http://www.web-junior.net/xml-rpc-rabota-s-pomoshhyu-zend-framework/" >предыдущей статье</a>.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Всю работу по организации сервера берет на себя класс <strong>Zend_XmlRpc_Server</strong>. Он, как и все сервера в ZF, является потомком класса <strong>Zend_Server_Abstract</strong>.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Для добавления функций в сервер используется метод</span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">void Zend_XmlRpc_Server<span style="color: #339933;">::</span><span style="color: #004000;">addFunction</span><span style="color: #009900;">&#40;</span>
string<span style="color: #339933;">|</span>array <span style="color: #000088;">$function</span><span style="color: #339933;">,</span> string <span style="color: #000088;">$namespace</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="LEFT"><span style="font-size: small;">Параметры:</span></p>
<ul>
<li>
<p align="LEFT"><span style="font-size: small;"><strong>string|array $function</strong> — имя функции, которая добавляется к серверу. Если функций несколько, то их можно передать массивом;</span></p>
</li>
<li>
<p align="LEFT"><span style="font-size: small;"><strong>string $namespace</strong> — пространство имен, к которому добавляется функция. Параметр не обязателен.</span></p>
</li>
</ul>
<p align="LEFT"><span style="font-size: small;">Сам метод ничего не возвращает по окончанию работы. Но бросает исключение типа <strong>Zend_XmlRpc_Server_Exception</strong> в следующих случаях:</span></p>
<ul>
<li>
<p align="LEFT"><span style="font-size: small;">$function не является строкой и не является массивом;</span></p>
</li>
<li>
<p align="LEFT"><span style="font-size: small;">элемент массива $function не является строкой;</span></p>
</li>
<li>
<p align="LEFT"><span style="font-size: small;">указанная функция не существует.</span></p>
</li>
</ul>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Для запуска сервера вызываем метод</span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Zend_XmlRpc_Server<span style="color: #339933;">::</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span>Zend_XmlRpc_Request <span style="color: #000088;">$request</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="LEFT"><span style="font-size: small;">Параметр:</span></p>
<ul>
<li>
<p align="LEFT"><span style="font-size: small;"><strong>Zend_XmlRpc_Request $request</strong></span><span style="font-size: small;"> — объект запроса. Если нужна какая-то особая обработка запроса, то передаем объект здесь. По умолчанию установлен в </span><span style="font-size: small;"><strong>false</strong></span><span style="font-size: small;">.</span></p>
</li>
</ul>
<p align="LEFT"><span style="font-size: small;">Этот метод не бросает никаких исключений, но возвращает объект класса </span><span style="font-size: small;"><strong>Zend_XmlRpc_Response</strong></span><span style="font-size: small;">. Или объект класса </span><span style="font-size: small;"><strong>Zend_XmlRpc_Fault</strong></span><span style="font-size: small;"> в случае ошибки.</span></p>
<p align="LEFT">
<p align="LEFT">
<p align="LEFT"><span style="font-size: medium;"><strong>Классы</strong></span></p>
<p align="LEFT"><span style="font-size: small;">Теперь рассмотрим, как добавлять методы классов к серверу. Вот код простого класса, методы которого можно добавить к серверу.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;"><strong>library/Service/Test.php</strong></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Test<span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #009933; font-style: italic;">/**
  * Test method
  * @param string $val1 First param
  * @param base64 $val2 Second param
  * @return struct combined in array
  **/</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> combine<span style="color: #009900;">&#40;</span><span style="color: #000088;">$val1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_combine<span style="color: #009900;">&#40;</span><span style="color: #000088;">$val1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _combine<span style="color: #009900;">&#40;</span><span style="color: #000088;">$val1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'val1'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$val1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'val2'</span><span style="color: #339933;">=&gt;</span>base64_encode<span style="color: #009900;">&#40;</span><span style="color: #000088;">$val2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Как и для функций, добавляемые методы <strong>должны иметь</strong> комментарий в стиле <strong>phpDoc</strong>. Добавляются только публичные методы.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Немного изменим код сервера, представленного выше. Добавим еще этот класс.</span></p>
<p align="LEFT"><span style="font-size: small;"><strong>application/controllers/ServerController.php</strong></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ServerController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action<span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//подключаем файлы с функцией и классом</span>
    <span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Service/functions.php'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Service/Test.php'</span><span style="color: #339933;">;</span>
    try<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//создаем объект сервера</span>
    <span style="color: #000088;">$server</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_XmlRpc_Server<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//добавляем функцию</span>
    <span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addFunction</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testFunction'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'webjunior'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//добавляем публичные методы класса</span>
    <span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClass</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Test'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'webjunior'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//запускаем сервер</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>catch<span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Теперь у нашего сервера есть две функции <strong>webjunior.testFunction</strong> и <strong>webjunior.combine</strong>.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Этот сервер <strong>отличается</strong> от предыдущего вызовом всего лишь одного метода:</span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">void Zend_XmlRpc_Server<span style="color: #339933;">::</span><span style="color: #004000;">setClass</span><span style="color: #009900;">&#40;</span>
string<span style="color: #339933;">|</span>object <span style="color: #000088;">$class</span><span style="color: #339933;">,</span> string <span style="color: #000088;">$namespace</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> 
mixed <span style="color: #000088;">$argv</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="LEFT"><span style="font-size: small;">Метод добавляет все <strong>публичные методы класса</strong> указанного в параметре $class.</span></p>
<p align="LEFT"><span style="font-size: small;">Параметры:</span></p>
<ul>
<li>
<p align="LEFT"><span style="font-size: small;"><strong>string|object $class</strong> — класс, методы которого будут добавлены к серверу. Это может быть строка или объект самого класса;</span></p>
</li>
<li>
<p align="LEFT"><span style="font-size: small;"><strong>string $namespace</strong> — пространство имен. По умолчанию пустая строка;</span></p>
</li>
<li>
<p align="LEFT"><span style="font-size: small;"><strong>mixed $argv</strong> — все параметры, которые переданы после $namespace будут переданы в вызываемые методы.</span></p>
</li>
</ul>
<p align="LEFT">
<p align="LEFT">
<p align="LEFT">
<p align="LEFT">
<p align="LEFT"><span style="font-size: medium;"><strong>Кеширование</strong></span></p>
<p align="LEFT"><span style="font-size: small;">Рассмотренной выше функциональности вполне достаточно для понимания основ создания <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервера в ZF. Теперь рассмотрим случай, когда нагрузка на сервер настолько большая, что железу просто не под силу обработать все поступившие запросы. Здесь на выручку приходит кеширование.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Кеширование серверов в ZF на данный момент не на высшем уровне. Кешировние <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервера не исключение. Сейчас есть только примитивный функционал, который дает возможность добавить сервер в кеш, извлечь его из кеша или совсем удалить сервер из кеша.</span></p>
<p align="LEFT"><span style="font-size: small;">Рассмотрим простой пример организации кеша для <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервера.</span></p>
<p align="LEFT"><span style="font-size: small;"><strong>application/controllers/ServerController.php</strong></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ServerController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action<span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">//организуем кеш</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> cachedAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//создаем сервер</span>
    <span style="color: #000088;">$server</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_XmlRpc_Server<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">//подключаем весь функционал сервера</span>
   <span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Service/Test.php'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Service/functions.php'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//пытаемся достать сервер из кеша</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>Zend_XmlRpc_Server_Cache<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span>
APPLICATION_PATH<span style="color: #339933;">.</span><span style="color: #0000ff;">'/../tmp/cache.file'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$server</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//если сервер не удалось получить, то добавляем функции вручную</span>
    <span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addFunction</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testFunction'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'webjunior'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClass</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Test'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'webjunior'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//сохраняем сервер в кеш</span>
    Zend_XmlRpc_Server_Cache<span style="color: #339933;">::</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span>
APPLICATION_PATH<span style="color: #339933;">.</span><span style="color: #0000ff;">'/../tmp/cache.file'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$server</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//запускаем сервер</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Для кеширования сервера используем класс <strong>Zend_XmlRpc_Server_Cache</strong>. Метод</span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">bool Zend_XmlRpc_Server_Cache<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span>
string <span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> Zend_Server_Interface <span style="color: #000088;">$server</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="LEFT"><span style="font-size: small;">получает сервер из кеша.</span></p>
<p align="LEFT"><span style="font-size: small;">Параметры:</span></p>
<ul>
<li>
<p align="LEFT"><strong><span style="font-size: small;">string $filename</span></strong><span style="font-size: small;"> — имя файла-кеша, в котором сохранен наш сервер;</span></p>
</li>
<li>
<p align="LEFT"><strong><span style="font-size: small;">Zend_Server_Interface $server</span></strong><span style="font-size: small;"> — объект класса-сервера, в который запишется закешированный сервер;</span></p>
</li>
</ul>
<p align="LEFT"><span style="font-size: small;">Метод вызывается только статично, поскольку объявлен как </span><strong><span style="font-size: small;">public static</span></strong><span style="font-size: small;">. Возвращает булевое значение, которое говорит о результате операции.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">Для сохранения сервера в кеш есть метод</span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">bool Zend_XmlRpc_Server_Cache<span style="color: #339933;">::</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span>
string <span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> Zend_Server_Interface <span style="color: #000088;">$server</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="LEFT"><span style="font-size: small;">Параметры:</span></p>
<ul>
<li>
<p align="LEFT"><strong><span style="font-size: small;">string $filename</span></strong><span style="font-size: small;"> — имя файла, в который будет сохранен кеш;</span></p>
</li>
<li>
<p align="LEFT"><span style="font-size: small;"><strong>Zend_Server_Interface $server</strong> — объект класса-сервера, который сохраняем в кеше.</span></p>
</li>
</ul>
<p align="LEFT"><span style="font-size: small;">Этот метод тоже вызывается только статично. И возвращает булевое значение.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;">И третий метод, который доступен при кешировании,</span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">bool Zend_XmlRpc_Server_Cache<span style="color: #339933;">::</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span>string <span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="LEFT"><span style="font-size: small;">удаляет файл кеша, а вместе с ним и все закешированные данные.</span></p>
<p align="LEFT"><span style="font-size: small;">Параметры:</span></p>
<ul>
<li>
<p align="LEFT"><strong><span style="font-size: small;">string $filename</span></strong><span style="font-size: small;"> — имя файла-кеша.</span></p>
</li>
</ul>
<p align="LEFT"><span style="font-size: small;">Этот метод, как и предыдущие, вызывается статично и возвращает булевое значение.</span></p>
<p align="LEFT">
<p align="LEFT"><span style="font-size: small;"><strong>А какими инструментами в Zend Framework пользуетесь вы и о чем вам больше всего хотелось почитать? Не стесняйтесь, <a href="#comments">пишите в комментариях.</a></strong></span></p>
<p><br/><br />
<strong>Читайте все статьи цикла:</strong></p>
<ul>
<li><a href="http://www.web-junior.net/xml-rpc-biblioteki-dlya-vzaimodejjstviya-s-udalennymi-servisami/" ><acronym title="eXtensible Markup Language">XML</acronym>-RPC: библиотеки для взаимодействия с удаленными сервисами</a></li>
<li><a href="http://www.web-junior.net/xml-rpc-posting-v-livejournal/" ><acronym title="eXtensible Markup Language">XML</acronym>-RPC: Постинг в LiveJournal</a></li>
<li><a href="http://www.web-junior.net/xml-rpc-posting-v-wordpress/" ><acronym title="eXtensible Markup Language">XML</acronym>-RPC: постинг в WORDPRESS</a></li>
<li><a href="http://www.web-junior.net/xml-rpc-rabota-s-pomoshhyu-zend-framework/" ><acronym title="eXtensible Markup Language">XML</acronym>-RPC: работа с помощью Zend Framework</a></li>
<li><acronym title="eXtensible Markup Language">XML</acronym>-RPC: организация сервера с помощью Zend Framework</li>
</ul><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_krakozyambri/?ref_id=850394791" >Пройди игру, получи приз !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=272&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/EtmPoVuUREs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/xml-rpc-organizaciya-servera-s-pomoshhyu-zend-framework/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/xml-rpc-organizaciya-servera-s-pomoshhyu-zend-framework/</feedburner:origLink></item>
		<item>
		<title>XML-RPC: работа с помощью Zend Framework</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/D5MV6ZUgyFY/</link>
		<comments>http://www.web-junior.net/xml-rpc-rabota-s-pomoshhyu-zend-framework/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 20:02:47 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=264</guid>
		<description><![CDATA[<a href="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc.jpg"><img src="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc-300x172.jpg" alt="" title="zf-xml-rpc" width="300" height="172" style="margin-right:5px" class="alignleft size-medium wp-image-265" /></a><p align="LEFT">В 1998 году <a href="http://ru.wikipedia.org/wiki/Microsoft">Microsoft</a> совместно с Дейвом Винером разработала протокол XML-RPC, который является реализацией RPC (Remote Procedure Call — Вызов удаленных процедур) на основе <a href="http://ru.wikipedia.org/wiki/Xml">XML</a>. Позже Microsoft разработала собственный протокол <a href="http://ru.wikipedia.org/wiki/SOAP">SOAP</a>, <strong>основанный на XML-RPC</strong>, и начала продвигать свой стандарт, полностью <strong>отказавшись от предыдущего</strong>. На мой взгляд это было <strong>большой ошибкой</strong>. SOAP намного сложнее своего предка, что увеличивает не только время разработки приложения, но еще и размер передаваемых данных, что сказывается на скорости работы приложения. Но сегодня мы не будем обсуждать эту ошибку, а займемся <strong>подробностями использования XML-RPC в Zend Framework</strong>.</p>]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/JcYxcyQQyuc9J-jTzkNFHLHhzVk/0/da"><img src="http://feedads.g.doubleclick.net/~a/JcYxcyQQyuc9J-jTzkNFHLHhzVk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/JcYxcyQQyuc9J-jTzkNFHLHhzVk/1/da"><img src="http://feedads.g.doubleclick.net/~a/JcYxcyQQyuc9J-jTzkNFHLHhzVk/1/di" border="0" ismap="true"></img></a></p><p><a href="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2011/07/zf-xml-rpc-300x172.jpg" alt="" title="zf-xml-rpc" width="300" height="172" style="margin-right:5px" class="alignleft size-medium wp-image-265" /></a>
<p align="left">В 1998 году <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/Microsoft" >Microsoft</a> совместно с Дейвом Винером разработала протокол <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym>, который является реализацией <acronym title="Remote Procedure Call">RPC</acronym> (Remote Procedure Call — Вызов удаленных процедур) на основе <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/Xml" ><acronym title="eXtensible Markup Language">XML</acronym></a>. Позже Microsoft разработала собственный протокол <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/SOAP" ><acronym title="Simple Object Access Protocol">SOAP</acronym></a>, <strong>основанный на <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym></strong>, и начала продвигать свой стандарт, полностью <strong>отказавшись от предыдущего</strong>. На мой взгляд это было <strong>большой ошибкой</strong>. <acronym title="Simple Object Access Protocol">SOAP</acronym> намного сложнее своего предка, что увеличивает не только время разработки приложения, но еще и размер передаваемых данных, что сказывается на скорости работы приложения. Но сегодня мы не будем обсуждать эту ошибку, а займемся <strong>подробностями использования <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> в Zend Framework</strong>.</p>
<p><span id="more-264"></span></p>
<p><br/></p>
<p align="left">
<h1>Фреймворк</h1>
<p align="left">Последнюю версию <strong>Zend Framework</strong> можно скачать на страничке <a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/download/current/" >Downloads</a> <a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/" >официального сайта</a>. На момент написания статьи, <strong>последней была версия 1.11.9</strong>. Именно на ней и будем проводить все тесты.</p>
<p align="LEFT">Далее предполагается, что <strong>читатель знаком</strong> с <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/MVC" >шаблоном проектирования MVC</a> и его реализацией в Zend Framework. Поэтому все подробности о создании и настройки проектов в этой статье мы рассматривать не будем.</p>
<p align="LEFT"><br/></p>
<h1>От слов к делу</h1>
<p align="LEFT">Напишем контроллер, в котором расположим <strong>код постинга в LiveJournal</strong>. Подробнее о постинге в <a target="_blank" href="http://www.web-junior.net/goto/http://www.livejournal.com/" >LiveJournal</a> читайте в одной из <a href="http://www.web-junior.net/xml-rpc-posting-v-livejournal/" >предыдущих статей</a>.</p>
<p align="LEFT">Хочу отдельно заметить, что <strong>код не является самодостаточным</strong>. Это всего-лишь <strong>пример использования библиотек</strong> Zend Framework. Хотя, если запустить этот код, он работает вполне корректно.</p>
<p align="LEFT">Весь код написан <strong>в кодировке UTF-8</strong>. Я рекомендую использовать <strong>именно эту кодировку</strong>, чтобы не было никаких проблем.</p>
<p align="LEFT">
<p align="LEFT">Вот собственно код контроллера.</p>
<p align="LEFT">
<p align="LEFT"><strong>application/controllers/IndexController.php</strong></p>
<p align="LEFT">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> IndexController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action
<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//логин и пароль в ЖЖ</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$lj_uname</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'ЖЖ_логин'</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$lj_upass</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'ЖЖ_пароль'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
	<span style="color: #666666; font-style: italic;">/*создаем новый объект класса Zend_XmlRpc_Client 
и передаем ему адрес сервера*/</span>
	<span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_XmlRpc_Client<span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'http://www.livejournal.com/interface/xmlrpc'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	try<span style="color: #009900;">&#123;</span>
	  <span style="color: #666666; font-style: italic;">//получаем challenge для авторизации</span>
	  <span style="color: #000088;">$challenge</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">call</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'LJ.XMLRPC.getchallenge'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>catch<span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	  <span style="color: #666666; font-style: italic;">//в случае неудачи выводим ошибку</span>
	  <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
	<span style="color: #666666; font-style: italic;">//собираем данные для поста</span>
	<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	  <span style="color: #666666; font-style: italic;">//имя пользователя</span>
	  <span style="color: #0000ff;">'username'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lj_uname</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//тип авторизации - challenge</span>
	  <span style="color: #0000ff;">'auth_method'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'challenge'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//сам challenge</span>
	  <span style="color: #0000ff;">'auth_challenge'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$challenge</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'challenge'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//зашифрованный пароль</span>
	  <span style="color: #0000ff;">'auth_response'</span><span style="color: #339933;">=&gt;</span>md5<span style="color: #009900;">&#40;</span><span style="color: #000088;">$challenge</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'challenge'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>
<span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lj_upass</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//версия</span>
	  <span style="color: #0000ff;">'ver'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//переводы строк</span>
	  <span style="color: #0000ff;">'lineendings'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//название поста</span>
	  <span style="color: #0000ff;">'subject'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Пост в живой журнал'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//отформатированный текст поста</span>
	  <span style="color: #0000ff;">'event'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'&lt;strong&gt;Антивирус.&lt;/strong&gt; Ты кто?&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; Область данных!&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; А не вирус?&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; Hи боже мой!&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; А зачем прерывания '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'перехватываешь?&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; Я?!&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; Вот же подпрограмма.&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; Это не подпрограмма. Это цитата из'</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">' Лао-цзы на языке оригинала в альтернативной кодировке.&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; А зачем EXE-файлы ищешь?&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; А вдруг хозяин спросит: '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'&quot;А где мои ЕХЕ-файлы?&quot; А я ему - вот они!&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; Сдается мне, что ты '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'все-таки вирус.&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; Hу ладно, только тебе признаюсь, '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'только ты никому не говори! Hа самом деле я... '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'антивирусная вакцина!&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; А зачем нужна антивирусная'</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">' вакцина, если есть я?&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; Откуда я знаю? У хозяина спроси.&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; А если я тебя на всякий случай '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'все-таки грохну?&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; А если я тебя?&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; Hе получится. У меня'</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">' управление.&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; А ты свою контрольную сумму давно'</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">' пересчитывал?&lt;br/&gt;
	  &lt;strong&gt;Антивирус.&lt;/strong&gt; А причем тут моя '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'контрольная... ой!!!&lt;br/&gt;
	  &lt;strong&gt;Вирус.&lt;/strong&gt; То-то же.'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//день</span>
	  <span style="color: #0000ff;">'day'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//месяц</span>
	  <span style="color: #0000ff;">'mon'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'m'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//год</span>
	  <span style="color: #0000ff;">'year'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Y'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//час</span>
	  <span style="color: #0000ff;">'hour'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'H'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//минута</span>
	  <span style="color: #0000ff;">'min'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'i'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//публичный доступ к посту</span>
	  <span style="color: #0000ff;">'security'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'public'</span><span style="color: #339933;">,</span>
	  <span style="color: #0000ff;">'props'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
	    <span style="color: #666666; font-style: italic;">//true, если пост в отформатирован в html</span>
	    <span style="color: #0000ff;">'opt_preformatted'</span><span style="color: #339933;">=&gt;</span>true<span style="color: #339933;">,</span>
	    <span style="color: #666666; font-style: italic;">//если добавляем запись задним числом</span>
	    <span style="color: #0000ff;">'opt_backdated'</span><span style="color: #339933;">=&gt;</span>true<span style="color: #339933;">,</span>
	    <span style="color: #666666; font-style: italic;">//список тегов через запятую</span>
	    <span style="color: #0000ff;">'taglist'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'юмор,анекдот'</span>
	  <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//отправляем данные на сервер</span>
	try<span style="color: #009900;">&#123;</span>
	  <span style="color: #000088;">$p_data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">call</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'LJ.XMLRPC.postevent'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>catch<span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	  <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>	
&nbsp;
	<span style="color: #666666; font-style: italic;">//если все нормально, то сервер вернет массив с 3-мя переменными:</span>
	<span style="color: #666666; font-style: italic;">//itemid - идентификатор поста</span>
	<span style="color: #666666; font-style: italic;">//url - URL-адрес поста</span>
	<span style="color: #666666; font-style: italic;">//anum - аутентификационный номер, созданный для этой записи</span>
	<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Пост успешно добавлен. Прочитать его можно &lt;a href=&quot;'</span><span style="color: #339933;">.</span>
<span style="color: #000088;">$p_data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p align="LEFT">
<p align="LEFT">
<p align="LEFT">Если не произошло никаких ошибок, то получим пост в LiveJournal.</p>
<div id="attachment_266" class="wp-caption aligncenter" style="width: 523px"><a href="http://www.web-junior.net/wp-content/uploads/2011/07/zf-first-e1311536948862.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2011/07/zf-first-e1311536948862.jpg" alt="" title="zf-first" width="513" height="455" class="size-full wp-image-266" /></a><p class="wp-caption-text">Все оказалось не сложнее похищения яблока у слепого =)</p></div>
<p align="JUSTIFY">
<p align="JUSTIFY">Для работы нам потребуется класс <strong>Zend_XmlRpc_Client</strong>. Вся работа строится именно через него.</p>
<p align="JUSTIFY">Конструктор объявлен следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Zend_XmlRpc_Client<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$server</span><span style="color: #339933;">,</span> Zend_Http_Client <span style="color: #000088;">$httpClient</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="JUSTIFY">Параметры:</p>
<ul>
<li>
<strong>string $server</strong> — адрес <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервера, с которым будем работать. В нашем случае — это <a target="_blank" href="http://www.web-junior.net/goto/http://www.livejournal.com/interface/xmlrpc" >http://www.livejournal.com/interface/xmlrpc</a>;
</li>
<li>
<strong>Zend_Http_Client $httpClient</strong> — объект класса-клиента Zend_Http_Client. По умолчанию этот параметр имеет значение null. Если какой-то особенный http-клиент не нужен, то этот параметр можно пропустить. Zend_XmlRpc_Client сам создаст простой объект этого класса.
</li>
</ul>
<p align="JUSTIFY">Вся основная работа (вызов процедур) строится через метод Zend_XmlRpc_Client::call(), который объявлен так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Zend_XmlRpc_Client<span style="color: #339933;">::</span><span style="color: #004000;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="JUSTIFY">Параметры:</p>
<ul>
<li>
<strong>string $method</strong> — имя вызываемой процедуры вместе с пространством имен, например LJ.XMLRPC.postevent;
</li>
<li>
<strong>mixed $params</strong> — параметры, передаваемые процедуре. Представляет собой массив. Каждый элемент массива является параметром <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> процедуры.
</li>
</ul>
<p align="JUSTIFY">Практически все параметры преобразовываются автоматически из php-типов в типы <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> и обратно. Исключение составляют <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> типы array, struct, base64, dateTime.iso8601. Типы array и struct получаются из массивов. Первый — из массива с числовыми индексами, а второй — из ассоциативного массива. Типы base64 и dateTime.iso8601 никак не преобразовываются. Чтобы передать параметр одного из этих типов нужно использовать объект класса Zend_XmlRpc_Value, например, так</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$value</span> <span style="color: #339933;">=</span> Zend_XmlRpc_Value<span style="color: #339933;">::</span><span style="color: #004000;">getXmlRpcValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'какая-то строка в base64'</span><span style="color: #339933;">,</span>
 Zend_XmlRpc_Value<span style="color: #339933;">::</span><span style="color: #004000;">XMLRPC_TYPE_BASE64</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="JUSTIFY">А для dateTime.iso8601 используем константу <strong>Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME</strong></p>
<p align="JUSTIFY"><span style="font-size: medium;"></span></p>
<p><br/></p>
<h1>Прокси</h1>
<p align="JUSTIFY">Для более удобного вызова процедур <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> в Zend Framework реализована технология проксирования. Смысл в следующем. Мы вызываем нужную <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> процедуру у объекта прокси, напрмер так</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$proxy</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getchallenge</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p align="JUSTIFY">а он отправляет ее на сервер. Удобно, не правда ли?</p>
<p align="JUSTIFY">Добавим к нашему контроллеру proxyAction, в котором рассмотрим пример использования этой технологии</p>
<p align="LEFT"><strong>application/controllers/IndexController.php</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> proxyAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
	<span style="color: #666666; font-style: italic;">/*создаем новый объект класса Zend_XmlRpc_Client 
и передаем ему адрес сервера*/</span>
	<span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_XmlRpc_Client<span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'http://www.livejournal.com/interface/xmlrpc'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">/*получаем объект прокси, при этом передаем 
ему пространство имен*/</span>
	<span style="color: #000088;">$proxy</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProxy</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'LJ.XMLRPC'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	try<span style="color: #009900;">&#123;</span>
	  <span style="color: #666666; font-style: italic;">//получаем challenge для авторизации</span>
	  <span style="color: #000088;">$challenge</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$proxy</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getchallenge</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>catch<span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	  <span style="color: #666666; font-style: italic;">//в случае неудачи выводим ошибку</span>
	  <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
	<span style="color: #666666; font-style: italic;">//собираем данные для поста</span>
	<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	  <span style="color: #666666; font-style: italic;">//имя пользователя</span>
	  <span style="color: #0000ff;">'username'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lj_uname</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//метод аутентификации</span>
	  <span style="color: #0000ff;">'auth_method'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'challenge'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//значение challenge, которое прислал нам сервер</span>
	  <span style="color: #0000ff;">'auth_challenge'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$challenge</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'challenge'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//зашифрованный пароль</span>
	  <span style="color: #0000ff;">'auth_response'</span><span style="color: #339933;">=&gt;</span>md5<span style="color: #009900;">&#40;</span><span style="color: #000088;">$challenge</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'challenge'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>
<span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lj_upass</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//версия протокола</span>
	  <span style="color: #0000ff;">'ver'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//переводы строк</span>
	  <span style="color: #0000ff;">'lineendings'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//название поста</span>
	  <span style="color: #0000ff;">'subject'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Новый пост в живой журнал'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//текс поста</span>
	  <span style="color: #0000ff;">'event'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Сидит Дрим перед компом, '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'занимается аутотренингом:&lt;br/&gt;
	  - Я не войду в Интернет, я не войду в Интернет, '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'я не войду в Интернет...&lt;br/&gt;
	  Срывается, стучит что-то на клавиатуре. '</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'На дисплее появляется: &lt;a href=&quot;http://www.web-junior.net&quot;&gt;'</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'web-junior.net&lt;/a&gt;.
	  &lt;br/&gt;Дрим:&lt;br/&gt;
	  - Это не я... Это не я... Это не я...'</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//день</span>
	  <span style="color: #0000ff;">'day'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//месяц</span>
	  <span style="color: #0000ff;">'mon'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'m'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//год</span>
	  <span style="color: #0000ff;">'year'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Y'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//час</span>
	  <span style="color: #0000ff;">'hour'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'H'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//минута</span>
	  <span style="color: #0000ff;">'min'</span><span style="color: #339933;">=&gt;</span>date<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'i'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  <span style="color: #666666; font-style: italic;">//тип поста - публичный</span>
	  <span style="color: #0000ff;">'security'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'public'</span><span style="color: #339933;">,</span>
	  <span style="color: #0000ff;">'props'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
	    <span style="color: #666666; font-style: italic;">//пост отформатирован в html</span>
	    <span style="color: #0000ff;">'opt_preformatted'</span><span style="color: #339933;">=&gt;</span>true<span style="color: #339933;">,</span>
	    <span style="color: #666666; font-style: italic;">//добавляем задним числом</span>
	    <span style="color: #0000ff;">'opt_backdated'</span><span style="color: #339933;">=&gt;</span>true<span style="color: #339933;">,</span>
	    <span style="color: #666666; font-style: italic;">//список тегов</span>
	    <span style="color: #0000ff;">'taglist'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'юмор,анекдот'</span>
	  <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//отправляем данные на сервер</span>
	try<span style="color: #009900;">&#123;</span>
	  <span style="color: #000088;">$p_data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$proxy</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">postevent</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>catch<span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	  <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>	
&nbsp;
	<span style="color: #666666; font-style: italic;">/*если все нормально, то сервер вернет структуру с 
3-мя переменными:
	itemid - идентификатор поста
	url - URL-адрес поста
	anum - аутентификационный номер, созданный для этой записи*/</span>
	<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Пост успешно добавлен. Прочитать его можно &lt;a href=&quot;'</span><span style="color: #339933;">.</span>
<span style="color: #000088;">$p_data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="JUSTIFY">В результате</p>
<div id="attachment_267" class="wp-caption aligncenter" style="width: 539px"><a href="http://www.web-junior.net/wp-content/uploads/2011/07/zf-second-e1311537054335.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2011/07/zf-second-e1311537054335.jpg" alt="" title="zf-second" width="529" height="246" class="size-full wp-image-267" /></a><p class="wp-caption-text">В результате имеем новый пост</p></div>
<p>Вся настройка прокси-объекта сводится к вызову метода</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Zend_XmlRpc_Client<span style="color: #339933;">::</span><span style="color: #004000;">getProxy</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$namespace</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>В метод передается строка с пространством имен. В нашем случае — это  <strong>LJ.XMLRPC</strong>. Если не передавать пространство имен, то придется вписывать его в вызов метода так</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$proxy</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">LJ</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">XMLRPC</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getchallenge</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p><br/></p>
<p>
Вот и все на сегодня. В следующий раз рассмотрим принципы организации <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервера с помощью Zend Framework.</p>
<p><br/><br />
<strong>Читайте все статьи цикла:</strong></p>
<ul>
<li><a href="http://www.web-junior.net/xml-rpc-biblioteki-dlya-vzaimodejjstviya-s-udalennymi-servisami/" ><acronym title="eXtensible Markup Language">XML</acronym>-RPC: библиотеки для взаимодействия с удаленными сервисами</a></li>
<li><a href="http://www.web-junior.net/xml-rpc-posting-v-livejournal/" ><acronym title="eXtensible Markup Language">XML</acronym>-RPC: Постинг в LiveJournal</a></li>
<li><a href="http://www.web-junior.net/xml-rpc-posting-v-wordpress/" ><acronym title="eXtensible Markup Language">XML</acronym>-RPC: постинг в WORDPRESS</a></li>
<li><acronym title="eXtensible Markup Language">XML</acronym>-RPC: работа с помощью Zend Framework</li>
</ul><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_puzzle/?ref_id=850394791" >Собери пазл, получи приз !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=264&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/D5MV6ZUgyFY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/xml-rpc-rabota-s-pomoshhyu-zend-framework/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/xml-rpc-rabota-s-pomoshhyu-zend-framework/</feedburner:origLink></item>
		<item>
		<title>А вы готовы к приходу twitter? Аутентификация oAuth</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/gPCCZ8a525U/</link>
		<comments>http://www.web-junior.net/a-vy-gotovy-k-prikhodu-twitter-autentifikaciya-oauth/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 11:52:26 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[oAuth]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[twitteroauth]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=257</guid>
		<description><![CDATA[<a href="http://www.web-junior.net/wp-content/uploads/2011/02/Twitte_oAuthl.jpg"><img class="alignleft size-full wp-image-258" style="margin: 10px;" title="Twitte_oAuthl" src="http://www.web-junior.net/wp-content/uploads/2011/02/Twitte_oAuthl.jpg" alt="" width="131" height="131" /></a>31 августа 2010 года HTTP-аутентификация в твиттере «приказала долго жить». Разработчики решили, что аутентификация с помощью <a href="http://oauth.net/">oAuth</a> будет намного эффективнее, а главное безопаснее. Теперь, для корректной работы примеров, которые были представлены в <a href="http://www.web-junior.net/a-vy-gotovy-k-prikhodu-twitter-obzor-api/">предыдущей статье</a>, понадобится новый способ аутентификации. Пришла пора исправить недоработки.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/_X87ccdP_86DYhDCAXf3hKQzkjs/0/da"><img src="http://feedads.g.doubleclick.net/~a/_X87ccdP_86DYhDCAXf3hKQzkjs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_X87ccdP_86DYhDCAXf3hKQzkjs/1/da"><img src="http://feedads.g.doubleclick.net/~a/_X87ccdP_86DYhDCAXf3hKQzkjs/1/di" border="0" ismap="true"></img></a></p><p><a href="http://www.web-junior.net/wp-content/uploads/2011/02/Twitte_oAuthl.jpg" ><img class="alignleft size-full wp-image-258" style="margin: 10px;" title="Twitte_oAuthl" src="http://www.web-junior.net/wp-content/uploads/2011/02/Twitte_oAuthl.jpg" alt="" width="131" height="131" /></a>31 августа 2010 года <acronym title="HyperText Transfer Protocol, Протокол передачи гипертекста">HTTP</acronym>-аутентификация в твиттере «приказала долго жить». Разработчики решили, что аутентификация с помощью <a target="_blank" href="http://www.web-junior.net/goto/http://oauth.net/" >oAuth</a> будет намного эффективнее, а главное безопаснее. Теперь, для корректной работы примеров, которые были представлены в <a href="http://www.web-junior.net/a-vy-gotovy-k-prikhodu-twitter-obzor-api/" >предыдущей статье</a>, понадобится новый способ аутентификации. Пришла пора исправить недоработки.</p>
<h2>Протокол</h2>
<p>oAuth представляет собой <strong>протокол авторизованного доступа</strong> к стороннему сервису. Если немного разобраться, то получится, что приложение (веб-приложение, виджет для постинга в твиттер, приложение для iPhone для работы с твиттером и т.д.) авторизуется в сервисе (в твиттере) с помощью (от имени) пользователя.</p>
<p>Некоторые сравнивают этот протокол с <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/Openid" >OpenID</a>. По-моему, такое <strong>сравнение недопустимо</strong> и его можно делать только по неведению. Поскольку первый <strong>авторизует приложение</strong> для работы с <acronym title="Application Programming Interface">API</acronym> сервиса от имени пользователя, а второй <strong>авторизует пользователя</strong> для работы с приложением с помощью сервиса. Запутанно, на первый взгляд, не так ли? Немного разобравшись с одним и другим протоколом, можно понять справедливость этого утверждения.</p>
<h2>Регистрация</h2>
<p>Чтобы приложение могло работать с твиттером, его нужно зарегистрировать на <a target="_blank" href="http://www.web-junior.net/goto/http://dev.twitter.com/apps/new" >http://dev.twitter.com/apps/new</a>.</p>
<div id="attachment_262" class="wp-caption aligncenter" style="width: 488px"><a href="http://www.web-junior.net/wp-content/uploads/2011/02/register_app.jpg" ><img class="size-full wp-image-259" style="margin: 10px;" title="register_app" src="http://www.web-junior.net/wp-content/uploads/2011/02/register_app.jpg" alt="" width="478" height="360" /></a><p class="wp-caption-text">Нужно предоставить немного информации о приложении</p></div>
<p style="text-align: center;">
<p>Можно заполнить следующие поля:</p>
<ul>
<li><strong>Application Name</strong> – наименование приложения;</li>
<li><strong>Description</strong> – описание приложения;</li>
<li><strong>Application Website</strong> – сайт приложения;</li>
<li><strong>Organization</strong> – ваша организация;</li>
<li><strong>Application Type</strong> – тип приложения. <strong>Browser </strong>– это браузерное приложение, т.е. веб-сайт. <strong>Client</strong> – это обычное приложение для любой операционной системы;</li>
<li><strong>Callback <acronym title="Uniform Resource Locator">URL</acronym></strong> – <acronym title="Uniform Resource Locator">URL</acronym>, на который будет переадресован пользователь после авторизации. Этот пункт заполняем, только если в предыдущем пункте был выбран тип <strong>Browser</strong>;</li>
<li><strong>Default Access type</strong> – тип доступа к твиттеру из приложения. <strong>Read &amp; Write</strong> – для чтения и записи. <strong>Read-only</strong> – только чтение. Мы в примерах будем писать твитты, поэтому выберем тип <strong>Read&amp;</strong><strong>Write</strong>;</li>
<li><strong>Application Icon</strong> – можно загрузить иконку приложения jpg, gif или png, размером не более 700 Кб;</li>
<li>ниже заполняем капчу.</li>
</ul>
<p>Нажав на кнопку «<strong>Register</strong><strong> </strong><strong>application</strong>», регистрируем приложение. <strong>После регистрации</strong>, в разделе «<strong>Your</strong><strong> </strong><strong>apps</strong>» появится, только что зарегистрированное, приложение.</p>
<p>В свойствах приложения можно посмотреть данные, которые нам будут нужны для работы: <strong>Consumer</strong><strong> </strong><strong>key</strong><strong>, </strong><strong>Consumer</strong><strong> </strong><strong>secret</strong><strong> </strong><strong>и </strong><strong>Registered</strong><strong> </strong><strong>Callback</strong><strong> </strong><strong><acronym title="Uniform Resource Locator">URL</acronym></strong>.</p>
<p style="text-align: center;">
<div id="attachment_263" class="wp-caption aligncenter" style="width: 571px"><a href="http://www.web-junior.net/wp-content/uploads/2011/02/application.jpg" ><img class="size-full wp-image-260" style="margin: 10px;" title="application" src="http://www.web-junior.net/wp-content/uploads/2011/02/application.jpg" alt="" width="561" height="401" /></a><p class="wp-caption-text">Все ключи и секреты находятся здесь</p></div>
<h2>Библиотека</h2>
<p>На данный момент уже существует множество достаточно приемлемых решений для работы с twitter посредством oAuth. Мне понравилась библиотека <a target="_blank" href="http://www.web-junior.net/goto/https://github.com/abraham/twitteroauth" >twitteroauth</a>. По утверждениям разработчика – это первая библиотека для работы с twitter через oAuth. Как можно не использовать ее, если она первая? И при этом работает вполне корректно.</p>
<p>Скачать ее можно по адресу <a target="_blank" href="http://www.web-junior.net/goto/https://github.com/abraham/twitteroauth" >https://github.com/abraham/twitteroauth</a>, нажав на кнопку <strong>Downloads</strong> и выбрав нужный релиз. Рекомендую выбрать последний. Дата последнего релиза немного смущает (март 2010-го), но как оказалось библиотека работает вполне нормально, а главное имеет простую и понятную структуру.</p>
<h2>Приступаем к работе</h2>
<p>После распаковки архива получится куча файлов, из которых нас интересует только <strong>config</strong><strong>.</strong><strong>php</strong>. Вся настройка библиотеки состоит в замене значений констант <strong>CONSUMER_KEY</strong>, <strong>CONSUMER_SECRET</strong> и <strong>OAUTH_CALLBACK</strong> на свои, которые можно посмотреть в свойствах приложения (см. выше).</p>
<p><strong>Таймлайн</strong></p>
<p>Для начала, попробуем написать скрипт, который отобразит таймлайн пользователя.</p>
<p><strong>example.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'twitteroauth/twitteroauth.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'config.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Если access tokens отсутствует, то нужно законнектиться. */</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'access_token'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
 <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'access_token'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> 
<span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'access_token'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'oauth_token_secret'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location: ./clearsessions.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">/* Получаем access tokens из сессии. */</span>
<span style="color: #000088;">$access_token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'access_token'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Создаем объект класса TwitterOauth и передаем ему все секретные данные. */</span>
<span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TwitterOAuth<span style="color: #009900;">&#40;</span>CONSUMER_KEY<span style="color: #339933;">,</span> 
CONSUMER_SECRET<span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> 
<span style="color: #000088;">$access_token</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'oauth_token_secret'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Устанавливаем формат получаемых данных */</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'xml'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Таймлайн */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'statuses/home_timeline'</span><span style="color: #339933;">,</span>
<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'count'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'page'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>После старта сессии и подключения нужных файлов, проверяем наличие access token. Если его нет, то нужно получить. Библиотека получит его сама, без нашего вмешательства.</p>
<p>Далее, создаем объект класса <strong>TwitterOAuth</strong> и передаем ему в конструктор <strong>CONSUMER</strong><strong>_</strong><strong>KEY</strong><strong>, </strong><strong>CONSUMER</strong><strong>_</strong><strong>SECRET</strong>, которые мы можем получить на сайте twitter.com в разделе «<strong>Your</strong><strong> </strong><strong>apps</strong>» (см. выше), а также <strong>oauth</strong><strong>_</strong><strong>token</strong> и <strong>oauth</strong><strong>_</strong><strong>token</strong><strong>_</strong><strong>secret</strong><strong> </strong>из access_token.</p>
<p>С помощью <strong>$</strong><strong>connection</strong><strong>-&gt;</strong><strong>format</strong><strong> = &#8216;</strong><strong>xml</strong><strong>&#8216;;</strong> устанавливаем формат данных, которым будет нам отвечать сервер. Доступны форматы <strong>xml</strong><strong>, </strong><strong>json</strong>. По умолчанию установлен <strong>json</strong>.</p>
<p>Для отправки запросов на сервер твиттера, мы будем использовать методы класса TwitterOAuth.</p>
<p>Для отправки запроса <strong>по методу </strong><strong>GET</strong><strong> </strong>нужно использовать метод</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">String TwitterOAuth<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parameters</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>$url – это часть <acronym title="Uniform Resource Locator">URL</acronym> без домена, к которому посылаем запрос. $parameters – массив параметров. Метод вернет ответ от сервера в соответствующем формате.</p>
<p>Для отправки запроса <strong>по методу </strong><strong>POST</strong> берем метод</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">String TwitterOAuth<span style="color: #339933;">::</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parameters</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Параметры и возвращаемое значение, точно такие же, как и у метода TwitterOAuth::get().</p>
<p>Для отправки запроса по <strong>методу </strong><strong>DELETE</strong> будем использовать метод</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">String TwitterOAuth<span style="color: #339933;">::</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span>
 <span style="color: #000088;">$parameters</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Он точно такой же, как и предыдущие два.</p>
<p>Вообще, все три метода являются врапперами для метода <strong>TwitterOAuth</strong><strong>:: </strong><strong>oAuthRequest()</strong>, поэтому они все похожи друг на друга.</p>
<p>В этом примере, для получения таймлайн пользователя, мы отправляем запрос по <strong>методу </strong><strong>GET</strong>. Все, что вернул метод, распечатываем на экране. Тут будут данные о таймлайне в формате xml.</p>
<p><strong>Последние твитты</strong><br />
Для получения последних твиттов, нужно послать <strong>GET</strong><strong>-запрос</strong> по адресу <strong>statuses/user_timeline</strong>. В параметрах нужно указать ид пользователя, чьи твитты получаем, количество получаемых твиттов и страницу.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Последние твитты */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'statuses/user_timeline'</span><span style="color: #339933;">,</span>
<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'webjuniornet'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'count'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'page'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Обращения</strong><br />
Последние обращения можно получить, обратившись с <strong>GET</strong><strong>-запросом</strong> по адресу <strong>statuses/mentions</strong>. В параметрах указываем количество получаемых обращений и страницу.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Обращения */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'statuses/mentions'</span><span style="color: #339933;">,</span>
<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'count'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'page'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Direct Messages</strong><br />
Приватное сообщение отправляем с помощью <strong>POST-</strong><strong>запроса</strong> по адресу <strong>direct_messages/new</strong>. В параметрах указываем, кому посылаем сообщение и текст сообщения.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Direct Messages */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'direct_messages/new'</span><span style="color: #339933;">,</span>
<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'webjuniornet'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'text'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Тестовое сообщение'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Удаление сообщения</strong><br />
Удаляем приватное сообщение, отсылкой DELETE-запроса по адресу <strong>direct_</strong><strong>messages/</strong><strong>destroy/2331505787</strong>. Вместо 2331505787 нужно указать идентификатор удаляемого сообщения.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Удаление сообщения */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'direct_messages/destroy/2331505787'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Друзья</strong><br />
Друзья – это те, чью таймлайн вы читаете. Идентификаторы всех друзей можно получить по адресу  <strong>friends/</strong><strong>ids</strong>. В параметрах, нужно передать идентификатор пользователя, друзей которого получаем.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Друзья */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'friends/ids'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'webjuniornet'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Фолловеры</strong><br />
Фоловеры – это те, кто читает вашу таймлайн. Идентификаторы всех фоловеров можно получить по адресу <strong>followers/ids</strong>. В параметрах передаем ид пользователя, фоловеров которого будем смотреть.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Фоловеры */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'followers/ids'</span><span style="color: #339933;">,</span>
<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'webjuniornet'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Зафоловить пользователя</strong><br />
Для этого нужно отправить <strong>POST</strong><strong>-запрос</strong> по адресу <strong>friendships/create/id</strong>. В параметрах нужно передать имя пользователя, ид пользователя, отображаемое имя, а follow установить в true.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Зафоловить пользователя */</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'friendships/create/id'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'bla2test'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'user_id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'109344899'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'screen_name'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'bla2test'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'follow'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'true'</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>
<p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_biathlon/?ref_id=850394791" >Пройди головоломку, получи приз ! Бесплатно !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=257&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/gPCCZ8a525U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/a-vy-gotovy-k-prikhodu-twitter-autentifikaciya-oauth/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/a-vy-gotovy-k-prikhodu-twitter-autentifikaciya-oauth/</feedburner:origLink></item>
		<item>
		<title>С первым днем рождения, web-junior.net</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/yLh2-7gQJhI/</link>
		<comments>http://www.web-junior.net/s-pervym-dnem-rozhdeniya-web-junior-net/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 11:34:43 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[день рождения]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=250</guid>
		<description><![CDATA[<strong>19 октября </strong>1962 года родился всемирно известный боксер в тяжелом весе <a href="http://ru.wikipedia.org/wiki/Evander_Holyfield">Эвандер Холифилд</a>. В этом году весь мир отмечал 48-ю его годовщину. Для фанатов Холифилда во всем мире этот день имел особое значение в связи с его днем рождения. Для меня же этот день имел совсем другое значение. Ровно год назад была создана первая запись в этом блоге. В этой небольшой заметке рассмотрим, каких успехов удалось достичь, и какие цели будут стоять на следующий год.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/9iqmev4t2KGkiGfG1tkw9OaVmeg/0/da"><img src="http://feedads.g.doubleclick.net/~a/9iqmev4t2KGkiGfG1tkw9OaVmeg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/9iqmev4t2KGkiGfG1tkw9OaVmeg/1/da"><img src="http://feedads.g.doubleclick.net/~a/9iqmev4t2KGkiGfG1tkw9OaVmeg/1/di" border="0" ismap="true"></img></a></p><p><strong>19 октября </strong>1962 года родился всемирно известный боксер в тяжелом весе <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/Evander_Holyfield" >Эвандер Холифилд</a>. В этом году весь мир отмечал 48-ю его годовщину. Для фанатов Холифилда во всем мире этот день имел особое значение в связи с его днем рождения. Для меня же этот день имел совсем другое значение. Ровно год назад была создана первая запись в этом блоге. В этой небольшой заметке рассмотрим, каких успехов удалось достичь, и какие цели будут стоять на следующий год.</p>
<h2>Успехи</h2>
<p>Для начала рассмотрим достижения. В данный момент имеем следующее.<br />
<strong>Записей</strong>: 35<br />
<strong>Страниц</strong>: 10<br />
<strong>Рубрик</strong>: 7<br />
<strong>Тегов</strong>: 41<br />
<strong>Комментариев (одобренных)</strong>: 438<br />
<strong>ТИЦ: </strong>0<br />
<strong>PR (для главной</strong><strong>): </strong>1</p>
<p><strong>Посещения</strong><br />
<a href="http://www.web-junior.net/wp-content/uploads/2010/10/poseshen.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/poseshen.jpg" alt="" title="poseshen" width="364" height="342" class="aligncenter size-full wp-image-251" /></a><br />
Показатель отказов настолько высок только потому, что высок процент поискового трафика (см. ниже). Судя по всему, пользователи находят нужные им материалы через поисковики, читают и больше не возвращаются на сайт.</p>
<p><strong>География посещений</strong><br />
<a href="http://www.web-junior.net/wp-content/uploads/2010/10/map.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/map.jpg" alt="" width="556" height="338" class="aligncenter size-full wp-image-255" title="map" /></a><br />
Больше всего посетителей из России, Украины и Белоруссии (и других стран бывшего СССР). Последнее время вырос трафик из США, Канады, Австралии и западной Европы. Летом были посетители из Аргентины и Бразилии. Также иногда приходят люди из Китая, Индии, Тайваня и др. азиатских стран. Только вот из Африки практически нет никого.</p>
<p><strong>Источники</strong><br />
<a href="http://www.web-junior.net/wp-content/uploads/2010/10/isto4niki.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/isto4niki.jpg" alt="" title="isto4niki" width="554" height="118" class="aligncenter size-full wp-image-253" /></a><br />
Как видите, подавляющая часть трафика идет из поисковых систем. Больше всего поискового трафика сайт получил из Гугла, Яндекса и Рамблера. Последнее время начал подтягиваться Yahoo.</p>
<p><strong>Сайты-источники</strong><br />
<a href="http://www.web-junior.net/wp-content/uploads/2010/10/sites.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/sites.jpg" alt="" title="sites" width="282" height="284" class="aligncenter size-full wp-image-254" /></a><br />
Наибольшее количество пользователей пришло из соц-сетей, в которых постоянно публикую анонсы своих статей. Также много пришло из википедии, в которой некоторое время были расположены ссылки на сайт. Большой неожиданностью стала ссылка с phpexcel.codeplex.com. <a target="_blank" href="http://www.web-junior.net/goto/http://www.codeplex.com/site/users/view/MarkBaker" >Mark Baker</a> все-таки расположил ссылку на мои статьи по <a href="http://www.web-junior.net/sozdanie-excel-fajjlov-s-pomoshhyu-phpexcel/" >PHPExcel</a>, хоть я его об этом не просил. Спасибо тебе, Марк!</p>
<p><strong>Ключевые слова</strong><br />
<a href="http://www.web-junior.net/wp-content/uploads/2010/10/keywords.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/keywords.jpg" alt="" title="keywords" width="292" height="286" class="aligncenter size-full wp-image-255" /></a><br />
Больше всего на сайт приходят при поиске phpexcel, отправке post-запросов, shadowbox, featured content gallery, twitter и др.</p>
<p><strong>Популярные страницы</strong><br />
<a href="http://www.web-junior.net/wp-content/uploads/2010/10/popularity.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/popularity.jpg" alt="" title="popularity" width="261" height="288" class="aligncenter size-full wp-image-256" /></a><br />
Наиболее популярными за этот год стали циклы статей про PHPExcel и POST-запросы.</p>
<p>Пока что сравнивать не с чем (это только первая годовщина блога), но результаты есть. Важно, что эти результаты не нулевые и не отрицательные. Еще важно то, что время, затрачиваемое на написания статей и поддержку блога, не уходит в никуда, а имеет вполне положительные результаты.</p>
<h2>Планы</h2>
<p>Теперь, что касается планов на будущий год. Пока что четких планов на будущее нет.</p>
<p>Блог имел некоторый успех весной, но летом наступил критический период. Летом настолько мало было времени, что даже где-то проскакивала мысль о закрытии блога. Но, к счастью, кризис миновал и теперь я уверенно могу заявить, что блог будет существовать и обязательно доживет до своего второго дня рождения.</p>
<p>Кроме того, возникла мысль об открытии форума. Хотел бы спросить у посетителей блога: стоит ли создавать форум на основе сайта, стоит ли вкладывать в это силы? С нетерпением жду ответов на этот вопрос в комментариях.</p><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_krakozyambri/?ref_id=850394791" >Пройди игру, получи приз !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=250&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/yLh2-7gQJhI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/s-pervym-dnem-rozhdeniya-web-junior-net/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/s-pervym-dnem-rozhdeniya-web-junior-net/</feedburner:origLink></item>
		<item>
		<title>Отправка POST запросов с помощью PHP. Zend Framework</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/fvjou0dRpWA/</link>
		<comments>http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-zend-framework/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 16:59:47 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=245</guid>
		<description><![CDATA[<a href="http://www.web-junior.net/wp-content/uploads/2010/10/logo-zend-framework.jpg"><img class="alignleft size-full wp-image-246" style="border: 0pt none; margin: 5px;" title="logo-zend-framework" src="http://www.web-junior.net/wp-content/uploads/2010/10/logo-zend-framework.jpg" alt="" width="226" height="145" /></a>Некоторое время назад мы рассмотрели отправку post-запросов <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-1/">с помощью сокетов</a> , <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-2/">с помощью библиотеки curl</a>, <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-3/">с помощью врапперов потока</a> и <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-otpravka-fajjlov/">отправку файлов</a>. Пришел черёд рассмотреть, как отправку post-запросов реализуют некоторые фреймворки. Начнём с одного из самых популярных фреймворков на сегодняшний день – Zend Framework.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/qxj5JxKNo9y7KQ3FiqhBQJzbhTI/0/da"><img src="http://feedads.g.doubleclick.net/~a/qxj5JxKNo9y7KQ3FiqhBQJzbhTI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/qxj5JxKNo9y7KQ3FiqhBQJzbhTI/1/da"><img src="http://feedads.g.doubleclick.net/~a/qxj5JxKNo9y7KQ3FiqhBQJzbhTI/1/di" border="0" ismap="true"></img></a></p><p><a href="http://www.web-junior.net/wp-content/uploads/2010/10/logo-zend-framework.jpg" ><img class="alignleft size-full wp-image-246" style="border: 0pt none; margin: 5px;" title="logo-zend-framework" src="http://www.web-junior.net/wp-content/uploads/2010/10/logo-zend-framework.jpg" alt="" width="226" height="145" /></a>Некоторое время назад мы рассмотрели отправку post-запросов <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-1/" >с помощью сокетов</a> , <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-2/" >с помощью библиотеки curl</a>, <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-3/" >с помощью врапперов потока</a> и <a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-otpravka-fajjlov/" >отправку файлов</a>. Пришел черёд рассмотреть, как отправку post-запросов реализуют некоторые фреймворки. Начнём с одного из самых популярных фреймворков на сегодняшний день – Zend Framework.</p>
<p><strong>О фреймворке</strong></p>
<p><a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/" >Zend Framework</a> был разработан компанией <a target="_blank" href="http://www.web-junior.net/goto/http://www.zend.com/" >Zend Technologies Ltd</a>. Самая первая версия (Zend Framework 0.1.3 Preview Release) вышла 18 апреля 2006 года. Этот релиз нельзя назвать полноценным, но он был первым. Первая полноценная версия фреймворка (Zend Framework 1.0.0) вышла более чем через год после первого релиза 30 июня 2007 года. С тех пор Zend Framework развивается достаточно активно и уже имеет немалую популярность среди разработчиков. Распространяется по лицензии <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/BSD_license" >New BSD License</a>.</p>
<p><strong>Скачать</strong></p>
<p>Скачать последнюю версию Zend Framework можно на страничке <a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/download/latest" >Downloads</a> официального сайта. На момент написания статьи последней доступной без регистрации была версия <strong>1.10.8</strong>.</p>
<p>Качать для тестов лучше всего версию та, которая <strong>Full</strong>, чтобы все пакеты и модули фреймворка были на месте.</p>
<p>Останавливаться на установке и настройке Zend Framework не будем. Это уже описано по нескольку раз на различных сайтах и русскоязычных тоже.</p>
<p>Далее предполагается, что читатель уже знаком с архитектурой <a target="_blank" href="http://www.web-junior.net/goto/http://ru.wikipedia.org/wiki/MVC" >MVC</a> и имеет некоторый опыт написания приложений на основе Zend Framework.</p>
<p><strong>Быстрый старт</strong></p>
<p>Напишем IndexController, который отправит post-запрос на сервер.</p>
<p><strong>application/controllers/IndexController.php</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
* подключаем клиента
*/</span>
<span style="color: #b1b100;">include_once</span> <span style="color: #0000ff;">'Zend/Http/Client.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> IndexController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//создаем объект клиента</span>
		<span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Http_Client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//устанавливаем урл, к которому обратимся</span>
		<span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setUri</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://test.zend.loc/index/page'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//устанавливаем метод</span>
		<span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMethod</span><span style="color: #009900;">&#40;</span>Zend_Http_Client<span style="color: #339933;">::</span><span style="color: #004000;">POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//устанавливаем переменные</span>
		<span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setParameterPost</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'John'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setParameterPost</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'surname'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Smith'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//получаем результат</span>
		<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isError</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Вышла ошибочка за номером '</span><span style="color: #339933;">.</span>
<span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStatus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBody</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">layout</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">disableLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #009933; font-style: italic;">/**
	*
	* метод отобразит все пост-переменные
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> pageAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span> <span style="color: #339933;">=</span>
		this<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRequest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPost</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Также нам нужен пустой вьювер index.phtml, который расположим в папке <strong>application/views/scripts/index</strong>. А также вьювер page.phtml в той-же папке следующего содержания:</p>
<p><strong>application/views/scripts/index/page.phtml</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;name = &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;surname = &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'surname'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>который выведет на печать наши post-переменные.</p>
<p>Теперь, сохранив все файлы и обратившись к адресу http://test.zend.loc/ мы увидим следующий текст</p>
<div id="attachment_247" class="wp-caption aligncenter" style="width: 378px"><a href="http://www.web-junior.net/wp-content/uploads/2010/10/zf_vars.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/zf_vars.jpg" alt="" title="zf_vars" width="368" height="97" class="size-full wp-image-247" /></a><p class="wp-caption-text">Результаты впечатляют</p></div>
<p>который означает, что переменные дошли до места назначения.</p>
<p><strong>Пояснения</strong><br />
Теперь рассмотрим классы и механизмы их работы, чтобы понять все детали и нюансы работы.</p>
<p>Чтобы отправить post-запрос необходимо использовать класс <a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/apidoc/core/db_Http_Client.html" >Zend_Http_Client</a>. В конструктор этому классу передаются.</p>
<ul>
<li><strong>$</strong><strong>uri=</strong><strong>null </strong>– uri которому необходимо отослать запрос;</li>
<li><strong>$config=null </strong>– конфигурационные данные.</li>
</ul>
<p>Оба параметра не обязательны и можно их опустить.</p>
<p>Для установки <acronym title="Uniform Resource Identifier">URI</acronym> (если он не был установлен через конструктор) следует использовать метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Zend_Http_Client <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUri<span style="color: #009900;">&#40;</span>Zend_Uri_Http<span style="color: #339933;">|</span>string <span style="color: #000088;">$uri</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<ul>
<li><strong>$</strong><strong>uri</strong><strong> </strong><strong>– </strong><acronym title="Uniform Resource Identifier">URI</acronym> к которому необходимо отослать запрос. Может быть простой строкой либо объектом класса <a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/apidoc/core/db_Uri_Http.html" >Zend_Uri_Http</a>;</li>
</ul>
<p>Метод возвращает объект класса Zend_Http_Client.</p>
<p>Для установки метода, по которому отправляем запрос (GET, POST) используем метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Zend_Http_Client <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setMethod<span style="color: #009900;">&#40;</span>string <span style="color: #000088;">$menthod</span><span style="color: #339933;">=</span>Zend_Http_Client<span style="color: #339933;">::</span><span style="color: #004000;">GET</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<ul>
<li><strong>$</strong><strong>method</strong><strong> </strong><strong>– </strong>метод по которому будем отправлять запрос. Для установки следует использовать константы класса (Zend_Http_Client::GET, Zend_Http_Client::POST и т.д.). По умолчанию установлен в GET.</li>
</ul>
<p>Для добавления post-переменных используем метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Zend_Http_Client <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setParameterPost<span style="color: #009900;">&#40;</span>string <span style="color: #000088;">$name</span><span style="color: #339933;">,</span> string <span style="color: #000088;">$value</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<ul>
<li><strong>$name – </strong>наименование post-переменной;</li>
<li><strong>$</strong><strong>value</strong><strong> </strong><strong>–</strong> значение post-переменной. По умолчанию установлен в null.</li>
</ul>
<p>Для отправки запроса вызываем метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Zend_Http_Response <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> request<span style="color: #009900;">&#40;</span>string <span style="color: #000088;">$method</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<ul>
<li><strong>$</strong><strong>method</strong><strong> </strong><strong>– </strong>метод, по которому отправляем запрос, если забыли установить его через setMethod (см. описанние выше). По умолчанию установлен в null.</li>
</ul>
<p>Метод возвращает объект класса <a target="_blank" href="http://www.web-junior.net/goto/http://framework.zend.com/apidoc/core/db_Http_Response.html" >Zend_Http_Response</a>.</p>
<p>У этого класса мы используем всего несколько методов. Для того, чтобы проверить, не ответил ли нам сервер ошибкой, вызываем метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">bool <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> isError<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>который вернет true или false. Если метод вернул true, то для получения кода ошибки, используем метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">int <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getStatus<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Если же нет никакой ошибки, то можем получить тело ответа, вызвав метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">string <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getBody<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p><strong>Файлы</strong><br />
Теперь займемся отправкой файлов по методу POST с помощью Zend Framework. Для этого нужно немного переделать IndexController. Вот пример отправки файла по методу POST.</p>
<p><strong>application/controllers/IndexController.php</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * подключаем клиента
 */</span>
<span style="color: #b1b100;">include_once</span> <span style="color: #0000ff;">'Zend/Http/Client.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> IndexController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action
<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//создаем объект клиента</span>
    	<span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Http_Client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #666666; font-style: italic;">//устанавливаем урл, к которому обратимся</span>
        <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setUri</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://test.zend.loc/index/page'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//устанавливаем метод</span>
        <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMethod</span><span style="color: #009900;">&#40;</span>Zend_Http_Client<span style="color: #339933;">::</span><span style="color: #004000;">POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//устанавливаем переменные</span>
        <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setParameterPost</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'John'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setParameterPost</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'surname'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Smith'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">//устанавливаем данные файла</span>
        <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFileUpload</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
<span style="color: #009900; font-weight: bold;">DIRECTORY_SEPARATOR</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'my_file.jpg'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'my_file'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'image/jpeg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">//получаем результат</span>
        <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isError</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Вышла ошибочка за номером '</span><span style="color: #339933;">.</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStatus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
        	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBody</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">layout</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">disableLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     *
     * метод отобразит все пост-переменные
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> pageAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRequest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPost</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #000088;">$adapter</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_File_Transfer_Adapter_Http<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #000088;">$adapter</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setDestination</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'E:\tmp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #000088;">$adapter</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">files</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$adapter</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFileInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    	
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Также немного переделаем page.phtml, который ответственен за вывод данных.</p>
<p><strong>application/views/scripts/index/page.phtml</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;name = &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;surname = &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'surname'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">files</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;filname=<span style="color: #006699; font-weight: bold;">{$file['name']}</span>&lt;br/&gt;
			type=<span style="color: #006699; font-weight: bold;">{$file['type']}</span>&lt;br/&gt;
			size=<span style="color: #006699; font-weight: bold;">{$file['size']}</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>В результате выполнения этого кода получим в браузере текст</p>
<div id="attachment_248" class="wp-caption aligncenter" style="width: 318px"><a href="http://www.web-junior.net/wp-content/uploads/2010/10/zf_file.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/10/zf_file.jpg" alt="" title="zf_file" width="308" height="138" class="size-full wp-image-248" /></a><p class="wp-caption-text">Файл получен в целости и сохранности</p></div>
<p>Теперь рассмотрим метод, который предназначен для отправки файла. У класса Zend_Http_Client есть метод</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Zend_Http_Client <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setFileUpload<span style="color: #009900;">&#40;</span>string <span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> string <span style="color: #000088;">$formname</span><span style="color: #339933;">,</span> string <span style="color: #000088;">$data</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> string <span style="color: #000088;">$ctype</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<ul>
<li><strong>$</strong><strong>filename</strong><strong> </strong><strong>– </strong>путь к загружаемому файлу. Если $data не null, то можно вписать только имя;</li>
<li><strong>$formname –</strong> имя переменной формы;</li>
<li><strong>$</strong><strong>data</strong><strong>=</strong><strong>null</strong><strong> </strong><strong>–</strong> сам файл в виде строки. Если этот параметр установлен в null, то файл будет взят из $filename;</li>
<li><strong>$</strong><strong>ctype</strong><strong> </strong><strong>–</strong> <acronym title="Multipurpose Internet Mail Extension">MIME</acronym>-тип файла. Если установлен в null, то класс самостоятельно попытается определить тип файла.</li>
</ul>
<p>И всё было бы хорошо, если б не одно большое НО. Вдумчивый читатель, внимательно просмотрев скрины и код найдет одно, на первый взгляд не заметное,  но достаточно важное в некоторых случаях отличие.</p>
<p>В метод setFileUpload при отправке файла устанавливается <acronym title="Multipurpose Internet Mail Extension">MIME</acronym>-тип <strong>image</strong><strong>/</strong><strong>jpeg</strong>. А на скрине ясно видно, что тип полученного файла <strong>application</strong><strong>/</strong><strong>octet</strong><strong>-</strong><strong>stream</strong>. Вот и подвох, который с первого взгляда не заметен.</p>
<p>Кто же виноват в таком безрассудстве? Оказывается класс Zend_File_Transfer_Adapter_Http при получении файла пытается не только сохранить все данные. Он пытается еще и определить <acronym title="Multipurpose Internet Mail Extension">MIME</acronym>-тип файла по своему, не обращая внимание на $_FILES[‘type’]. Поэтому при получении файлов корректность их типа не гарантируется.</p>
<p>Читайте все статьи цикла:</p>
<ul>
<li><a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-1/" >Отправка POST запросов с помощью php. Часть 1</a></li>
<li><a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-2/" >Отправка POST-запросов с помощью php. Часть 2</a></li>
<li><a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-3/" >Отправка POST запросов с помощью php. Часть 3</a></li>
<li><a href="http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-otpravka-fajjlov/" >Отправка POST запросов с помощью php. Отправка файлов</a></li>
<li>Отправка POST запросов с помощью <acronym title="PHP:Hypertext Preprocessor, язык программирования">PHP</acronym>. Zend Framework</li>
</ul><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_running/?ref_id=850394791" >Пройди игру, получи приз !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=245&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/fvjou0dRpWA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-zend-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-zend-framework/</feedburner:origLink></item>
		<item>
		<title>Склоняем фамилию на PHP</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/x63nVBt5yLU/</link>
		<comments>http://www.web-junior.net/sklonyaem-familiyu-na-php/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 16:17:43 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[склонение]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=238</guid>
		<description><![CDATA[<a href="http://www.web-junior.net/wp-content/uploads/2010/08/logo.jpg"><img src="http://www.web-junior.net/wp-content/uploads/2010/08/logo.jpg" alt="" title="logo" width="250px" height="152px" class="alignleft size-full wp-image-237" /></a>Некоторое время назад, в очередном проекте, задался целью обращение к пользователям ставить в соответствующий падеж. Например, во фразе «Вам пришло письмо от Васи Пупкина», фамилия и имя стоят в Родительном падеже. Это получается красиво, а главное очень удобно. В то же время пользователю безумно приятно видеть, что программа правильно обращается к нему по имени. Задавшись целью, я не стал сломя голову писать все с нуля, а решил сначала поискать наработки других программистов на этом поприще. Поиски увенчались переменным успехом.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/3EiVUa5KtZsGoa0RtlwB7J2eU3M/0/da"><img src="http://feedads.g.doubleclick.net/~a/3EiVUa5KtZsGoa0RtlwB7J2eU3M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/3EiVUa5KtZsGoa0RtlwB7J2eU3M/1/da"><img src="http://feedads.g.doubleclick.net/~a/3EiVUa5KtZsGoa0RtlwB7J2eU3M/1/di" border="0" ismap="true"></img></a></p><p><a href="http://www.web-junior.net/wp-content/uploads/2010/08/logo.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/08/logo.jpg" alt="" title="logo" width="250px" height="152px" class="alignleft size-full wp-image-237" /></a>Некоторое время назад, в очередном проекте, задался целью обращение к пользователям ставить в соответствующий падеж. Например, во фразе «Вам пришло письмо от Васи Пупкина», фамилия и имя стоят в Родительном падеже. Это получается красиво, а главное очень удобно. В то же время пользователю безумно приятно видеть, что программа правильно обращается к нему по имени. Задавшись целью, я не стал сломя голову писать все с нуля, а решил сначала поискать наработки других программистов на этом поприще. Поиски увенчались переменным успехом.</p>
<p><strong>Результаты поисков</strong><br />
Сразу же нашлись несколько скриптов для склонения английских фамилий. Их я немедленно отбросил, поскольку мне нужно было склонение русских фамилий. За ними нашел библиотеки для 1С, Delphi и FoxPro. Но, в конце концов, и мне сопутствовала удача. Нашел одну относительно неплохую библиотеку на php. Скачать ее можно <a href="http://www.web-junior.net/download-manager.php?id=10" >здесь</a>.</p>
<p>Последней интересной находкой по этой теме, были отличыные сервисы <a target="_blank" href="http://www.web-junior.net/goto/http://www.morpher.ru/Demo.aspx"  target="_blank">Морфер.ру</a> и <a target="_blank" href="http://www.web-junior.net/goto/http://nano.yandex.ru/project/inflect/"  target="_blank">Яндекс.Склонятор</a>, но об этом ниже.</p>
<p><strong>Найденная библиотека</strong><br />
Найденная библиотека в комментариях не поведала мне о своем наименовании. Архив называется names, но я предлагаю именовать его <strong>RussianNameProcessor</strong>, по имени основного класса. Сама библиотека срабатывает верно приблизительно в 90-95% случаев, что само по себе достаточно много.</p>
<p>В архиве есть файл для тестирования <strong>testNames.</strong><strong>php</strong>, который объясняет, как работать с библиотекой.</p>
<p><strong>testNames.php</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">include</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;./names.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'Козлов Евгений Павлович'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #666666; font-style: italic;">// годится обычная форма</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'Евгений Павлович Козлов'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #666666; font-style: italic;">// в таком виде тоже</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Козлов'</span><span style="color: #339933;">,</span> 
<span style="color: #0000ff;">'Евгений'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        <span style="color: #666666; font-style: italic;">// можно явно указать составляющие</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Кунтидия'</span><span style="color: #339933;">,</span> 
<span style="color: #0000ff;">'Убиреко'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// можно явно указать пол ('m' или 'f')</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Козлова Евгения Павловна'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Соответственно видим следующий текст.</p>
<div id="attachment_240" class="wp-caption aligncenter" style="width: 287px"><a href="http://www.web-junior.net/wp-content/uploads/2010/08/testnames.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/08/testnames.jpg" alt="" title="testnames" width="277" height="141" class="size-full wp-image-240" /></a><p class="wp-caption-text">В родительном падеже стоят прекрасно</p></div>
<p>Итак, подключив файл names.php, с помощью include, создаем объект класса RussianNameProcessor. Этот класс является основным и через него идет вся работа. Конструктор объявлен следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> RussianNameProcessor <span style="color: #009900;">&#40;</span>string <span style="color: #000088;">$lastName</span><span style="color: #339933;">,</span> 
string <span style="color: #000088;">$firstName</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> string <span style="color: #000088;">$middleName</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> 
string <span style="color: #000088;">$sex</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Как видите, в конструктор обязательно нужно передать первый параметр – фамилию. Можно также первым параметром передать строку с фамилией, именем и отчеством, как показано в примере выше.</p>
<p>Следующие параметры можно передать в конструктор:</p>
<ul>
<li><strong>string $lastName</strong> – фамилия. Может быть указана строка с фамилией, именем и отчеством;</li>
<li><strong>string $firstName</strong> – имя. По умолчанию равно NULL;</li>
<li><strong>string $middleName</strong> – отчество. По умолчанию равно NULL;</li>
<li><strong>string $sex</strong> – пол. Может принимать значение «m» что значит мужской пол или «f» что значит женский пол. По умолчанию равно NULL.</li>
</ul>
<p>Для работы со склонением фамилий в принципе достаточно одной функции.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">string fullName<span style="color: #009900;">&#40;</span> string <span style="color: #000088;">$gcase</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Метод в качестве параметра получает название падежа, а возвращает фамилию, имя и отчество в указанном падеже. Падежи записаны в специальных публичных свойствах в классе <strong>RussianNameProcessor</strong></p>
<ul>
<li><strong>$RussianNameProcessor-&gt;gcaseIm</strong> или <strong>$RussianNameProcessor-&gt;gcaseNom</strong> – именительный падеж;</li>
<li><strong>$RussianNameProcessor-&gt;gcaseRod</strong> или <strong>$RussianNameProcessor-&gt;gcaseGen</strong> – родительный падеж;</li>
<li><strong>$RussianNameProcessor-&gt;gcaseDat</strong> – дательный падеж;</li>
<li><strong>$RussianNameProcessor-&gt;gcaseVin</strong> или <strong>$RussianNameProcessor-&gt;gcaseAcc</strong> – винительный падеж;</li>
<li><strong>$RussianNameProcessor-&gt;gcaseTvor</strong> или <strong>$RussianNameProcessor-&gt;gcaseIns</strong> – творительный падеж;</li>
<li><strong>$RussianNameProcessor-&gt;gcasePred</strong> или <strong>$RussianNameProcessor-&gt;gcasePos</strong> – предложный падеж.</li>
</ul>
<p>Есть также несколько функций для склонения отдельных составляющих:</p>
<ul>
<li>string <strong>lastName</strong>(string $gcase) – метод склоняет отдельно фамилию;</li>
<li>string <strong>firstName</strong>(string $gcase) – метод склоняет отдельно имя;</li>
<li>string <strong>middleName</strong>(string $gcase) – метод склоняет отдельно отчество.</li>
</ul>
<p>В эти методы падеж передается точно также как и в метод fullName, т.е. с помощью указанных выше свойств класса RussianNameProcessor.</p>
<p>Хочу отдельно заметить, что эта библиотека настроена так, что хорошо склоняет <strong>русские фамилии, записанные в кодировке </strong><strong>windows-1251</strong>.</p>
<p>Для того чтобы <strong>склонять фамилии, записанные в </strong><strong>UTF-8</strong>, нужно сделать некоторые преобразования.</p>
<p>Во-первых, нужно перекодировать файл names.php в кодировку UTF-8. Сделать это можно в любом нормальном редакторе, рекомендую Notepad++, который можно скачать где угодно, да хотя бы <a target="_blank" href="http://www.web-junior.net/goto/http://soft.softodrom.ru/ap/Notepad-p3232"  target="_blank">здесь</a>.</p>
<p>Во-вторых, нужно в php настроить перегрузку строковых функций, функциями из расширения mb_string (не забудьте его сначала активировать). Для этого в php.ini напишите <strong>mbstring.func_overload = 7</strong>.</p>
<p>Теперь можно склонять фамилии, записанные в UTF-8. Для примера можно немного переделать файл testNames.php, перекодировав его в UTF-8.</p>
<p><strong>testNamesUTF.php</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type:text/html;charset=UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//внутреннюю кодировку поставим в утф</span>
<span style="color: #990000;">mb_internal_encoding</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;./names.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'Козлов Евгений Павлович'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #666666; font-style: italic;">// годится обычная форма</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'Евгений Павлович Козлов'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #666666; font-style: italic;">// в таком виде тоже</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Козлов'</span><span style="color: #339933;">,</span> 
<span style="color: #0000ff;">'Евгений'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        <span style="color: #666666; font-style: italic;">// можно явно указать составляющие</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Кунтидия'</span><span style="color: #339933;">,</span> 
<span style="color: #0000ff;">'Убиреко'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// можно явно указать пол ('m' или 'f')</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RussianNameProcessor<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Козлова Евгения Павловна'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br/&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gcaseRod</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>При этом видим ту же картину<br />
<div id="attachment_241" class="wp-caption aligncenter" style="width: 287px"><a href="http://www.web-junior.net/wp-content/uploads/2010/08/testnamesutf.jpg" ><img src="http://www.web-junior.net/wp-content/uploads/2010/08/testnamesutf.jpg" alt="" title="testnamesutf" width="277" height="141" class="size-full wp-image-241" /></a><p class="wp-caption-text">В UTF-8 все слова были поставлены верно</p></div></p>
<p>Эта библиотека вполне неплохо справляется с поставленной задачей склонения фамилий на русском языке. Поэтому, я считаю, что ее можно использовать в различных проектах.</p>
<p><strong>Морфер.ру</strong><br />
Теперь перейдем к сервисам.</p>
<p>Кого по каким-либо причинам не устаивает вышеописанная библиотека, может использовать специальные сервисы для склонения фамилий и слов. Начнем описание с сервиса morpher.ru.</p>
<p>Этот сервис был разработан и поддерживается программистом <a target="_blank" href="http://www.web-junior.net/goto/http://morpher.ru/Contacts.aspx"  target="_blank">Сергеем Слеповым</a>. Разработанная технология отличная и умеет многое:</p>
<ul>
<li>склонять слова на русском;</li>
<li>склонять слова на украинском;</li>
<li>писать сумму прописью;</li>
<li>склонять слова в единственном и множественном числе;</li>
<li>и многое другое.</li>
</ul>
<p>Сервис представляет собой следующую структуру: обратившись к определенному <acronym title="Uniform Resource Locator">URL</acronym>, передав через get или post слово, которое нужно просклонять, получим <acronym title="eXtensible Markup Language">XML</acronym>-файл с результатом.</p>
<p>Для примера, я написал небольшой класс для работы с этим сервисом по протоколу <acronym title="HyperText Transfer Protocol, Протокол передачи гипертекста">HTTP</acronym> (ещё этот сервис поддерживает <acronym title="Simple Object Access Protocol">SOAP</acronym>). Скачать этот класс можно <a href="http://www.web-junior.net/download-manager.php?id=11" >отсюда</a>.</p>
<p>Вот небольшой пример работы с этим классом</p>
<p><strong>testMorpher.php</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//подключаем класс</span>
<span style="color: #b1b100;">include_once</span> <span style="color: #0000ff;">'morpher.php'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//отправляем заголовки</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type:text/plain;charset=UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//создаем объект класса</span>
<span style="color: #000088;">$m</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Morpher<span style="color: #009900;">&#40;</span><span style="color: #990000;">mb_convert_encoding</span><span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'Вася Пупкин'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'UTF-8'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'windows-1251'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//получаем склонение</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$m</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getInflect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>В конструктор класса передается слово, которое нужно просклонять, в кодировке UTF-8.</p>
<p>Для того чтобы получить склонение, нужно вызвать метод <strong>getInflect()</strong>. Этот метод вернет массив со словами в соответствующих падежах либо false, если произошла ошибка.</p>
<p>Сервис позволяет делать не более 100 одинаковых запросов в сутки и не более 1000 запросов в сутки всего. Правда существуют платные варианты, в которых нет данных ограничений.</p>
<p><strong>Яндекс.Склонятор</strong><br />
У Яндекса есть специальная площадка для того, чтобы сотрудники компании могли размещать свои проекты в сети. Эта площадка называется <a target="_blank" href="http://www.web-junior.net/goto/http://nano.yandex.ru/"  target="_blank">Яндекс.Нано</a>. Среди всех проектов, расположенных на Яндекс.Нано, есть один, который предназначен для склонения фамилий. Он имеет название <a target="_blank" href="http://www.web-junior.net/goto/http://nano.yandex.ru/project/inflect/"  target="blank">Яндекс.Склонятор</a>.</p>
<p>Этот сервис чуть-чуть похуже, чем предыдущий. Верность склонения составляет приблизительно 90% (например, мою фамилию неверно поставил в винительный падеж).</p>
<p>Работает этот сервис приблизительно по такой же схеме, что и предыдущий. Единственное отличие Яндекс.Склонятора в том, что он может возвращать данные не только в xml-формате, но еще и в формате json.</p>
<p>Вот небольшой <a href="http://www.web-junior.net/download-manager.php?id=12" >класс</a>, который я написал, чтобы продемонстрировать работу с сервисом.</p>
<p><strong>testYandex.php</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//отсылаем заголовки</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type:text/plain;charset=UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//подключаем класс</span>
<span style="color: #b1b100;">include_once</span> <span style="color: #0000ff;">'yandex_inflect.php'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//создаем объект</span>
<span style="color: #000088;">$y</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> YandexInflect<span style="color: #009900;">&#40;</span><span style="color: #990000;">mb_convert_encoding</span><span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">'Вася Пупкин'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'UTF-8'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'windows-1251'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'json'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//получаем склонение</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$y</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getInflect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>В конструктор класса передаем слово, которое нужно просклонять в UTF-8, а также наименование формата, в котором будем запрашивать данные у Яндекса: xml или json. По умолчанию установлено в xml.<br />
Метод getInflect() вернет массив со словами в падежах.<br />
Про ограничения этого сервиса ничего не сказано, но я уверен, что такой сервис без ограничений в количестве запросов не обойдется.</p><p><p><a target="_blank" href="http://www.web-junior.net/goto/http://start.fotostrana.ru/partners/pet_run/?ref_id=850394791" >Пройди головоломку, получи приз ! Бесплатно !</a></p>
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=238&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/x63nVBt5yLU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/sklonyaem-familiyu-na-php/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/sklonyaem-familiyu-na-php/</feedburner:origLink></item>
		<item>
		<title>Часто задаваемые вопросы по PHPExcel</title>
		<link>http://feedproxy.google.com/~r/web-junior/~3/wlUIDul-Zn0/</link>
		<comments>http://www.web-junior.net/chasto-zadavaemye-voprosy-po-phpexcel/#comments</comments>
		<pubDate>Mon, 17 May 2010 11:19:43 +0000</pubDate>
		<dc:creator>web-junior</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[faq]]></category>
		<category><![CDATA[PHPExcel]]></category>

		<guid isPermaLink="false">http://www.web-junior.net/?p=234</guid>
		<description><![CDATA[<a href="http://www.web-junior.net/wp-content/uploads/2010/05/logo.jpg"><img class="alignleft size-full wp-image-235" style="border: 0pt none; margin: 10px;" title="logo" src="http://www.web-junior.net/wp-content/uploads/2010/05/logo.jpg" alt="" width="250" height="152" /></a>После выхода статей по работе с PHPExcel (<a href="http://www.web-junior.net/sozdanie-excel-fajjlov-s-pomoshhyu-phpexcel/">Создание Excel-файлов с помощью PHPExcel</a> и <a href="http://www.web-junior.net/chtenie-excel-fajjlov-s-pomoshhyu-phpexcel/">Чтение Excel-файлов с помощью PHPExcel</a>) в комментариях было задано множество вопросов по работе с библиотекой PHPExcel. Сегодня я собрал вместе наиболее часто задаваемые вопросы в этой статье. Спасибо всем посетителям, которые задавали вопросы в комментариях.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/3o52WbRX8n7usEX5x-_80buFNrA/0/da"><img src="http://feedads.g.doubleclick.net/~a/3o52WbRX8n7usEX5x-_80buFNrA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/3o52WbRX8n7usEX5x-_80buFNrA/1/da"><img src="http://feedads.g.doubleclick.net/~a/3o52WbRX8n7usEX5x-_80buFNrA/1/di" border="0" ismap="true"></img></a></p><p><a href="http://www.web-junior.net/wp-content/uploads/2010/05/logo.jpg" ><img class="alignleft size-full wp-image-235" style="border: 0pt none; margin: 10px;" title="logo" src="http://www.web-junior.net/wp-content/uploads/2010/05/logo.jpg" alt="" width="250" height="152" /></a>После выхода статей по работе с PHPExcel (<a href="http://www.web-junior.net/sozdanie-excel-fajjlov-s-pomoshhyu-phpexcel/" >Создание Excel-файлов с помощью PHPExcel</a> и <a href="http://www.web-junior.net/chtenie-excel-fajjlov-s-pomoshhyu-phpexcel/" >Чтение Excel-файлов с помощью PHPExcel</a>) в комментариях было задано множество вопросов по работе с библиотекой PHPExcel. Сегодня я собрал вместе наиболее часто задаваемые вопросы в этой статье. Спасибо всем посетителям, которые задавали вопросы в комментариях.<br />
<span id="more-234"></span></p>
<p style="font-size:14px"><strong>1.Создаю </strong><strong>Excel-файл с помощью </strong><strong>PHPExcel. Вся кириллица отображается кракозяблами или не отображается вообще. В чем может быть проблема?</strong></p>
<p>Проблема в том, что библиотека PHPExcel работает только с utf-8. Внимательно проверьте кодировку текста, который вы вставляете в ячейки. Если она отлична от utf-8, то обязательно перекодируйте с помощью функции <a target="_blank" href="http://www.web-junior.net/goto/http://www.php.net/manual/en/function.mb-convert-encoding.php" >mb_convert_encoding</a> или <a target="_blank" href="http://www.web-junior.net/goto/http://www.php.net/manual/en/function.iconv.php" >iconv</a>.<br />
<br/></p>
<p style="font-size:14px"><strong>2.Как вставлять русские формулы?</strong></p>
<p>Об этом разъяснено в статье <a href="http://www.web-junior.net/kirillicheskie-formuly-v-phpexcel/"  target="_blank">Кириллические формулы в PHPExcel</a><br />
<br/></p>
<p style="font-size:14px"><strong>3.Можно ли вставить рисунок в ячейку?</strong></p>
<p>Да, конечно можно. Для этих целей в библиотеке PHPExcel есть класс <strong>PHPExcel_Worksheet_Drawing. </strong>Вот пример кода:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$iDrowing</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PHPExcel_Worksheet_Drawing<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//берем рисунок</span>
<span style="color: #000088;">$iDrowing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setPath</span><span style="color: #009900;">&#40;</span>‘img<span style="color: #339933;">.</span>jpeg’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//устанавливаем ячейку</span>
<span style="color: #000088;">$iDrowing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCoordinates</span><span style="color: #009900;">&#40;</span>‘A3′<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//устанавливаем смещение X и Y</span>
<span style="color: #000088;">$iDrowing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOffsetX</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$iDrowing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOffsetY</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//помещаем на лист</span>
<span style="color: #000088;">$iDrowing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setWorksheet</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$objPHPExcel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getActiveSheet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Также есть класс <strong>PHPExcel_Worksheet_MemoryDrawing</strong>, с помощью которого можно вставлять ресурсы GD. Это делается с помощью метода setImageResource. Вот пример из документации:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Generate an image</span>
<span style="color: #000088;">$gdImage</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">imagecreatetruecolor</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">120</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span>‘Cannot Initialize <span style="color: #000000; font-weight: bold;">new</span> GD image stream’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$textColor</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecolorallocate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gdImage</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">imagestring</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gdImage</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> ‘Created with PHPExcel’<span style="color: #339933;">,</span> <span style="color: #000088;">$textColor</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Add a drawing to the worksheet</span>
<span style="color: #000088;">$objDrawing</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PHPExcel_Worksheet_MemoryDrawing<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setName</span><span style="color: #009900;">&#40;</span>‘Sample image’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setDescription</span><span style="color: #009900;">&#40;</span>‘Sample image’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setImageResource</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gdImage</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setRenderingFunction</span><span style="color: #009900;">&#40;</span>
PHPExcel_Worksheet_MemoryDrawing<span style="color: #339933;">::</span><span style="color: #004000;">RENDERING_JPEG</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMimeType</span><span style="color: #009900;">&#40;</span>
PHPExcel_Worksheet_MemoryDrawing<span style="color: #339933;">::</span><span style="color: #004000;">MIMETYPE_DEFAULT</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setHeight</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">36</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setWorksheet</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$objPHPExcel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getActiveSheet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><br/></p>
<p style="font-size:14px"><strong>4.А как же ширина и высота в рисунке? Я выставляю $</strong><strong>objDrawing-&gt;</strong><strong>setHeight(36), но рисунок еще расползается на 30-40%.</strong></p>
<p>По умолчанию для рисунков устанавливается пропорциональные размеры для высоты и ширины. Отсюда и появляются размеры чуть большие, чем указаны. Отключить эту функциональность можно, вызвав</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$objDrawing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setResizeProportional</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Перед установкой ширины или высоты.<br />
<br/></p>
<p style="font-size:14px"><strong>5.У</strong><strong> меня</strong><strong> возникает</strong><strong> ошибка</strong><strong> Fatal error: Uncaught exception ‘Exception’ with message ‘Cloning a Singleton is not allowed!’ </strong></p>
<p>Вам нужно отключить опцию <strong>zend.ze1_compatibility_mode. </strong>Для этого в конфигурационном файле php.ini нужно найти строку</p>
<p>zend.ze1_compatibility_mode = On</p>
<p>и заменить On на Off</p>
<p>Если нет доступа к конфигурационному файлу, то можно отключить в скрипте, написав в начале</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'zend.ze1_compatibility_mode'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
…</pre></td></tr></table></div>

<p><br/></p>
<p style="font-size:14px"><strong>6.Текст в ячейке расползается на несколько ячеек, хотя вставляю символы \</strong><strong>n и \</strong><strong>r\</strong><strong>n. Как сделать перенос?</strong></p>
<p>Перенос текста в ячейке по умолчанию отключен. Включить его можно так</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$aSheet</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStyle</span><span style="color: #009900;">&#40;</span>‘C7′<span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAlignment</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setWrapText</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Где $aSheet – активный лист, а C7 – нужная ячейка.</p>
<p>После того, как поддержка переноса будет включена, перенос будет вставляться символом \n (<acronym title="American Standard Code for Information Interchange">ASCII</acronym>-символ под номером 10).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$aSheet</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCellValue</span><span style="color: #009900;">&#40;</span>‘C7′<span style="color: #339933;">,</span>”Строка<span style="color: #cc66cc;">1</span>\nСтрока<span style="color: #cc66cc;">2</span>″<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$aSheet</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStyle</span><span style="color: #009900;">&#40;</span>‘C7′<span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAlignment</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setWrapText</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><br/></p>
<p style="font-size:14px"><strong>7.Возникает</strong><strong> ошибка</strong><strong> с</strong><strong> текстом</strong><strong> Fatal error: Uncaught exception ‘Exception’ with message ‘Multibyte string function overloading in <acronym><acronym title="PHP:Hypertext Preprocessor, язык программирования">PHP</acronym></acronym> must be disabled.’.</strong></p>
<p>Эта ошибка возникает, когда включена перегрузка строковых функций, соответствующими функциями из расширения mb_string. Для отключения этого режима нужно в конфигурационном файле php.ini установить опцию <strong>mbstring.func_overload </strong><strong>в </strong><strong>off</strong><strong>.</strong><br />
<br/></p>
<p style="font-size:14px"><strong>8.Как задать стиль рамки для ячейки?</strong></p>
<p><strong>В классе </strong>PHPExcel_Style_Border есть константы, которые можно использовать для установки стилей. Например:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$styleArray</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
‘borders’ <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	‘outline’ <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		’style’ <span style="color: #339933;">=&gt;</span> PHPExcel_Style_Border<span style="color: #339933;">::</span><span style="color: #004000;">BORDER_THICK</span><span style="color: #339933;">,</span>
		‘color’ <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>‘argb’ <span style="color: #339933;">=&gt;</span> ‘FFFF0000’<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$aSheet</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStyle</span><span style="color: #009900;">&#40;</span>‘A1<span style="color: #339933;">:</span>B3’<span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">applyFromArray</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$styleArray</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Вот список констант, которые можно использовать</p>
<p>PHPExcel_Style_Border::BORDER_NONE<br />
PHPExcel_Style_Border::BORDER_THIN<br />
PHPExcel_Style_Border::BORDER_MEDIUM<br />
PHPExcel_Style_Border::BORDER_DASHED<br />
PHPExcel_Style_Border::BORDER_DOTTED<br />
PHPExcel_Style_Border::BORDER_THICK<br />
PHPExcel_Style_Border::BORDER_DOUBLE<br />
PHPExcel_Style_Border::BORDER_HAIR<br />
PHPExcel_Style_Border::BORDER_MEDIUMDASHED<br />
PHPExcel_Style_Border::BORDER_DASHDOT<br />
PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT<br />
PHPExcel_Style_Border::BORDER_DASHDOTDOT<br />
PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT<br />
PHPExcel_Style_Border::BORDER_SLANTDASHDOT<br />
<br/></p>
<p style="font-size:14px"><strong>9. Делаю расчеты с помощью PHPExcel: ввожу в ячейки данные, а потом считываю результат расчетов из соответствующей ячейки. После чего ввожу в ячейки другие данные, а результат расчетов не изменяется. В чем может быть проблема?</strong></p>
<p>Проблема в том, что все данные расчетов <strong>кэшируются</strong>. Это сделано для увеличения скорости расчетов и уменьшения используемой памяти. Чтобы все расчеты срабатывали правильно, нужно перед каждым, кроме первого, <strong>сбрасывать кэш расчетов</strong> следующим образом:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Здесь первый расчет</span>
<span style="color: #339933;">....</span>
<span style="color: #666666; font-style: italic;">//после чего сбрасываем кэш</span>
PHPExcel_Calculation<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clearCalculationCache</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//здесь второй расчет</span>
<span style="color: #339933;">....</span></pre></td></tr></table></div>

<p style="font-size:14px"><strong>10. При обработке файлов с большим количеством данных появляется ошибка Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in &#8230;</strong></p>
<p>Проблема состоит в том, что <acronym title="PHP:Hypertext Preprocessor, язык программирования">PHP</acronym> имеет ограниченное кол-во памяти и это строго контролируется интерпретатором. PHPExcel требует очень много памяти для обработки данных, поэтому при чтении больших файлов может появляться такого рода ошибка.<br />
Если у вас есть доступ к настройкам <acronym title="PHP:Hypertext Preprocessor, язык программирования">PHP</acronym>, то просто увеличьте размер памяти.<br />
Если нет, то можно разбить файл на две части и обрабатывать их отдельно.<br />
<br/><br/></p>
<p>На данный момент это большая часть часто задаваемых вопросов. По мере поступления новых вопросов, буду добавлять их сюда.</p>
<p>Читайте все статьи цикла:</p>
<ul>
<li><a href="http://www.web-junior.net/sozdanie-excel-fajjlov-s-pomoshhyu-phpexcel/" >Создание Excel-файлов с помощью PHPExcel</a></li>
<li><a href="http://www.web-junior.net/chtenie-excel-fajjlov-s-pomoshhyu-phpexcel/" >Чтение Excel-файлов с помощью PHPExcel</a></li>
<li>Часто задаваемые вопросы по PHPExcel</li>
<li><a href="http://www.web-junior.net/kirillicheskie-formuly-v-phpexcel/" >Кириллические формулы в PHPExcel</a></li>
</ul><p><a target="_blank" href="http://www.web-junior.net/goto/http://www.rotaban.ru/?a=vyxyme"  target="_blank">Rotaban.ru</a> - биржа банерной рекламы
</p><p>© 2009-2012 <a href="http://www.web-junior.net" >web-junior.net</a>. Все права сохранены. Перепечатка материалов только в соответствии с <a href="http://www.web-junior.net/copyright" >копирайтом</a></p><img src="http://www.web-junior.net/?ak_action=api_record_view&id=234&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/web-junior/~4/wlUIDul-Zn0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.web-junior.net/chasto-zadavaemye-voprosy-po-phpexcel/feed/</wfw:commentRss>
		<slash:comments>74</slash:comments>
		<feedburner:origLink>http://www.web-junior.net/chasto-zadavaemye-voprosy-po-phpexcel/</feedburner:origLink></item>
	</channel>
</rss>

