协医网开发中发现的Drupal5.x的若干问题(一)连载中……

由 葬月 于 周二, 2007-11-27 13:58 提交。

Drupal 5.2/5.3 的cache.inc 文件的第159行为:

db_query("DELETE FROM {". $table. "} WHERE cid LIKE '%s%%'", $cid);

该行的意图是清楚某个cache表中主键包含$cid的那些缓存内容,由调用函数cache_clear_all()时的第三个参数$wildcard = TRUE来控制;但是该行代码有错误,按照原版代码,只能清除主键为$cid开头的那些主键,而不是包含$cid的那些,所以应该改成:

db_query("DELETE FROM {". $table. "} WHERE cid LIKE '%%s%'", $cid);

协医网由互连网行业知名上市公司股东共同投资创建,网站的宗旨是建立中国最大的严肃、实名制的医生网站及专业的医患信息交流平台。主要产品形态包括:找医生医患问答医患圈博客用户个人空间、站内消息和实时通讯(即将开通)。现在已经有2万1千多个标签,6、7万的节点,功能还在不断完善中。

一些常用技巧整理,比较凌乱呵呵

这些都是我以前学习drupal的时候保存下来的问题,整理下硬盘,把这些贴出来,希望对大家有用。
其实很多问题,论坛内都有答案的,请多用搜索,有收藏的朋友可以跟帖,谢谢。

定制登陆界面:
http://drupal.org/node/19855

让某个条件下的节点使用新的page.tpl.php(条件自行判断)
http://drupal.org/node/46017

定制分类的界面

<?php
if ($terms[0]->tid == '3') {include 'page-brochure.tpl.php'; /*load a custom page-brochure.tpl.php if the taxonomy term of the current node matches */
   
return; }
?>

定制用户信息界面
http://drupal.org/node/35728

定制搜索框
http://drupal.org/node/45295

让图片自动缩放的一段代码,也是经常用到的哦

img {max-width: 200px; width: 200px; WIDTH: expression(parseInt(this.width)>200?'200px': this.width); border:0px;}

一些常用的判断
http://drupal.org/node/23348

区块位置可见设置的一些参考
http://drupal.org/node/64135

在theme里区别显示一般分类与freetag标签
http://www.drupalchina.org/node/1521

一个国外的drupal相册制作视频教程
http://www.drupalchina.org/node/2735

views+cck+viewfield自定义页面风格录象教程

上传一个到了www.56.com,质量很差
http://www.56.com/u60/v_MTk3MjUzMzc.html

视频在群FTP里的位置/files/drupal视频录像/views+cck+viewfield自定义页面风格/

公开FTP,有好东西大家分享,但不要乱传,乱删东西,谢谢合作!
----------------------------
感谢KK125提供
size:5000M
ftp:nesbitt.dreamhost.com
usr:drupal5
psw:okk125

--------------------------------------------------------
协医网
北京海淀区,招聘PHP程序员,有意向发邮件至lyh(at)xieyi.com
--------------------------------------------------------

我也发几条经常用到

我也发几条经常用到的一些代码,自制主题时经常会需要用到的一些权限判断代码。
按登录非登录判断:

<?php
 
global $user;/*是否为登录用户*/
if ($user->uid){/*如果是当前浏览者为登录用户则显示下面的内容*/
   
print ;
  }
else {
/*如果是当前浏览者为非登录用户则显示下面的内容*/
   
print ;
  }
?>

按用户uid判断,这个很适合把一些特定区块只显示给管理员:

<?php
 
global $user;/*是否为登录用户*/
if ($user->uid == 10){/*如果是当前浏览者登录且uid等于10则显示下面的内容*/
   
print ;
  }
else {
/*如果是当前浏览者uid不等于10则显示下面的内容*/
   
print ;
  }
?>

按角色判断,给不同用户组显示不同的内容:

<?php
global $user;/*是否为登录用户*/
if (in_array('vips',$user->roles)) {/*假定有一个角色,叫做"vips",如登录用户属于该用户组,则显示以下内容*/
print ;
}
else{
/*若不属于"vips"用户组则显示以下内容*/
print ;
}
?>

