<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.joetsuihk.com" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>tabs</title>
 <link>http://www.joetsuihk.com/free_tags/tabs</link>
 <description>The taxonomy view with a depth of 0.</description>
 <language>en</language>
<item>
 <title>使用 views 建立tabs, use view to build tabs</title>
 <link>http://www.joetsuihk.com/node/112</link>
 <description>&lt;p&gt;&lt;img src=&quot;http://www.joetsuihk.com/files/views-tab1.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上圖顯示了一個經過修改的 user page 的 tabs&lt;/p&gt;
&lt;p&gt;tabs 其實來自一個 hook(), menu_local_tasks()&lt;br /&gt;
用 theme developer 指一下便可以看到&lt;br /&gt;
但這次介紹的並不是要修改這個 hook 的 theme template&lt;br /&gt;
而是使用 views, 新增一個tab 到這個地方&lt;/p&gt;
&lt;p&gt;在上圖的例子,&lt;br /&gt;
一個 url 為 [root]/user 的 頁面,&lt;br /&gt;
要在 views 建立一個的 tab,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.joetsuihk.com/node/112&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://www.joetsuihk.com/node/112#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/drupal">Drupal</category>
 <enclosure url="http://www.joetsuihk.com/files/views-tab1.gif" length="10422" type="image/gif" />
 <pubDate>Mon, 15 Sep 2008 01:11:48 -0700</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">112 at http://www.joetsuihk.com</guid>
</item>
<item>
 <title>2007-04-09-drupal-module-develop-with-tabs-and-ajax</title>
 <link>http://www.joetsuihk.com/2007_04_09_drupal_module_develop_tabs_and_ajax</link>
 <description>&lt;p&gt;blog 數正幾何級的減少中...&lt;/p&gt;
