1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

Drupal related

本帖由 东瓜2006-09-15 发布。版面名称:源码讨论

  1. 东瓜

    东瓜 New Member

    注册:
    2005-12-07
    帖子:
    2,306
    赞:
    25
    Drupal related
    记录一些 Drupal 相关的文章,主要翻译一些有用的放在此处备忘。

    4.7 的模块
    为了新的项目,寻找一些合用的模块。

    Admin block
    drupal.org/node/19309

    为管理员显示一个板块,显示那些需要管理的评论,方便进行编辑和删除。

    貌似不错的模块,只是站点评论少,就可以免了。

    Bad Behavior
    drupal.org/node/30501

    Bad Behavior 是一系列 PHP 片断的集合,通过分析实际的 HTTP 请求来识别垃圾机器人,并进行阻止。

    好像不错,不过暂时站点访问量小,也可以不考虑。

    Block Bar
    Block Bar

    是其他板块的容器,类似 Outlook 风格。

    如果侧边栏的板块多就可以用这个来节约空间。

    Bookmarks
    Bookmarks

    允许用户有自己的书签板块,可以添加任何 URL 到列表中,还有一个快速连接特性使得用户轻易将当前访问的页面添加到书签中。

    说的不错,只是我没有看到那个快速连接,每个 URL 都要手工输入,烦不烦?

    Browscap
    Browscap 对访问站点的浏览器进行识别,并对他们进行统计和监视,让管理员了解客户端的情况。

    很好的模块,有一定帮助。

    captcha
    captcha 随机产生一个有字符或数字的图片,必须看图识字,输入图中文字才能发表。

    防止垃圾,很有效。

    Drupal 的安装
    Drupal 在各种环境下的安装。

    常规安装 Drupal
    本文依据随 Drupal 发布的 INSTALL.TXT 文件翻译整理。

    首先当然要从 Drupal.org 下载需要的版本。
    在 Linux 下可以用 wget 来下,例如最新的 4.7 版:


    wget http://drupal.org/files/projects/drupal-4.7.0-beta3.tar.gz
    然后解压,在 Linux 下直接执行:

    tar zxvf drupal-4.7.0-beta3.tar.gz

    在 Windows 下可以用 7-zip(一个根据 GNU LGPL 协议发布的免费压缩/解压缩软件)。

    解压后得到 drupal-4.7.0-beta3 目录。

    如果在本地可以直接将该目录移动过去,例如:

    mv drupal-4.7.0-beta3 /var/www/html

    如果是在远程主机上,就用FTP客户端上传 drupal-4.7.0-beta3 目录下所有内容。
    未完成~~~~
    必要条件
    要安装一个 Drupal 站点,需要满足一定的条件,当然现在这种条件很容易满足。
    本文由 Holz 根据 http://drupal.org/node/270 翻译整理。

    一个可以执行 PHP 脚本的 Web 服务器。
    推荐: Apache。 Drupal 在 1.3.x 版下进行开发,但 2.0.x 版也已经成功通过测试。
    可选: IIS。 Drupal 在开发时就注意了与 IIS 的兼容,而且也有报告显示 Drupal 在 IIS 中是可以正常工作的。
    PHP
    对于 Drupal 4.6,需要 4.3.3+ 的 PHP (PHP 5 也 得到了 4.6 的支持)。 Drupal 4.2 到 4.5.2 需要 4.1+ 的 PHP。 更老版本的 Drupal 能运行在 PHP 4.0.6+。 推荐使用最新版本的 PHP 4.x。
    PHP XML 扩展 (用于 {bloggerapi|drupal|jabber|ping}.module)。 这个扩展在一个标准安装的 PHP 中 默认已启用, windows 版的 PHP 内建本扩展支持。
    一个 Drupal 内核安装需要 8MB 的 php 内存。 如果您安装了额外的模块可能需要 增加 php 允许的内存。 重新打包的 Drupal 发行版例如 CivicSpace 可能需要更高的 php 内存。
    PHP 需要 下列 配置 指令 使得 drupal 能正常工作:
    session.save_handler: user
    此外我们 推荐 下面的设置:
    session.cache_limiter: none
    (这里只写出与 PHP 4.0.6 默认 php.ini-dist / php.ini-recommended 不同的地方)
    上面的这些设置包含在随 Drupal 发布的默认 .htaccess 文件中,因此您实际上不需要设置他们。 虽然如此,仍然值得注意的是, .htaccess 中的 php 配置仅仅适用于
    Apache (或兼容的 webserver),
    当 .htaccess 确实被读取,如 AllowOverride 不是 None,
    当 php 作为一个 Apache 模块安装时。
    参考 此处 了解如何改变其他接口的 PHP 设置。
    使用一个支持 PEAR 的数据库 (见后文) 要求 (理所当然) PEAR 已正确 安装。
    一个支持 PHP 的数据库服务器
    推荐: MySQL, v3.23.17 或更新版本 (我们使用 INNER JOIN's with join_condition's)。 MySQL 4 就不错。
    drupal 在某些廉价的主机计划中一些功能不能用,例如 LOCK TABLE
    从 4.7 以后工作良好的有: PostgreSQL, 7.3 或更新 (7.2 也许能工作,但从 4.6 更新时可能会有一些错误)。 其他数据库需要您的实验。
    注意: 如果您的系统/主机运行 MySQL 4.1 以上版本,在疑难解答部分的 (http://drupal.org/node/35226) 会连接到 这个页面,那里有一些有助于定位 PHP 4.x 和 PHP5 问题的信息。 还有一些次要的 OS 文章讨论 MySQL 5+ 安装 主要基于 Windows 不过也部分适用于 *nix 安装。

    同样, 基于 xTemplate (4.6.x 及以前版本的默认主题引擎) 的主题也有一些关于 php5.0.5 和 5.1 的文章。 换用 phpTemplate (4.7 的默认主题引擎) 引擎看起来是个不错的解决办法。

    Drupal 的手册页面代码
    Drupal 的 handbook 页面是一个很不错的效果,所以上次的站点丢失以后,还是继续将这个代码找回来,记录下来以备后用。 这个代码需要 CSS 的配合。


    <?php
    // Book nids and their titles
    $books = array(1 => "About Drupal", 258 => "Installation and upgrading", 257 => "Configuration and customization", 316 => "Developing for Drupal", 14279 => "About Drupal documentation");
    foreach ($books as $nid => $title) {
    print '<h2 style="clear: left;">'. l($title, url('node/'. $nid)) .'</h2>';
    // Fetch first level children
    $result = db_query("SELECT DISTINCT b.nid, n.title FROM {book} b INNER JOIN {node} n ON b.nid = n.nid WHERE b.parent = %d AND n.moderate = 0 AND n.status = 1 ORDER BY b.weight ASC", $nid);
    // Output pretty two-column list
    $half = ceil(db_num_rows($result) / 2); $i = 0;
    $section = '<div class="column-left"><ul>';
    while ($page = db_fetch_object($result)) {
    $section .= '<li>'. l($page->title, 'node/'. $page->nid) .'</li>';
    $i++;
    if ($i == $half) {
    $section .= '</ul></div><div class="column-right"><ul>';
    }
    }
    $section .= '</ul></div>';
    print $section;
    }
    ?>

    这时 Drupal 的 CSS 代码,改改就可以自己用了。


    /* Styles for nside nodes */
    .column-left {
    float: left;
    width: 47%;
    padding-right: 3%;
    }
    .column-right {
    float: left;
    width: 47%;
    }
    .node img.right {
    margin-left: 5px;
    clear: right;
    float: right;
    padding: 1px;
    border: 1px solid #ccc;
    }
    .node img.left {
    margin-left: 5px;
    clear: right;
    float: right;
    padding: 1px;
    border: 1px solid #ccc;
    }
    .node .gallery-item {
    float: left;
    width: auto;
    margin-right: 12px;
    }
    .node .gallery-item img {
    border: 0px;
    float: left;
    clear: both;
    }
    ul.bulky li {
    margin-bottom: 0.5em;
    }

    在 Byethost 上安装 Drupal
    我自己在 byethost 上安装 Drupal 的经历。

    在 byethost 上装 Drupal 很花了一些时间,主要是一开始不清楚该主机的特别要求,例如要更改 htaccess 等,还有 FTP 上传,一开始用错客户端,几乎放弃。

    01.注册用户
    登陆 Byethost。



    单击页面下面的 Click Here to Sign-up 连接,根据提示建立一个用户,然后等待 Byethost 来信。

    一定要用一个正确的邮箱,否则收不到信就白忙活了。

    02.收到来信
    过了好长时间,大约二天,收到来自 Byethost 的信,标题大约是 “You have been approved for a Byethost account ”

    下面是信件内容,中文为我自己添加的说明:

    Thank you for registering at byethost15.com. We are delighted to inform you that your account holz.byethost15.com has been successful !

    大意说感谢在 byethost15.com 这台服务器上注册,很高兴您的账号 holz.byethost15.com 开通了,holz.byethost15.com 既是账号,也是将来网站的域名。

    Your account will be activated, and you should be able to login to the Cpanel, in 15 - 20 minutes .

    账号将在 15-20 分钟内激活,那时就可以登陆控制面板了。

    Take careful note of your login details below and consider printing them for your own records.

    下面是详细的登陆信息,一定要记住。
    ---------------------------------------------------
    Cpanel Username: holz.byethost15.com
    控制面板登陆的用户名是 holz.byethost15.com
    Cpanel Password: 123456789
    控制面板的密码是 123456789
    Your URL: holz.byethost15.com
    您的网站地址是 holz.byethost15.com
    FTP IP : 209.190.18.74
    FTP Login : MUST CREATE IN CPANEL
    FTP 登陆用户名必须由你自己在控制面板建立
    FTP Password : MUST CREATE IN CPANEL
    FTP 登陆密码也要自己在控制面板建立
    MySQL Database Name: MUST CREATE IN CPANEL
    MySQL 数据库名称要自己在控制面板建立
    MySQL Username : MUST CREATE IN CPANEL
    MySQL 用户名要自己在控制面板建立
    MySQL Password : MUST CREATE IN CPANEL
    MySQL 密码要自己在控制面板建立
    MySQL Server: localhost
    MySQL 服务器必须是 localhost
    Cpanel URL: http://www.cpanel.byethost15.com
    这是登陆控制面板的地址。
    ---------------------------------------------------

    Please , do firstly create an FTP account, in your cpanel, the ftp account login will look like an email address , e.g. you enter 'admin' as the FTP user name on (holz.byethost15.com) then your ftp username will be [email protected]

    请第一时间建立一个 FTP 账号,在控制面板中,FTP 登陆账号看起来象 E_Mail 地址,例如你建立一个名为 admin 的FTP用户,那么你的 FTP 登陆用户应该是 [email protected]

    PLEASE NOTE ALL WEBSITE FILES SHOULD BE UPLOADED TO THE 'HTDOCS' FOLDER
    POR FAVOR, OBSERVE QUE TODOS LOS FICHEROS SEAN CARGADOS EN LA CARPETA 'HTDOCS'
    MERKEN SIE BITTE ALLE WEB SITE AKTE SOLLTE ZUM ' HEFT DES HTDOCS' GEHOCHLADEN WERDEN
    NOTI PREGO TUTTA LA LIMA DI WEB SITE DOVREBBE UPLOADED AL DISPOSITIVO DI PIEGATURA 'DEL HTDOCS
    ANOTE POR FAVOR TODA A LIMA DO WEB SITE DEVE UPLOADED AO DOBRADOR ' DO HTDOCS'
    HOUDT U ER AUB REKENING MEE DAT ALLE WEBSITE DOCUMENTEN NAAR DE 'HTDOCS' FOLDER DIENEN TE WORDEN GEUPLOAD.
    ANOTE POR FAVOR TODA A LIMA DO WEB SITE DEVE UPLOADED AO DOBRADOR ' DO HTDOCS'

    上面用各种语言告诉你网站的文件,例如 Drupal 必须上传到 HTDOCS 目录下。

    下面还有一些感谢,FAQ等,省略。

    03.控制面板
    登陆 Byethost 的控制面板后,发现是 VHCS 管理系统。


    对各项进行简要介绍:

    General information,一般性信息,包括个人信息、密码、界面语言、主机计划(例如想升级为付费空间)等管理。
    Manage domains,管理域名,如果你有注册到域名,可以通过 Add Alias 绑定。
    Email Accounts,是 byethost 送你的邮局。
    FTP Accounts,第一次登陆就要访问这里,建立一个 FTP 登陆账号。注意当你建立一个名为 admin 的 FTP 用户时,实际上登陆 FTP 的用户应该是 [email protected](假设您的 byethost 账号为 holz.byethost15.com)。
    Manage SQL,管理 MySQL 数据库的地方,首先用 Add SQL Database 建立一个数据库,然后在该数据库下面用 Add SQL User 建立该数据库相对应的用户。
    例如我要装 Drupal,就可以建立一个名为 drupal 的数据库,然后添加 admin 为数据库用户,admin123456 作为用户密码。

    Webtools,一些工具,如包含区域、每日备份、错误页定制等。
    Domain statistics,域名统计,按月统计浏览之类的信息。
    New Support System,byethost 新的帮助系统,会连接到 byethost.com:8080,我的一些问题就是在此找到答案的。请遇到问题首先访问此处,找不到答案再写信给 Byethost。
    Logout,不用说,完成作业要退出系统,免得他人作乱。
    04.Drupal 设置
    建立好 FTP 账号、MySQL 数据库等之后,到 Drupal.org 下载一个发行。例如我自己下了一个 4.7-Beta 4,解压得到 drupal-4.7.0-beta4 目录,现在要根据 Byethost 修改一些数据。

    首先修改 .htaccess 文件

    将 "php_" 开头的那些部分删除。

    具体就是下面这些:

    <IfModule mod_php4.c>
    php_value magic_quotes_gpc 0
    php_value register_globals 0
    php_value session.auto_start 0
    </IfModule>

    <IfModule sapi_apache2.c>
    php_value magic_quotes_gpc 0
    php_value register_globals 0
    php_value session.auto_start 0
    </IfModule>


    如果不愿意删除,也可以在每行前面用“#”号注释掉。

    将 "options -index" 和 "options" 这样的行删除,具体是两行:

    # Set some options.
    Options -Indexes
    Options +FollowSymLinks


    同样,如果不愿意删除,也可以在每行前面用“#”号注释掉。

    编辑 setting 文件。
    这个文件是 sites/default/setting.php,只要修改两个地方:


    $db_url = 'mysql://username:password@localhost/database';
    改为
    $db_url = 'mysql://admin:admin123456@localhost/drupal';
    因为我们在控制面板中建立了名为 drupal 的数据库以及 admin 用户。

    $base_url = 'http://www.example.com'; // NO trailing slash!
    改为
    $base_url = 'http://holz.byethost15.com'; // NO trailing slash!
    因为我的网站地址是 holz.byethost15.com,注意不用画蛇添足加一个斜杠哦。
    为什么要修改 .htaccess 文件?这是依据 500 Internal Server Error 上的说明做的,如果不这样修改,那么将来会出现 500 错误。

    05.上传 Drupal
    对于 byethost 的主机,最佳的 FTP 客户端就是 SmartFTP,这个软件个人使用免费,并且有官方的中文语言包。

    针对 Byethost 的主机,smartftp 应该做以下设置,打开 SETTINGS >> Connection。

    Max. Retries =10
    Retry Delay = 30
    Connection Timeout = 40
    Protocol Family = IPv4
    Send FEAT = enable
    Mode = PASV
    Port IP mode = auto
    Force PASV = disable
    Keep Alive = Enable



    然后输入 byethost 的 FTP 地址,输入你自己的 FTP 用户名和密码,登陆后,进入 htdocs 目录,选中本地目录 drupal-4.7.0-beta4 下所有内容,上传。

    个人经验:千万不用 FlashFXP,那速度真是杀死人的慢(仅针对 Byethost)!

    06.导入数据表
    登陆 Byethost 控制面板,点 Manage SQL。



    点击 PhpMyAdmin,在弹出的提示中输入 MySQL 用户名和密码(都是在控制面板中建立的),进入 PhpMyAdmin 界面。

    在左边选择数据库,然后在右侧点 SQL 标签,如下:



    单击 浏览... 按钮,选择 drupal-4.7.0-beta4/database/database.mysql 文件。



    单击右下方的 执行 按钮将数据表导入数据库,应该有 56 个表。

    07.完成站点设置
    立刻访问自己的站点,例如 holz.byethost15.com,不出意外你应该是第一个访问的人,根据提示创建第一个用户。

    登陆站点,在 administrater >> settings 下面设置自己的站点名称、口号、任务、页脚信息、缓存、错误处理、文件系统等;到 administrater >> categories 下面设置一些基本的分类;到 administrater >> modules 启用一些模块,如 blog、forum、path、locale 等;到 administrater >> blocks 调整一些板块设置。

    然后就可以在导航菜单中的 create content 下面撰写文章了。

    只有第一个用户具有所有的权限,所以自己的站点一定要拥有第一个用户的账号,否则这个站点不能说是你的。
     
  2. 东瓜

    东瓜 New Member

    注册:
    2005-12-07
    帖子:
    2,306
    赞:
    25
    定制和主题
    虽然用 Drupal 的核心模块可以搭建相当出色的站点,但为了更加体现 Drupal 的强大,熟悉一些 PHP、MySQL 和 WEB 设计是有必要的。

    这一部分包括一些 PHP 和 SQL 代码片段和示范,可以用于站点的页面、区块和主题。 同时还有少量关于主题引擎的文章,主题引擎是构建新主题的基础。

    Holz 译自 Drupal.org

    PHPTemplate 主题片段
    本节收集用于基于 PHPTEMPLATE 的主题的代码片段。 (PHPTEMPLATE 主题引擎 是 Drupal 4.7 的默认主题引擎)

    在提交您的片段之前,请先阅读提交片段指南。

    请注意! 片段是用户提交的,使用前进行全面测试非常重要,并且风险自担! 在经过测试站点测试之前不要简单地复制和粘贴。

    对于那些使用其他数据库(默认 MySQL)搭建 Drupal 的用户,要注意可能有一些数据库查询仅适用于 MYSQL。

    Holz 译自 Drupal.org

    定制完整的页面布局和部分
    说明
    本节收录定制特定页面类型的完整页面布局,如果您的站点不同部分使用不同主题,这很有用。

    当使用 PHPTemplate 引擎时,完整的页面布局通过 page.tpl.php 布局文件控制。

    用法
    查阅片段,寻找您需要的复制到您的定制 page-type.tpl.php 布局文件中。

    推荐您使用一个文本编辑器,例如 notepad.exe 或类似的程序来编辑您的布局文件。

    对于 PC 用户,编辑 HTML 和 PHP 混合的文件的一个有用的工具是 Crimson Editor (免费软件)。

    可用变量
    下面是您编辑布局文件时可能用的上的变量。

    head_title: 显示在页面标题的文本。
    language: 站点显示使用的语言。
    site: 站点名称,总会有的。
    head: 通过 drupal_get_html_head() 生成的 HTML (需要动态添加脚本到页面)
    onload_attributes: Onload 标签将被添加到 head 标签,允许附加的脚本自动执行。
    directory: 主题所在目录,例如: themes/box_grey 或 themes/box_grey/box_cleanslate
    logo: logo 图片的路径,在主题配置中可定制。
    site_name: 站点的站点名称,用于头部,如果禁止显示则空白。
    site_slogan: 站点口号,禁止显示时空白。
    search_box: 如果允许搜索框则为 True(1)。
    search_url: 搜索表单提交到的 URL。
    search_button_text: 搜索按钮的注释文本。
    search_description: 搜索按钮的注释说明。
    title: 标题,不同于 head_title,大多数情况下这是节点标题。
    primary_links (数组): 一个包含在 phptemplate 特定配置区块中定义的链接的数组。
    secondary_links (数组): 一个包含在 phptemplate 特定配置区块中定义的链接的数组。
    breadcrumb: 在页面的顶部显示琐碎信息的 HTML。
    tabs: 在页面顶部显示 tab 的 HTML。
    messages: 显示在页面顶部的状态和错误信息的 HTML。
    layout: 本设置允许您样式化不同的布局类型 ('none', 'left', 'right' 或 'both'),取决于启用的侧边栏数。
    help: 动态的帮助文本,多在管理页面。
    styles: 用于使样式表切换工作。
    mission: 站点任务文本。
    is_front: 如果当前显示的是首页则为 True。常用于显示 mission。
    sidebar_left: 左边栏的 HTML。
    content: 由 Drupal 生成的用于显示的 HTML 内容。
    sidebar_right: 右边栏的 HTML。
    footer_message: 页脚信息,在管理页面定义。
    closure: 需要显示在页面的底部,用于一旦页面载入完毕就要调用动态的 javascript。
    仅在首页显示/隐藏内容
    说明
    本片段允许您在首页显示或隐藏内容。

    用法

    使用类似 NOTEPAD.EXE 的文本编辑器,复制粘贴片段到 page.tpl.php 或定制的 page-type.tpl.php 文件中。
    改变片段中的 "false" 为 "true" 在仅在首页显示内容。
    在 Drupal 4.5, 4.6 和 Drupal 4.7 测试通过。
    按需要可改变 div 类名或链接前缀文本。
    下列示范插入一个名为 blocks-top.jpg 的图片到所有页面,除了首页。


    <?php if ($is_front == "false"): ?>
    <div id="snapshot">
    <img src="http://www.example.com/images/blocks-top.jpg" /><br />
    </div>
    <?php endif; ?>

    Holz 译自 Drupal.org

    使用 CSS 和唯一 BODY 类和 ID 定制页面布局
    说明

    说明如何使用 CSS 样式基于节点类型控制整个页面布局。
    感谢 Zach Harkey 提交 原始片段。
    本片段适用于 Drupal 4.5、 4.6 和 4.7。
    用法
    本将片段将建立一个 body 类和 id 用于站点的每个页面。 一个应用例子是当进入管理页面时调整固定的宽度。
    举个例子,使用这个片段,当您进入 admin/themes 时,您可以使用下列样式控制页面外观。
    <body class="section-admin" id="page-admin-themes">
    在您的样式表中 (在您的主题文件夹的 CSS 文件),只要简单地加入下面的代码:


    .content { width="744px" }
    .section-admin .content { width="100%" }

    第 1 步共 2 步

    备份您的 page.tpl.php 文件。
    使用文本编辑器替换 page.tpl.php 文件中的
    <?php print theme("onload_attribute"); ?>

    为下面的片段。
    上传编辑过的 page.tpl.php 布局文件到主题文件夹

    <?php
    /**
    * 本片段为每个页面建立一个 <body> 类和 id。
    *
    * - 类名是常规的,应用于文档一个部分 (如 admin 而 )
    * - Id 名是唯一的,应用于单个页面。
    */
    // 删除人和前导斜杠。
    $uri_path = trim($_SERVER['REQUEST_URI'], '/');
    // 将 URI 分割到一个数组,用 '/' 作为分隔符。
    $uri_parts = explode('/', $uri_path);
    // 如果第一部分为空, id 和类都标为 'main'.
    if ($uri_parts[0] == '') {
    $body_id = 'main';
    $body_class = 'main';
    }
    else {
    // 从完整的 URI 构造 id 名,替换斜杠为破折号。
    $body_id = str_replace('/','-', $uri_path);
    // 从 URI 的第一部分构造类名。
    $body_class = $uri_parts[0];
    }
    /**
    * 添加前缀预防类名与其他
    * css 选择器冲突。
    *
    * - body id 的前缀为 "page-"(因为我们将它用于特定页面)。
    * - body 类的前缀为 "section-"(因为我们将它用于一个部分)。
    */
    $body_id = 'page-'.$body_id;
    $body_class = 'section-'.$body_class;
    print "<body class=\"$body_class\" id=\"$body_id\"";
    print theme('onload_attribute');
    print ">";
    ?>

    第 2 步共 2 步

    每页将有一个唯一的 BODY 类和 BODY ID。 如 <body class="section-admin" id="page-admin">
    编辑您的 style.css 文件,添加相应的样式。
    备注

    本片段利用链接来检测要调用的类和 ID,因此当您的 Drupal 安装在子目录时,您的 BODY 类和 BODY ID 标题将类似: <body class="section-private" id="page-private-profile"> ,其中 Drupal 站点在 www.example.com/private 子目录而用户正在浏览 PROFILE (用户列表) 页面。
    感谢 Zach Harkey 发表了原始的代码。 点过去 了解更详细的情况。
    Holz 译自 Drupal.org

    基于节点类型定制页面布局
    说明
    说明如何基于节点类型定制整个页面布局,一个例子是您希望 blog 页面看起来与其他页面万全不同。

    用法
    作为一个演示的例子,下面的步骤演示如何为 blog、 book 和首页设置不同的页面布局。

    第一步共二步
    复制 page.tpl.php 文件并命名为 page-default.tpl.php.
    复制更多的 page.tpl.php 文件并分别命名为 page-front.tpl.php、 page-blog.tpl.php 和 page-book.tpl.php 以及等等...
    根据需要,使用类似 notepad.exe 的编辑器修改每个 tpl.php 文件
    上传新的 page-type.tpl.php 布局文件到主题文件夹
    第二步共二步
    使用类似 notepad.exe 的编辑器替换 page.tpl.php 文件为下面的片段内容
    确保有 page-default.tpl.php 文件。
    上传新的 page.tpl.php 文件到主题文件夹,新的布局效果将自动出现


    <?php

    /**

    * 本片段自动载入不同的 page-type.tpl.php 布局
    * 用于 page.tpl.php 文件。
    *

    * 适用于 Drupal 4.5、 Drupal 4.6 和 Drupal 4.7


    */

    if ($is_front) {/* 检查是否为首页 */

    include 'page-front.tpl.php'; /*载入定制的 front-page.tpl.php */

    return; }

    if ($node->type == 'book') {/* 检查是否为手册页面 */

    include 'page-book.tpl.php'; /*载入 page-book.tpl.php */

    return; }

    if ($node->type == 'blog') {/* 检查是否为 blog 节点 */

    include 'page-blog.tpl.php'; /*载入 page-blog.tpl.php */

    return; }

    if ($node->type == 'image') {/* 检查是否为图片节点 */

    include 'page-image.tpl.php'; /*载入 page-image.tpl.php */

    return; }

    if ($node->type == 'forum') {/* 检查是否论坛节点 */

    include 'page-forum.tpl.php'; /*载入 page-forum.tpl.php */

    return; }

    include 'page-default.tpl.php'; /*如果都不是上面的类型,载入 page-default.tpl.php */

    return;

    ?>



    Holz 译自 Drupal.org

    基于路径和分类术语定制页面布局
    说明
    说明如何基于路径和分类术语定制页面布局。

    用法
    一个简单的示范是使用下列的路径告诉 Drupal 载入一个定制的 page-admin.tpl.php 布局文件。

    例如,假设当前路径是 www.example.com/admin/* arg(n) 变量就是 "admin" 因此我们就可以告诉 Drupal 载入 page-admin.tpl.php。

    Step 1 of 2
    复制 page.tpl.php 文件并命名为 page-default.tpl.php。
    复制更多 page.tpl.php 文件并分别命名为 page-front.tpl.php、 page-blog.tpl.php 和 page-book.tpl.php 以及等待...
    用类似 notepad.exe 的文本编辑器修改每个 tpl.php 文件
    上传新的 page-type.tpl.php 布局文件到主题文件夹
    Step 2 of 2
    用类似 notepad.exe 的文本编辑器将 page.tpl.php 文件内容替换为下列片段内容
    确保有一个 page-default.tpl.php 。
    上传新的 page.tpl.php 文件到主题文件夹,新布局自动生效


    <?php
    /**
    * 本片段自动载入不同的 page-type.tpl.php 布局
    * 用于一个 page.tpl.php 文件。
    *
    * 适用于 Drupal 4.5、 Drupal 4.6 和 Drupal 4.7
    */
    if (arg(0)=="admin") {/* 检查路径是否为 example.com/admin */
    include 'page-admin.tpl.php'; /*载入定制的 page-admin.tpl.php */
    return; }
    if ($node->type == 'blog') {/* 检查路径是否 example.com/blog */
    include 'page-blog.tpl.php'; /*载入 page-blog.tpl.php */
    return; }
    /*在调用 page-default.tpl.php 前插入更多布局的调用,如果需要的话*/
    include 'page-default.tpl.php'; /*如果不是上述定义,载入 page-default.tpl.php */
    return; }
    ?>


    加入更多布局
    上面的示范片段非常易于扩展,。

    如果需要加入更多的布局调用,复制这个片段并按下面备注提示编辑即可。


    if ($node->type == 'blog') {/* 检查路径是否 example.com/blog */
    include 'page-blog.tpl.php'; /*载入 page-blog.tpl.php */
    return; }
    提示及更多示范
    这里有更多使用路径的示范,可以大大扩展您的布局。


    arg(0)=="admin"// is /admin
    arg(0) =="node"// 是 /node
    arg(0)=="user" // 是 /user
    arg(0)=="node"&&arg(1)=="add" // 是 /node/add
    arg(0)=="node"&& arg(arg(2)=="edit" // 是 /node/###/edit
    arg(0)=="user"&&arg(1)=="add" // 是 /user/add
    arg(0)=="admin"&&arg(1)="user"&&arg(2)=="create" // 是 /admin/user/create
    arg(0)=="alias"&&arg(1)=="alias1" 是 /alias/alias1
    arg(0)=="taxonomy"&&arg(1)=="term"&&arg(2)=="term#" // 是 /taxonomy/term/term#
    //arg(1)=="comment"
    //arg(2)=="reply"
    Holz 译自 Drupal.org

    用于 page.tpl.php 文件的管理主题切换
    说明
    本片段自动切换主题为一个定制的 page-admin.tpl.php 布局文件,在需要时即可激活管理主题。

    如果您使用一个固定宽度的站点设计,而您的管理页面打乱了布局时,这很有用。

    用法
    复制 page.tpl.php 文件并命名为 page-admin.tpl.php。
    使用类似 notepad.exe 的文本编辑器,将下列片段放到 page.tpl.php 文件的最前面。
    编辑 page-admin.tpl.php 布局文件
    上传新的 page-admin.tpl.php 布局文件和编辑过的 page.tpl.php 文件到主题文件夹


    <?php
    /**
    * 本片段告诉 Drupal 自动载入 page-admin.tpl.php 布局
    * 用于 page.tpl.php 文件。
    *
    * 适用于 Drupal 4.5、 Drupal 4.6 和 Drupal 4.7
    */
    if (arg(0) == 'admin' ||
    (arg(0) == 'node' && arg(1) == 'add') ||
    (arg(0) == 'node' && arg(2) == 'edit') ||
    (arg(0) == 'user' && arg(2) == 'edit')) {
    include 'page-admin.tpl.php'; /*载入定制的 page-admin.tpl.php */
    return; }
    ?>


    Holz 译自 Drupal.org

    用于 page.tpl.php 文件的首页布局切换
    说明
    本片段自动为 Drupal 站点的首页切换主题为一个定制的 page-front.tpl.php。

    这是使用 front_page.module 的一个替代。

    用法
    复制 page.tpl.php 文件并命名为 page-front.tpl.php。
    用类似 notepad.exe 的文本编辑器在 page.tpl.php 文件的最前面加入下列片段内容。
    编辑 page-front.tpl.php 布局文件
    上传新的 page-front.tpl.php 布局文件和编辑过的 page.tpl.php 文件到主题文件夹


    <?php
    /**
    * 本片段告诉 Drupal 载入一个不同的 page-front.tpl.php 布局
    * 用于 page.tpl.php 文件。
    *
    * 适用于 Drupal 4.5、 Drupal 4.6 和 Drupal 4.7
    */
    if ($is_front) {
    include('page-front.tpl.php');
    return;
    }
    /**
    * 本片段必须放在 page.tpl.php 文件的最前面。
    * page.tpl.php 的其余部分应该在本片段之后。
    */
    ?>


    Holz 译自 Drupal.org

    动作片段
    Actions.module 是处理站点自动化任务的有效机制,动作是很小的 php 代码“片段”,用于触发特定的事件。 一个例子是 workflow.module。

    要使用这些动作,在 modules 目录建立一个定制的模块并将动作代码粘贴到您的模块中。

    示范


    <?php
    //这是我的模块
    function action_do_something($op, $edit = array(), $node) {
    /* 这里写动作片断代码 */
    }
    ?>

    给某角色组的所有用户发封 EMail
    这个动作将给某个选定的角色组中的每个用户发送 EMail,当工作流改变并通知编辑查看新内容时非常有用。


    <?php
    function action_send_email_torolegroup($op, $edit = array(), $node) {
    switch($op) {
    case 'metadata':
    return array(
    'description' => t('Send Email to a role group'),
    'type' => t('Email'),
    'batchable' => false,
    'configurable' => true,
    );
    case 'do':
    // note this is the user who owns the node, not global $user
    $user = user_load(array('uid' => $node->uid));
    $site_name = variable_get('site_name', 'Drupal');
    $from = "$site_name <" . variable_get('site_mail', ini_get('sendmail_from')) . '>';
    $subject = $edit['subject'];
    $message = $edit['message'];
    foreach($edit['recipients'] as $rid => $chose_role) {
    if ($chose_role) {
    $recipient_roles[] = $rid;
    }
    }
    $recipient_addresses = array();
    if ($recipient_roles[2]) { //email every one! wow. that's why a watchdog is invoked
    watchdog('action', t('Sent an email to every single registered user. Use with caution.'));
    $result = db_query('SELECT mail FROM {users} WHERE uid > 0');
    while($account = db_fetch_object($result)) {
    $recipient_addresses[] = $account->mail;
    }
    } else {
    $roles = implode(',', $recipient_roles);
    $result = db_query('SELECT DISTINCT u.mail FROM {users} u INNER JOIN {users_roles} r ON u.uid = r.uid WHERE r.rid IN (%s)', $roles);
    while($account = db_fetch_object($result)) {
    $recipient_addresses[] = $account->mail;
    }
    }
    if (isset($node) && is_object($node)) {
    $variables = array(
    '%site_name' => $site_name,
    '%username' => $user->name,
    '%uid' => $node->uid,
    '%node_url' => url('node/' . $node->nid, NULL, NULL, TRUE),
    '%node_type' => $node->type,
    '%title' => $node->title,
    '%teaser' => strip_tags($node->teaser),
    '%body' => strip_tags($node->body)
    );
    $message = strtr($message, $variables);
    }
    foreach ($recipient_addresses as $recipient) {
    if (user_mail($recipient, $subject, $message, "From: $from\nReply-to: $from\nX-Mailer: Drupal\nReturn-path: $from\nErrors-to: $from" )) {
    watchdog('action', t('Sent email to %recipient', array('%recipient' => $recipient)));
    }
    else {
    watchdog('error', t('Unable to send email to %recipient', array('%recipient' => $recipient)));
    }
    }
    break;
    // return an HTML config form for the action
    case 'form':
    // default values for form
    // if (!isset($edit['recipients'])) $edit['recipients'] = '';
    if (!isset($edit['subject'])) $edit['subject'] = '';
    if (!isset($edit['message'])) $edit['message'] = '';
    $form = array();
    $roles = user_roles();
    unset($roles[1]); // good bye anonymous users!
    //unset($roles[2]); // good bye authenticated users!
    $form['recipients'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Recipient Role Groups'),
    '#default_value' => $edit['recipients'],
    '#options' => $roles,
    '#description' => t('Select which roles should receive this email.'),
    );
    $form['subject'] = array(
    '#type' => 'textfield',
    '#title' => t('Subject'),
    '#default_value' => $edit['subject'],
    '#size' => '20',
    '#maxlength' => '254',
    '#description' => t('The subject of the message.'),
    );
    $form['message'] = array(
    '#type' => 'textarea',
    '#title' => t('Message'),
    '#default_value' => $edit['message'],
    '#cols' => '80',
    '#rows' => '20',
    '#description' => t('The message that should be sent. You may include the following variables: %site_name, %username, %node_url, %node_type, %title, %teaser, %body'),
    );
    return $form;
    // validate the HTML form
    case 'validate':
    $errors = array();
    $roleselected = false;
    foreach($edit['recipients'] as $rid => $selected) {
    if ($selected) {
    $roleselected = true;
    }
    }
    if (!$roleselected) {
    $errors['recipients'] = t('Please enter at least one recieptient role group');
    }
    foreach ($errors as $name => $message) {
    form_set_error($name, $message);
    }
    return count($errors) == 0;
    // process the HTML form to store configuration
    case 'submit':
    $params = array(
    'recipients' => $edit['recipients'],
    'subject' => $edit['subject'],
    'message' => $edit['message']);
    return $params;
    }
    }
    ?>

    定制节点布局
    说明
    本节收集定制节点布局的片段。

    (如果要定制完整页面的布局,查阅 定制完整页面布局和部分)。

    用法
    查阅示范片段,复制到您定制的 node-type.tpl.php 布局文件中。

    推荐使用类似 notepad.exe 的文本编辑器来编辑布局文件。

    对于 PC 用户,一个很有用的编辑混合 HTML 和 PHP 文件的工具是 Crimson Editor (免费软件)。

    可用变量
    $title : 节点标题。
    $node_url : 链接到节点。
    $terms : 分类术语的 HTML。
    $name : 格式化的作者名。
    $date : 格式化的发表日期。
    $sticky : 如果节点置顶则为 True。
    $picture : 如果启用,是用户头像的 HTML。
    $content : 节点内容,如果是概述则为摘要。
    $links : 节点链接
    $taxonomy (数组) : 分类术语的 HTML 链接数组。
    $node (对象) : 节点对象。
    $main : 如果节点处于一个上下文例如首页(应该显示摘要)则为 True。
    $page : 如果节点显示为一个页面则为 True。
    $submitted : 注释文本,如果节点信息显示被启用的话。
    Holz 译自 Drupal.org

    定制 blog 节点布局
    定制 blog 的显示方式在 使用 phptemplate 主题的 Drupal 是非常容易的,您所需要的就是:

    复制一份 node.tpl.php 文件
    命名为 node-blog.tpl.php
    用一个类似 notepad.exe 的文本编辑器编辑布局文件适应您的需要,并上传到您的主题目录
    Drupal 将自动识别新的 node-blog.tpl.php 布局并应用之
    可用变量

    $title : 节点标题。
    $node_url : 链接到节点。
    $terms : 分类术语的 HTML。
    $name : 格式化的作者名。
    $date : 格式化的发表日期。
    $sticky : 如果节点置顶则为 True。
    $picture : 如果启用,是用户头像的 HTML。
    $content : 节点内容,如果是概述则为摘要。
    $links : 节点链接
    $taxonomy (数组) : 分类术语的 HTML 链接数组。
    $node (对象) : 节点对象。
    $main : 如果节点处于一个上下文例如首页(应该显示摘要)则为 True。
    $page : 如果节点显示为一个页面则为 True。
    $submitted : 注释文本,如果节点信息显示被启用的话。
    默认模板


    <div class="node <?php print ($sticky) ? " sticky" : ""; ?> ">
    <?php if ($page == 0): ?>
    <h2><a href=" <?php print $node_url ?> " title=" <?php print $title ?> "> <?php print $title ?> </a></h2>
    <?php endif; ?>
    <?php print $picture ?>
    <div class="info"> <?php print $submitted ?> <span class="terms"> <?php print $terms ?> </span></div>
    <div class="content">
    <?php print $content ?>
    </div>
    <?php if ($links): ?>
    <?php if ($picture): ?>
    <br class='clear' />
    <?php endif; ?>
    <div class="links"> <?php print $links ?> </div>
    <?php endif; ?>
    </div>

    Holz 译自 Drupal.org

    将 blog 内容分割为 (x) 列
    说明
    使用一个定制的 node-blog.tpl.php 布局文件,本片段将 blog 的正文分割为若干列,就象新闻报刊的文章一样。

    用法
    本片段是一个完整的 node-blog.tpl.php 文件。 用文本编辑器复制粘贴并上传到主题目录。

    您可以通过修改 $columns 值指定列数,修改 $column_spacing 值改变列间的间隔。

    备注:
    摘要按正常处理,多列仅当显示全文时起作用。
    推荐用于仅含文字的 blog,自动列平衡在文字中有图片时有时不起作用
    本片段使用 HTML 表格输出列,如果您知道如何使用 DIV 达到相同效果,请发表之
    关于本片段的讨论,请发表到 论坛的多列片段讨论主题
    <?php $columns = 3; // number of columns ?>
    <?php $column_spacing = 8; //spacing between columns in pixels ?>
    <div class="node <?php print ($sticky) ? " sticky" : ""; ?> ">
    <?php if ($page == 0): ?>
    <h2><a href=" <?php print $node_url ?> " title=" <?php print $title ?> "> <?php print $title ?> </a></h2>
    <?php endif; ?>
    <?php print $picture ?>
    <div class="info"> <?php print $submitted ?> </div>
    <div class="content">
    <?php if (!$page == 0): ?>
    <?php
    print "<table border=\"0\" cellpadding=\"$column_spacing\"><tr>";
    $bodytext = array("$content");
    $text = implode(",", $bodytext); //prepare bodytext
    $length = strlen($text); //determine the length of the text
    $length = ceil($length/$columns); //divide length by number of columns
    $words = explode(" ",$text); // prepare text for word count and split the body into columns
    $c = count($words);
    $l = 0;
    for($i=1;$i<=$columns;$i++) {
    $new_string = "";
    print "<td style=\"text-align:justify\" valign=\"top\">";
    for($g=$l;$g<=$c;$g++) {
    if(strlen($new_string) <= $length || $i == $columns)
    $new_string.=$words[$g]." ";
    else {
    $l = $g;
    break;
    }
    }
    print $new_string;
    print "</td>";
    }
    print "</tr></table>"; // complete the table
    ?>
    <?php endif; ?>
    <?php if ($page == 0): ?>
    <?php print $content ?>
    <?php endif; ?>
    </div>
    <?php if ($links): ?>
    <?php if ($picture): ?>
    <br class='clear' />
    <?php endif; ?>
    <div class="links"> <?php print $links ?> </div>
    <?php endif; ?>
    <div class="terms">( categories: <?php print $terms ?> )</div>
    </div>
    Holz 译自 Drupal.org
    对付盗链
    看了一些用 Drupal 架设的站点具有图片反盗链能力,一直不明白,在网上逛阿逛的,发现 一个示范教程。

    原来是使用 .htaccess 文件来实现的。

    假设我的域名是 mrjc.net,我希望那些盗我链的站点显示一个在 images 目录下的 yousuck.png 文件,那就编辑站点根目录下的 .htaccess 文件:

    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^http://(www\.)?mrjc\.net/ [NC]
    RewriteCond %{HTTP_REFERER} !^$
    RewriteRule \.(jpe?g|gif|png)$ images/yousuck.png [L]
    只是这样一来,所有站点都不能引用了,我当然希望朋友们可以引用我的,那我们就反过来,只对那些不受欢迎的站点进行反盗链好了。假设有两个站点超恶心,叫 badsite.net 和 badsite.com:

    RewriteEngine On
    RewriteCond %{HTTP_REFERER} ^http://(www\.)?badsite\.net/ [NC,OR]
    RewriteCond %{HTTP_REFERER} ^http://(www\.)?badsite\.com/ [NC]
    RewriteRule \.(jpe?g|gif|png)$ images/yousuck.png [L]


    本地 Drupal
    以 Ubuntu 5.10 系统为基础,在本地安装 Drupal 4.7 Beta 4。

    其中 Ubuntu 服务器的安装可参照 node/130 node/131 node/132 或者ubuntu.org.cn 中 支持 >> 文档中心 >> 服务器架设 里面的文章。

    注意我使用root登陆,因此具有全部权限,如果默认情况下,一些命令需要sudo。

    下载 Drupal,用

    wget -c http://drupal.org/files/projects/drupal-4.7.0-beta4.tar.gz
    解压并移动,用

    tar zxvf drupal-4.7.0-beta4.tar.gz
    mv drupal-4.7.0-beta4 /var/www/drupal
    修改站点配置文件,用

    vi /var/www/drupal/sites/default/setting.php
    根据提示将
    $db_url = 'mysql://username:password@localhost/databasename';
    改为
    $db_url = 'mysql://drupaluser:123456@localhost/drupal';
    因为我希望建立一个名为 drupal 的数据库,一个名为 drupaluser 且密码为 123456 的数据库用户。
    再将
    $base_url = 'http://www.example.com'; // NO trailing slash!
    改为
    $base_url = 'http://192.168.1.156/drupal'; // NO trailing slash!
    因为我的服务器 IP 地址设置为 192.168.1.156,站点所在目录为 drupal。
    建立一个数据库,用

    mysqladmin -u root -p create drupal

    根据提示输入root的密码即建立 drupal 数据库。
    为数据库分配权限,用

    mysql -u root -p
    按提示输入 root 的密码后进入 mysql 提示符下,输入
    GRANT ALL PRIVILEGES ON drupal.* TO drupaluser@localhost IDENTIFIED BY '123456';
    此时建立了数据库用户 drupaluser,其密码为 123456,并允许操作数据库 drupal。
    然后刷新权限,用
    FLUSH PRIVILEGES;
    最后输入 \q 退出 mysql。
    导入数据库表,用

    mysql -u drupaluser -p drupal < /var/www/drupal/database/database.mysql
    用浏览器访问 http://192.168.1.156/drupal,因为是第一次访问,根据提示建立第一个用户,此用户具有最高权限。
    登陆站点后通过 admin 管理和设置各种参数,通过 Create content 就可以建立各种类型的文章了。
    对于我等懒人,必装 Poor Man's Cron 模块。安装非常简单:
    下载 wget -c http://drupal.org/files/projects/poormanscron-4.7.0.tar.gz
    解压 tar zxvf poormanscron-4.7.0.tar.gz
    放到正确的位置 mv poormanscron /var/www/drupal/modules/poormanscron
    在站点中启用poormanscron模块即可。
     
  3. 东瓜

    东瓜 New Member

    注册:
    2005-12-07
    帖子:
    2,306
    赞:
    25
  4. srsman

    srsman Active Member

    注册:
    2005-11-08
    帖子:
    1,920
    赞:
    6
    看着怎么这么眼熟