判断用户是否有编辑权限:

<?php
if (node_access('update', $node)){/*如果用户有编辑当前节点的权限,则显示以下内容。*/
print ;/*通常这儿是当前节点的编辑链接*/
}
else{
/*如果没有,则显示以下内容。*/
print
}
?>

定义主题regions:
比如,在template.php里加上:

<?php
function 主题名_regions() {
  return array(
'contenttop' => t('内容顶部'),
'contentbottom' => t('内容底部'),
  );
}
?>

现在进入管理-区块,看一下,是不是出现了“内容顶部”、“内容底部”这两个块了?举一反三,想要更多的块就很简单了。块的宽度,显示位置,也是非常灵活的。
当然,你需要然在page.tpl.php文件中加上这两句:

<?php
print $contenttop
?>

<?php
print $contentbottom
?>

------
瞅瞅

非常好文,留个记号

非常好文,留个记号,推荐加精。
--------------
美国空间,美国主机,营销型网站,美国虚拟主机

上面也发了根据分类

上面也发了根据分类制作布局,因为制作主题比较多,经常会用到这些代码,就发个比较全面的。基本包括了类型、分类、节点、别名url。都是从官方找来整理的。官方文档是个大宝库,建议中文站用cck做个方便查阅的文档库,有时间和兴趣的可以翻译官方的book添加上去。

drupal使用php模板引擎,主题制作修改非常灵活,可以按类型按url按分类来定义不同page.tpl.php。具体操作步骤如下:
将page.tpl.php复制一份,另存为page-default.tpl.php。现在可以在page.tpl.php里定义了:

<?php
if ($is_front) {
    include
'page-front.tpl.php';
    return; }
if (
arg(0)=="node"&& arg(1)=="add" ){
    include
'page-add.tpl.php';
    return; }
if (
$node->type == 'story') {
    include
'page-story.tpl.php';
    return; }
include
'page-default.tpl.php';
    return;
?>

上面的意思就是首页使用page-front.tpl.php,路径为node/add的使用page-add.tpl.php,类型为story的节点使用page-story.tpl.php,其它都使用page-default.tpl.php

有一点要注意,drupal默认会先按url路径读取模块,比如有story类型的文章,url为http://www.500959.com/front/345,系统会先寻找page-front.tpl.php,因为node/6也是一个路径,所以默认会先根据节点的nid来读取。如果你根据类型指定了不同的page-xxx.tpl.php,读取顺序会变成这样,以nid为6的blog节点为例:page-node-6.tpl.php -> page-blog.tpl.php -> page.tpl.php

节点tpl.php需要在template里定义variables函数。定义方法见面下。这样定义了之后,系统读取顺序就是这样,以nid为6的blog文章为例子:node-node-6.tpl.php -> node-blog.tpl.php -> node.tpl.php。

如果没有template.php就建一个,如果template里已经有variables函数,根据实际情况修改一下。

<?php
function _phptemplate_variables($hook, $vars = array()) {
  if (
$hook == 'node')
  {

   
$alias = $_GET['q'];
   
$suggestions = array();
   
$name_prefix = 'node';
   
$node_type = !empty($vars['node']->type) ? '-' . $vars['node']->type : '';
   
$add_path = '';
    foreach (
explode('/', $alias) as $path_part) {
     
$add_path .= !empty($path_part) ? '-' . $path_part : '';
     
$suggestions[] = $name_prefix . $add_path;
     
$suggestions[] = $name_prefix . $node_type . $add_path;
    }

   
$vars['template_files'] = $suggestions;

    if (
module_exists('path')) {
     
$alias = drupal_get_path_alias($_GET['q']);

      if (
$alias != $_GET['q']) {
       
$suggestions = array();
       
$add_path = '';
        foreach (
explode('/', $alias) as $path_part) {
         
$add_path .= !empty($path_part) ? '-' . $path_part : '';
         
$suggestions[] = $name_prefix . $add_path;
         
$suggestions[] = $name_prefix . $node_type . $add_path;
        }
      }
     
$vars['template_files'] = array_merge($vars['template_files'], $suggestions);
    }
  }
  return
$vars;
}
?>

