<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Acko.net]]></title>
  <link href="https://acko.net/atom.xml" rel="self"/>
  <link href="https://acko.net/"/>
  <updated>2026-03-05T12:10:39+01:00</updated>
  <id>https://acko.net</id>
  <author>
    <name><![CDATA[Steven Wittens]]></name>
    
  </author>

  
  <entry>
    <title type="html"><![CDATA[Drupal OpenSearch module released]]></title>
    <link href="https://acko.net/blog/drupal-opensearch-module-released/"/>
    <updated>2006-07-17T00:00:00+02:00</updated>
    <id>https://acko.net/blog/drupal-opensearch-module-released</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>Today I wrote a quick, basic OpenSearch module for Drupal. It implements the Amazon-originating spec for syndication and aggregation of search results.
</p>

<p>
The interesting part is that OpenSearch builds upon RSS and Atom, which means that the resulting feeds can be used in any news reader. Of course, an OpenSearch-aware reader can interpret the extra information that is present (total number of results, other search pages, search URL syntax, ...).
</p>

<p>
I've installed the module on Acko.net, so you can give it a try here:
<a href="http://www.acko.net/opensearch/node">OpenSearch description file</a> (XML)
<a href="http://www.acko.net/opensearch/node/drupal">Search results for the query "Drupal"</a> (RSS)
</p>

<p>
The module will be available on <a href="http://drupal.org/project/opensearch">drupal.org</a> as soon as CVS Contrib is repackaged in a couple of hours, though it will require Drupal CVS HEAD or 4.7-HEAD to work.</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Spotlightish search result grouping]]></title>
    <link href="https://acko.net/blog/spotlightish-search-result-grouping/"/>
    <updated>2006-06-28T00:00:00+02:00</updated>
    <id>https://acko.net/blog/spotlightish-search-result-grouping</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad">
  
  <p>Here's a fun, albeit hackish search theme snippet for Drupal.
</p>

<p>
It takes advantage of the fact that the temporary tables for search stay around, to present results grouped by node type à la Apple Spotlight. Note that it does not simply reformat a single search result page, but regroups results across all pages.
</p>

<p>
In fact, it's really just a hackish way of doing N separate queries that contain a <code>type:something</code> restriction, one for each node type. To see more results, it presents you with a link to a normal <code>type:something</code> query.
</p>

<p>
It's a bit inefficient in that the presentational work for the normal results is thrown away (loading nodes, filtering content, extracting a summary). But it's a start ;).
</p>

