<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tpoxa&#039;s blog &#187; PHP</title>
	<atom:link href="http://tpoxa.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://tpoxa.com</link>
	<description></description>
	<lastBuildDate>Sun, 19 Jun 2011 21:11:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Fully ajax website with Yii – Part 2</title>
		<link>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii-%e2%80%93-part-2/</link>
		<comments>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii-%e2%80%93-part-2/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 12:28:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=300</guid>
		<description><![CDATA[In previous post I described how to create simple full ajax web application without changing basically logic of the application. All changes was made to the layout, view and to the base classes. But as you maybe already noticed not everything works well. For example if you tried to sign-in -menu won&#8217;t be updated. In [...]]]></description>
			<content:encoded><![CDATA[<p>In previous post I described how to create simple full ajax web application without changing basically logic of the application. All changes was made to the layout, view and to the base classes.<br />
But as you maybe already noticed not everything works well. For example if you tried to sign-in -menu won&#8217;t be updated. In this short article I will show how to fix such kind of problems.<br/><br />
All data which ouputs for ajax request collecting with help of flash messages (built-in Yii functionality);<br/><br />
So basically if you wand update something on your page you have to set flash message with name <strong>updatedata</strong> wich contains an array with key value elements</p>
<p>Example   <strong>protected/controllers/SiteController.php</strong> ;  actionLoginMethod</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">                <span class="sy0">...</span>
                <span class="co1">// collect user input data</span>
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st_h">'LoginForm'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
			<span class="re0">$model</span><span class="sy0">-&gt;</span><span class="me1">attributes</span><span class="sy0">=</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st_h">'LoginForm'</span><span class="br0">&#93;</span><span class="sy0">;</span>
			<span class="co1">// validate user input and redirect to the previous page if valid</span>
                        <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$model</span><span class="sy0">-&gt;</span><span class="me1">validate</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$model</span><span class="sy0">-&gt;</span><span class="me1">login</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                               Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">setFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span>
 						<span class="st_h">'#mainmenu'</span><span class="sy0">=&gt;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">renderPartial</span><span class="br0">&#40;</span><span class="st_h">'/includes/menu'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>                   
                               <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">redirect</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">homeUrl</span><span class="br0">&#41;</span><span class="sy0">;</span>
                        <span class="br0">&#125;</span>
                <span class="sy0">...</span></pre></div></div></div></div></div></div></div>


<p>As you can see I put all mainmenu to separate file. Here is it&#8217;s content</p>
<p><strong>protected/views/includes/menu.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">	<span class="kw2">&lt;?php</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">widget</span><span class="br0">&#40;</span><span class="st_h">'zii.widgets.CMenu'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span>
			<span class="st_h">'items'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Home'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/index'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'About'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/page'</span><span class="sy0">,</span> <span class="st_h">'view'</span><span class="sy0">=&gt;</span><span class="st_h">'about'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Contact'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/contact'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Login'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/login'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'visible'</span><span class="sy0">=&gt;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">isGuest</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Logout ('</span><span class="sy0">.</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="sy0">.</span><span class="st_h">')'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/logout'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'visible'</span><span class="sy0">=&gt;!</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">isGuest</span><span class="br0">&#41;</span>
			<span class="br0">&#41;</span><span class="sy0">,</span>
		<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>For avoiding dublicating data I cut this code from main layout and put there <strong>renderPartial</strong> instead.</p>
<p><strong>protected/views/layout/main.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html"><pre class="de1">...
&lt;div id=&quot;mainmenu&quot; &gt;
		&lt;?php $this-&gt;renderPartial('/includes/menu');?&gt;
&lt;/div&gt;&lt;!-- mainmenu --&gt;
...</pre></div></div></div></div></div></div></div>


<p>So all blocks that might be updated via ajax better to move to includes folder. Now after sign -in main menu is changing.<br/></p>
<p>Now we have to add the same code to sign-out method</p>
<p><strong>protected/controllers/SiteController.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="sy0">...</span>
<span class="kw2">public</span> <span class="kw2">function</span> actionLogout<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">logout</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">setFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span>
 						<span class="st_h">'#mainmenu'</span><span class="sy0">=&gt;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">renderPartial</span><span class="br0">&#40;</span><span class="st_h">'/includes/menu'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">redirect</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">homeUrl</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="sy0">...</span></pre></div></div></div></div></div></div></div>


<p>
In that way you can update everyrhing you want on the webpage. Good luck!<br/>P.S. Suggestions are welcome!<br/> </p>
<p><a href="http://filin.impressweb.org" target="_blank"></p>
<h3>
Full ajax Yii webapp demo<br />
</h3>
<p></a></p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii-%e2%80%93-part-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Fully ajax website with Yii &#8212; Part 1</title>
		<link>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii/</link>
		<comments>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 11:07:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=264</guid>
		<description><![CDATA[This article will be suitable for who made fully ajax site like  Gmail with best PHP Framework &#8212; Yii. Main requirements are: All pages should be loaded via ajax. All forms should be submitted via ajax. Pages should be reachable by search engines. History support. Window title support Minimal additional code. Here  is my solution. [...]]]></description>
			<content:encoded><![CDATA[<p>This article will be suitable for who made fully ajax site like  Gmail with best <a href="http://www.yiiframework.com/" target="_blank">PHP Framework &#8212; Yii.</a><br />
Main requirements are:</p>
<ol>
<li>All pages should be loaded via ajax.</li>
<li>All forms should be submitted via ajax.</li>
<li>Pages should be reachable by search engines.</li>
<li>History support.</li>
<li>Window title support</li>
<li>Minimal additional code.</li>
</ol>
<p>Here  is my solution.<br />
I get for example simple web application which you can made with help of <a title="Quick start first app" href="http://www.yiiframework.com/doc/guide/1.0/en/quickstart.first-app" target="_blank">yiic utility</a>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="shell"><pre class="de1">cd /home/www/mywebsite
wget http://yii.googlecode.com/files/yii-1.1.7.r3135.tar.gz
gunzip yii-1.1.7.r3135.tar.gz
tar -xvf yii-1.1.7.r3135.tar
mv yii-1.1.7.r3135/framework/ ./
php framework/yiic.php webapp ./</pre></div></div></div></div></div></div></div>


<p>That is it your application has been created!</p>
<p>Add this code to the <strong>protected/views/layout/main.php</strong> file  before   &lt;/head&gt; tag.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">&lt;?php</span> 
		<span class="re0">$cs</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getClientScript</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  		<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerCoreScript</span><span class="br0">&#40;</span><span class="st_h">'jquery'</span><span class="br0">&#41;</span><span class="sy0">;</span>
  		<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerCoreScript</span><span class="br0">&#40;</span><span class="st_h">'bbq'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span>
&nbsp;
  	<span class="kw2">&lt;?php</span> 
<span class="re0">$script</span><span class="sy0">=</span><span class="co3">&lt;&lt;&lt;HTML
			function applychanges(obj) {
					for(k in obj) {
						jQuery(k).html(obj[k]);
					}	
			}
HTML</span><span class="sy0">;</span>
<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerScript</span><span class="br0">&#40;</span><span class="st_h">'applychanges'</span><span class="sy0">,</span> <span class="re0">$script</span><span class="sy0">,</span> CClientScript<span class="sy0">::</span><span class="me2">POS_HEAD</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span>	
&nbsp;
  	<span class="kw2">&lt;?php</span> 
<span class="re0">$script</span><span class="sy0">=</span><span class="co3">&lt;&lt;&lt;HTML
		var headline = $(&quot;#loading&quot;);
&nbsp;
		$(document).ajaxSend(function() {
    		headline
        	.attr(&quot;class&quot;, &quot;activity&quot;)
		});
&nbsp;
		$(document).ajaxStop(function() {
    		headline.removeAttr(&quot;class&quot;)
		 	});
HTML</span><span class="sy0">;</span>
<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerScript</span><span class="br0">&#40;</span><span class="st_h">'loading-indicator'</span><span class="sy0">,</span> <span class="re0">$script</span><span class="sy0">,</span> CClientScript<span class="sy0">::</span><span class="me2">POS_READY</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span>
&nbsp;
&nbsp;
&nbsp;
<span class="kw2">&lt;?php</span> 
<span class="re0">$script</span><span class="sy0">=</span><span class="co3">&lt;&lt;&lt;HTML
&nbsp;
  // handling links and forms
&nbsp;
  $(&quot;a:not(.direct)&quot;).live(&quot;click&quot;, function(){		  	
		    var href = $(this).attr( &quot;href&quot; );		    
		    if(href==&quot;#&quot;)
		    	return false;	
&nbsp;
		    $.bbq.pushState({ url: href});  
		    return false;
		  });
&nbsp;
&nbsp;
&nbsp;
		  $(&quot;form:not(.direct)&quot;).live(&quot;submit&quot;, function(){
		  	var url = &quot;&quot;;
&nbsp;
			var type = jQuery(this).attr(&quot;method&quot;);
&nbsp;
			if(type==undefined)
		  		type = &quot;get&quot;;
&nbsp;
		  	if(type==&quot;get&quot;) {
&nbsp;
		  		var action = jQuery(this).attr(&quot;action&quot;);
		  		if(action.indexOf(&quot;?&quot;)==-1)
		  			url = action + &quot;?&quot; + jQuery(this).serialize();
		  		else 
		  			url = action + &quot;&amp;&quot;	+ jQuery(this).serialize();
&nbsp;
		  		$.bbq.pushState({ url: url});
&nbsp;
		  	} else {
		  		jQuery.ajax({
					type:&quot;post&quot;,
					data:$(this).serialize(),
					url:jQuery(this).attr(&quot;action&quot;),
						success:applychanges
					});
				}	
&nbsp;
&nbsp;
		  	return false;
		  })
&nbsp;
&nbsp;
		   $(window).bind( &quot;hashchange&quot;, function(e) {	    
    		var url = $.bbq.getState( &quot;url&quot; );    		
&nbsp;
    		if(!url)
    			return;
&nbsp;
		    $(&quot;a&quot;).each(function(){
		      var href = $(this).attr( &quot;href&quot; );
&nbsp;
		      if ( href === url ) {
		      	$(this).addClass( &quot;current&quot; ); $(this).parent(&quot;li&quot;).addClass( &quot;active&quot; );
&nbsp;
		      } else {
		        $(this).removeClass( &quot;current&quot; ); $(this).parent(&quot;li&quot;).removeClass( &quot;active&quot; );
		      }
		    });
&nbsp;
				jQuery.ajax({
					type:&quot;get&quot;,
					url:url,
					success:applychanges
				});
&nbsp;
		  });
&nbsp;
		  $(window).trigger( &quot;hashchange&quot; );
&nbsp;
HTML</span><span class="sy0">;</span>
<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerScript</span><span class="br0">&#40;</span><span class="st_h">'ajaxlinks-and-forms'</span><span class="sy0">,</span> <span class="re0">$script</span><span class="sy0">,</span> CClientScript<span class="sy0">::</span><span class="me2">POS_READY</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>Next code should be added after &lt;body&gt; tag</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html"><pre class="de1">&lt;div id=&quot;loading&quot;&gt;&lt;?php echo Yii::t('main','Loading');?&gt;&lt;/div&gt;</pre></div></div></div></div></div></div></div>


<p>We&#8217;ve jus added javascript code which will handle all client side job<br/> Then we extend Base controller class &#171;Controller&#187;.</p>
<p><strong>protected/componens/Controller.php</strong>; Add new methods below:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">public</span> <span class="kw2">function</span> ajaxRender<span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$data</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'title'</span><span class="br0">&#93;</span> <span class="sy0">=</span> CHtml<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pageTitle</span><span class="br0">&#41;</span><span class="sy0">;</span>			
		<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
		Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> render<span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$params</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$data</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span> <span class="sy0">=</span> parent<span class="sy0">::</span><span class="me2">renderPartial</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$params</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'title'</span><span class="br0">&#93;</span> <span class="sy0">=</span> CHtml<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pageTitle</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>			
			<span class="kw1">echo</span> parent<span class="sy0">::</span><span class="me2">render</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$params</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="br0">&#125;</span>	
&nbsp;
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> redirect<span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
			<span class="re0">$url</span> <span class="sy0">=</span> <span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;
				jQuery.ajax({
					url:&quot;'</span><span class="sy0">.</span><span class="re0">$url</span><span class="sy0">.</span><span class="st_h">'&quot;,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
&nbsp;
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">redirect</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> refresh<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
			var url = $.bbq.getState( &quot;url&quot; );
&nbsp;
			jQuery.ajax({
					url:url,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">refresh</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p> Then you have to override some Request methods to support CWebUser redirects:</p>
<p>Put content below to new file with name <strong>protected/components/EHttpRequest.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
&nbsp;
<span class="kw2">class</span> EHttpRequest <span class="kw2">extends</span> CHttpRequest
<span class="br0">&#123;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> redirect<span class="br0">&#40;</span><span class="re0">$url</span><span class="sy0">,</span><span class="re0">$terminate</span><span class="sy0">=</span><span class="kw4">true</span><span class="sy0">,</span><span class="re0">$statusCode</span><span class="sy0">=</span><span class="nu0">302</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
			<span class="re0">$url</span> <span class="sy0">=</span> <span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;
				jQuery.ajax({
					url:&quot;'</span><span class="sy0">.</span><span class="re0">$url</span><span class="sy0">.</span><span class="st_h">'&quot;,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">redirect</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> refresh<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
			var url = $.bbq.getState( &quot;url&quot; );
&nbsp;
			jQuery.ajax({
					url:url,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp;
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">refresh</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p> Set new class name for request component in your main config <strong>protected/config/main.php</strong>
<p>It should looks like this</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">  <span class="sy0">....</span> 
  <span class="st_h">'components'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'user'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
			<span class="co1">// enable cookie-based authentication</span>
			<span class="st_h">'allowAutoLogin'</span><span class="sy0">=&gt;</span><span class="kw4">true</span><span class="sy0">,</span>
		<span class="br0">&#41;</span><span class="sy0">,</span>
&nbsp;
		<span class="st_h">'request'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
                     <span class="st_h">'class'</span><span class="sy0">=&gt;</span><span class="st_h">'EHttpRequest'</span><span class="sy0">,</span>
               <span class="br0">&#41;</span><span class="sy0">,</span>
&nbsp;
   <span class="sy0">....</span></pre></div></div></div></div></div></div></div>


<p> That&#8217;s all. Now you have full ajax simple web application.<br/><br />
Offcourse it has some limitations and issues, further I&#8217;ll extend this article.</p>
<p>P.S. I have forgotten to say about styles.<br/> Just add these lines to your css file.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="css"><pre class="de1"><span class="re0">#loading</span> <span class="br0">&#123;</span>
	<span class="kw1">position</span><span class="sy0">:</span><span class="kw2">fixed</span><span class="sy0">;</span>
	<span class="kw1">padding</span><span class="sy0">:</span><span class="re3">3px</span><span class="sy0">;</span>
	<span class="kw1">background</span><span class="sy0">:</span><span class="re0">#80B646</span><span class="sy0">;</span>
	<span class="kw1">color</span><span class="sy0">:</span><span class="re0">#fff</span><span class="sy0">;</span>
	<span class="kw1">display</span><span class="sy0">:</span><span class="kw2">none</span><span class="sy0">;</span>
	<span class="kw1">z-index</span><span class="sy0">:</span><span class="nu0">999</span><span class="sy0">;</span>
	<span class="kw1">right</span><span class="sy0">:</span><span class="nu0">0</span><span class="sy0">;</span>
	<span class="kw1">top</span><span class="sy0">:</span><span class="nu0">0</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="re0">#loading</span><span class="re1">.activity</span> <span class="br0">&#123;</span>
	<span class="kw1">display</span><span class="sy0">:</span><span class="kw2">block</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Gearman воркер для скачивания файлов по URl</title>
		<link>http://tpoxa.com/2010/12/03/gearman-vorker-dlya-skachivaniya-fajlov-po-url/</link>
		<comments>http://tpoxa.com/2010/12/03/gearman-vorker-dlya-skachivaniya-fajlov-po-url/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 11:13:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=203</guid>
		<description><![CDATA[Gearman, сервер организации и распределения задач, более подробно можно узнать на оффициальном сайте http://gearman.org/ Данную статью я пишу для тех кто уже знает для чего он нужен и как его устанавливать.  В одном из моих проектов gearman воркеры скачивают файлы по ссылке. Также они во время работы отсылают статусы о прогрессе. Вы можете запустить нужно [...]]]></description>
			<content:encoded><![CDATA[<p>Gearman, сервер организации и распределения задач, более подробно можно узнать на оффициальном сайте http://gearman.org/</p>
<p>Данную статью я пишу для тех кто уже знает для чего он нужен и как его устанавливать.  В одном из моих проектов gearman воркеры скачивают файлы по ссылке. Также они во время работы отсылают статусы о прогрессе. Вы можете запустить нужно количество воркеров в зависимости от доступного интернет канала и конфигурации серверов.</p>
<p>Собственно сам класс воркера</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
&nbsp;
<span class="kw2">class</span> FetchWorker <span class="kw2">extends</span> GearmanWorker <span class="br0">&#123;</span>
&nbsp;
	<span class="kw2">public</span> <span class="re0">$job</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$downloaded</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$tmp_file_name</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$tmp_file_pointer</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$download_size</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$username</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$pswd</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$url</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$referrer</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$last_part_time</span><span class="sy0">;</span>
&nbsp;
&nbsp;
	<span class="kw2">private</span> <span class="kw2">function</span> resetvalues<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
&nbsp;
	<span class="br0">&#125;</span>
	<span class="kw2">private</span> <span class="kw2">function</span> closefp<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="sy0">@</span><span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">private</span>	<span class="kw2">function</span> remote_filesize<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>	
		<span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$ch</span> <span class="sy0">=</span> <span class="kw3">curl_init</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_NOBODY<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
	    <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_FOLLOWLOCATION<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
	    <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_REFERER<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_USERPWD<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="re0">$ok</span> <span class="sy0">=</span> <span class="kw3">curl_exec</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw3">curl_close</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$head</span> <span class="sy0">=</span> <span class="kw3">ob_get_contents</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">ob_end_clean</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$regex</span> <span class="sy0">=</span> <span class="st_h">'/Content-Length:\s([0-9].+?)\s/'</span><span class="sy0">;</span>
		<span class="re0">$count</span> <span class="sy0">=</span> <span class="kw3">preg_match</span><span class="br0">&#40;</span><span class="re0">$regex</span><span class="sy0">,</span> <span class="re0">$head</span><span class="sy0">,</span> <span class="re0">$matches</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">return</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$matches</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$matches</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
&nbsp;
	<span class="kw2">function</span> fetchfile<span class="br0">&#40;</span><span class="re0">$job</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span> <span class="sy0">=</span> <span class="re0">$job</span><span class="sy0">;</span>
		<span class="re0">$workload</span><span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">workload</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">echo</span> <span class="st0">&quot;Received job: &quot;</span> <span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">handle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$args</span> <span class="sy0">=</span> <span class="kw3">json_decode</span><span class="br0">&#40;</span><span class="re0">$workload</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">tmp_file</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">print</span> <span class="st0">&quot;Url and tmp_file are required&quot;</span><span class="sy0">;</span>
			<span class="kw1">return</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span> <span class="sy0">=</span> <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">password</span><span class="br0">&#41;</span><span class="br0">&#41;</span>? <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">password</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="br0">&#41;</span><span class="br0">&#41;</span>? <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">referrer</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">referrer</span> <span class="sy0">:</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">remote_filesize</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="sy0">==</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">print</span> <span class="st0">&quot;Can't get size header of the remote file&quot;</span><span class="sy0">;</span>
			<span class="kw1">return</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_name</span> <span class="sy0">=</span> <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">tmp_file</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_name</span><span class="sy0">,</span> <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span><span class="br0">&#41;</span>
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">fetchurl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw1">else</span> <span class="br0">&#123;</span>
				<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;Couldn't open tmp file&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">return</span><span class="sy0">;</span>
			 <span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> percent<span class="br0">&#40;</span><span class="re0">$num_amount</span><span class="sy0">,</span> <span class="re0">$num_total</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="re0">$count1</span> <span class="sy0">=</span> <span class="re0">$num_amount</span> <span class="sy0">/</span> <span class="re0">$num_total</span><span class="sy0">;</span>
		<span class="re0">$count2</span> <span class="sy0">=</span> <span class="re0">$count1</span> <span class="sy0">*</span> <span class="nu0">100</span><span class="sy0">;</span>
		<span class="re0">$count</span> <span class="sy0">=</span> <span class="kw3">ceil</span><span class="br0">&#40;</span><span class="re0">$count2</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw1">return</span> <span class="re0">$count</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> fetchurl<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="re0">$ch</span> <span class="sy0">=</span> <span class="kw3">curl_init</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_NOPROGRESS<span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_WRITEFUNCTION<span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'fetchcallback'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_REFERER<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_FOLLOWLOCATION<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_USERPWD<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HEADERFUNCTION<span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'readHeader'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_exec</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_close</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> readHeader<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> <span class="re0">$headers_text</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">return</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$headers_text</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> fetchcallback<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> <span class="re0">$str</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="re0">$length</span> <span class="sy0">=</span>  <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$str</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span> <span class="sy0">+=</span><span class="re0">$length</span><span class="sy0">;</span>
			<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span><span class="sy0">,</span><span class="re0">$str</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">print</span> <span class="st0">&quot;Can't write to tmp file<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
				<span class="kw1">return</span><span class="sy0">;</span>
			<span class="br0">&#125;</span> 
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span> <span class="sy0">&gt;=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">sendStatus</span><span class="br0">&#40;</span><span class="nu0">100</span><span class="sy0">,</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span>
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">sendComplete</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">closefp</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>			
				 <span class="kw1">print</span> <span class="st0">&quot;100% Done<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>	
				 <span class="kw1">return</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>		
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">last_part_time</span> <span class="sy0">&gt;</span> <span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="co1">// 2 seconds</span>
			<span class="kw1">return</span> <span class="re0">$length</span><span class="sy0">;</span>
&nbsp;
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">last_part_time</span> <span class="sy0">=</span> <span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">sendStatus</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">percent</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="br0">&#41;</span> <span class="sy0">,</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">print</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">percent</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;%...&quot;</span><span class="sy0">;</span>
			<span class="kw1">return</span> <span class="re0">$length</span><span class="sy0">;</span>	
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Как видите для скачивания используется curl.<br />
Далее прилагаю код демона, который поднимает вышеуказанный класс. У меня это реализовано как консольная комманда Yii фреймворка, но вы можете реализовать демон как угодно.</p>
<p>Версия с использованием Yii</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
<span class="co1">//FetchCommand.php |  placed in commands folder of Yii protected dir</span>
<span class="kw2">class</span> FetchCommand <span class="kw2">extends</span> CConsoleCommand
<span class="br0">&#123;</span>
	<span class="kw2">public</span> <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
&nbsp;
		<span class="re0">$worker</span> <span class="sy0">=</span> <span class="kw2">new</span> FetchWorker<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addFunction</span><span class="br0">&#40;</span><span class="st0">&quot;fetchfile&quot;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">,</span> <span class="st0">&quot;fetchfile&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
&nbsp;
&nbsp;
		<span class="kw1">while</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
		  <span class="kw1">print</span> <span class="st0">&quot;Waiting for job...<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp;
		  <span class="re0">$ret</span><span class="sy0">=</span> <span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">work</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">returnCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> GEARMAN_SUCCESS<span class="br0">&#41;</span>
		    <span class="kw1">break</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Standalone версия</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">&lt;?php</span> 
<span class="co1">//worker.php</span>
&nbsp;
		<span class="re0">$worker</span> <span class="sy0">=</span> <span class="kw2">new</span> FetchWorker<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addFunction</span><span class="br0">&#40;</span><span class="st0">&quot;fetchfile&quot;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">,</span> <span class="st0">&quot;fetchfile&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
&nbsp;
&nbsp;
		<span class="kw1">while</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
		  <span class="kw1">print</span> <span class="st0">&quot;Waiting for job...<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp;
		  <span class="re0">$ret</span><span class="sy0">=</span> <span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">work</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">returnCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> GEARMAN_SUCCESS<span class="br0">&#41;</span>
		    <span class="kw1">break</span><span class="sy0">;</span>
		<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Запуск standalone версии</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="shell"><pre class="de1">&nbsp;
php worker.php</pre></div></div></div></div></div></div></div>


<p>Запус версии с использованием Yii</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="shell"><pre class="de1">php dispatch.php Fetch</pre></div></div></div></div></div></div></div>


<p>Ну и наконец чтобы статья была исчерпывающей я приведу скрипт (точку входа) dispatch.php для Yii. В принципе он очень похож на обычный index.php  для Yii application</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/framework/yii.php'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$config</span><span class="sy0">=</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/protected/config/console.php'</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// remove the following line when in production mode</span>
<span class="kw3">defined</span><span class="br0">&#40;</span><span class="st_h">'YII_DEBUG'</span><span class="br0">&#41;</span> or <span class="kw3">define</span><span class="br0">&#40;</span><span class="st_h">'YII_DEBUG'</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
Yii<span class="sy0">::</span><span class="me2">createConsoleApplication</span><span class="br0">&#40;</span><span class="re0">$config</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Нужно только создать отдельный конфиг для консоли. Как минимум скопируйте содержимое main config<br />
Все, будем считать что наши демоны <img src='http://tpoxa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  запущены и ждут камманды от gearman jоb сервера чтобы начать работу.</p>
<p>Даем комманду job серверу</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
<span class="co1">//index.php</span>
&nbsp;
<span class="co2"># Create our client object.
</span><span class="re0">$client</span><span class="sy0">=</span> <span class="kw2">new</span> GearmanClient<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co2"># Add default server (localhost).
</span><span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'handle'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
	<span class="re0">$handle</span> <span class="sy0">=</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'handle'</span><span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="re0">$status</span> <span class="sy0">=</span> <span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">jobStatus</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$status</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw3">die</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$params</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'referrer'</span><span class="sy0">=&gt;</span><span class="st_h">''</span><span class="sy0">,</span>
		<span class="st_h">'tmp_file'</span><span class="sy0">=&gt;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/test.file'</span><span class="sy0">,</span>
		<span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="st_h">'http://dl1.overload.in.ua/files/2050/SOD3z9jF3LiXdxO/file.zip'</span><span class="sy0">,</span>
		<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$params</span> <span class="sy0">=</span> <span class="kw3">json_encode</span><span class="br0">&#40;</span><span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$handle</span> <span class="sy0">=</span> <span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">doBackground</span><span class="br0">&#40;</span><span class="st0">&quot;fetchfile&quot;</span><span class="sy0">,</span> <span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Location: index.php?handle='</span><span class="sy0">.</span><span class="kw3">urlencode</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>В примере идет подключение к job серверу, дается фоновая команда с параметрами. Далее работа скрипта заканчивается и идет редирект с параметром именем задачи job-handle<br />
Далее по этому параметру скрипт может следить за прогрессом выполнения именно этого таска.</p>
<p>Конец.</p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2010/12/03/gearman-vorker-dlya-skachivaniya-fajlov-po-url/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа с сессиями в плагинах WordPress</title>
		<link>http://tpoxa.com/2010/10/20/using-sessions-in-wordpress-plugins/</link>
		<comments>http://tpoxa.com/2010/10/20/using-sessions-in-wordpress-plugins/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 19:29:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=185</guid>
		<description><![CDATA[Для разработчиков под WordPress может быть полезно. Запускаем PHP сессию из плагина &#160; function my_plugin_init&#40;&#41; &#123; if &#40;!session_id&#40;&#41;&#41; session_start&#40;&#41;; &#160; &#125; &#160; add_action&#40;'init','my_plugin_init'&#41;; После этого можно свободно пользоваться суперглобальным массивом $_SESSION]]></description>
			<content:encoded><![CDATA[<p>Для разработчиков под WordPress может быть полезно. Запускаем PHP сессию из плагина</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">function</span> my_plugin_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">session_id</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="kw3">session_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span>
&nbsp;
add_action<span class="br0">&#40;</span><span class="st_h">'init'</span><span class="sy0">,</span><span class="st_h">'my_plugin_init'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>После этого можно свободно пользоваться суперглобальным массивом $_SESSION</p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2010/10/20/using-sessions-in-wordpress-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Columns for CListView</title>
		<link>http://tpoxa.com/2010/08/13/columns-for-clistview/</link>
		<comments>http://tpoxa.com/2010/08/13/columns-for-clistview/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 08:11:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=148</guid>
		<description><![CDATA[В составе лучшего PHP фреймворка в мире &#8212; Yii есть класс для отображения списка элементов &#8212; CListView. К сожалению он не отображает список в несколько колонок, для одного из моих проектов понадобилось именно это. Представляю ColumnListView &#60;?php &#160; Yii::import&#40;'zii.widgets.CListView'&#41;; &#160; class ColumnListView extends CListView &#123; &#160; public $columns = array&#40;&#34;leftblock&#34;, &#34;midblock&#34;, &#34;rightblock&#34;&#41;; &#160; //@override) public [...]]]></description>
			<content:encoded><![CDATA[<p>В составе <a href="http://www.yiiframework.com/" target="_blank">лучшего PHP фреймворка в мире &#8212; Yii</a> есть класс для отображения списка элементов &#8212; CListView. К сожалению он не отображает список в несколько колонок, для одного из моих проектов понадобилось именно это.</p>
<p>Представляю ColumnListView<br />
<span id="more-148"></span></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
&nbsp;
Yii<span class="sy0">::</span><span class="me2">import</span><span class="br0">&#40;</span><span class="st_h">'zii.widgets.CListView'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw2">class</span> ColumnListView <span class="kw2">extends</span> CListView
<span class="br0">&#123;</span>
&nbsp;
	<span class="kw2">public</span> <span class="re0">$columns</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;leftblock&quot;</span><span class="sy0">,</span> <span class="st0">&quot;midblock&quot;</span><span class="sy0">,</span> <span class="st0">&quot;rightblock&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">//@override)</span>
	<span class="kw2">public</span> <span class="kw2">function</span> renderItems<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="re0">$y</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">columns</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
			<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">columns</span> <span class="kw1">as</span> <span class="re0">$column</span><span class="br0">&#41;</span>
			<span class="br0">&#123;</span>			
				<span class="kw1">echo</span> CHtml<span class="sy0">::</span><span class="me2">openTag</span><span class="br0">&#40;</span><span class="st_h">'div'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'class'</span><span class="sy0">=&gt;</span><span class="st_h">'column '</span><span class="sy0">.</span><span class="re0">$column</span><span class="sy0">,</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
				<span class="re0">$columns</span> <span class="sy0">=</span> <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">columns</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
				<span class="re0">$data</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dataProvider</span><span class="sy0">-&gt;</span><span class="me1">getData</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">&gt;</span><span class="nu0">0</span><span class="br0">&#41;</span>
				<span class="br0">&#123;</span>
					<span class="re0">$owner</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getOwner</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
					<span class="re0">$render</span><span class="sy0">=</span><span class="re0">$owner</span> instanceof CController ? <span class="st_h">'renderPartial'</span> <span class="sy0">:</span> <span class="st_h">'render'</span><span class="sy0">;</span>
					<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$data</span> <span class="kw1">as</span> <span class="re0">$i</span><span class="sy0">=&gt;</span><span class="re0">$item</span><span class="br0">&#41;</span>
					<span class="br0">&#123;</span>	
						<span class="kw1">if</span><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">+</span> <span class="br0">&#40;</span><span class="re0">$columns</span> <span class="sy0">-</span> <span class="re0">$y</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="re0">$columns</span> <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
						<span class="br0">&#123;</span>
							<span class="re0">$data</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">viewData</span><span class="sy0">;</span>
							<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'index'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$i</span><span class="sy0">;</span>
							<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'data'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$item</span><span class="sy0">;</span>
							<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'widget'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">;</span>
							<span class="re0">$owner</span><span class="sy0">-&gt;</span><span class="re0">$render</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">itemView</span><span class="sy0">,</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
						<span class="br0">&#125;</span>
					<span class="br0">&#125;</span>
				<span class="br0">&#125;</span>
				<span class="kw1">else</span>
					<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">renderEmptyText</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">echo</span> CHtml<span class="sy0">::</span><span class="me2">closeTag</span><span class="br0">&#40;</span><span class="st_h">'div'</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="re0">$y</span><span class="sy0">++;</span>
			<span class="br0">&#125;</span>	
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Использование:</p>
<p>Скопируйте файл ColumnListView.php в папку protected/components.</p>
<p>В том месте где нужно вывести список должен выполнится примерно такой код:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">&lt;?php</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">widget</span><span class="br0">&#40;</span><span class="st_h">'application.components.ColumnListView'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'dataProvider'</span><span class="sy0">=&gt;</span><span class="re0">$dataProvider</span><span class="sy0">,</span>
		<span class="st_h">'itemView'</span><span class="sy0">=&gt;</span><span class="st_h">'_view'</span><span class="sy0">,</span>
		<span class="st_h">'columns'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;one&quot;</span><span class="sy0">,</span><span class="st0">&quot;two&quot;</span><span class="sy0">,</span><span class="st0">&quot;three&quot;</span><span class="sy0">,</span><span class="st0">&quot;four&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span>
	<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>Все наши элементы будут выведены в четырех колонках.<br />
Обратите внимание, добавился новый параметр columns &#8212; массив, каждый элемент которого это див с одноименным классом. Правильное отображение этих дивов вам нужно обеспечить самостоятельно.</p>
<p><a href="http://overload.in.ua/1787" target="_blank">ColumnListView.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2010/08/13/columns-for-clistview/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Видео чат своими руками на FreeBsd</title>
		<link>http://tpoxa.com/2009/01/06/videochat/</link>
		<comments>http://tpoxa.com/2009/01/06/videochat/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 22:40:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Сайты]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=58</guid>
		<description><![CDATA[Всем привет. Однажды задался сделать видео чат. Знаний во флеш у меня маловато поэтому решил использовать готовый. В качестве сервера выбрал бесплатный флеш сервер RED5  (http://osflash.org/red5) Сам видеочат взял c http://www.flashcoms.com/  Их триальный чат позволяет работать максимум с пятью  онлайнерами. В приниципе настроив  RED5 на своем сервере вы можете использовать и http://www.red5chat.com/ &#8212; он более [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет.</p>
<p>Однажды задался сделать видео чат.</p>
<p><span id="more-58"></span></p>
<p>Знаний во флеш у меня маловато поэтому решил использовать готовый.</p>
<p>В качестве сервера выбрал бесплатный флеш сервер RED5  (http://osflash.org/red5)</p>
<p>Сам видеочат взял c http://www.flashcoms.com/  Их триальный чат позволяет работать максимум с пятью  онлайнерами.</p>
<p>В приниципе настроив  RED5 на своем сервере вы можете использовать и http://www.red5chat.com/ &#8212; он более сложен в установке, функционал победнее зато бесплатен.</p>
<p>Так как RED5 &#8212; это tomcat с своими сервлетами то на сервере вам нужна JAVA.</p>
<p>Как устанавливать Java на freebsd нашел в рунете.</p>
<p>Установка red5 заключается в скачивании архива в какую либо папку и  его распокавка.</p>
<p>Запуск RED5 .</p>
<p>sh /usr/local/distfiles/red5/red5.sh</p>
<p>(/usr/local/distfiles/  -папка куда я распаковал архив с red5)</p>
<p>Установка  видеочата от flashcoms состоит из двух частей. Добавление в tomcat (папка  /usr/local/distfiles/red5/webapps)</p>
<p>сервлета который идет с flashcoms видеочатом.   (у меня это папка flashcoms_5_1_videochat)</p>
<p>после копирования вы должны перезапустить RED5</p>
<p>По сути все. Осталось разместить html и флеш файлы которые идут с видеочатом в www папке.</p>
<p><a href="http://videochat.in.ua" target="_blank">Пример работы видеочата </a></p>
<p>Будут вопросы пишите в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2009/01/06/videochat/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Проблемы с кодировкой WordPress 2.7</title>
		<link>http://tpoxa.com/2008/12/20/problemi_s_kodirovkoy/</link>
		<comments>http://tpoxa.com/2008/12/20/problemi_s_kodirovkoy/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 08:01:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=51</guid>
		<description><![CDATA[Заметил что в некотрых случаях все AJAX ответы в админке возвращаются с неверной кодировкой. Изза этого все надписи кирилицей повреждены. Это происходит тогда когда дефолтовая кдировка www хоста отличается от кодировки установленой в wordpress. Лечится это маленьким изменением в wp-includes/admin-ajax.php Нужно подправить метод send() объекта WP_Ajax_Response, привести его к такому виду. function send&#40;&#41; &#123; header&#40;'Content-Type: [...]]]></description>
			<content:encoded><![CDATA[<p>Заметил что в некотрых случаях все AJAX ответы в админке возвращаются с неверной кодировкой. Изза этого все надписи кирилицей повреждены.</p>
<p>Это происходит тогда когда дефолтовая кдировка www хоста отличается от кодировки установленой в wordpress.</p>
<p><span id="more-51"></span>Лечится это маленьким изменением в wp-includes/admin-ajax.php</p>
<p>Нужно подправить метод send() объекта WP_Ajax_Response, привести его к такому виду.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">function</span> send<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-Type: text/xml; charset='</span> <span class="sy0">.</span> get_option<span class="br0">&#40;</span><span class="st_h">'blog_charset'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">echo</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
<span class="kw1">foreach</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>responses <span class="kw1">as</span> <span class="re0">$response</span> <span class="br0">&#41;</span>
<span class="kw1">echo</span> <span class="re0">$response</span><span class="sy0">;</span>
<span class="kw1">echo</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>вот и все <img src='http://tpoxa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2008/12/20/problemi_s_kodirovkoy/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>market.yandex.ru парсер</title>
		<link>http://tpoxa.com/2008/09/09/marketyandexru-parser/</link>
		<comments>http://tpoxa.com/2008/09/09/marketyandexru-parser/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 18:48:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XSLT]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=28</guid>
		<description><![CDATA[Недавно появилась задача парсить странички. Точнее market.yandex.ru. Собрать все описания в готовом к вставке в базу виде а также доступные изображения к товару. Исторически сложилось что с регулярками у меня хуже чем с XSLT. Все хорошо но маркет не дает валидный код и парсить его напрямую у меня не получилось. На помощь пришел Tidy. &#60;?php [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно появилась задача парсить странички. Точнее market.yandex.ru.</p>
<p>Собрать все описания в готовом к вставке в базу виде а также доступные изображения к товару.</p>
<p>Исторически сложилось что с регулярками у меня хуже чем с XSLT.</p>
<p>Все хорошо но маркет не дает валидный код и парсить его напрямую у меня не получилось.</p>
<p>На помощь пришел Tidy.</p>
<p><span id="more-28"></span></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="re0">$YMI</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'ymid'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="kw3">urldecode</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'ymid'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">:</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span> <span class="co1">// переменная хранит адрес страницы с описанием на Яндексе</span>
<span class="re0">$content</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="re0">$YMI</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// $content = iconv(&quot;CP1251&quot;, &quot;UTF-8//IGNORE&quot;, $content); // это строка ненужна така Яндекс маркет перешел на UTF-8</span>
&nbsp;
<span class="re0">$config</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span>
<span class="st0">&quot;indent&quot;</span>        <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
<span class="st0">&quot;output-xml&quot;</span>    <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
<span class="st0">&quot;wrap&quot;</span>          <span class="sy0">=&gt;</span> <span class="nu0">200</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$tidy</span> <span class="sy0">=</span> <span class="kw2">new</span> tidy<span class="sy0">;</span>
<span class="re0">$tidy</span><span class="sy0">-&gt;</span><span class="me1">parseString</span><span class="br0">&#40;</span><span class="re0">$content</span><span class="sy0">,</span> <span class="re0">$config</span><span class="sy0">,</span> <span class="st0">&quot;utf8&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$tidy</span><span class="sy0">-&gt;</span><span class="me1">cleanRepair</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$xml</span><span class="sy0">=</span><span class="kw3">simplexml_load_string</span> <span class="br0">&#40;</span><span class="re0">$tidy</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$groups</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelProperties<span class="st0">&quot;]//tr/td[@class=&quot;</span>title<span class="st0">&quot;]/b&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$strings</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelProperties<span class="st0">&quot;]//tr/td[@class=&quot;</span>title<span class="st0">&quot;]/b|//table[@class=\'modelProperties\']//td[@class=\'label\']/span/text()|//table[@class=\'modelProperties\']//tr/td[position()=2]/text()&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$results_groups</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$results</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$i</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
<span class="re0">$GI</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
<span class="co1">//print_r($strings);</span>
<span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">&lt;</span><span class="kw3">sizeof</span> <span class="br0">&#40;</span><span class="re0">$strings</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="re0">$groups</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="re0">$GI</span><span class="sy0">=</span><span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="re0">$results_groups</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$results_groups</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">;</span>
<span class="re0">$results</span><span class="br0">&#91;</span><span class="re0">$GI</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$i</span><span class="sy0">=</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">3</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="kw1">else</span>
<span class="br0">&#123;</span>
<span class="re0">$results</span><span class="br0">&#91;</span><span class="re0">$GI</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$i</span><span class="sy0">=</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">2</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$photos</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelpict<span class="st0">&quot;]//a/@href&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$photos</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="re0">$photos</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelpict<span class="st0">&quot;]//img/@src&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">foreach</span><span class="br0">&#40;</span> <span class="re0">$photos</span> <span class="kw1">as</span> <span class="re0">$photo</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;img src=<span class="es1">\&quot;</span>&quot;</span><span class="sy0">;</span>
<span class="kw1">print</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re0">$photo</span><span class="sy0">;</span>
<span class="kw1">print</span> <span class="st0">&quot;<span class="es1">\&quot;</span> /&gt;&quot;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">print</span> <span class="st0">&quot;&lt;hr /&gt;&lt;table&gt;&lt;caption&gt;Технические характеристики&lt;/caption&gt;&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$results_groups</span> <span class="kw1">as</span> <span class="re0">$k</span><span class="sy0">=&gt;</span><span class="re0">$v</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;tr&gt;&lt;td colspan=<span class="es1">\&quot;</span>2<span class="es1">\&quot;</span> align=<span class="es1">\&quot;</span>center<span class="es1">\&quot;</span> style=<span class="es1">\&quot;</span>background-color:#ccc<span class="es1">\&quot;</span>&gt;&quot;</span><span class="sy0">.</span><span class="re0">$v</span><span class="sy0">.</span><span class="st0">&quot;&lt;/td&gt;&lt;/tr&gt;&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#91;</span><span class="re0">$k</span><span class="br0">&#93;</span> <span class="kw1">as</span> <span class="re0">$arr</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;tr&gt;&lt;td&gt;&quot;</span><span class="sy0">.</span><span class="re0">$arr</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&lt;/td&gt;&lt;td&gt;&quot;</span><span class="sy0">.</span><span class="re0">$arr</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&lt;/td&gt;&lt;/tr&gt;&quot;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;/table&gt;&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2008/09/09/marketyandexru-parser/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Downloader на PHP с поддержкой докачки.</title>
		<link>http://tpoxa.com/2008/08/29/peardownloader/</link>
		<comments>http://tpoxa.com/2008/08/29/peardownloader/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 09:35:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=21</guid>
		<description><![CDATA[В свое время столкнулся с проблемой когда нужно скрыть реальный URL скачиваемого файла.Обычным выходом из такой ситуации есть следующее. PHP читает содержимое файла. Выводит соответствующие заголовки файла (headers)  (имя файла, размер и тип ) и печатает содержимое на страницу. Пример &#60;?php $filename=&#34;/some_secret_folder/file.mp3&#34;; header&#40;&#34;Content-Type: audio/mpeg&#34;&#41;; header&#40;&#34;Content-Disposition: attachment; filename=&#34;.basename&#40;$filename&#41;&#41;; header&#40;&#34;Content-Length: &#34;. filesize&#40;$filename&#41;&#41;; readfile&#40;$filename&#41;; ?&#62; Где $filename путь [...]]]></description>
			<content:encoded><![CDATA[<p>В свое время столкнулся с проблемой когда нужно скрыть реальный URL скачиваемого файла.Обычным выходом из такой ситуации есть следующее.<span id="more-21"></span></p>
<p>PHP читает содержимое файла.</p>
<p>Выводит соответствующие заголовки файла (headers)  (имя файла, размер и тип )  и печатает содержимое на страницу.</p>
<p>Пример</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span>
<span class="re0">$filename</span><span class="sy0">=</span><span class="st0">&quot;/some_secret_folder/file.mp3&quot;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: audio/mpeg&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Disposition: attachment; filename=&quot;</span><span class="sy0">.</span><span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Length: &quot;</span><span class="sy0">.</span> <span class="kw3">filesize</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">readfile</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>Где $filename путь к файлу. У данного способа есть несколько минусов. Один из них не поддерживается докачка. Для того чтобы  скрипт поддерживал докачку он должен отдавать кусок тела файла (header(Content-Range:xxx)) в зависимости от полученого заголовка ($_SERVER["HTTP_RANGE"]). Конечно это можно было написать самому но я решил воспользоваться готовым решением на PEAR</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="sy0">&lt;</span> ?php
<span class="re0">$filename</span><span class="sy0">=</span><span class="st0">&quot;/some_secret_folder/file.mp3&quot;</span><span class="sy0">;</span>
<span class="kw3">ini_set</span><span class="br0">&#40;</span><span class="st_h">'include_path'</span><span class="sy0">,</span> <span class="kw3">ini_get</span><span class="br0">&#40;</span><span class="st_h">'include_path'</span><span class="br0">&#41;</span><span class="sy0">.</span>PATH_SEPARATOR <span class="sy0">.</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'DOCUMENT_ROOT'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> ‘pear<span class="sy0">/</span>PEAR’<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// добавляем в пути инклудов папку куда установлен на сайте PEAR</span>
<span class="kw1">require</span><span class="br0">&#40;</span>”HTTP<span class="sy0">/</span>Download<span class="sy0">.</span>php”<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Подключаем  HTTP_Download</span>
<span class="re0">$dl</span> <span class="sy0">=</span> <span class="kw2">&amp;new</span> HTTP_Download<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Создаем экземпляр класса</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">setFile</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">//указываем какой файл</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">setContentDisposition</span><span class="br0">&#40;</span>HTTP_DOWNLOAD_ATTACHMENT<span class="sy0">,</span> <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Устанавливаем имя с которым будет скачиваться файл</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">setContentType</span><span class="br0">&#40;</span>”audio<span class="sy0">/</span>mpeg”<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Устанавливаем тип файла</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">send</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2008/08/29/peardownloader/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ajax uploader</title>
		<link>http://tpoxa.com/2008/08/28/ajax-uploader/</link>
		<comments>http://tpoxa.com/2008/08/28/ajax-uploader/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 01:34:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mootools]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=5</guid>
		<description><![CDATA[Недавно понадобилось в галерее сделать аплоад. После поисков ajax uploader&#8217;a решил сделать свой.Недавно понадобилось в галерее сделать аплоад. После поисков ajax uploader&#8217;a решил сделать свой позаимствовав некоторые запчасти от Fancy Upload (Кстати только у меня его индикатор движется как то непропорционально?) Как и Digitarald я  применил  mootools фреймворк. Серверная часть позаимствована от Steve Miles ajax [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно понадобилось в галерее сделать аплоад. После поисков ajax uploader&#8217;a решил сделать свой.<span id="more-5"></span>Недавно понадобилось в галерее сделать аплоад. После поисков ajax uploader&#8217;a решил сделать свой позаимствовав некоторые запчасти от <a href="http://digitarald.de/project/fancyupload/" target="_blank">Fancy Upload</a> (Кстати только у меня его индикатор движется как то непропорционально?)</p>
<p>Как и Digitarald я  применил  <a href="http://mootools.net" target="_blank">mootools</a> фреймворк.</p>
<p>Серверная часть позаимствована от <a href="http://www.srmiles.com/freestuff/ajax_file_uploader/" target="_blank">Steve Miles ajax uploader</a> <img src='http://tpoxa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Требования от хостинга:</p>
<ol>
<li>Выполнение cgi скриптов.</li>
<li>Установленный Perl.</li>
<li>PHP (4 или 5)</li>
</ol>
<p>Возможности:</p>
<ol>
<li>Закачивать большие файлы на сервер. ( Вы не ограничены директивами <em><em>max_post_size </em><em></em><em></em></em>или <em>max_upload_size</em> и т.п.)</li>
<li>Во время загрузки файла отображается индикатор прогресса. (Также возможно отображать скорость и расчетное время конца загрузки)</li>
<li>Сделать ajax аплоад опциональным. Тоесть пользователь может выбрать для себя режим загрузки.</li>
</ol>
<p>Данный скрипт удобно применять в система где уже есть аплоад и хотелось бы сделать прогрессбар с минимумом прилагаемых усилий.</p>
<p>Я сделал пример на котором можно разобраться как это работает. Также этот пример можно полностью скачать со всей иерархией папок и нужными файлами.</p>
<p>Пример <a href="http://upload.tpoxa.com" target="_blank">upload.tpoxa.com</a></p>
<p>Первый вариант &#8212; обычный.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html"><pre class="de1">&lt;form id=&quot;myaupload&quot; action=&quot;postscript.php&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
&nbsp;
&lt;fieldset&gt;
&lt;legend&gt;Закачайте файл&lt;/legend&gt;
&nbsp;
&lt;label for=&quot;filename&quot;&gt;Название файла&lt;/label&gt;
&lt;input id=&quot;filename&quot; name=&quot;filename&quot; size=&quot;40&quot; type=&quot;text&quot; /&gt;
&nbsp;
&lt;label for=&quot;file&quot;&gt;Файл&lt;/label&gt;
&lt;input id=&quot;file&quot; name=&quot;file&quot; type=&quot;file&quot; /&gt;
&nbsp;
&lt;input name=&quot;goupload&quot; type=&quot;submit&quot; /&gt;
&lt;/fieldset&gt;
&nbsp;
&lt;/form&gt;</pre></div></div></div></div></div></div></div>


<p>Скрипт postscript.php отображает значения суперглобальных массивов $_POST и $_FILES<br />
Обычно мы используем функцию <a href="http://www.php.net/move_uploaded_file" target="_blank">move_uploaded_file</a> котороя переместит файл в папку для постоянного хранения</p>
<p>В случае же &#171;аякс загрузки&#187; это делает наш cgi скрипт который закачивает файл сначала во временное хранилище потом в любую папку которую мы укажем.<br />
В результате postscript.php не получит никаких данных в $_FILES но зато в $_POST будет уже локальный (размещенный на сервере) адрес загружаемого файла.<br />
В общем советую поиграться на <a href="http://upload.tpoxa.com" target="_blank">примере</a>.</p>
<p>Для того чтобы форма стала &#171;аяксовой&#187; нужно подключить в странице файлы аплоадера и выполнить такой код</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="javascript"><pre class="de1"><span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span>
 window.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">'domready'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw2">var</span> UploadeManagerObj <span class="sy0">=</span> <span class="kw2">new</span> UploadeManager<span class="br0">&#40;</span><span class="st0">'myaupload'</span><span class="sy0">,</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 <span class="br0">&#125;</span><span class="br0">&#41;</span>
<span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span></pre></div></div></div></div></div></div></div>


<p>&#171;myaupload&#187; &#8212; Это ID нашей формы.</p>
<p>Настройка.</p>
<p>Настройка сводится к заливке всех файлов на сервер и установки прав на них.</p>
<p>Папки tmp и upload должны быть записуемыми для PHP.  CHMOD 777</p>
<p>У /cgi-bin/upload.cgi &#8212; должны быть права для запуска CHMOD 755</p>
<p>Для отладки советую включить DEBUG режим при котором iframe в который &#171;сабмитится&#187; форма будет видим</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="javascript"><pre class="de1"><span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span>
 window.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">'domready'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw2">var</span> UploadeManagerObj <span class="sy0">=</span> <span class="kw2">new</span> UploadeManager<span class="br0">&#40;</span><span class="st0">'myaupload'</span><span class="sy0">,</span><span class="br0">&#123;</span>debugmode<span class="sy0">:</span><span class="kw2">true</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 <span class="br0">&#125;</span><span class="br0">&#41;</span>
<span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span></pre></div></div></div></div></div></div></div>


<p>Если появятся какие вопросы с радостью отвечу.<br />
<a href="http://tpoxa.com/wp-content/uploads/2008/08/uploader.zip">uploader.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2008/08/28/ajax-uploader/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

