اگر می خواهید برای سایت یا اسکریپت اختصاصی خودتان خروجی فید حرفه ای بنویسید دست نگه دارید بلکه یکی از قوی ترین کلاس های خروجی فید اینجاست . کلاس ABC_RSS به شما کمک می کند تا در هم شرایطی خروجی فید خود را راه اندازی کنید با دیتابیس یا بدون آن طبق آخرین نسخه منتشر شده خروجی فید نسخه ۲ می باشد و قابل نمایش در همه فیدخوان های اینترنت را داراست مستندات خود این سیستم شامل ۳ بخش کلیست که در ادامه مطلب به صورت حرفه ای و با توضیحات فارسی با معرفی آن ها می پردازیم .
خوب در ابتدا متذکر شوم که متن های بلند و دارای متغیرهای زیاد با صلاح دید کلاس در قالب CDATA قرار میگیرد و با UTF-8 هیچ گونه مشکلی ندارد . خوب به مثال اول نگاه کنید :
require_once( 'ABC_RSS.php' ); $rss = new ABC_RSS(); $channel =array(); $channel['title'] ='Tavousi.name Blog'; $channel['link'] ='http://tavousi.name/'; $channel['description'] ='This is my blog'; $channel['language'] ='fa-ir'; $channel['copyright'] ='Copyright 2013-2014, @Tavousi'; $channel['webMaster'] ='p30search@gmail.com (Tavousi)'; $channel['pubDate'] =date( DATE_RSS ); $channel['generator'] ='ABC_RSS PHP Class'; $channel['docs'] ='http://blogs.law.harvard.edu/tech/rss'; $channel['category'] =array(); $channel['category'][] =array( 'content' =>'Rock', 'domain' =>'genre' ); $channel['category'][] =array( 'content' =>'Folk', 'domain' =>'genre' ); $rss->set_channel( $channel );
$item =array(); $item['title'] ='Love Machine'; $item['description'] ='This is a power ballad evocative of MC Bubblicious Fish-eyes.'; $item['link'] ='http://www.band-name.dom/band/songs/love_machine.html $item['enclosure'] =array(); $item['enclosure']['url'] ='http://www.band-name.dom/band/songs/love_machine.mp3'; $item['enclosure']['length'] ='12216320'; $item['enclosure']['type'] ='audio/mpeg'; $item['category'] = array(); $item['category'][] =array( 'content' =>'Rock', 'domain' =>'genre' ); $rss->set_item( $item ); $item =array(); $item['title'] ='Mud Puppet Square Dance'; $item['description'] ='A folksy taste of Americana'; $item['link'] ='http://www.band-name.dom/band/songs/mud_puppet.html $item['enclosure'] =array(); $item['enclosure']['url'] ='http://www.band-name.dom/band/songs/mud_puppet.mp3'; $item['enclosure']['length'] ='14005740'; $item['enclosure']['type'] ='audio/mpeg'; $item['category'] = array(); $item['category'][] =array( 'content' =>'Folk', 'domain' =>'genre' ); $rss->set_item( $item ); $rss->export();
در ابتدا کد با فراخونی کلاس و نوشتن متغیری برای اجرای آن شروع می شود :
$rss =new ABC_RSS();
در قسمت بعد المنت های اولیه فایل خروجی را تعیین می کنیم هیچ محدودیتی ندارد :
$channel =array(); $channel['title'] ='Tavousi.name Blog'; $channel['link'] ='http://tavousi.name/'; $channel['description'] ='This is my blog'; $channel['language'] ='fa-ir'; $channel['copyright'] ='Copyright 2013-2014, @Tavousi'; $channel['webMaster'] ='p30search@gmail.com (Tavousi)'; $channel['pubDate'] =date( DATE_RSS ); $channel['generator'] ='ABC_RSS PHP Class'; $channel['docs'] ='http://blogs.law.harvard.edu/tech/rss';
در ابتدا کد دیدیم که در قسمت های المنت های اولیه از المنت category هم استفاده شده اما این المنت نحوه استفاده ازش متفاوت است نسبت به بقیه المنت ها برای مثال باید از کد زیر استفاده کرد :
$channel['category'] =array(); $channel['category'][] =array( 'content' =>'Rock', 'domain' =>'genre' ); $channel['category'][] =array( 'content' =>'Folk', 'domain' =>'genre' );
domain نام المنتی است که داخل تگ category قرار می گیرد و مقدار آن مثلا genre هست و content که در array دیده می شود متن داخل تگ هست خوب خروجی آن به شکل زیر در کنال بقیه المنت های اولیه رویت می شود :
<category domain='genre'>Rock</category>
<category domain='genre'>Folk</category>
خوب [نکته : شما به جای category می توانید هر نامی را که نیاز دارید به کار ببرید این یه مثال برای استفاده از array ها در این بخش بود] خوب احتمالا قابلیت افزودن بیش از یک المنت در تگ باشد ولی من بررسی نکردم و برای استفاده از تگی با چندین المنت به همراه مقدار به صورت زیر :
<cloud domain="rpc.news.dom" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/>
می توانید از این کد استفاده کنید تا در المنت های اولیه که اینجا منظورمان همان تگ های اول فایل هستند ساخته شود :
$channel['cloud'] = array(); $channel['cloud']['domain'] ='rpc.news.dom'; $channel['cloud']['port'] ='80'; $channel['cloud']['path'] ='/RPC2'; $channel['cloud']['registerProcedure'] ='pingMe'; $channel['cloud']['protocol'] ='soap';
بررسی درست بودن وضعیت کدهای المنت اولیه یا داده های ورودی ($channel) با کد زیر صورت میگیرد :
$rss->set_channel( $channel );
خوب به سراغ قرار دادن پست ها و یا همان آیتم ها می رویم بعد از کدهای بالا و تاییدیه set_channel برای ساخت ایتم می توانیم از کد زیر استفاده کنیم :
$item = array(); $item['title'] ='Love Machine'; $item['description'] ='This is a power ballad evocative of MC Bubblicious Fish-eyes.'; $item['link'] ='http://www.band-name.dom/band/songs/love_machine.html
سپس قرار دادن موضوع و یا چندین موضوع با array :
$item['category'] =array(); $item['category'][] =array( 'content' = >'Rock', 'domain' =>'genre' );
همچنین متذکر شوم که برای ساخت تگی با چندین المنت و مقدار در آیتم ها همانند مثال چند خط قبل باید اقدام کنید و در آخر با کد زیر تاییدیه درستی اطلاعات را برای آیتم بگیرید :
$rss->set_item( $item );
خوب حال بهتر است در مورد خروجی فید صحبت کنیم خروجی فید همان طور که در کد پایین مشاهده میکنید به ۳ شکل می باشد :
// خروج اطلاعات در همان فایل داینامیک با هدر : text/xml // همانند همه اسکریپت های مدیریت محتوا // header("Content-type: text/xml"); $rss->export(); // دانلود فیلد با فرمت : xml $rss->export('download'); //ساخت فایل فید با فرمت : xml $rss->export('write','/home/user/htdocs/xml/rss.xml');
خوب به سراغ مثال دوم میرویم حال به کمک چند خط کد کاری کردیم که این کلاس از دیتابیس آیتم ها را دریافت کند :
require_once( 'ABC_RSS.php' );
// اطلاعات اتصال به دیتابیس $hostname ="host"; $database ="database"; $username ="username"; $password ="password"; $errors =array(); $destination_file ='home/user/htdocs/xml/local_news.xml'; try { if ( !$connection =mysql_connect( $hostname, $username, $password )) throw new Exception( mysql_error(), mysql_errno() ); if ( !mysql_select_db( $database, $connection )) throw new Exception( "Unable to connect to database '$database'." ); $query ="SELECT `id`, `title`, `description`, `datetime` ". "FROM `articles` ". "WHERE `scope` = 'local' ". "ORDER BY `datetime` DESC ". "LIMIT 0, 10"; if ( !$result =mysql_query( $query, $connection )) throw new Exception( mysql_error(), mysql_errno() ); $row_count =@mysql_num_rows( $result ); if ( $row_count > 0 ) { $rss =new ABC_RSS(); $channel =array(); $channel['title'] ='News.dom - All the News You Can Stand'; $channel['link'] ='http://www.news.dom/'; $channel['description'] ='The Latest Ten Local News Stories from News.dom'; $channel['language'] ='en-us'; $channel['copyright'] ='Copyright 2010-2012, News.dom'; $channel['managingEditor'] ='editor@news.dom (John Smith)'; $channel['webMaster'] ='webmaster@news.dom (Jane Doe)'; $channel['pubDate'] =date(DATE_RSS); $channel['generator'] ='ABC_RSS PHP Class'; $channel['docs'] ='http://blogs.law.harvard.edu/tech/rss'; $channel['skipHours'] ='0,1,2,3'; $channel['skipDays'] ='Saturday'; $channel['category'] =array(); $channel['category'][] =array( 'content' =>'news', 'domain' =>'local' ); if ( !$rss->set_channel( $channel )) { $errors =&$rss->errors; throw new Exception( "Failed to set the channel." ); } for ( $i =0 ; $i <$row_count ; $i++ ) { $row =mysql_fetch_assoc( $result ); $item =array(); $item['title'] =$row['title']; $item['description'] =$row['description']; $item['link'] =sprintf( "http://www.news.dom/articles/?id=%d", $row['id'] ); $item['pubDate'] =date( DATE_RSS, strtotime( $row['datetime'] )); $item['category'] =array(); $item['category'][] =array( 'content' =>'news', 'domain' =>'local' ); if ( !$rss->set_item( $item )) { $errors =&$rss->errors; throw new Exception( "Failed to set the item." ); } } if ( !$rss->export( 'write', $destination_file )) { $errors =&$rss->errors; throw new Exception( "Failed to write the XML to file." ); } } else throw new Exception( "No articles were found in the database." ); } catch ( Exception $e ) { $errors[] =$e->getMessage(); } if ( count( $errors ) > 0 ) foreach ( $errors as $error ) printf( "<p>%s</p>", $error ); else exit ( "<p>The XML file was written without errors.</p>" );
۲ تگ <skipHours> و <skipDays> در این جا نیاز به توضیح دارد این ۲ تگ به فید دستور می دهد که در چه ساعاتی از شبانه روز و چه روزهایی این آیتم را نمایش ندهد به اصطلاح خودش Skip کند . خروجی این ۲ تگ بصورت زیر در آیتم رویت می شود :
<skipHours>
<hour>0</hour>
<hour>1</hour>
<hour>2</hour>
<hour>3</hour>
</skipHours>
<skipDays>
<day>Saturday</day>
</skipDays>
مقادیر skipHours شامل ۰ تا ۲۴ می باشد که منظور همان ساعات شبانه روز می باشد و مقادیر skipDays نام روزها به انگلیسی می باشد و می توانید مقداریز را با کاما (,) از هم جدا کنیم یکبار دگیر کد ساخت این ۲ تگ را در بخش آیتم ها به صورت خلاصه می بینیم :
$channel['skipHours'] = '0,1,2,3'; // And for the <skipDays> element: $channel['skipDays'] = 'Saturday';
حال که به کلاس مسلط شدید در نهایت مثال ۳ را با هم مشاهده می کنیم که آنالیز آن باعث یادگیری بهتر شما می شود اما در این مثال فایل rss.xml ساخته می شود در فولدر :
require_once( 'ABC_RSS.php' ); $destination_file ='rss.xml'; $rss = new ABC_RSS(); try { // All possible channel elements $channel =array(); $channel['title'] ='News.dom'; $channel['link'] ='http://www.news.dom/'; $channel['description'] ='All the News You Can Stand'; $channel['language'] ='en-us'; $channel['copyright'] ='Copyright 2010-2012, News.dom'; $channel['managingEditor'] ='editor@news.dom (John Smith)'; $channel['webMaster'] ='webmaster@news.dom (Jane Doe)'; $channel['pubDate'] =date( DATE_RSS ); $channel['lastBuildDate'] =date( DATE_RSS ); $channel['category'] =array(); $channel['category'][] =array( 'content' =>'news', 'domain' =>'local,regional,national,world' ); $channel['category'][] =array( 'content' =>'sports', 'domain' =>'local,regional,national' ); $channel['category'][] =array( 'content' =>'entertainment', 'domain' =>'local,regional,national' ); $channel['generator'] ='ABC_RSS PHP Class'; $channel['docs'] ='http://blogs.law.harvard.edu/tech/rss'; $channel['cloud'] = array(); $channel['cloud']['domain'] ='rpc.news.dom'; $channel['cloud']['port'] ='80'; $channel['cloud']['path'] ='/RPC2'; $channel['cloud']['registerProcedure'] ='pingMe'; $channel['cloud']['protocol'] ='soap'; $channel['ttl'] = '60'; $channel['image'] =array(); $channel['image']['url'] ='http://www.news.dom/logo.jpg'; $channel['image']['title'] ='News.dom'; $channel['image']['link'] ='http://www.news.dom/'; $channel['image']['width'] ='88'; $channel['image']['height'] ='31'; $channel['rating'] ='(PICS-1.1 "http://www.gcf.org/v2.5" '. 'l r (suds 0.5 density 0 color/hue 1) '. 'r (subject 2 density 1 color/hue 1))'; $channel['textInput'] =array(); $channel['textInput']['title'] ='Search'; $channel['textInput']['description'] ='Find an article on News.dom'; $channel['textInput']['name'] ='q'; $channel['textInput']['link'] ='http://www.news.dom/search/'; $channel['skipHours'] ='0,1,2,3'; $channel['skipDays'] ='Saturday'; if ( !$rss->set_channel( $channel )) { $errors =&$rss->errors; throw new Exception( 'Unable to set the RSS channel.' ); } // All possible item elements $item =array(); $item['title'] ='New Water Park Makes Big Splash in Local Economy'; $item['description'] ='Reporter Peter Griffin talks to Bob Smith, the owner-operator '. 'of Quahog\'s new attraction, Wetworld.'; $item['link'] ='http://www.news.dom/headlines/'; $item['author'] ='Peter Griffin'; $item['category'] =array(); $item['category'][] =array( 'content' =>'news', 'domain' =>'local' ); $item['category'][] =array( 'content' =>'entertainment', 'domain' =>'local' ); $item['comments'] ='http://www.news.dom/comments/?article=7836453'; $item['enclosure'] =array(); $item['enclosure']['url'] ='http://www.news.dom/video/?id=68737'; $item['enclosure']['length'] ='12216320'; $item['enclosure']['type'] ='video/quicktime'; $item['guid'] =array(); $item['guid']['isPermaLink'] ='true'; $item['guid']['content'] ='http://www.news.dom/articles/?id=7836453'; $item['pubDate'] ='Sun, 19 May 2002 15:21:36 GMT'; if ( !$rss->set_item( $item )) { $errors =&$rss->errors; throw new Exception( 'Unable to set the RSS item.' ); } if ( !$rss->export( 'write', $destination_file )) { $errors =&$rss->errors; throw new Exception( 'Unable to write the RSS file.' ); } } catch ( Exception $e ) { $errors[] =$e->getMessage(); } if ( !empty( $errors )) foreach ( $errors as $error ) printf( "<p>%s</p>", $error ); else print '<p>The RSS was created without errors.</p>';
خروجی مثال ۳ به صورت زیر می باشد :
<?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>News.dom</title> <link>http://www.news.dom/</link> <description><![CDATA[All the News You Can Stand]]></description> <language>en-us</language> <copyright>Copyright 2010-2012, News.dom</copyright> <managingEditor>editor@news.dom (John Smith)</managingEditor> <webMaster>webmaster@news.dom (Jane Doe)</webMaster> <pubDate>Sat, 11 Oct 2014 15:14:31 +0000</pubDate> <lastBuildDate>Sat, 11 Oct 2014 15:14:31 +0000</lastBuildDate> <category domain="local,regional,national,world">news</category> <category domain="local,regional,national">sports</category> <category domain="local,regional,national">entertainment</category> <cloud domain="rpc.news.dom" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap" /> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <generator>ABC_RSS PHP Class</generator> <ttl>60</ttl> <rating><![CDATA[(PICS-1.1 "http://www.gcf.org/v2.5" l r (suds 0.5 density 0 color/hue 1) r (subject 2 density 1 color/hue 1))]]></rating> <textInput> <title>Search</title> <description><![CDATA[Find an article on News.dom]]></description> <name>q</name> <link>http://www.news.dom/search/</link> </textInput> <image> <url>http://www.news.dom/logo.jpg</url> <title>News.dom</title> <link>http://www.news.dom/</link> <width>88</width> <height>31</height> </image> <skipHours> <hour>0</hour> <hour>1</hour> <hour>2</hour> <hour>3</hour> </skipHours> <skipDays> <day>Saturday</day> </skipDays> <item> <title>New Water Park Makes Big Splash in Local Economy</title> <link>http://www.news.dom/headlines/</link> <description><![CDATA[Reporter Peter Griffin talks to Bob Smith, the owner-operator of Quahog's new water recreation park, Wetworld.]]></description> <author>Peter Griffin</author> <category domain="local">news</category> <category domain="local">entertainment</category> <comments>http://www.news.dom/comments/?article=7836453</comments> <enclosure url="http://www.news.dom/video/?id=68737" length="12216320" type="video/quicktime" /> <pubDate>Sun, 19 May 2002 15:21:36 GMT</pubDate> <guid isPermaLink="true">http://www.news.dom/articles/?id=7836453</guid> </item> </channel> </rss>
منبع کلاس : http://j.gs/4aYG