给不同分类定义不同的page-xxxx.tpl.php:

<?php
if (arg(0)=="taxonomy"&&arg(1)=="term"&&arg(2)=="214"){
    include
'page-term-photo.tpl.php'/*分类id为214,使用page-term-photo.tpl.php。*/
   
return; }
?>

------
瞅瞅

我用了你说的方法但

我用了你说的方法但是好像不管用的。
我有一个类型为page,nid=71的页面,我在template里面加了你上面的代码,也重新加了一个node-71.tpl.php,但是没用,内容显示的还是node.tpl.php的样式。
是不是还有哪里需要改的呢?

我也留个印把

image模块可以给图片分类,分类的缩略图默认是最后发布的那张,而不是指定的,所以的都一下代码:在image模块里的image_gallery里面,找到image_gallery.module。先自己写过函数,很简单,就是读term_image表里的,给分类指定缩略图的那张图片路径,放到image_gallery.module最后面。
<?php
function get_term_iamge($term_id)//专递个分类id
{
$term_image_url = db_fetch_object(db_query("SELECT * FROM {term_image} WHERE tid = %d",$term_id));//主要是在了
if(!$term_image_url)
{
echo "取分类图片失败!";//测试之用,不应该有输入的
}
$url = $term_image_url -> path;
$out = "[a href=\"?q=product/tid/".$term_id."\"][img width=\"150\" height=\"150\" class=\"image image-thumbnail\" src=".$url."][/a]";//直接在这定义了图片大小,呵呵

return $out;
}
>
然后找到388行的
$content .= l(image_display($gallery->latest, IMAGE_THUMBNAIL), 'image/tid/'. $gallery->tid, array(), NULL, NULL, FALSE, TRUE);把它注释掉.

在它后面直接添加
$content .= get_term_iamge($gallery->tid);

ok

强烈要求加精加威望

强烈要求加精加威望置顶!

-----------------------------------------------------

Phoenix's Blog

haha! done!

haha!
done!

难得的好技术贴,强

难得的好技术贴,强烈顶!

我认为drupal原意应该

我认为drupal原意应该是清除以cid开头的记录,而不是包含cid的记录。这样有可能提高性能,而且可以防止误清除。
---------------------------------------------
欢迎访问我的drupal网站http://web.srv.cn/
---------------------------------------------

这个网站强悍!在下

这个网站强悍!在下佩服得不行了~
请教下葬月网站右上方科室展示那个slideshow是什么模块

自己写了个幻灯片图

自己写了个幻灯片图片的输出,用了一个,flash焦点图,把输出插入到了flash里。
flash焦点图,网上很多了 呵呵。
推荐个网站,有N多漂亮的, http://www.makewing.com/lanren/jscode/

--------------------------------------------------------
协医网
北京海淀区,招聘PHP程序员,有意向发邮件至lyh(at)xieyi.com
QQ群:6703001(人满) QQ群2:5816016 {加入请注明drupal}
--------------------------------------------------------

这东西很实用,能给

这东西很实用,能给我一个可以直接用的吗?不会编程呀
非常感谢!
sinkstyle@gmail.com

*
Drupal Sites

*

好文章! 不过db_query("

好文章!
不过db_query("DELETE FROM {". $table. "} WHERE cid LIKE '%%s%'", $cid);
这句drupal原意应该是清除cid打头的内容的。
就算不是我觉得也应该这样写
db_query("DELETE FROM {". $table. "} WHERE cid LIKE '%%%s%'", $cid);

好文章。

好文章。

葬月 , 这是高手。

葬月 , 这是高手。

谢谢!

请问葬月,协议网中

请问葬月,协议网中都用了哪些module啊?
那个评分的系统是怎么做的,
还有那个评好最佳答案后帖子的状态可以为关闭,这是怎么实现的?
-----------------------
快乐购GoGo
学习drupal,共同进步

都是自己开发的模块

都是自己开发的模块哦

--------------------------------------------------------
协医网
QQ群:6703001(人满) QQ群2:5816016 {加入请注明drupal}
--------------------------------------------------------