&lt;p&gt;主要是專注於放復活節假...&lt;br /&gt;和drupal 的一個模?開發有關&lt;/p&gt;
&lt;p&gt;這一次的模?是一個recent comment 和 recent blog post 的二合一模?&lt;br /&gt;用了jquery library 和 tabs plugin&lt;br /&gt;成就一個tab 和ajax 模?&lt;br /&gt;當然沿用drupal 內建使用ajax 的方式&lt;br /&gt;但講起來容易&lt;br /&gt;官網都不多這類的drupal 5.1+ ajax 的描述&lt;br /&gt;唯有向已經內建ajax 的現有module 偷師&lt;br /&gt;open source 吧...&lt;br /&gt;明白了當中的機制之後&lt;br /&gt;有寫過ajax 的朋友應該會立即上手&lt;br /&gt;如果還沒有寫過, 到jquery 的官網先參考一下ajax 的用法會容易點&lt;br /&gt;反正都有中文說明&lt;/p&gt;
&lt;p&gt;以下假設你已經會做一個模?&lt;br /&gt;所以只提重點部份&lt;/p&gt;
&lt;p&gt;先講tabs 的組成&lt;br /&gt;tabs 有一個指定的格式&lt;/p&gt;
&lt;p&gt;&amp;lt;div&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;ul&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;li&amp;gt;tab title1&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;tab title2&amp;lt;/li&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;/ul&amp;gt;&lt;br /&gt;  &amp;lt;div&amp;gt;tab content1&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div&amp;gt;tab content2&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;換成recent comment, recent blog post:(非php code, 只為一個算法結構)&lt;br /&gt;hook_block()內:&lt;/p&gt;
&lt;p&gt;&amp;lt;div id=&#039;&#039;joe_container&#039;&#039;&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;ul&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;li&amp;gt;t(&#039;&#039;Recent comments&#039;&#039;)&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;t(&#039;&#039;Recent blog posts&#039;&#039;)&amp;lt;/li&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;/ul&amp;gt;&lt;br /&gt;  &amp;lt;div&amp;gt;theme(&#039;&#039;comment_block&#039;&#039;)&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div&amp;gt;joe_recent_blog()&amp;lt;/div&amp;gt;//self defined function&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;其中, theme(&#039;&#039;comment block&#039;&#039;)為comment module 內建的function 輸出recent comment&lt;br /&gt;joe_recent_blog() 為一個模?內定義的function, prototype類似:&lt;/p&gt;
&lt;p&gt;    if (user_access(&#039;&#039;access content&#039;&#039;)) {&lt;br /&gt;      $result = db_query_range(db_rewrite_sql(&quot;SELECT&lt;br /&gt;n.nid, n.title, n.created FROM {node} n WHERE n.type = &#039;&#039;blog&#039;&#039; AND n.status = 1&lt;br /&gt;ORDER BY n.created DESC&quot;), 0, 10);&lt;br /&gt;      if (db_num_rows($result)) {&lt;br /&gt;        $block[&#039;&#039;content&#039;&#039;] .= &quot;&amp;lt;div&lt;br /&gt;id=&#039;&#039;fragment-2&#039;&#039;&amp;gt;&quot;.node_title_list($result);&lt;br /&gt;        $block[&#039;&#039;content&#039;&#039;] .= &#039;&#039;&amp;lt;div&lt;br /&gt;class=&quot;more-link&quot;&amp;gt;&#039;&#039;. l(t(&#039;&#039;more&#039;&#039;), &#039;&#039;blog&#039;&#039;, array(&#039;&#039;title&#039;&#039; =&amp;gt; t(&#039;&#039;Read the&lt;br /&gt;latest blog entries.&#039;&#039;))) .&#039;&#039;&amp;lt;/div&amp;gt;&#039;&#039;;&lt;br /&gt;      }&lt;br /&gt;    }&lt;/p&gt;
&lt;p&gt;先完成非ajax block 的部份, 可降解ajax, 可降解block&lt;/p&gt;
&lt;p&gt;此時已經可以在drupal 內enable block, 測試一下&lt;br /&gt;為插入ajax 做準備&lt;/p&gt;
&lt;p&gt;因為ajax 的javascript code 為數十多二十行,&lt;br /&gt;分開一個.js file 處理&lt;br /&gt;joe.js:&lt;/p&gt;
&lt;p&gt;$(document).ready( function(){dojo_ajax_auto_attach();} )&lt;/p&gt;
&lt;p&gt;function dojo_ajax_auto_attach(){&lt;br /&gt;  //init tabs&lt;br /&gt;  $(&quot;#joe_container&quot;).tabs();&lt;/p&gt;
&lt;p&gt;///////////////////////////////略&lt;/p&gt;
&lt;p&gt;留意, drupal 5.1 內建的drupal/misc/jquery.js&lt;br /&gt;並不可以使用tabs plugin...(應該為版本問題)&lt;br /&gt;故要使用tabs plugin 包內的jquery.js 或官網的jquery.js, 覆蓋&lt;br /&gt;接著又可以試一下tabs 的效果&lt;/p&gt;
&lt;p&gt;戲玉...終於到了...ajax 的部分&lt;br /&gt;ajax request 有一個url 的para  注(i)&lt;br /&gt;用作找出php handler 的php file&lt;br /&gt;但drupal 內卻用一個module file作handler&lt;br /&gt;故要告訴(register) 到drupal core, 某一path 會用作handler&lt;br /&gt;傳相關parameter 到module file&lt;br /&gt;要在hook_menu() 內:&lt;/p&gt;
&lt;p&gt;$items = array();&lt;br /&gt;    $items[] = array(&lt;br /&gt;      &#039;&#039;path&#039;&#039; =&amp;gt; &#039;&#039;dojo/menu&#039;&#039;,  //注(i)&lt;br /&gt;      &#039;&#039;title&#039;&#039; =&amp;gt; t(&#039;&#039;dojo&#039;&#039;),&lt;br /&gt;      &#039;&#039;access&#039;&#039; =&amp;gt; user_access(&#039;&#039;access content&#039;&#039;),&lt;br /&gt;      &#039;&#039;type&#039;&#039; =&amp;gt; MENU_CALLBACK,&lt;br /&gt;      &#039;&#039;callback&#039;&#039; =&amp;gt; &#039;&#039;dojo_js&#039;&#039; //真正的php handler&lt;br /&gt;function&lt;br /&gt;    );&lt;/p&gt;
&lt;p&gt;  $items = array_merge($items, module_invoke_all(&#039;&#039;dojo_menu&#039;&#039;, $may_cache));&lt;br /&gt;  return $items;&lt;/p&gt;
&lt;p&gt;到此, ajax 的php 部份其實只有一個register function hook_menu()&lt;br /&gt;和dojo_js(), 一個真正的handler&lt;/p&gt;
&lt;p&gt;javascript 卻反而可以細分為兩個部份&lt;br /&gt;caller 和handler&lt;br /&gt;caller 為一個buttom, 按了就發出一個要求到注(i) 的path&lt;/p&gt;
&lt;p&gt;$(&quot;.dojo-ajax&quot;).click(function(){&lt;br /&gt;    $.ajax({&lt;br /&gt;      type: &quot;POST&quot;,&lt;br /&gt;      url: &quot;/drupal/dojo/menu&quot;,&lt;br /&gt;      data: &quot;path=&quot; + &quot;dojo/menu&quot;,&lt;/p&gt;
&lt;p&gt;/////////////////////略, 待續&lt;br /&gt;handler 為php 返回的json object parser&lt;br /&gt;通常為插入返回的json object 的javascript code&lt;br /&gt;////續&lt;/p&gt;
&lt;p&gt;success: function (data) {&lt;br /&gt;        data = Drupal.parseJson(data);&lt;br /&gt;        $(&quot;#block-dojo-0 .content&quot;).html(&lt;br /&gt;data.content );&lt;/p&gt;
&lt;p&gt;細心看source code 就可以了&lt;/p&gt;
&lt;p&gt;歡迎回應~&lt;/p&gt;
</description>
 <comments>http://www.joetsuihk.com/2007_04_09_drupal_module_develop_tabs_and_ajax#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/drupal">Drupal</category>
 <category domain="http://www.joetsuihk.com/free_tags/tabbed_block">Tabbed Block</category>
 <pubDate>Sun, 08 Apr 2007 18:35:19 -0700</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">14 at http://www.joetsuihk.com</guid>
</item>
</channel>
</rss>
