欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Drupal零散知识笔记

shiping1 的头像
2013-4-22

关注cron

1、我们知道网站需要定期的进行一些操作以保证站点的正常运行,比如定期的清除临时文件,定期的清除某部分缓存等等。这就是cron要做的事情,我们可以通过实现hook_cron来在cron运行时执行自己的模块操作。当然,我们可以运行drupal_cron_run()来手动执行,也可以设置cron运行的间隔时间。

2、drupal7中加入了hook_cron_queue_info()钩子函数,可以返回若干个数组(包含被操作的queue名称,操作queue的执行函数actionFunc以及一个执行时间time),这样在cron执行时actionFunc会对queue中的对象逐个进行操作,而时间time则告诉站点该操作的最多执行时间。如果队列内对象很多,在time内执行不完,则暂停执行,留由下次cron执行时继续执行。(queue的数据存储在数据库中,drupal7基本把大部分数据都存在数据库中,但是给予我们改变存储的权利,我想这是D7考虑安装的要求和难度更低,同时兼顾性能优化的一个方法吧)。

 

2013-4-18

关注tablesort

1、需要给table展示的数据的select语句提供hearder,header里依次提供需要被排列的表中的列名,并在执行select语句前调用->orderByHeader($header),将搜出来的sql结果转化为数组,然后返回的数据调用主题为“table”的即可。

[php] view plain copy
 
  1. /** 
  2.  * Build the table render array. 
  3.  * 
  4.  * @return 
  5.  *   A render array set for theming by theme_table(). 
  6.  */  
  7. function tablesort_example_page() {  
  8.   // We are going to output the results in a table with a nice header.  
  9.   $header = array(  
  10.     // The header gives the table the information it needs in order to make  
  11.     // the query calls for ordering. TableSort uses the field information  
  12.     // to know what database column to sort by.  
  13.     array('data' => t('Numbers'), 'field' => 't.numbers'),  
  14.     array('data' => t('Letters'), 'field' => 't.alpha'),  
  15.     array('data' => t('Mixture'), 'field' => 't.random'),  
  16.   );  
  17.   
  18.   $query = db_select('tablesort_example''t')  
  19.     ->extend('TableSort'); // Using the TableSort Extender is what tells the  
  20.                            // the query object that we are sorting.  
  21.   $query->fields('t');  
  22.   
  23.   $result = $query  
  24.     ->orderByHeader($header// Don't forget to tell the query object how to  
  25.                              // find the header information.  
  26.     ->execute();  
  27.   
  28.   $rows = array();  
  29.   foreach ($result as $row) {  
  30.     // normally we would add some nice formatting to our rows  
  31.     // but for our purpose we are simply going to add our row  
  32.     // to the array.  
  33.     $rows[] = array('data' => (array$row);  
  34.   }  
  35.   
  36.   // build the table for the nice output.  
  37.   $build['tablesort_table'] = array(  
  38.     '#theme' => 'table',  
  39.     '#header' => $header,  
  40.     '#rows' => $rows,  
  41.   );  
  42.   
  43.   return $build;  
  44. }  

可以修改上述代码可以在排序的基础上实现分页。①在“->extend('TableSort')”后添加“->extend('PagerDefault')”②在“->orderByHeader($header)”后添加“limit(5)”③return $build前添加$build['tablesort_pager'] = array('#theme' => 'pager');即可。

 

2013-4-16

关注XML-RPC

1、现今网络中,存在很多分布式式计算。而drupal内部也有类似的这种机制,它是通过XML的形式进行请求很获取数据的(结果通常已经转化为可直接使用的数据)。中间的网络连接、HTTP访问是否成功等底层实现drupal会帮你搞定。

2、你需要做的就是:通过xmlrpc函数来请求某个站点的某个函数,使其返回需要的结果。

3、如果你想开放自己站点的函数以被其他站点请求执行,则需要执行hook_xmlrpc()函数,设置好“被请求的名字”和“执行该请求的函数”之间的映射即可。

 

2013-4-15

关注taxonomy

1、taxonomy由vocabulary和term组成,而vocabulary包含了一个类别的term。比如vocabulary是“sport”,term可以是“football”、“basketball”等等。

2、term可以分多级,代表他们的相互关系。通常情况下是按树状来的,这时可以在taxonomy下直接通过“拖拉”来调节父子关系。但如果一个term有两个或多个父节点term,那么此时“拖拉”界面就不可用了,因为难以表示“图”结构的拖拉关系。

3、查看term下的node时,可以用taxonomy/term/1访问,可以有“与”(用“,”分隔)和“或”(用“。”分隔)的关系,比如taxonomy/term/1,2代表着既有标签1又有标签2的节点。同时还可以访问某节点的子、孙或更深层次的标点,此时用taxonomy/term/1/1表示同时包含“子标签”,taxonomy/term/1/2包含“子和孙标签”。以此类推,标签ID后面跟的数字代表层次。

 

2013-4-10

今天主要看了下drupal的session的机制。

1、可以建立自己的session.inc文件,实现_drupal_session_read()等函数来自己实现session的交互,以将session数据的存储在file中或其他(drupal7存储在MySQL中)
2、为了防止cookie被劫持而导致sessionId泄露的攻击,所以drupal在每次用户重新登陆时(或者改完密码时)生成新的sessionId。
3、同一用户在同一ip下的不同浏览器中的sessionID不同,所以seesion表中UID可重复,sessionID才唯一(主键)。
4、匿名用户在需要存储数据时才会建立session,否则不建立。这也方便了缓存来提供页面给匿名用户者,提高网站性能。
5、drupal在sessionId被需要前就已经创建好,以备使用。
6、查看当前用户的最后一次访问时间用$user->timestamp比$user->access更加精确,因为$user->timestamp存储在session表,每次访问一个页面时更新。而$user->access存储在user表,至少间隔一段时间(默认180秒)后才允许更新。

PS:Pro D7 page387的Changing the name of session没懂,有空再看吧~~

 

2013-4-9

今天主要是完整的了解了一遍drupal的缓存机制。so……下面都是关于缓存的

drupal分多个层次对网站内容进行缓存,包括page, block, menu, variable, filter caching等等,为每个类在系统中建立单独的缓存表,但所有缓存表的结构相同。

cache_set()和cache_get()用来存储和获取缓存值。

cache_clear_all()能根据不同的传入值来清除缓存,这里两个原则:

      ①在可能的情况下尽量减少缓存范围,不要“为了打扫厨房而把整个房子的地毯掀起来”。

      ②在所有情况下尽量都使用缓存的数据(感觉跟清除缓存木有半毛钱关系,不知道作者怎么想的  = =!,不过也是一个原则)

在拥有自己的缓存表而又要在管理员清除缓存时也清除自己的缓存表里的数据的时候,可以利用hook_flush_caches()来返回自己的缓存表名即可(提醒:缓存表的结构和系统缓存表结构还是要相同的)

 

2013-4-8 

1、drupal多步表单的实现原理:根据当前条件(步数)勾选该步的表单函数(返回表单数组),然后重构表单即可($form_state['rebuild'] = TRUE)。每一步的值也存在$form_state中。

-------参考源代码(http://drupal.org/project/examples,form_example下的wizard就是很好的可扩展的源码,其他的inc文件对学习表单也还不错)

普通分类: