From: Marc L. <ma...@ma...> - 2011-06-22 17:25:46
|
awesome! On Wed, Jun 22, 2011 at 10:14 AM, <lph...@us...> wrote: > Revision: 35006 > http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=35006&view=rev > Author: lphuberdeau > Date: 2011-06-22 14:14:35 +0000 (Wed, 22 Jun 2011) > > Log Message: > ----------- > [NEW] Export the search results as an RSS or Atom feed (respecting HTTP Accept headers) > > Modified Paths: > -------------- > trunk/lib/rss/rsslib.php > trunk/lib/tikiaccesslib.php > trunk/lib/tikilib.php > trunk/tiki-filter-base.php > trunk/tiki-searchindex.php > > Modified: trunk/lib/rss/rsslib.php > =================================================================== > --- trunk/lib/rss/rsslib.php 2011-06-22 12:33:57 UTC (rev 35005) > +++ trunk/lib/rss/rsslib.php 2011-06-22 14:14:35 UTC (rev 35006) > @@ -635,6 +635,51 @@ > > return $default; > } > + > + function generate_feed_from_data($data, $feed_descriptor) > + { > + require_once 'lib/smarty_tiki/modifier.sefurl.php'; > + > + $tikilib = TikiLib::lib('tiki'); > + $writer = new Zend_Feed_Writer_Feed; > + $writer->setTitle($feed_descriptor['feedTitle']); > + $writer->setDescription($feed_descriptor['feedDescription']); > + $writer->setLink($tikilib->tikiUrl('')); > + $writer->setDateModified(time()); > + > + foreach ($data as $row) { > + $titleKey = $feed_descriptor['entryTitleKey']; > + $url = $row[$feed_descriptor['entryUrlKey']]; > + $title = $row[$titleKey]; > + > + if (isset($feed_descriptor['entryObjectDescriptors'])) { > + list($typeKey, $objectKey) = $feed_descriptor['entryObjectDescriptors']; > + $object = $row[$objectKey]; > + $type = $row[$typeKey]; > + > + if (empty($url)) { > + $url = smarty_modifier_sefurl($object, $type); > + } > + > + if (empty($title)) { > + $title = TikiLib::lib('object')->get_title($type, $object); > + } > + } > + > + if (empty($url)) { > + //continue; > + } > + > + $entry = $writer->createEntry(); > + $entry->setTitle($title ? $title : tra('Unspecified')); > + $entry->setLink($tikilib->tikiUrl($url)); > + $entry->setDateModified($row[$feed_descriptor['entryModificationKey']]); > + > + $writer->addEntry($entry); > + } > + > + return $writer; > + } > } > global $rsslib; > $rsslib = new RSSLib; > > Modified: trunk/lib/tikiaccesslib.php > =================================================================== > --- trunk/lib/tikiaccesslib.php 2011-06-22 12:33:57 UTC (rev 35005) > +++ trunk/lib/tikiaccesslib.php 2011-06-22 14:14:35 UTC (rev 35006) > @@ -431,7 +431,7 @@ > } > } > > - function get_accept_types() { > + function get_accept_types($acceptFeed = false) { > $accept = explode( ',', $_SERVER['HTTP_ACCEPT'] ); > > if( isset( $_REQUEST['httpaccept'] ) ) { > @@ -449,6 +449,10 @@ > $known = 'json'; > elseif( strpos( $t = 'text/x-yaml', $type ) !== false ) > $known = 'yaml'; > + elseif( strpos( $t = 'application/rss+xml', $type ) !== false ) > + $known = 'rss'; > + elseif( strpos( $t = 'application/atom+xml', $type ) !== false ) > + $known = 'atom'; > > if( $known && ! isset( $types[$known] ) ) > $types[$known] = $t; > @@ -474,12 +478,17 @@ > return false; > } > > - function is_serializable_request() { > - foreach( $this->get_accept_types() as $name => $full ) { > + function is_serializable_request($acceptFeed = false) { > + foreach( $this->get_accept_types($acceptFeed) as $name => $full ) { > switch( $name ) { > case 'json': > case 'yaml': > return true; > + case 'rss': > + case 'atom': > + if ($acceptFeed) { > + return true; > + } > } > } > > @@ -490,8 +499,19 @@ > return ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'; > } > > - function output_serialized( $data ) { > - foreach( $this->get_accept_types() as $name => $full ) { > + /** > + * Will process the output by serializing in the best way possible based on the request's accept headers. > + * To output as an RSS/Atom feed, a descriptor may be provided to map the array data to the feed's properties > + * and to supply additional information. The descriptor must contain the following keys: > + * [feedTitle] Feed's title, static value > + * [feedDescription] Feed's description, static value > + * [entryTitleKey] Key to lookup for each entry to find the title > + * [entryUrlKey] Key to lookup to find the URL of each entry > + * [entryModificationKey] Key to lookup to find the modification date > + * [entryObjectDescriptors] Optional. Array containing two key names, object key and object type to lookup missing information (url and title) > + */ > + function output_serialized( $data, $feed_descriptor = null ) { > + foreach( $this->get_accept_types(! is_null($feed_descriptor)) as $name => $full ) { > switch( $name ) { > case 'json': > header( "Content-Type: $full" ); > @@ -502,14 +522,25 @@ > echo $data; > return; > case 'yaml': > - require_once( 'Horde/Yaml.php' ); > - require_once( 'Horde/Yaml/Loader.php' ); > - require_once( 'Horde/Yaml/Node.php' ); > - require_once( 'Horde/Yaml/Exception.php' ); > - > header( "Content-Type: $full" ); > echo Horde_Yaml::dump($data); > return; > + case 'rss': > + $rsslib = TikiLib::lib('rss'); > + $writer = $rsslib->generate_feed_from_data($data, $feed_descriptor); > + $writer->setFeedLink($this->tikiUrl($_SERVER['REQUEST_URI']), 'rss'); > + > + header('Content-Type: application/rss+xml'); > + echo $writer->export('rss'); > + return; > + case 'atom': > + $rsslib = TikiLib::lib('rss'); > + $writer = $rsslib->generate_feed_from_data($data, $feed_descriptor); > + $writer->setFeedLink($this->tikiUrl($_SERVER['REQUEST_URI']), 'atom'); > + > + header('Content-Type: application/atom+xml'); > + echo $writer->export('atom'); > + return; > case 'html': > header( "Content-Type: $full" ); > echo $data; > > Modified: trunk/lib/tikilib.php > =================================================================== > --- trunk/lib/tikilib.php 2011-06-22 12:33:57 UTC (rev 35005) > +++ trunk/lib/tikilib.php 2011-06-22 14:14:35 UTC (rev 35006) > @@ -190,6 +190,9 @@ > case 'validators': > global $validatorslib; include_once('lib/validatorslib.php'); > return $libraries[$name] = $validatorslib; > + case 'rss': > + global $rsslib; include_once('lib/rss/rsslib.php'); > + return $libraries[$name] = $rsslib; > case 'unifiedsearch': > global $unifiedsearchlib; include_once('lib/search/searchlib-unified.php'); > return $libraries[$name] = $unifiedsearchlib; > > Modified: trunk/tiki-filter-base.php > =================================================================== > --- trunk/tiki-filter-base.php 2011-06-22 12:33:57 UTC (rev 35005) > +++ trunk/tiki-filter-base.php 2011-06-22 14:14:35 UTC (rev 35006) > @@ -93,6 +93,7 @@ > TikiInit::appendIncludePath($tikipath); > require_once 'Zend/Loader/Autoloader.php'; > Zend_Loader_Autoloader::getInstance() > + ->registerNamespace('Horde_Yaml') > ->registerNamespace('TikiFilter') > ->registerNamespace('DeclFilter') > ->registerNamespace('JitFilter') > > Modified: trunk/tiki-searchindex.php > =================================================================== > --- trunk/tiki-searchindex.php 2011-06-22 12:33:57 UTC (rev 35005) > +++ trunk/tiki-searchindex.php 2011-06-22 14:14:35 UTC (rev 35006) > @@ -53,7 +53,7 @@ > > $dataSource = $unifiedsearchlib->getDataSource('formatting'); > > - if ($access->is_serializable_request()) { > + if ($access->is_serializable_request(true)) { > $results = $dataSource->getInformation($results, array('title', 'modification_date', 'url')); > > require_once 'lib/smarty_tiki/function.object_link.php'; > @@ -64,7 +64,14 @@ > 'title' => $res['title'], > ), $smarty); > } > - $access->output_serialized($results); > + $access->output_serialized($results, array( > + 'feedTitle' => tr('%0: Results for "%1"', $prefs['sitetitle'], $request['filter']['content']), > + 'feedDescription' => tr('Search Results'), > + 'entryTitleKey' => 'title', > + 'entryUrlKey' => 'url', > + 'entryModificationKey' => 'modification_date', > + 'entryObjectDescriptors' => array('object_type', 'object_id'), > + )); > exit; > } else { > $plugin = new Search_Formatter_Plugin_SmartyTemplate(realpath('templates/searchresults-plain.tpl')); > > > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. > > ------------------------------------------------------------------------------ > Simplify data backup and recovery for your virtual environment with vRanger. > Installation's a snap, and flexible recovery options mean your data is safe, > secure and there when you need it. Data protection magic? > Nope - It's vRanger. Get your free trial download today. > http://p.sf.net/sfu/quest-sfdev2dev > _______________________________________________ > Tikiwiki-cvs mailing list > Tik...@li... > https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs > -- Marc Laporte http://MarcLaporte.com http://Tiki.org/MarcLaporte http://AvanTech.net |