Drupal 常见问题 (FAQ)

经常在Drupal群里提出这样和那样的问题,有的问题是重复了很多次,为了能节约大家的时间,对于在学习Drupal中遇到的问题,简单做个归纳,题就定为Drupal常识一百问。文章编排的顺序可能不是很有规律、或者有可能不是先易后难,暂时先做个罗列,等资料多了的时候再整理吧。

1. 如何安装drupal?

Drupal学习之前自然是搭建drupal的工作环境,然后安装drupal啦!

这第一问就是:

一、如何安装drupal?

答:对于drupal的开发环境,只要是适合php的就可以了。笔者推荐安装XAMPP集成开发环境,简单易操作。XAMPP的安装就不作介绍了,开发环境的配置可以参考本站的《如何配置XAMPP的本地工作路径》一文。

环境搭建好以后就可以安装drupal啦。这里以drupal6的安装为例:

1.将sites/default下的default.settings.php复制一份,并重命名为settings.php

2.通过phpmyadmin创建一个数据库,名字自己定义,如drupal。

3.地址栏输入drupal项目的工作路径,如http://localhost/drupal ,即可开始drupal的安装了。

下面按部就班安装下去,基本就没问题了。详细安装教程参见《Drupal6 入门系列教程—drupal6 安装简明图文教程》。

 

2. 当站点离线后,如何登录drupal 后台?

问题:当站点离线后,如何登录drupal 后台?

回答:对于初学者来说,一般都会遇到这个问题,那就是一不小心将网站离线了,却怎么也找不到进入drupal后台的入口.

如果稍微了解一下,就会发现,其实只要在你的站点后面加一下“/user”(前提是开启了简洁链接哦),如果没有开启简洁链接的话,你就需要再前面加上“q=?”,也就是“/?q=user”。

假如你的域名是:www.a.com的话,那你就可以通过www.a.com/user 或者www.a.com/?q=user

有些人可能用的是windows的IIS,简洁链接也没有开的话,那么可能要这么输入了:www.a.com/index.php?q=user

3. 如何获取当前页面的路径?

问题:如何获取当前页面的路径?

回答:

参考代码如下:

function current_path() {
  return $_GET['q']; 
}

Returns the current URL path of the page being viewed(返回当前浏览页面的URL路径)。


 

Taxonomy upgrade extras: 

4. Drupal 中文参考书有哪些?

问题:

对于初学者看英文资料有些吃力,能否介绍一些简单点的Drupal中文方面的资料呢?

回答:

1. 目前大陆还没有出版Drupal方面的中文书,2009由Thomas组合了howell和我编写了一本《Drupal6 水滴架站全机能攻略》,由台湾基峰出版社出版。

2. 由老葛翻译的《Drupal专业开发指南(Drupal6版)》,对于不懂编程的人来说,看起来比较吃力一些,不过对drupal的整体认识,会起到很大的作用,如果你是PHP程序开发者,这本书将是你Drupal之门的“葵花宝典”。

3. http://www.verynic.com 这个站的站长发起的翻译《Using Drupal》,目前已翻译第一章-第八章,第十一章。

