Drupal问答

自站点成立以来,不少朋友通过email或者其它方式,向我询问drupal方面的问题,许多问题,这个用户遇到了,下个用户也可能 会用到。所以我决定,将所有的问题,以及我的答复,统一归类到一起,这样如果回答不准确,不对的时候,我将来也好修改。另一方面就是,如果有人遇到同样的问题,我就不用回答第2遍了。

当然,drupal设计的东西还是很多的,并不是每个问题我都能回答得了,也不是每个问题我都能给出详细的答案,比如一个问题需要写上几十行的代码,我会尽力回答好每个问题的,对于费时的,我也会给出相应的方法,对于自己不会的,自己也会不断研究,争取有一天,能够回答你的问题。

问题范围,只要和drupal相关就可以了。我的联系方式可以参看页面右下角。暂时只通过email的方式,不会通过论坛的。

Drupal版本:

Acquia drupal和drupal比较

昨天看到Acquia drupal 1.0发布了,这个是基于drupal6的一个版本。Acquia drupal现在不支持drupal5,将来也不会支持。它是从6开始了。每当drupal发布一个版本以后,它都会快速的跟进。它是建立在drupal基础之上的,而不是drupal的一个分支。

昨天,我从Acquia网站上,下载了他们发布的最新版本。解压缩到本地。发现的第一个不同点,就是Acquia drupal的体积要大很多,基本上是drupal的2倍吧。看来确实加了不少的东西。

从上面的文件夹往下看,includes目录下面没看出来变化,misc好像也没有,modules下面有变化了,多加了一个acquia目录,里面放置了20个他们精心挑选的模块。Profiles也有改动,默认的default被替换为了acquia。Scripts目录下面没有看出来变化。Sites目录下多了一个files子目录,而在sites\all下面,则添加了modules和themes两个子目录。在themes目录下面,添加了一个新的主题acquia_marina,看样子挺漂亮的。另外还增加了一个uploads目录,专门用来上传文件。跟目录下面的其它文件都没有变化,包括LICENSE文件,里面采用的都是GPL协议,所以担心acquia搞分裂的人,现在可以放心一下了。

安装Acquia drupal,把下载的文件解压到xampp\htdocs\acquia目录下,修改sites\default目录下的settings文件,我的是$db_url = 'mysql://root:@localhost/acquia';。还有创建数据库acquia。在浏览器地址栏中,输入http://localhost/acquia/install.php,将会把你带到一个页面http://localhost/acquia/install.php?locale=&profile=acquia,在这里你需要输入用户名,email,等等,于drupal6.4唯一不同的地方是,让你输入acquia subscription identifier,和key。这个不理它就是了。当然上面的图标也被替换成acquia的了。点击保存,安装就成功了,我的报了一点错误信息,但是不碍事,warning: mail() [function.mail]:。。。Unable to send e-mail。这个也不用管。

进入以后,在上面老提示你输入identifier和key了,不过不是红色。Acquia有免费的可用,如果需要的话可以去申请一个。最上面的管理菜单很酷。

里面有不少新的特性,还是自己动手亲自看看吧。

相关链接: http://acquia.com/ ,Think in Drupal

Drupal版本:

Drupal Google cse模块常见错误分析

很多个人站点安装了google的自定义搜索引擎,对于Drupal站长来说,有一个非常方便的模块可用那就是google_cse, Google Custom Search Engine.

       这个模块还是比较好用的,但是对于初次使用的用户,开始会碰到一个问题,点击搜索后,系统报错, Your client has issued a malformed or illegal request.

       原因就是,没有在模块的后台正确的配置cx,导航到admin/settings/google_cse,你会看到第一项, “Google Custom Search Engine ID”:,很多人不知道这个地方填什么,以至于填错了,这里出错,就不能正常工作了.你就会看到上面的错误.

       在这里输入的就是cx的值,cx的值在哪里呢?访问http://www.google.com/coop/manage/cse/,点击控制面板,在点击代码,你会看到这样的一段代码:

 

<form action="http://www.google.com/cse" id="cse-search-box">

  <div>

    <input type="hidden" name="cx" value="006644068316277358089:7skgjry3hxc" />

    <input type="hidden" name="ie" value="UTF-8" />

    <input type="text" name="q" size="31" />

    <input type="submit" name="sa" value="搜索" />

 

  </div>

</form>

 

<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=zh-Hans"></script>

 

在这里有用的就是<input type="hidden" name="cx" value="006644068316277358089:7skgjry3hxc" />