<p class="codeblock"><code>&lt;?php<br />
<br />
define('SEARCH_TYPE_ITEMS',&nbsp;5);<br />
<br />
function&nbsp;_node_search_result($nid)&nbsp;{<br />
&nbsp;&nbsp;$node&nbsp;=&nbsp;node_load($nid);<br />
<br />
&nbsp;&nbsp;//&nbsp;Get&nbsp;node&nbsp;output&nbsp;(filtered&nbsp;and&nbsp;with&nbsp;module-specific&nbsp;fields).<br />
&nbsp;&nbsp;if&nbsp;(node_hook($node,&nbsp;'view'))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;node_invoke($node,&nbsp;'view',&nbsp;false,&nbsp;false);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;$node&nbsp;=&nbsp;node_prepare($node,&nbsp;false);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;//&nbsp;Allow&nbsp;modules&nbsp;to&nbsp;change&nbsp;$node-&gt;body&nbsp;before&nbsp;viewing.<br />
&nbsp;&nbsp;node_invoke_nodeapi($node,&nbsp;'view',&nbsp;false,&nbsp;false);<br />
<br />
&nbsp;&nbsp;//&nbsp;Fetch&nbsp;comments&nbsp;for&nbsp;snippet<br />
&nbsp;&nbsp;$node-&gt;body&nbsp;.=&nbsp;module_invoke('comment',&nbsp;'nodeapi',&nbsp;$node,&nbsp;'update&nbsp;index');<br />
&nbsp;&nbsp;//&nbsp;Fetch&nbsp;terms&nbsp;for&nbsp;snippet<br />
&nbsp;&nbsp;$node-&gt;body&nbsp;.=&nbsp;module_invoke('taxonomy',&nbsp;'nodeapi',&nbsp;$node,&nbsp;'update&nbsp;index');<br />
<br />
&nbsp;&nbsp;$extra&nbsp;=&nbsp;node_invoke_nodeapi($node,&nbsp;'search&nbsp;result');<br />
<br />
&nbsp;&nbsp;return&nbsp;array('link'&nbsp;=&gt;&nbsp;url('node/'.&nbsp;$nid),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type'&nbsp;=&gt;&nbsp;node_get_name($node),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title'&nbsp;=&gt;&nbsp;$node-&gt;title,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'user'&nbsp;=&gt;&nbsp;theme('username',&nbsp;$node),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date'&nbsp;=&gt;&nbsp;$node-&gt;changed,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'node'&nbsp;=&gt;&nbsp;$node,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'extra'&nbsp;=&gt;&nbsp;$extra,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'snippet'&nbsp;=&gt;&nbsp;search_excerpt($keys,&nbsp;$node-&gt;body));<br />
}<br />
<br />
function&nbsp;phptemplate_search_page($results,&nbsp;$type)&nbsp;{<br />
&nbsp;&nbsp;//&nbsp;Only&nbsp;kick&nbsp;in&nbsp;for&nbsp;type-agnostic&nbsp;node&nbsp;searches<br />
&nbsp;&nbsp;if&nbsp;($type&nbsp;==&nbsp;'node'&nbsp;&amp;&amp;&nbsp;!search_query_extract($keys&nbsp;=&nbsp;search_get_keys(),&nbsp;'type'))&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;all&nbsp;types&nbsp;used&nbsp;in&nbsp;results<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;db_query(&quot;SELECT&nbsp;DISTINCT(n.type)&nbsp;FROM&nbsp;temp_search_results&nbsp;s&nbsp;LEFT&nbsp;JOIN&nbsp;node&nbsp;n&nbsp;ON&nbsp;s.sid&nbsp;=&nbsp;n.nid&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;($node&nbsp;=&nbsp;db_fetch_object($result))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$types[]&nbsp;=&nbsp;$node-&gt;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$output&nbsp;=&nbsp;'';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($types&nbsp;as&nbsp;$type)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Fetch&nbsp;results&nbsp;of&nbsp;one&nbsp;particular&nbsp;type&nbsp;from&nbsp;the&nbsp;2nd&nbsp;search&nbsp;pass&nbsp;results<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;db_query_range(&quot;SELECT&nbsp;n.nid&nbsp;FROM&nbsp;temp_search_results&nbsp;s&nbsp;LEFT&nbsp;JOIN&nbsp;node&nbsp;n&nbsp;ON&nbsp;s.sid&nbsp;=&nbsp;n.nid&nbsp;WHERE&nbsp;n.type&nbsp;=&nbsp;'%s'&quot;,&nbsp;$type,&nbsp;0,&nbsp;SEARCH_TYPE_ITEMS&nbsp;+&nbsp;1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$output&nbsp;.=&nbsp;'&lt;h2&gt;'.&nbsp;check_plain($type)&nbsp;.'&lt;/h2&gt;';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$i&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$output&nbsp;.=&nbsp;'&lt;dl&nbsp;class=&quot;search-results&quot;&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(($node&nbsp;=&nbsp;db_fetch_object($result))&nbsp;&amp;&amp;&nbsp;$i++&nbsp;&lt;&nbsp;SEARCH_TYPE_ITEMS)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$output&nbsp;.=&nbsp;theme('search_item',&nbsp;_node_search_result($node-&gt;nid),&nbsp;$type);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$output&nbsp;.=&nbsp;'&lt;/dl&gt;';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(db_num_rows($result)&nbsp;&gt;&nbsp;SEARCH_TYPE_ITEMS)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$output&nbsp;.=&nbsp;l(t('More&nbsp;results'),&nbsp;'search/node/'.&nbsp;search_query_insert(search_get_keys(),&nbsp;'type',&nbsp;$type));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$output;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;//&nbsp;Otherwise&nbsp;present&nbsp;the&nbsp;default&nbsp;page<br />
&nbsp;&nbsp;return&nbsp;theme_search_page($results,&nbsp;$type);<br />
}<br />
</code></p></div></div>
]]></content>
  </entry>
  
</feed>