4. 方擎(方医生)的《Drupal高手建站技术手册》 (Drupal6)(介绍较为浅显,可以先看样章

5. adrupal翻译的《学习Drupal 6 模块开发》(英文名:Learning Drupal 6 Module Development),第一章 - 第九章翻译完毕。(http://adrupal.com/node/59 [ 域名已过期 ] )

 

附件尺寸
Image icon using-drupal.jpg72.36 KB

5. 如何配置drupal 的简洁链接

示例:drupalchina.cn/?q=user ,drupalchina.cn/user,后者就是简洁URL,去掉了“?q=”的URL。简洁URL的好处,SEO。

这里以XAMPP集成安装包为例,介绍如何配置简洁链接:

1、 F:\xampp\apache\conf,在该目录下找到httpd.conf文件,打开,找到#LoadModule rewrite_module modules/mod_rewrite.so。

将前面的注释符“#”去掉。

2、把F:\xampp\apache\conf\apache conf里面的AllowOverride None改为了AllowOverride All,试了一下

<Directory "F:/xampp/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important. Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks Includes ExecCGI
  
    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride All
 
    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all
 
</Directory>
Taxonomy upgrade extras: 

6. 内容类型page 和story的区别

分别创建一个Page节点,和一个Story节点,并比较它们之间的区别。

答案:

Page和Story节点类型,是Drupal自带的两种节点类型,在Drupal7中,story被更名为了Article。

Page主要应用于静态的页面,而Story则应用于动态性的文章,比如部门的新闻,对于个人博客网站,如果是单人博客的话,一般用Story作为博客。Page没有节点的发布信息,而Story有。

Page默认是不会被推到首页的,而Story默认被推到首页。Page默认是禁止评论的,而Story则允许评论。从这几点可以看出,Story更具有交互性。

Taxonomy upgrade extras: 

7. Views 怎么指定他的显示的模板?

回答:views的配置里 有模板名称建议:

Advanced -- Theme:Information

8. 请问第三方模块的如何翻译成中文?

问题:

请问第三方模块的如何翻译成中文,我已经下载了views-7.x-3.5.zh-hans.po,不知道怎么放到网站中?

回答:

推荐用l10n_update这个模块更方便下载安装翻译:

http://drupal.org/project/l10n_update

备注:该模块将纳入drupal8核心。

9. 已发布的文章如何设置不在首页上显示?

问个问题,发了一个blog文章,但是不想让他在网站首页上显示。怎么办?

回答:编辑内容类型取消发布到首页。

 

我想这个blog类型的文档都不在首页显示。所以我去content type里面不选  Promoted to front page 。可是没有用。为什么呢?只能每一篇文章,每一篇文章的选?

回答:该设置不对已发布的文章有效。

10. 钩子的实现就像事件,把一个对象分给各个模块去处理是吗?

Nemo回答

我觉得是event,注册一个事件,等待触发。

那事件的顺序呢? 回答:根据事件所在的模块的#weight

这个#weight在哪改?

回答:

system表里有,可以在.install里指定,默认是0

11. Drupal后台主题怎么和前台主题一样吗?

问题:

我下载了知名的后台主题rootcandy,看网上说 rootcandy是一个不错的后台管理主题。

请教大家一下 drupal后台主题怎么安装 和前台主题一样吗?

回答:

主题配置页面最下面有个“管理主题”选项,选择一个主题作为后台主题,保存即可。

backend_theme.jpg

12. 我的解析地址是xxxx.com,怎么让它默认变成www.xxxx.com啊?

问题:

我的解析地址是xxxx.com,怎么让它默认变成www.xxxx.com啊?

回答:

回答:drupal根目录下的.htaccess里有设置。

13. drupal中国的模块中文介绍在哪呢?

drupal中国的模块中文介绍在哪呢?

http://drupalchina.cn/mo-kuai-jie-shao

14. 新装一个主题时页面白屏,如何设置一个默认主题?

问题:

请问我不小心退出登陆了 但这个主题没有登录口 而且之前不知道为什么我其他界面都不能显示内容所以 ?q=user 也不行,怎么办呢?看网上说更换默认主题 去variable表里把默认主题换了,我进variable里面但怎么换默认主题呢?

 

回答:

Drupal7 针对这个问题,已经做好了预备方案,找到sites/default/settings.php,搜索“$conf['theme_default'] = 'garland';” ,去掉前面的“#”。

这样,garland就会成为默认主题了。此时,你可以到后台将默认主题切换至之前没有问题的主题为默认主题即可。

15. 打开drupal的css和javascript压缩后,主题的背景图片就没了,如何解决?

问题

打开drupal的css和javascript压缩后,主题的背景图片就没了,如何解决?

CSS这样写的:

body {
  background: url("../images/login-bg.png") repeat scroll 0 0 transparent;
}

回答

CSS文件改成utf-8无BOM编码格式。

Taxonomy upgrade extras: 

16. Drupal内容页可以设置自动分页吗?

问题:

Drupal内容页可以设置自动分页吗?

回答:

Drupal7核心默认没有对内容页做分页的功能,官方有一些模块可以实现这样的功能。

推荐模块:

https://drupal.org/project/smart_paging D7 中文教程http://drupalchina.cn/node/1735

其他模块:

http://drupal.org/project/cleanpager d7,d6

http://drupal.org/project/pagination d7.x-dev

http://drupal.org/project/custom_pagers 6.x-1.0-beta2 d7.x-dev

Taxonomy upgrade extras: 

17. $front_page 是 Drupal 核心定义的变量吗?

问题

各位老师,问个问题  像是<?php print $front_page;?>中的 $front_page是drupal规定好的  是么?

回答:

这是Drupal核心定义的变量,参看api手册:

https://api.drupal.org/api/drupal/modules!system!page.tpl.php/7

$front_page: The URL of the front page. Use this instead of $base_path, when linking to the front page. This includes the language domain or prefix. (译文:$front_page: 首页的URL。当链接至首页的时候,可以使用它来替换$base_path。它包含语言域名或者前缀)。

Taxonomy upgrade extras: 

18. 怎么让网站自动识别访问终端并自动切换主题?

请教:怎么让网站自动识别访问终端,并自动切换主题(themes)?

比如用PC访问 用 garland,用手机访问用 AT。

回答:需要用到两个模块:mobile switch (https://drupal.org/project/mobile_switch)、 browscap (https://drupal.org/project/browscap)。

mobile switch 模块依赖于 browscap模块。

Taxonomy upgrade extras: 

19. 如何给Drupal7 的内容管理页面添加一列?

问题:

如何给Drupal7 的内容管理页面(admin/content)添加一列?

回答:

admin_views(https://drupal.org/project/admin_views)模块把你想用代码实现的方式已经预先解决了。

通过这个模块 可以覆盖默认的/admin/content页面 可以在views里添加和删除不需要的列!使用此模块,可以不用写代码就可以轻松定制自己的内容管理页面了。除此之外,此模块还有评论和用户的管理页面,都是用views覆写了的!

(备注:需要注意的是:admin_views模块,有几个依赖的模块,如:ctools、views、entity、views_bulk_operations。)

当然,有些时候不想装太多的模块,想自己写代码,是否可以用代码方式来实现呢?

答案是肯定可以的。

比如:想加一列“Changed by”(更新者),需要自定义一个模块,可以使用如下的代码(注意:请把“MYMODULE” 改为你的模块机器名):

function MYMODULE_form_node_admin_content_alter(&$form, &$form_state, $form_id) {
  // Load the nodes. This incurrs very little overhead as 
  // "$nodes = node_load_multiple($nids);" has already been run on these
  // nids in node_admin_nodes(). The static cache will be used instead of
  // another db query being invoked
  $nodes = node_load_multiple(array_keys($form['admin']['nodes']['#options']));

  // Grab a list of all user ids that have been responsible for changing the node
  $uids = array();
  foreach ($nodes as $node) {
    $uids[] = $node->changed_by;
  }

  // Filter out duplicates (one user may have been the last to change more than one node)
  $uids = array_unique($uids);

  // Load a list of all involved users in one go. This is about as performant
  // as this is going to get, as you're going to need the user objects one
  // way or the other for the call to theme_username
  $users = user_load_multiple($uids);

  // Add another column to the table header
  $form['admin']['nodes']['#header']['changed_by'] = array('data' => t('Changed by'));

  // Loop through the rows in the table and add the changed by column
  foreach ($form['admin']['nodes']['#options'] as $nid => $row) {
    // Grab the user related to this node.
    $this_user = $users[$nodes[$nid]->changed_by];

    // Add data for the new column
    $form['admin']['nodes']['#options'][$nid]['changed_by'] = theme('username', array('account' => $this_user));
  }
}

效果如下图所示:

enter image description here

 

20. 发布的图片或者图片不显示如何解决?

问题:发布的图片或者图片不显示如何解决?

问大家个个问题 我发布一个内容

<p>
  <img alt="" src="/mncms/sites/default/files/images/1122.jpg" style="height: 735px; width: 980px;" />
</p>

在数据库里面 是存入这个值的 可是发布以后就读不出来了 这个是为什么呢?

回答:发布文章的时候,内联CSS样式或者JS代码写在行内,会被过滤,默认的只有"PHPcode"不会被过滤。因此,文本格式需要选择“PHPcode”即可。

Taxonomy upgrade extras: 

21. 如何对针对不同角色设置内容类型的访问权限?

问题:如何对针对不同角色设置内容类型的访问权限?

对已经发布的 node 的类型,能对不同的用户 做访问权限控制么?
比如:我有 A、B两种内容类型 我要A可以对匿名访问者开放,A、B 同时对editor 开放。

回答https://drupal.org/project/content_access 这个模块就是对内容类型设置权限的。

https://drupal.org/files/images/content_access.png

 

22. 我要获取commSubject 下的vcomment_body 中的 value,php代码如何写?

问题:我要获取commSubject下的comment_body中的value,php代码如何写?

php代码如何一句实现得到comment_body中的value?

2014-09-22-comment_value.png

 

回答:

comment_body['und'][0]['value']

 

Drupal7下如何在page.tpl.php里输出图片?

问题:Drupal7下如何在page.tpl.php里输出图片?

回答:

方法有很多,举2个例子:

方法1,使用theme()函数:

print theme("image", array(
    'path'  => path_to_theme() . "'/img/img.jpg",
    'width' => "240",
    'height' => "300",
));

方法2,直接用img标签(这种方法一般不推荐):

global $base_path;
print "<img src='" . $base_path . path_to_theme() . "/img/img.jpg' width='240' height='300' />";

相关链接:

Drupal如何实现不同用户不同主题?

问题:

Drupal如何实现不同用户不同主题?

回答:

Drupal6版本时候默认可以设置,Drupal7移除了,可以用 themekey模块设置: https://www.drupal.org/project/themekey

关于theme_image() 和theme('image', $variables) 之间区别与联系

提问:还有一个问题 核心定义了theme_image() ,但是调用的时候是theme('image', $variables) 有什么讲究吗?

回答:

theme_image()是核心定义的方法,theme('image', $variables)是调用的时候使用。

有一种说法(待确认):theme('xxx', $ooo) 这么调用的话,它是有个优先级的,比如优先调用THEMENAME_xxx, modulename_xxx,所以建议theme('xxx', $ooo) 这么调用。

参考链接

在Drupal内容页如何单独输出页面访问次数?

问题:在Drupal内容页如何单独输出页面访问次数?

回答:

Drupal核心提供了统计(Statistics)模块,主要是用于统计node页面被浏览的次数。对于默认主题或者常用的第三方主题,如果想在node页面显示统计次数,开启Statistics模块,然后到node页面刷新,即可看到页面访问次数。

但是对于有时覆写了页面的tpl,我们想只输出部分我们需要的字段时,我们会需要单独输出访问次数。

我们可以这样,覆写node.tpl.php,在需要输出的地方加上以下代码:

<?php 
  $views_count = statistics_get($node->nid); 
  print($views_count['totalcount']); 
?>

保存,然后清drupal cache,查看node页面,就可以生效了。

请教一下,这种键带“#”,有的时候不带,为什么?

提问:请教一下,这种键带“#”,有的时候不带,为什么?

......
  $content['my_markup'] = array(
    '#type' => 'markup',
    '#markup' => '<p>Hello, Drupal!</p>',
  );
......

回答:

带#号的是函数定义的一些键,是可用来render的数组,这些键是在Drupal核心里定义的。

参考链接