这里就给出了cx的值,把这个值拷贝到“Google Custom Search Engine ID”中,这样就可以了.

 

Drupal版本:

drupal中url传值和表单传值

 

drupal的传值很有意思,不过我做的时候都是在编写模块时用的,不知道别人怎么做的,然后就是

我写的东西比较少,有什么问题或者错误希望大家给指出来啊,呵呵。这个传值相当于普通php的url

地址是http://xxx.com/aaa?aa=hello&bb=world&cc=fine.这个的传递方法大概是这样的:

    $items['aaa/%'] = array(

    'title' => 'aaa',

    'page callback' => 'show_sub',

    'page arguments' => array(1),

    'access callback' => TRUE,

    'access arguments' => '',

    'type' => MENU_NORMAL_ITEM,

    );

    function show_sub($cat1 = ''){

echo $cat1;

}

这样就把aaa/后面的这个值传到函数show_sub里了。举个例子,您访问的是http://drupal/aaa/hello,在这个页面上

就会输出hello这个值。如果page arguments这样的话 page arguments => array(1,2,3),那么对应的函数这么传值

function show_sub($aa = '',$bb = '', $cc = ''){ echo $aa.$bb.$cc;}那么当您访问http://drupal/aaa/hello/

world/fine这个地址时就会输出helloworldfine。这个是url传值。它的具体用法还要大家多多实验,我也不能说的

很清楚。

另一个想说的是form传值。它和url传值有点类似,一个是老东写过的一个文章里的例子,详细:http://www.cmsns.com/node/6

print drupal_get_form('test_form', $node);

//表单函数上就可以接收到了。

function test_form(&$form_state, $node){//注意这里是$node,也就是说可以直接传进来个数组的值。

$form['title'] = array(

    '#type'=> 'textfield',

    '#title' => '主题',

    '#default_value' => 11111,//默认值

    '#maxlength' => 128,//长度

        );

return $form;

}

这个可以随便放到一个主题里的page.tpl.php就能看到效果,另一种方法还是hook_menu,原理和url传值是一样的。就是

  $items['aaa/%'] = array(

    'title' => 'aaa',

    'page callback' => 'drupal_get_form',

    'page arguments' => array('test_form',1,2,3),

    'access callback' => TRUE,   //访问权限,设为TRUE的话任何人都能访问

    'access arguments' => '',

    'type' => MENU_NORMAL_ITEM,

    );

   function test_form(&$form_state,$aa = '',$bb = '',$cc = ''){//传递表单参数

        $form['title'] = array(

    '#type'=> 'textfield',

    '#title' => '主题',

    '#default_value' => $cc,//默认值

    '#maxlength' => 128,//长度

        );

  return $form;

}

这个访问http://drupal/aaa/hello/world/fine的时候form的title就是fine这个值

 

Drupal版本:

如何在Drupal的其它页面中嵌入内容类型表单(content type form)

 

在Drupal中,我们创建一个内容时,通常使用这样的路径node/add/article,或者node/add/page,这里面的article和page,就是相应的内容类型,对应的页面,就是article和page这两个内容类型的表单页面。

现在,如果我想在别的Drupal页面中输出,article内容类型的表单(content type form),该怎么办呢?

在drupal 7中,我们使用这样的代码:

 

  $form['title'] = array(

    '#type' => 'textfield',

    '#title' => t('Title'),

    '#required' => TRUE,

  );

  $node = (object) array(

    'uid' => $user->uid,

    'name' => (isset($user->name) ? $user->name : ''),

    'type' => 'article',

    'language' => LANGUAGE_NONE

  );

 

  //$form = drupal_get_form('node_form',$node);

  field_attach_form('node', $node, $form, $form_state);

 

    这里使用了field_attach_form,同时将表单的标题,也加入了进来,这是一种办法,也是我比较喜欢的办法。此外,还有别的办法。Drupal中解决问题的方式很多,通常都是有多种办法的。后面有机会介绍另一种办法。

     field_attach_form在think in Drupal第4集的实体API(Entity API)一章有介绍。

 

Drupal版本:

如何将Drupal中Date表单元素的月日年的顺序改造为年月日

老葛的Drupal培训班 Think in Drupal

我们在表单元素中,很多时候都会使用date这样的元素,但是,你会发现,这个元素由3个select组成,他们的顺序为月,日,年,这是不符合中国的习惯的。
       我在帮人指导建站的时候,就遇到了这样的问题,但是找不到答案。我判断,可以通过theme层搞定这个问题,这样就去找了对应的theme函数。这个问题在网上好像是找不到答案的,我google了多次,但是都找不到,也有人遇到了同样的问题,但是都是绕道而行。
       我决定尝试着解决这样的问题,因为我相信,一定存在一个方法,将月日年的顺序调整为年月日。先看系统生成的默认元素里面的markup。然后就去找对应的主题函数,这样就找到了theme_date。
       代码如下:
function theme_date($element) {
 return theme('form_element', $element, '<div class="container-inline">'. $element['#children'] .'</div>');
}
container-inline就是这里生成。但是3个子元素的顺序不是这里决定的。我的第一个想法是,覆写这个函数,print_r($element['#children']),这样就可以到定这个顺序问题了。
       不过我很想知道,核心代码中,哪部分决定了3个子元素的顺序,这样,就找到了expand_date($element)。代码如下:
function expand_date($element) {
 // Default to current date
 if (empty($element['#value'])) {
    $element['#value'] = array('day' => format_date(time(), 'custom', 'j'),
                            'month' => format_date(time(), 'custom', 'n'),
                            'year' => format_date(time(), 'custom', 'Y'));
 }
 
 $element['#tree'] = TRUE;
 
  // Determine the order of day, month, year in the site's chosen date format.
 $format = variable_get('date_format_short', 'm/d/Y - H:i');
 $sort = array();
 $sort['day'] = max(strpos($format, 'd'), strpos($format, 'j'));
 $sort['month'] = max(strpos($format, 'm'), strpos($format, 'M'));
 $sort['year'] = strpos($format, 'Y');
 asort($sort);
 $order = array_keys($sort);
 
 // Output multi-selector for date.
 foreach ($order as $type) {
    switch ($type) {
      case 'day':
        $options = drupal_map_assoc(range(1, 31));
        break;
      case 'month':
        $options = drupal_map_assoc(range(1, 12), 'map_month');
        break;
      case 'year':
        $options = drupal_map_assoc(range(1900, 2050));
        break;
    }
    $parents = $element['#parents'];
    $parents[] = $type;
    $element[$type] = array(
      '#type' => 'select',
      '#value' => $element['#value'][$type],
      '#attributes' => $element['#attributes'],
      '#options' => $options,
    );
 }
 
 return $element;
}
注意代码中红色的部分,3个子元素的顺序,是由日期格式决定的,我猜测,调整日期格式,就可以改变3个子元素的顺序,我尝试着将日期格式都改为了年月日:导航到admin/settings/date-time,将3中长,中,短的日期格式都调整为自定义格式,Y/m/d(D) H:i。
这样,date元素中的顺序,就从“月,日,年”调整为了“年,月,日”。
 

Drupal版本:

玩转Drupal

Drupal确切地说就是面向程序员的,再准确一点说,它就是一个CMS开发框架,尽管Joomla,wp等等,也被人们称为框架,但是Drupal与它们相比,更难一些.

       我认识一些人,不乏许多程序高手,不乏许多玩过其它CMS的高手,他们因为Drupal的灵活,选择了Drupal,但是却在灵活性上碰了壁,许多人最终不得不放弃Drupal.

    还有大多数的人,搞过Drupal开发的人,更多准确的说,是在Drupal的基础上,写过几个PHP函数,PHP的方式搞定了客户,做过两三个Drupal项目.

       在中文的Drupal圈子内,大多数的人都是这样的,他们不懂表单API,不懂Drupal的菜单机制,许多人就连Drupal的主题系统也不明白,Drupal相关的其它方面,大多数人还是一知半解的.

       我举个例子,我以前在公司的时候,有个国外的项目,很小的问题,就是修改一个表单的外国,两个同事搞了两天,他们接触Drupal很长时间了,但是都没有搞定,后来就让我帮忙,不到1小时就帮他们解决问题,其实很简单,就是去覆写一个表单元素的外观,他们不了解.

       Drupal的问题,就是这样,如果你不了解它的底层机制,又不愿意去学习的话,那么在项目中,等待你的应该是老板的抱怨和客户的离去.

 

       那种抱着12个月就能搞定Drupal的人,还是踏踏实实的去学习装装FCKeditor,搞定图片上传这样的基本问题吧。我每天花10个小时学Drupal,一个项目一个项目踏踏实实的去做,花了半年的时间,才感觉真正的入了门,即便是到了今天,还有许多问题没有接触过。

       12个月就能搞定Drupal,一两个人花上一两个月的时间,就能搞定你的大想法。如果你怀着这样的心理,等待你的,只有钉子。

论坛:

Drupal feeds导入大的CSV文件,中间过程时,停止了

错误信息大致如下: •Warning: fopen(public://feeds/FeedsHTTPFetcherResult1337706181): failed to open stream: "DrupalPublicStreamWrapper::stream_open" call failed 在 FeedsFetcherResult->sanitizeFile() (行 87 在 /var/www/d7production/sites/all/modules/standard/feeds/plugins/FeedsFetcher.inc). •Warning: fgets() expects parameter 1 to be resource, boolean given 在 FeedsFetcherResult->sanitizeFile() (行 88 在 /var/www/d7production/sites/all/modules/standard/feeds/plugins/FeedsFetcher.inc). •Warning: fclose() expects parameter 1 to be resource, boolean given 在 FeedsFetcherResult->sanitizeFile() (行 89 在 /var/www/d7production/sites/all/modules/standard/feeds/plugins/FeedsFetcher.inc). •Warning: fopen(public://feeds/FeedsHTTPFetcherResult1337706181): failed to open stream: "DrupalPublicStreamWrapper::stream_open" call failed 在 ParserCSVIterator->__construct() (行 19 在 /var/www/d7production/sites/all/modules/standard/feeds/libraries/ParserCSV.inc). •Recoverable fatal error: Argument 2 passed to feeds_tamper_feeds_after_parse() must be an instance of FeedsParserResult, null given 在 feeds_tamper_feeds_after_parse() (行 14 在 /var/www/d7production/sites/fltrp.com/modules/standard/feeds_tamper/feeds_tamper.module). 这个问题,在官方网站上可以找到答案,可参看 http://drupal.org/node/1029102。 正确的答案应该是评论15里面给出的,这是一个权限问题,Feeds在查找文件FeedsHTTPFetcherResult1337706181,但是在这里没有找到,要么你手工的创建一个这样的文件,要么删除这个文件夹,让系统帮你再创建一次。

Drupal版本:

Drupal是什么

第一次听说drupal是在一年前的时候,那时根本就不知道它是干什么的,通过百度,谷歌了解到,它是一个php的cms。然后就开始学习PHP,drupal,PHP只是在drupal中学习了,所以到现在,对于一些很常见的php函数,我还是没有用过的。现在,已有一年多的时间了。对Drupal也有所了解,并实践一些项目了。所以想回过头来总结一下。

 

首先,drupal什么呢?

 

Drupal是一个基于php+mysql的CMS系统。它是一个CMS,建立在php+mysql之上的。CMS能干的,drupal都可以胜任。比如搭建一个公司宣传类型的网站,比如为某个大学建个校园网,都可以使用 drupal。就连许多名人的个人网站,许多也都是用它建立的。比如最近在中国巡回演出的摇滚歌手艾薇儿(Avril Lavigne)的官方网站http://www.avrillavigne.com使用就是drupal.

 

Drupal是一个新型的操作系统,也是一个平台。这个是drupal创建者的一个目标。使用它,加上各种各样的第3方模块,你可以搭建各种类型的网站。就像垒积木一样,对于许多不懂得Php,许多不懂得编程的人都可以使用drupal搭建一个漂亮的网站。在drupal.org上,已经有成千上万个第3方模块了,覆盖了互联网上的各种应用,SNS,电子商务,视频,音频网站,博客,wiki,dig,等等,使用现成相关的模块就可以搭建一个。也有人将此称之为web3.0。

 

Drupal是一个php框架。就如同java中的struts一样,它自己为你封装了很多函数,在开发过程中,你只需要调用它的api就可以了。有时,你完全你可以撇开它所提供的一些功能,仅仅把它作为一个框架,在其基础之上开发自己的东西。所以,对于使用drupal进行定制开发的人,一定要熟悉它的API。

 

关于drupal是什么的相关介绍,还可可参看:

Drupal官网上drupal是什么的回答:http://drupal.org/about

官方的(acquia drupal)drupal是什么回答:http://acquia.com/what-is-drupal

drupal中国上drupal是什么的回答:http://drupalchina.org/about

百度知道上drupal是什么fhileo的回答http://zhidao.baidu.com/question/44832523.html

相关链接: Think in Drupal

Drupal环境问题,cURL 的安装

我在启用Drupal7核心模块Testing的时候,没有安装成功,提示需要安装php的cURL库,系统的错误信息如下:

The testing framework could not be installed because the PHP cURL library is not available. (Currently using cURL Not found)

 

打开xampp下面的php.ini文件,找到下面的一行:

extension=php_bz2.dll

;extension=php_curl.dll

;extension=php_dba.dll

extension=php_mbstring.dll

extension=php_exif.dll

将php_curl.dll前面的注释符号“;”去掉,保存文件,重启Apache,即可。

现在重新安装Drupal的Testing模块。就安装成功了。

Drupal版本:

Parse error: syntax error, unexpected T_VARIABLE

你遇到过这样的错误吗,在编写drupal模块时,由于需要在中英文之间切换,不小心引入了以下错误:

Parse error: syntax error, unexpected T_VARIABLE in F:\xampp\htdocs\drupal-6.5\sites\all\modules\zixun\zixun.module on line 30

 

我写的代码如下:

function zixun_menu() {

 

  $items['admin/settings/zixun'] = array(

    'title' => 'zixun',

    'description' => 'peizhi',

    'page callback' => 'drupal_get_form',

    'page arguments' => array('zixun_admin_settings'),

   //'access arguments' => array('admin zixun configuration'),

  );

 

  return $items;

 

}

function zixun_admin_settings(){

 

}

 

 

/*

function zixun_admin_settings(){ 

 $form['mail'] = array('#type' => 'textfield',

      '#title' => t('Your e-mail address'),

      '#maxlength' => 255,

      '#default_value' => $user->uid ? $user->mail : '',

      '#required' => TRUE,

    );

    return system_settings_form($form);

}*/

  //$form['zixun_nodetypes'] = array(

  //     '#type' => 'checkboxes',

         //'#title' => t('用户可以对以下节点类型的文章进行咨询'),

         //'#options' => node_get_types('names'),

         //'#default_value' => variable_get('zixun_nodetypes',array('page')),

         //'#description' => t('在这些节点类型下面,就会多出一个咨询的输入框'),

//       );

//       $form['array_filter'] = array('#type' => 'hidden');

//       return system_settings_form($form);

 

整了半天,还以为我哪里写错了呢?看看这也对,那也对,是不是drupal6的模块的编写有特殊的规定,我没有遵守.怎么试都出错,最后没办法,google了以下,发现了解决方案。原来我使用了全角输入。

我的代码不是拷贝的,都是一个一个敲进去的,只不过自己用的是微软拼音,有时候需要中英文切换以下,不知道什么时候,搞成全角输入了。后来试了一下,果然是这个问题。

相关链接:Think in Drupal

Drupal版本:

Zend debugger 的配置安装

      以前用过Zend debugger的,不过那时候是同事帮我配置的环境。由于新装了环境 ,而且换了XAMPP,以前用WDP的。由于要开发修改一个drupal模块,所以想搭个测试环境,跑一跑。

      大概的印象还是有的,虽然自己不太会php,特别是一些配置的东西,不过还是会使用百度,google的。先google一下Zend debug,找到了知道要用的调试器为Zend debugger,刚开始连名字都不记得了。然后就搜到了两篇安装指南。按照说明先到http://downloads.zend.com/pdt/server-debugger下载最新的debugger。我下载的是ZendDebugger-5.2.14-cygwin_nt-i386.zip。将其解压缩。得到一个目录:

<DIR> 4_3_x_comp
<DIR> 4_4_x_comp
<DIR> 5_0_x_comp
<DIR> 5_1_x_comp
<DIR> 5_2_x_comp
<DIR> 5_2_x_nts_comp
321 dummy.php
6,934 Inventory.xml
376 md5
832 README.txt

这里我用的是5_2_x_comp中的ZendDebugger.dll。

 

下面是具体的操作步骤。
1、请将ZendDebugger.dll复制到您的php安装目录下,比如:F:/xampp/php。
2、然后将下面的4行内容加到您的php.ini:
[Zend]
zend_extension_ts=F:\xampp\php\ZendDebugger.dll
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always
其中,127.0.0.1是远程调试的文件所在机器的IP;我是本地web调试
3、将dummy.php复制到apache的document root目录。
4、重启apache。
     打开浏览器运行:http://192.168.1.25/phpinfo.php

 

     我照着作了,但是不对,始终建立不起来,不知道具体原因。又翻了好几篇文章,结果都是同一篇文章的转载。google虽好,但是解决不了我的问题。决定百度一下,很快找到一篇强文,因为对方也是用的xampp,里面说在xampp环境下php.ini文件指的是apache下面的F:\xampp\apache\bin中的php.ini,靠,我先前一直在改的是F:\xampp\php下面的php.ini和php5.ini,我说怎么不行啊。按照所说的修改F:\xampp\apache\bin下面的php.ini就可以了。由于我装的XAMPP版本比较新,自带了ZendExtensionManager,zendOptimizer,需要将

     ;zend_extension_ts = "F:\xampp\php\zendOptimizer\lib\ZendExtensionManager.dll"

     ;zend_extension_manager.optimizer_ts = "F:\xampp\php\zendOptimizer\lib\Optimizer"

     ;zend_optimizer.enable_loader = 0

     ;zend_optimizer.optimization_level=15

    注释掉,原来是没有的。我觉得应该可以共存的,不过这里zend_extension_ts这个重复了,不注掉下面的apache起不来。这个我试了。

 

总结,XAMPP下面,搭建Zend debugger需注意两点:

1,  php.ini文件指的是F:\xampp\apache\bin中的,apache/bin下面的。

2,  需要注释掉ZendExtensionManager的;zend_extension_ts等等。

 

    不过第2点可能存在更好的解决方案。我所用的环境为XAMPP, 其中php为5.2.6,操作系统vista,调试工具zend debugger.

 

相关联接:Think in Drupal , http://loveboat0204.blog.hexun.com/12433730_d.html 

Drupal版本:

drupal中的hook顺序问题

Drupal中的hook顺序问题,这是刚学Drupal开始时,经常遇到的一个问题,因为Drupal中的hook很多,有些hook,它的执行顺序,对后面的是有影响的。

比如hook_form_alter,如果一个多个模块,同时使用hook_form_alter修改同一个表单,这个时候,先后顺序不一样,效果可能也就不同。

在drupal7中,为了解决hook的顺序问题,我们可以调整模块的重量,比如我在Field

Validation模块中,就使用了下面的代码:

/**

 * Implements hook_install().

 */

function field_validation_install() {

  db_query("UPDATE {system} SET weight = 10 WHERE name = 'field_validation'");

}

通过将field_validation'模块的重量设置为10,从而让这个模块的钩子实现,放在靠后的位置执行。

Drupal版本:

drupal慢?不,Drupal很快

很多人刚接触Drupal的时候,总是感觉Drupal很慢,即便是在本地,装了几个Drupal模块以后,感觉就跑不动了。这个本身和本地环境的配置也有关系,建议修改php.ini文件,将PHP的内存,执行时间都调的大一点。这样就不会感觉慢了。

模块不要装太多,尤其是安装量比较小的Drupal模块,更应该注意。模块太多,对于性能的拖累也是非常明显的。

网站上线后,建议开启所有的缓存。性能优化的关键就在于缓存。有各种层次的缓存技术,具体可以参看Think in Drupal 第三集里面,有关性能优化的介绍。

 

Drupal6比Drupal5慢, Drupal7比Drupal6慢,Drupal8比Drupal7慢。其中,Drupal7的性能问题最为突出,性能比Drupal6慢很多。Entity API模块用的时候,要小心,很吃内存,也存在潜在的性能问题。顺便说一句,Commerce比Ubercart慢,具体慢多少,没有实际测试过,这是应该的,Commerce大量的使用Entity API,对性能影响很大,性能问题一直也是让commerce头疼的问题。

我们不能按照,单个页面的执行时间,作为唯一标准,判断性能的优劣。Drupal7在多个方面,都比Drupal6进步很多,而且Drupal7的性能问题,正在得到很大的改善。

 

Drupal,就像高铁上面的动车,只有跑在自己特有的轨道上,才能充分的发挥自己的性能优势。如果把动车,放到马路上,和汽车比,和自行车比,是很不科学的。

这个地球上,很多流量很大,每天千万PV,上亿次PV的站点,都有跑在Drupal上面的,这是其它很多商业软件,以及开源CMS所不能比拟的。

drupal的中文文件名附件上传问题

开发过程中,使用Drupal上传中文文件,文件名出了问题,原来系统不支持中文名. http://blog.chinaunix.net/u/19419/showart_1108081.html , http://www.5iphp.com/zh-hans/heart/180.html, http://www.blogme.cn/node/412, 这几篇文章给出了相应的解决办法,但是都是需要修改源代码的,所以决定找找看有没有别的办法.

 

使用Filefield模块来代替Upload模块,但是报错了.

warning: array_merge() [function.array-merge]: Argument #2 is not an array in F:\xampp\htdocs\rongzhi\modules\acquia\filefield\filefield.module on line 297.

 

但是很快发现,我没有启用Upload模块,还是Filefield模块的原因.搜索相关的资料,找到了Transliteration,其下载地址为: http://drupal.org/project/transliteration,这个是专门用来解决文件名编码问题的.

论坛:

drupal缓存清除小技巧

我今天发现的一个技巧,清除缓存的,那就是访问admin/build/modules也能够清除缓存。以前都是访问admin/settings/performance,点击里面的清除缓存数据按钮。

另外就是使用dev模块,清除缓存。后两者我都知道。

好像访问主题管理页面也能达到清除缓存的效果?最后这个我是猜测的,没有实验。

说到这里,就不得不提dev模块,模块很强大,我也使用过,但是开发的时候,我很少用它,不是因为这个模块不强大,而是最初的时候,我总是用写字板这样的工具拷贝和粘贴代码,所以在drupal中,会一些比较笨蛋的办法解决问题,而我觉得这些本方法已经很好用了,所以感觉不到对dev模块的需要。

论坛:

Drupal版本:

drupal表单重构

function test_form(){

if (isset($form_state['amazonbob_item'])) {

$markup .= '<pre>'. print_r($form_state['amazonbob_item'], TRUE) .'</pre>';

$form['item_data'] =

array( '#type' => 'markup',

'#value' => $markup,

'#weight' => 10, );

}

return $form; }

function test_form_submit(){

$form_state['amazonbob_item'] = $item;

$form_state['rebuild'] = TRUE; }

drupal的表单重构,感觉可以用在多级表单上了,呵呵,不是最好的解决方案。'#type'=>'markup' 这里markup是drupal表单的一个属性。print_r('XXX',TRUE);这个TRUE好像是把print_r出来的内容转化了,具体的还待研究,<pre> 格式化代码。

Drupal版本:

var_export debug在Drupal消息里面的应用

以前,自己总是使用 drupal_set_message(); 对于一些变量的输出,采用 print_r(); Drupal7里面有了debug以后,我经常这样用: print debug($var); 但是这样的一句在feeds导入的过程中不起作用,因为这里用到了batch API . 这个时候可以这样写: drupal_set_message('

' . var_export($unique_rules, TRUE) . '

');

Drupal版本:

warning: Missing argument 2 for variable_get()问题的解决

写模块的时候遇到的问题, warning: Missing argument 2 for variable_get(), called in…,发现问题以后,我很快大概知道问题出在哪里了,那就是variable_get()这个函数没有用对。我是修改的别的模块的代码,直接把第2个参数给删除了,为了省事,因为不删的话,就为空字符串了,觉得留着没用,就删了。

不过还是习惯的google了一下,找到一篇文章http://drupal.org/node/31792,讲的同一个问题。又查了查drupal api,果然是第2个参数,也就是默认值参数被删除的原因,那好,加上就可以了。

相关链接: Think in Drupal

论坛:

Drupal版本:

你问我答:$content变量,想扩展它的功能,比如添加node-page.tpl.php

问题:

G089h515r806,你好。
请问一下怎么定义$content这个变量。
我想在首页的时候调用node-front.tpl.php,术语的时候调用node-taxonomy.tpl.php,节点的时候调用node-page.tpl.php,默认情况下调用node.tpl.php
谢谢                             
         邓昌东

答复:

这个函数:
<?php
function _phptemplate_variables($hook, $vars = array()) {
  switch ($hook) {
    case 'node':
      $vars['template_files'] = array('node-'. $vars['nid']);
      break;
  }
  return $vars;
}
?>
你可以使用这种方法,如果用的是drupal5.X的话, 6.x我不知道这个方法是不是可行,不过也有相同的类似的方法.
就是在主题下面,建立一个template.php,然后向里面添加function _phptemplate_variables()函数,这个函数,里面根据你的实际作以下修改:
  $vars['template_files'] = array('node-'. ‘front');
  $vars['template_files'] = array('node-'. 'taxonomy');
  $vars['template_files'] = array('node-'. 'page');
 
这样你就可以在你的主题下面使用node-front.tpl.php,node-taxonomy.tpl.php,node-page.tpl.php,这些模板的用法和node-nodetype.tpl.php是一样的。不过你需要在代码中加上一些判断条件,判断哪个是front,哪个是taxonomy,哪个是page。
 
具体怎么判断我就不多说了。
你可以参看相关的手册,特别是节点的那部分。        

 

补充:这里还可以把 front,  taxonomy, page归纳为变量$path,   可以这样用:

  $vars['template_files'] = array('node-'.$path);

当然,前面你需要对$path进行一个处理。

Drupal版本:

如何使用VBO批量修改用户密码

在实际的Drupal项目中,偶尔会遇到批量修改用户密码的情况。在这种情况下,创建一个用户视图,启用VBO字段,动作选用"Execute arbitrary PHP script"(执行任意的PHP脚本)。

在批量操作的时候,输出以下代码:

<?php
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc'
);
$entity->pass = user_hash_password('my_new_password'
);
user_save($entity
);
?>

 

注意,不要输入 <?php ?>,自己可以在这里根据需要修改密码。

参考文章:http://drupal.org/node/1414694

 

Drupal版本:

如何将drupal节点置顶

无论是官方drupal.org,还是drupal china上,都有一篇文章置于最顶部,也就是最显眼的地方,由于我要搞drupal培训,发了篇培训信息,现在想把它置顶。现在看看怎么做?

找到“Zhupou.cn本周六,周日推出drupal培训课程”这篇文章,进入它的编辑页面,在“publishing options”(发布选项)中选中“Sticky at top of lists”(置顶)。Ok,这样就搞定了。

以前在学习节点的时候,知道有个Sticky变量,而在drupal内部也有相应的字段,当时把它翻译为“粘的”,纯粹是按照字面意思翻译的,现在终于明白,这个是用来置顶的。汉语中也有对应的词汇“置顶”。

相关链接:Think in Drupal

Drupal版本:

如何翻译drupal的url(菜单路径)

我们知道,drupal的A语言的节点可以映射到另一个B语言的节点,而drupal的模块,也能够使用potx模块提取里面的可翻译字符串,生成模板文件,从而在多个语言之间切换。

 

对于语言的切换,你可以使用url的方式,比如说,admin/settings,这个路径,使用url的方式en/ admin/settings,cn/ admin/settings,这样就可以在en,cn两个语言之间切换了。

但是如果想对url也进行翻译呢?我的意思是说把admin/settings翻译成汉语拼音guanli/shezhi。我在实际项目中,就遇到了这样的问题。我要编写一个模块,让客户和网站联系。Drupal自带的contact us满足不了需求。我们假定客户的需求是,对于英文的联系表单,使用路径http://example.com/contact-us,对于中文用户,路径使用http://example.com/lian-xi-wo-men 。然后下面是联系表单的各种字段,给出了中英文对应的文本。

编写一个模块,在菜单中定义路径contact-us,然后编写表单的逻辑,最后使用potx模板提取模块中的英文字段,然后将其中文化。将做好的po文件导入到drupal中,这个模块就汉化成功了。也就实现了中英文的切换,但是在切换的过程中,路径是不变的。怎么办?

我在网上看到许多人,问这样的问题,我在google上搜到了很多,比如:How to translate menu titles? Contact URL。等等,也看到有人写类似功能的实现,比如使用url别名,Multilingual frontpage with translation and URL alias

但是没有找到解决问题的办法,我仔细思考了drupal的国际化的机制,发现它并不支持url的翻译。这一点应该和drupal的菜单系统有关。那该怎么办呢?我从URL别名上获得了提示,使用两个别名,指向同一个内部路径,而两个别名之间是存在对应的翻译关系的。

实现的步骤如下,创建两个节点node1和node2,将两个节点用翻译关系对应起来,node1的本地语言为en,node2的本地语言为cn,设置node1的路径别名为contact-us,设置node2的路径别名为lian-xi-wo-men。

在模块中,实现一个区块钩子,这样模块中的表单就可以在区块中显示了,修改node1,node2对应的页面模板,去掉放置节点内容的congtent区域, 添加一个放置表单区块的区域,用来放置模块所生成的区块,最好放到正中央。配置模块生成的区块,将其仅显示在contact-u,lian-xi-wo-men这两个页面。

这样就实现了客户的要求了。在这里,节点node1和节点node2仅仅是一个壳子,作用就是放置表单中生成的页面的,而借助于节点之间的切换(使用localizer),就可以切换路径了。

     不知道我讲的大家听懂了没有,应该还有更好的办法来翻译drupal的url吧,我这里仅仅是实现了功能,并没有真正改变内部的url。

相关链接: Think in Drupal

Drupal版本: