Drupal培训

                        Drupal培训

为了更好的培养drupal人才,决定推出Drupal培训课程,主要将会面对个人站长和企业用户,帮助拥有Drupal项目资源的个人和中小企业,快速的开发自己的Drupal站点,积累自身的Drupal技能,培养专职的Drupal开发团队.

 

面向个人的,有《老葛的Drupal培训班》 http://www.thinkindrupal.com/node/711

面向企业的有,企业培训项目 http://www.thinkindrupal.com/node/604

站长的项目经验及Drupal技能:http://www.thinkindrupal.com/node/576

授课内容:将会以drupal专业开发指南为基础,为大家讲解里面的技能.同时会为大家提供更多参考资料,常用模块的讲解,常用类型网站的讲解.

 

论坛:

Drupal版本:

老葛的Drupal培训班(课程内容)

已停止服务


 

2009年10月21号后,不再销售Drupal6的网络培训班了。现有的付费学员可以继续享受现有的服务.

 

2009年8月1号后,不再执行这里的价格,不再分开卖了,统一267元。

 

培训班中的资源不再单独可以购买了.

 

从开始靠为大家培训Drupal技能开始,已经经历了将近50天了,先后录制了10个视频,制作了2种类型的演示网站.在摸索中前进.从最开始的,打算培养专职的Drupal程序员为目标,并列出了课程的大纲以后,不断地收到各种各样的反馈信息.根据大家的需求,建议,Drupal培训班,将包含以下内容:

 

1,Drupal6专业开发指南,培训资料,纸质版(已经免费了,不再出售这个).

2,四种类型Drupal网站的建站实践,展示型、多语言型、网店型,SNS型,

3,三个最常用的模块,CCK、Views、OG

除此以外,还有一个Drupal主题花园的整站代码,供有兴趣的人研究。

 

       购买了Drupal培训班的学员,将被站长手工的添加到这些付费小组中去,这就意味着购买了zhupou.cn所有的付费小组。另外,为了节省部分Drupal爱好者的成本,提供教学资源单独购买的方式。就是说,你觉得467对你来说贵了一点,或者你仅仅需要某一部分付费资源的话,那么你可以单独购买。

 

 

今后的工作,主要就是完善这些小组中的付费资源。另外,为了回赠那些为zhupou.cn做出贡献的用户,所有的付费资源都可以通过zhupou.cn的积分进行购买。积分与付费之间的换算关系可参看:会员积分制度, http://他thinkindrupal.com/node/703

 

       Drupal程序员课程大纲,http://zhupou.cn/node/578 所列的课程计划,将会被融入到前面的10个小组中去。根据用户的建议,Drupal专业开发指南上所列的许多技能,其实大家通过看书就能完成。所以将这些枯燥的技能,融入到实际的项目中,讲述如何去应用这些技能。

       培训班内容建设,包括视频的录制,将会在Drupal7正式版本问世后的3个月内结束,这个培训班是针对Drupal6的。Drupal7是否有培训班,以及收费标准,暂时不考虑。

       为

论坛:

Drupal版本:

Drupal程序员课程大纲

第一篇

 

    第一课,drupal编码规范和最佳实践

    第二课,代码安全

    第三课,编写一个模块

    第四课,Drupal菜单

    第5课,表单API

    第6课,数据库层

 

   第二篇

    第7课 节点

    第8课 CCK高级

    第9课 区块

    第10课 分类

   第11课 本地化,中文化

   第12课 Jquery

   第13课 文件系统

   第14课,用户

 

   第三篇

   第15课 过滤器

   第16课 XML-RPC + Service

   第17课 Views高级

   第18课 搜索

   第19课 缓存,会话

   第20课 安装profile

   

 

       另外,Drupal使用,Ubercart的内容都会放到一起的,就是说,这3个班的内容都将合并在一起。Drupal使用的课程大纲随后会给出来的。也就是说,报一个班,参加3个班的课程。

      

       通过本课程的学习,你能够把drupal当成一个开发框架,轻松的搞定项目中的困难问题。本课程是针对Drupal项目中,比较难的那部分的,无论什么样的Drupal项目,客户都会提出一些定制的要求,这个时候就需要编码搞定了,如果有80%的东西都可以通过Drupal模块的配置来解决,那么还有20%的问题,你解决不了的。

   本课程针对的就是这20%,学会本课程,能够很好的帮助你解决这些问题,至少你知道如何去解决的。

论坛:

Zhupou.cn面向企业的Drupal培训项目,正式启动

Drupal培训服务内容:
1, 3天的现场培训,您可以指定培训内容,
2, thinkindrupal.com读者答疑服务,
 
 
 
费用: 固定价格
参与培训人员 3-10人,   价格 5000元, 
收费办法,与站长联系,确定drupal培训的日期,大致的内容,提前付费2000元,协助解决站长在您哪里的食宿(无需另行付费),培训结束后,支付剩余款项.
Zhupou.cn与您共成长.
 

论坛:

Drupal版本:

老葛的Drupal项目经验

主要是用于宣传一下我的培训班的,我参与过30余个Drupal项目的建设,既有大一点的,也有很小的.如果把drupal项目进行分类,10万元以下的算小项目,10-50万元的算中型项目,50-100万元的算大型项目的话.100万以上算特大型drupal项目.

    那么,我参与过两个特大型的drupal项目建设,当然,在这两个项目,不是由我一个人完成的,很多人参与其中的项目.其它的中型项目可能也有1,2个,剩下的就是这种10万元以下的小项目了.这里衡量的标准是人民币.另外这些项目大多数是给外国人做的.

    1,intel flex项目,网址http://www.intelflexplus.com,

       我在这个项目中贡献了80+个manday的工作.这个项目是intel的全球客户激励的系统,相当于客户管理吧,他们使用drupal开发,重要的一点应该是drupal的国际化的支持非常好.这个项目中方的核心开发者,除了我以外,还有Andy(项目负责人),还有ITshark.这个项目是完全把drupal作为框架来用的,里面用到了pro drupal书中所讲的80%的知识点,大家常见的问题,这个项目中都遇到了.

       我的作用,一个人开发两个人的工作,帮助开发组中的成员使用drupal钩子,另外自己也写模块.还有就是和geoge制作主题.把静态的HTML转化为Drupal主题.

       项目算不上成功,但是也绝不能说是失败.除了公司从这个项目中,赚了不少外块以外,我和andy就是这个项目的最大受益者了.我们常常加班到晚上12点的,为这个项目.不过在这个项目开始以前,我们对drupal的理解,还是非常初级的,经过这个项目的历练,使得我们成为了国内少有的接触过Drupal大型项目的人.另外,也正是由于这个项目,使我完成了drupal专业开发指南的翻译,为了做项目,这本书我前后读了不下10边.

   2,sobeys的门户网站,  http://www.sobeys.com/,

  我在这个项目中,贡献了25manday的工作,但是主要是后期维护的,在原有的基础之上添加新的功能. Sobeys是个大公司,这个是它的门户网站,构建在drupal之上的. http://en.wikipedia.org/wiki/Sobeys,这个是它的说明,年销售120亿(加元),是加拿大第2大食品连锁店.

       把他们的项目下再过来以后,仅成功的搭建起来,就花了2天的工夫,因为它是一个真正的多站点.最初是由Andy在远方的服务器上搭的,我下载到本地,也仿照搭建了起来,尽管网站能跑起来,但是很快我发现,有问题,自己花了半天时间都搞不定,最后把Andy拉过来,两个人花了半天,最后Andy帮助解决了这个问题.这个时候,我和Andy都做过很多Drupal项目了.

       我的很多的中文教程,其实就是根据这个网站的功能所写了,我把这个网站的源代码度过一边.其规模和intel flex相仿.建议大家看看这个网站,还有http://www.compliments.ca/。里面有很多东西值得学习。

 

       前面的是两个大的项目.其它的都是小项目了.

       3,http://www.lovemypet.com.hk/

     在这个项目,我贡献了15个manday的工作,前期是由Anix做得,后期改动,功能添加的都是我一人搞定的.确切的,我是从这个项目中入的门,以前真的不知道什么是Drupal,做完这个项目以后,才知道Drupal可以干什么. http://www.drupalfans.com/node/10.在一个功能完善的网站上添加功能,是学习Drupal的好的途径.

   

   4.我忘记网站的地址了,功能是一个公司宣传型的网站,

     前面的25个manday,由我独自完成,后面的10manday,我也贡献了一半的力量.常见的公司宣传型网站,不过需要使用EC卖点东西.

  

   其它的就不写了.从最简单的宣传型网站,到功能稍微复杂的应用,以及到大型的应用,我都参与过,并在其中作出过比较大贡献.用过drupal5,也用过drupal6.以前还用过drupal4.7呢。

       从最初的主题制作,到模块开发,还有第3方模块的选取,都积累了一定的经验,除了这些项目以外,还翻译了drupal5的专业开发指南,主题制作指南,写过许多Drupal方面的技术文章,完整汉化了Ubercart模块,另外就是贡献了Ubercart下面的支付宝模块。

   
       能够独立写出支付宝模块的人,不知我一个,比如Andy就可以写出了EC下面的,但是能够独立的写出来的人,的确不多。

  

   为什么学习Drupal?作为接触过特大Drupal项目,并在其中作出过突出贡献的两个人,我和Andy都选择了单干,而且都在Drupal圈内发展,尽管我们对未来有着不同的看法,但是单飞这一事实本身就说明了,我们共同看好Drupal。看好它的前景。

      

       开班了,宣传期,网站会做一些改版,资料正在整理中^_^

论坛:

Drupal版本:

网站即将改版, 改版后即可报名

下面的这些内容,包括这个节点下面的子节点,都是以前关于Drupal培训的信息,可能已经过时了,仅供参考。以最新的为准。

 

现在正在准备培训所需要的资料,资料的整理比我预期的慢了,但是还是在全速的整理中.整个课程的设计,将会更加的贴近实际的需求,就是讲到的东西,你很快可以通过变通应用到实际中.

       新版的zhupou.cn将会继续保留现有的丑陋的主题,但是在功能上将会极大丰富,许多人想要的,设想的,都会在新版中,看到相应的影子。zhupou.cn将会更加的web2.0化,与其它国内的web2.0网站相比,本站将会在社区的基础之上,增加电子商务功能。

   Zhupou将会成为一个web2.0社区,在这里大家将会交友,认识新同学,还有购买站长销售的Drupal资料。在这里,既有免费的资源,也有大量整理后的,付费的资源。

   我的目标是,以付费的,来养活整个网站的运营,同时有了一定的前以后,就能够提供的更多的Drupal学习资源了,有了更多的学习资源,就会吸引更多的入门级的人,joomla的人,其它CMS,论坛的人学习Drupal,学得人多了,愿意付费的人就多了。

   很多网站,很多人想实现的功能,和我想的差不多,社区+电子商务,是当前网站的热点。我给大家看一个项目的需求,只摘抄一段:

My thinking is that we host something like the Facebook of sports if you will.. So it’s a community based site where sports lovers of all kinds of sports from all over the world can come to read & submit their own news articles, videos, photos and have a forum etc etc.

Additionally, there will be an online store selling sports apparel & merchandise.

 “

       他想要一个Facebook网站,不过主要是关于体育方面的,除了facebook的功能以外,他还想在这个网站上销售东西。

       社区,将会给他带来流量,而流量将会带来潜在的客户,通过销售东西,他就可以赚钱了。

    不止这一个客户想要,我遇到的客户当中,很多人都有这样的想法。新版的网站,可能功能并不完善,但是你会看到这种功能的影子的。

论坛:

Drupal所用的培训资料还在整理中

Drupal所用的培训资料还在整理中,从整个整理的进度来看,还需要30天,网站的改版,培训班的报名,都将留在资料整理以后进行.

预计将会向后推迟20天到1个月.

希望大家都耐心.

论坛:

本站将致力于Drupal的培训,推广,与普及

本站将致力于Drupal的培训,推广,与普及,继上一次决定退出大部分建站业务以来,从现在起,将专注于Drupal的培训,推广,与普及,致力于丰富Drupal中文资源.同时致力于社区型电子商务的实践与研究.

不能既当裁判员,又当运动员的.所以老葛决定把宝贵的时间用在自己认为最有意义的事情上去.

我们将推出3个drupal在线培训课程:1,Ubercart培训班 2,Drupal程序员培训班, 3,Drupal初级班.

如果你初步学会了使用Drupal,能够使用CCK+Views,这样的常用模块,能够自己独立的搭建一个博客,一个企业展示型网站的话,如果你达到了这样的程度,又想在Drupal技能上更进一步的话,不妨参加前两个培训班.

Ubercart培训班主要帮助大家学习Ubercart及相关模块,搭建网店型网站,同时讲解里面的模块钩子函数,如何将默认的样式改变成自己想要的.培训费用365元,培训周期3个月,采用在线方式.

,Drupal程序员培训班,主要帮助大家学习Drupal模块的编写,将会以Drupal专业开发指南为教程,为大家详细讲解里面的知识点,技能,以及难点.培训费用456元, 培训周期3个月,采用在线方式.

Drupal初级班,主要帮助大家掌握常用的模块,如何使用Drupal像搭积木一样搭建一个网站,将积木一搭到底,是这个班的特点,不讲编程,只讲配置. 培训费用267元, 培训周期3个月,采用在线方式.

 

总共两个中级在线课程,一个初级在线课程.同时将会有付费的Drupal学习视频推出.所有的文字,图片型的中文资料将会免费发布,供大家免费使用.

论坛:

Drupal表单API

课时:1天

 

课程内容:

1,创建基本的drupal表单

2,表单元素,属性介绍

3,创建多页面表单

4,添加前端验证,jquery

5,表单的主题化

6,表单处理流程

 

Drupal表单API是最难掌握的drupal技能之一,本课程将为你讲解里面的关键点,实际项目中常用的技巧,效果是降低学习成本,少走冤枉路.

论坛:

Drupal视频第一集, Drupal、钩子、算法

 

本视频,讲解了Drupal,钩子,算法,初步解答了Drupal的性能问题,初步给出了如何优化Drupal,回答了部分人的观点drupal6,drupal7越来越慢的这种错误观点。

本视频,市场价:10元

指南购买者5折优惠:5元

本视频PPT,大家可以免费观看,http://docs.google.com/Presentation?docid=dc479jk4_1g2fbvvgz

论坛:

Drupal视频第2集, 创建一个模块

 

本视频\PPT介绍了如何创建一个Drupal模块.详细讲解了info文件,module文件,简单介绍了菜单钩子,nodeapi钩子,表单API

     同时介绍了在编写Drupal模块时应该注意的一些事项。

本视频,市场价:10元

指南购买者5折优惠:5元

本PPT,大家可以免费观看,ppt地址: http://docs.google.com/Presentation?id=dc479jk4_3fxfvs2c7

论坛:

Drupal培训计划(第一课:Ubercart)

             经过精心的准备,第一期培训计划终于登场了,Ubercart培训课程.面向企业客户.

        很多外包公司,很多小团队,很多自由职业者,会接触到drupal+Ubercart的项目,当你有了这样的项目时,缺什么?技术+人才,当你招了一个php程序员,就以为可以搞定一切的时候,有没有遇到drupal中Ubercart中,存在的配置问题,常见的开发问题呢?

     现在zhupou.cn推出drupal+Ubercart的培训课程,课时 2天,帮您迅速的掌握Ubercart的2次开发,以及常见的一些问题。

 

 

论坛:

Drupal版本:

Zhupou.cn的Drupal程序员班正式开班了

已停止服务

 


费用 467,可获得与课程有关的所有资源,教材,视频,以及提问的机会。

培训教材包括《Drupal专业开发指南(Drupal6)》,共计40多个学习视频,还有提问的机会。只需一次付费,即可或得zhupou.cnDrupal6下的所有资源.

 

与培训班相关的资源将同步销售,现在已经有了《Drupal专业开发指南(Drupal6)》可供出售,本教材经过60余日的辛苦整理,是学习Drupal下面的工作流触发器,ajax.菜单系统,等等的上佳教材. Drupal专业开发指南(Drupal6)每份200.单独购买的用户享受以下服务:

1, 300元升级到Drupal程序员班学员.

2, 买视频5折优惠

3, 者签名和贴照片.

 

视频价格初步定在每集20,单独购买.

 

现在只出售1,Drupal程序员班. 2, Drupal专业开发指南(Drupal6

购买办法:

1,北京客户前一周可送货上门,无论是报班,还是购买《Drupal专业开发指南(Drupal6)》

请发短信到:13641026086,注明详细地址,购买项目. 请勿来电,来电一律不接,只接短信.

 

2,外地客户可汇款到9559980014226004910,汇款以后请保留您的凭证,发电子邮件到g089h515r806 at gmail.com,注明汇款金额,汇款时间,购买产品,您的详细地址,联系方式.

 

站长上网不便,可能需要一到两天才能响应您的电子邮件,,所以请您保存好你的汇款凭证.站长确认收款后,就会给您邮寄《Drupal专业开发指南(Drupal6)》

 

 

zhupou.cn帮助那些真正需要帮助的人.

论坛:

Drupal版本:

老葛,看看我的作品,给我指点下,美工没做完

  老葛,看看我的作品,给我指点下,美工没做完,对ie6严重不支持,http://kacheba.cn/   drupal搭建的多语言企业站演示。

Drupal版本:

Drupal 7 中文教程 代码部分

Drupal 7 中文教程 代码部分,

这里面包含了教程中所有的代码部分,包括模块的实例代码,菜单的实例代码,用户的实例代码,各个部分的实例代码。

所有的代码,都是原创的,源自于多年的实践经验。

Drupal版本:

Drupal 7 中文教程 字段验证 ISBN验证

<?php

/**
 * @file
 * isbn validation
 */

Drupal info文件:

name = ISBN Validation
description = "Add ISBN validation to text field"
core = 7.x
dependencies[] = field
dependencies[] = field_ui

module文件:

/**
 * Implements hook_field_attach_validate().
 */
function isbn_validation_field_attach_validate($entity_type, $entity, &$errors) {
 list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
 
 if($entity_type =='node' &&  $bundle == 'book'){
   $field_isbn_length = strlen($entity->field_isbn['und'][0]['value']);
   if(($field_isbn_length != 10) && ($field_isbn_length != 13)){
    $errors['field_isbn']['und'][0][] = array(
     'error' => 'field_isbn',
     'message' => t('无效的ISBN号.'),
    );
   }  
 }
}

Drupal 7 中文教程 省市县三级联动 实例代码

<?php
/**
 * @file
 * 省市县三级联动实例代码,
 */

/**
 * 实现钩子hook_menu().
 */
function shengshixian_menu() {
  $items['ssx'] = array(
  'title' => '省市县',
    'page callback' => 'shengshixian_test_page',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
 * 路径“ssx”页面的回调函数
 */
function shengshixian_test_page(){
 $render_array = array();
 //我们为这个页面设置标题
 drupal_set_title('省市县三级联动');
 //页面的正文为一个表单,注意drupal_get_form返回的不是html,需要使用drupal_render呈现一下。
 $render_array['#markup'] .= drupal_render(drupal_get_form('shengshixian_test_form'));
 //Drupal7的页面回调,返回的应该是一个数组,只有在退化形式下,才返回字符串。
 return $render_array;
}

/**
 * 表单shengshixian_test_form的构建函数
 */
function shengshixian_test_form($form, &$form_state){
  //设置省市县对应元素的默认值
  $default_sheng = !empty($form_state['values']['sheng']) ? $form_state['values']['sheng'] : '';
 $default_shi = !empty($form_state['values']['shi']) ? $form_state['values']['shi'] : '';
 $default_xian = !empty($form_state['values']['xian']) ? $form_state['values']['xian'] : '';
 
 //构建省份的选项数组,首先设置了一个提示语
  $sheng_options = array(
   '' => '请选择省份',
 );
 
 //向数据库中查询省份信息,
 $query_sheng = db_select('taxonomy_term_data','ttd')
 ->fields('ttd', array('tid', 'name'));
 
 //因为省份是第一级术语,分类术语的父亲为0
 $query_sheng->leftJoin('taxonomy_term_hierarchy', 'tth', 'ttd.tid = tth.tid ');
 $query_sheng->condition('tth.parent', 0);
 
 //需要确定术语所在的词汇表,就是我们在前面创建的地区
 $query_sheng->leftJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid ');
 $query_sheng->condition('tv.machine_name', 'diqu');
 
 //按照tid排序,并执行
 $result_sheng = $query_sheng->orderBy('tid')->execute();
 
 //将返回的结果,进行迭代,为$sheng_options赋值。
 foreach ($result_sheng as $record) {
   $sheng_options[$record->tid] = $record->name;
 }
 //省份表单元素
 $form['sheng'] = array(   
   '#title' => t('请选择您所在的省份?'),   
   '#type' => 'select',   
   '#options' => $sheng_options,   
   '#default_value' => $default_sheng,
    //#ajax属性数组  
   '#ajax' => array(     
     'callback' => 'shengshixian_sheng_callback',     
     'wrapper' => 'shi-wrapper-div',     
     'method' => 'replace',     
     'effect' => 'fade',   
   ), 
 );
 
 //构建市的选项数组,首先设置了一个提示语
 $shi_options = array(
   '' => '请选择市',
 );
 //在省份不为空的情况下,取该省份下的所有的市
 if(!empty($default_sheng)){
 
   //向数据库中查询术语信息,
  $query_shi = db_select('taxonomy_term_data','ttd')
  ->fields('ttd', array('tid', 'name'));
  //将其父术语限定在前面的省份的具体值上
  $query_shi->leftJoin('taxonomy_term_hierarchy', 'tth', 'ttd.tid = tth.tid ');
  $query_shi->condition('tth.parent', $default_sheng);
  //由于省份信息里面,已经包含了词汇表信息,所以我们不再需要关联这个taxonomy_vocabulary表。
  //$query_sheng->leftJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid AND tv.machine_name = :machine_name', array(':machine_name' => 'diqu'));
  
  //按照tid排序,并执行
  $result_shi = $query_shi->orderBy('tid')->execute();
  
  //将返回的结果,进行迭代,为$shi_options赋值。
  foreach ($result_shi as $record) {
   $shi_options[$record->tid] = $record->name;
  }

 }
 /*
 //测试代码,中间测试的时候用的,这里保留了,开发模块所用到的测试代码很多,多数都已删除。
  $form['test'] = array( 
   '#markup' => '123456:'.$default_sheng
 );
 */
 //表单元素市
 $form['shi'] = array(   
   '#title' => t('请选择您所在的市?'),   
  '#prefix' => '<div id="shi-wrapper-div">',   
  '#suffix' => '</div>',
   '#type' => 'select',   
   '#options' => $shi_options,   
   '#default_value' => $default_shi,
    '#ajax' => array(     
     'callback' => 'shengshixian_shi_callback',     
     'wrapper' => 'xian-wrapper-div',     
     'method' => 'replace',     
     'effect' => 'fade',   
   ),     
 );
 
 //构建县的选项数组,首先设置了一个提示语
 $xian_options = array(
   '' => '请选择县',
 );
 //在市不为空的情况下,取该市下的所有的县
 if(!empty($form_state['values']['shi'])){
 
   //向数据库中查询术语信息,
  $query_xian = db_select('taxonomy_term_data','ttd')
  ->fields('ttd', array('tid', 'name'));
  
  //将其父术语限定在前面的市的具体值上
  $query_xian->leftJoin('taxonomy_term_hierarchy', 'tth', 'ttd.tid = tth.tid AND tth.parent = :parent', array(':parent' => $form_state['values']['shi']));
  $query_xian->condition('tth.parent', $default_shi);
  
  //由于最前面省份信息里面,已经包含了词汇表信息,所以我们不再需要关联这个taxonomy_vocabulary表。
  //$query_sheng->leftJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid AND tv.machine_name = :machine_name', array(':machine_name' => 'diqu'));
  
  //按照tid排序,并执行
  $result_xian = $query_xian->orderBy('tid')->execute();
  
  //将返回的结果,进行迭代,为$xian_options赋值。
  foreach ($result_xian as $record) {
   $xian_options[$record->tid] = $record->name;
  }
 }
 
 //表单元素县
 $form['xian'] = array(   
   '#title' => t('请选择您所在的县/区?'),   
  '#prefix' => '<div id="xian-wrapper-div">',   
  '#suffix' => '</div>',
   '#type' => 'select',   
   '#options' => $xian_options,   
   '#default_value' => $default_xian,
   
 );
 
  //提交按钮
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('提交'),
  );
  return $form;
}

/**
 * 表单元素sheng,它的值变更时,对应的Ajax回调函数。
 */
function shengshixian_sheng_callback($form,&$form_state){
  //根据当前省份,重新确定市的可选项。返回重新构建的表单元素shi
 return $form['shi'];
}

/**
 * 表单元素sheng,它的值变更时,对应的Ajax回调函数。
 */
function shengshixian_shi_callback($form,&$form_state){
  //根据当前所选的市,重新确定县的可选项。返回重新构建的表单元素xian
 return $form['xian'];
}

Drupal版本:

Drupal 7 中文教程 简单的同步登陆 Drupal7同步Drupal6的用户

<?php

/**
 * @file
 * 当登录Drupal7站点时,检查是否在drupal6站点存在这个帐户,
 * 如果存在,将其保存到新的站点.
 */

/**
 * 实现钩子hook_form_FORMID_alter().
 */
function d6user_form_alter(&$form, &$form_state, $form_id){
  //这里我们对于表单user_login,user_login_block同时添加了一个验证器
  if($form_id == 'user_login' || $form_id == 'user_login_block'){
   $form['#validate'] = d6user_login_default_validators();
 }
}

/**
 * 我们自己的登录验证函数集合,.
 */
function d6user_login_default_validators(){
  //注意这里面保留了Drupal自带的验证器,只是在中间加上了一个自定义的验证器。这些验证器的执行存在先后顺序的
  return array('user_login_name_validate', 'd6user_user_form_validate', 'user_login_authenticate_validate', 'user_login_final_validate');
}

/**
 * 我们自己定义的登录验证函数,它在user_login_authenticate_validate前面执行.
 */
function d6user_user_form_validate($form, &$form_state){
  //form_set_error('name',t('用户名,密码不匹配.')); 这里保留了调试信息
  $name = $form_state['values']['name'];
 $pass = $form_state['values']['pass'];
 if (!empty($name) && !empty($pass)) {
   //drupal_set_message('123'); 这里保留了调试信息,用户调试代码,方便大家测试
   $account = db_query("SELECT * FROM {users} WHERE name = :name ", array(':name' => $name))->fetchObject();
  //如果用户名存在,则返回.
  if ($account) {
    return;
  }else{
   // $sql = "SELECT * FROM {users} WHERE name = :name AND pass = :pass";
   //drupal_set_message('123456');
   //我们向Drupal6站点的用户表进行查询,检查该用户是否存在。
   db_set_active('d6user');
   $account = db_query("SELECT * FROM users WHERE name = :name AND pass = :pass", array(':name' => $name, ':pass' => md5($pass)))->fetchObject();
   db_set_active('default');
   if($account){
    // drupal_set_message('1234567');
        //此时,用户帐号在Drupal6中存在,并且用户名密码正确
    $userinfo = array(
     'name' => $name,
     'pass' => $pass,
     'mail' => $account->mail,
     'init' => $name,
     'status' => 1,
     'access' => REQUEST_TIME
    );
    //我们将查询到的信息保存到Drupal7的用户表中
    $account = user_save(drupal_anonymous_user(), $userinfo);
   }
  }
 }

}

Drupal版本:

Drupal 7 中文教程 联系我们 两步表单 module 文件 代码部分

<?php

/**
 * @file
 * 方便用户联系我们.
 */

/**
 * 实现钩子hook_menu().
 */
function contactus_menu() {
  $items = array();
 //联系我们菜单项
  $items['contactus'] = array(
    'tilte' => '联系我们',
      'page callback' => 'contactus_page',
      'type'     => MENU_CALLBACK,
      'access callback' =>TRUE,
   'file' => 'contactus.pages.inc',
  );
 //确认页面菜单项
  $items['contactus/confirm'] = array(
      'page callback' => 'contactus_confirm_page',
      'type'     => MENU_CALLBACK,
      'access callback' =>TRUE,
   'file' => 'contactus.pages.inc',
  );
 //致谢页面菜单项
  $items['contactus/thanks'] = array(
      'page callback' => 'contactus_thanks_page',
      'type'     => MENU_CALLBACK,
      'access callback' =>TRUE,
   'file' => 'contactus.pages.inc',
  );
  return $items;
}

/**
 * 实现钩子hook_mail().
 */
function contactus_mail($key, &$message, $params){
 $language = $message['language'];
  switch ($key) {
   case 'contact':
  
    //邮件的标题
    $message['subject'] = '联系我们';
   
   //邮件正文,这里面包含:姓名、单位名称、电子邮件、电话号码、邮件正文、访问来源
      $message['body'][] = '姓名:'.$params['name'];
      $message['body'][] = '单位名称:'.$params['company_name'];
      $message['body'][] = '电子邮件:'.$params['mail'];
      $message['body'][] = '电话号码:'.$params['phone'];
      $message['body'][] = '邮件正文:'.$params['contact'];
   
      //对于访问来源,如果visit的值我们选择了“其它”,那么此时我们取$params['other'],否则取$params['visit']
      $visit = "";
      if($params['visit'] == 'other'){
        $visit = $params['other'];
      }else{
        $visit = $params['visit'];
      }
      $message['body'][] = '访问来源:'. $visit;
  }
}
 

Drupal版本:

Drupal 7 中文教程 联系我们 两步表单 “确认”页面回调

/**
 * “确认”页面的回调函数
 */
function contactus_confirm_page(){
  //我们为这个页面设置标题
 drupal_set_title('联系我们');
 
 //这里首先作了判断,如果会话中没有设置contactus_form,返回contactus
 if(empty($_SESSION['contactus_form'])){
  drupal_goto('contactus');
 }else{
 }

 $render_array = array(
   '#markup' => '',
 );
 //该页面的正文为一个表单,注意对于表单,这里需要使用drupal_render呈现一下。
 $render_array['#markup'] .= drupal_render(drupal_get_form('contactus_confirm_form'));
 //Drupal7的页面回调,返回的应该是一个数组
 return $render_array;
}

/**
 * “确认”表单的构建函数
 */
function contactus_confirm_form(){
  //添加我们自己的CSS,用来控制表单的样式
 drupal_add_css(drupal_get_path('module', 'contactus').'/contactus.css');
 //drupal_set_message(print_r($_SESSION['contactus_form']));
 //表单元素“姓名”
 $form['name'] = array(
  '#title' => t('姓名'),
  //表单元素的类型,这里为item
  '#type' => 'item',
  //'#default_value' => $_SESSION['contactus_form']['name'],
  //表单元素的#markup,在Drupal6下面,我用的是#value,在7下面就无法工作,改为了#default_value,还是不行,
  //最后改为#markup,才可以了
  '#markup' => isset($_SESSION['contactus_form']['name'])?$_SESSION['contactus_form']['name']:"",
 );
 
  //表单元素“单位名称”
 $form['company_name'] = array(
  '#title' => t('单位名称'),
  '#type' => 'item',
  //这是我在调试的时候,使用#value、#default_value、#description分别测试时的代码,这里保留了。
  //'#value' => $_SESSION['contactus_form']['company_name'],
  //'#value' => '123456',
  '#markup' => isset($_SESSION['contactus_form']['company_name'])?$_SESSION['contactus_form']['company_name']:"",
  //'#description' => '123456',
 );
 
 //表单元素“电子邮件”
 $form['mail'] = array(
  '#title' => t('电子邮件'),
  '#type' => 'item',
  '#markup' => isset($_SESSION['contactus_form']['mail'])?$_SESSION['contactus_form']['mail']:"",
 );
 
 //表单元素“电话号码”
 $form['phone'] = array(
  '#title' => t('电话号码'),
  '#type' => 'item',
  '#markup' => isset($_SESSION['contactus_form']['phone'])?$_SESSION['contactus_form']['phone']:"",
 );
 
  //表单元素“邮件正文”
 $form['contact'] = array(
  '#title' => t('邮件正文'),
  '#type' => 'item',
  '#markup' => isset($_SESSION['contactus_form']['contact'])?$_SESSION['contactus_form']['contact']:"",
 );
 
 //表单元素“访问来源”
 $form['visit'] = array(
  '#title' => t('访问来源'),
  '#type' => 'item',
  '#markup' => isset($_SESSION['contactus_form']['visit'])?$_SESSION['contactus_form']['visit']:"",
 );
 
 //如果访问来源,我们选择了“其它”,此时使用other表单元素的值来替换$form['visit']['#markup']。
 if( isset($_SESSION['contactus_form']['visit']) && $_SESSION['contactus_form']['visit'] == 'other'){
  $form['visit']['#markup'] = isset($_SESSION['contactus_form']['other'])?$_SESSION['contactus_form']['other']:"";
 } 
 /*
 //表单元素“返回”按钮
  $form['back'] = array(
    '#type' => 'submit',
    '#value' => t('返回'),
    '#submit' => array('contactus_confirm_form_back'),
  );
 //表单元素“提交”按钮
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('提交'),
  );
  */
 
  //表单元素“返回”图片按钮
  $form['image_back'] = array(
    '#type' => 'image_button',
    '#src' => drupal_get_path('module','contactus').'/images/button2-1.jpg',
  //使用这个按钮提交时,对应的提交处理函数为contactus_confirm_form_back
    '#submit' => array('contactus_confirm_form_back'),
    '#executes_submit_callback' => TRUE,
  //为表单元素添加两个属性,onmouseout、onmouseover,为了在鼠标移到按钮上时,显示不同的图片效果
    '#attributes' =>array(
      'onmouseout' => "this.src='".base_path().drupal_get_path('module','contactus')."/images/button2-1.jpg'",
      'onmouseover' => "this.src='".base_path().drupal_get_path('module','contactus')."/images/button2-2.jpg'",
    ),
  );
 
  //表单元素“提交”图片按钮
  $form['image_submit'] = array(
    '#type' => 'image_button',
    '#src' => drupal_get_path('module','contactus').'/images/button3-1.jpg',
    '#executes_submit_callback' => TRUE,
  //使用这个按钮提交时,对应的提交处理函数为contactus_confirm_form_submit
    '#submit' => array('contactus_confirm_form_submit'),
    '#attributes' =>array(
      'onmouseout' => "this.src='".base_path().drupal_get_path('module','contactus')."/images/button3-1.jpg'",
      'onmouseover' => "this.src='".base_path().drupal_get_path('module','contactus')."/images/button3-2.jpg'",
    ),
  );
 
  return $form;
}

/**
 * 返回按钮对应的提交函数
 */
function contactus_confirm_form_back($form, &$form_state){
  //简单的重定向到contactus页面
 $form_state['redirect'] = 'contactus';
}

/**
 * 提交按钮对应的提交函数
 */
function contactus_confirm_form_submit($form, &$form_state){
 $values = NULL;
 //从会话中获取用户最初提交的值,并将$_SESSION['contactus_form']置为空。
 if(empty($_SESSION['contactus_form'])){
  drupal_goto('contact');
 }else{
  $values = $_SESSION['contactus_form'];
  unset($_SESSION['contactus_form']);
 }
 
 //收件人地址,这里为作者的邮箱
 $to = 'g089h515r806@gmail.com';
 //用户填写的邮箱地址
 $from = $values['mail'];
 
 //发送邮件
 drupal_mail('contactus', 'contact', $to, language_default(), $values, $from);
 
 //简单的重定向到致谢页面
 $form_state['redirect'] = 'contactus/thanks';
}

/**
 * “致谢”页面的回调函数
 */
function contactus_thanks_page(){
  //我们为这个页面设置标题
 drupal_set_title('联系我们');
 $render_array = array(
   '#markup' => '',
 );
 //Drupal7的页面回调,返回的应该是一个数组
 $render_array['#markup'] .= '<div id="contactus-thanks">';
 $render_array['#markup'] .= t('感谢您的来信,我们会在第一时间给您回复。');
 $render_array['#markup'] .= '</div>';
 
 return $render_array;
}
 

Drupal版本:

Drupal 7 中文教程 联系我们 两步表单 “联系我们”页面回调

<?php

/**
 * @file
 * 各种页面的回调函数.
 */
 
/**
 * “联系我们”页面的回调函数
 */
function contactus_page(){
  //我们为这个页面设置标题
 drupal_set_title('联系我们');
 
 $render_array = array(
   '#markup' => '',
 );
 
 //该页面的正文为一个表单,注意对于表单,这里需要使用drupal_render呈现一下。
 $render_array['#markup'] .= drupal_render(drupal_get_form('contactus_form'));
 
 //Drupal7的页面回调,返回的应该是一个数组
 return $render_array;
}

/**
 * “联系我们”表单的构建函数
 */
function contactus_form(){
  //添加我们自己的CSS,用来控制表单的样式
 drupal_add_css(drupal_get_path('module', 'contactus').'/contactus.css');
 
  //提示信息,默认为markup类型。
 $form['tips'] = array(
  '#prefix' =>'<div id="tips">',
  '#markup' => t('<span class="form-required">*</span> 号为必填项。'),
  '#suffix' =>'</div>',
 );
 
 //表单元素“姓名”
 $form['name'] = array(
   //表单元素的#title属性,对应于实际输出中的label
  '#title' => t('姓名'),
  //表单元素的类型,这里为textfield
  '#type' => 'textfield',
  //这个表单元素是必填的
  '#required' => TRUE,
  //表单元素的默认值,这里使用了三位运算符和isset进行判定
  '#default_value' =>isset($_SESSION['contactus_form']['name'])?$_SESSION['contactus_form']['name']:"",
  //表单元素的描述,
  '#description' => t('例如:周星驰'),
 );
 
  //表单元素“单位名称”
 $form['company_name'] = array(
  '#title' => t('单位名称'),
  '#type' => 'textfield',
  '#required' => TRUE,
  '#default_value' =>isset($_SESSION['contactus_form']['company_name'])?$_SESSION['contactus_form']['company_name']:"",
  '#description' => t('例如:北京无名信息技术公司'),
 );
 
  //表单元素“电子邮件”
 $form['mail'] = array(
  '#title' => t('电子邮件'),
  '#type' => 'textfield',
  '#required' => TRUE,
  '#default_value' =>isset($_SESSION['contactus_form']['mail'])?$_SESSION['contactus_form']['mail']:"",
  '#description' => t('例如:info@example.com'),
 );
 
 //表单元素“电话号码”
 $form['phone'] = array(
  '#title' => t('电话号码'),
  '#type' => 'textfield',
  '#required' => TRUE,
  '#default_value' =>isset($_SESSION['contactus_form']['phone'])?$_SESSION['contactus_form']['phone']:"",
  '#description' => t('例如:010-88888888'),
 );
 
  //表单元素“邮件正文”
 $form['contact'] = array(
  '#title' => t('邮件正文'),
  //表单元素的类型,这里为textarea
  '#type' => 'textarea',
  '#required' => TRUE,
  '#default_value' =>isset($_SESSION['contactus_form']['contact'])?$_SESSION['contactus_form']['contact']:"",
 );
 
 //访问来源的可选项
 $visit_options = array(
  'baidu' =>t('百度'),
  'google' =>t('谷歌'),
  'sohu' =>t('搜狐'),
  'other' =>t('其它'),
 );
 //表单元素“访问来源”
 $form['visit'] = array(
  '#title' => t('访问来源'),
  //表单元素的类型,这里为radios
  '#type' => 'radios',
  //单选按钮的可选项。
  '#options' => $visit_options,
  '#default_value' =>isset($_SESSION['contactus_form']['visit'])?$_SESSION['contactus_form']['visit']:"",
  //为了便于控制radios的外观,我们使用#prefix、#suffix为其添加了一个带有ID的div
  '#prefix' => '<div id="visit-radios">',
  '#suffix' => '</div>',
 );
 
 //表单元素“其它”,它依赖于表单元素“访问来源”
 $form['other'] = array(
  '#title' => t('其它'),
  '#type' => 'textfield',
  '#default_value' =>isset($_SESSION['contactus_form']['other'])?$_SESSION['contactus_form']['other']:"",
  //这里的意思是,当表单元素“访问来源”的值为“other”时,这个表单元素才显示出来
   '#states' => array(
    'visible' => array(
     ':input[name="visit"]' => array('value' => 'other'),
   ),
  ),
 );
 /*
 //表单元素“确认”提交按钮
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('确认'),
  );
  */
 
  //表单元素“确认”提交按钮,这里采用了图片的形式
  $form['image_submit'] = array(
   //表单元素的类型,这里为image_button
    '#type' => 'image_button',
  
  //图片按钮特有的#src属性,
    '#src' => drupal_get_path('module','contactus').'/images/button1-1.jpg',
    '#value' => 'image_sub',
  
  //为表单元素添加两个属性,onmouseout、onmouseover,为了在鼠标移到按钮上时,显示不同的图片效果
    '#attributes' =>array(
      'onmouseout' => "this.src='".base_path().drupal_get_path('module','contactus')."/images/button1-1.jpg'",
      'onmouseover' => "this.src='".base_path().drupal_get_path('module','contactus')."/images/button1-2.jpg'",
    ),
  
  //为了便于控制image_button的外观,我们使用#prefix、#suffix为其添加了一个带有ID的div
    '#prefix' => '<div id="image-submit">',
    '#suffix' => '</div>',
  );

  return $form;
}

/**
 * contactus_form表单的验证函数
 */
function contactus_form_validate($form, &$form_state){
  //这里使用正则表达式,来验证邮箱的有效性,注意,这里的正则表达式,包围在"/...../"之间。
 if(!preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/", $form_state['values']['mail'])){
  form_set_error('mail',t('您输入的电子邮件地址格式不正确'));
 }
}

/**
 * contactus_form表单的提交函数
 */
function contactus_form_submit($form, &$form_state){
  //把表单的值存放在会话中去,由于这里涉及到了两个不同的表单之间传值。
 $_SESSION['contactus_form'] = $form_state['values'];
 //表单重定向到确认页面
 $form_state['redirect'] = 'contactus/confirm';
}
 

Drupal版本:

Notice: Undefined index: integer:normal in DatabaseSchema_mysql->processField()

在自定义一个字段模块时,为节点类型添加一个这个类型的字段实例时,报了以下错误信息:

 
Notice: Undefined index: integer:normal 在 DatabaseSchema_mysql->processField() (行 201F:\xampp\htdocs\drupal\includes\database\mysql\schema.inc).
 
  • 创建字段 t t t 遇到问题:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL DEFAULT 0, PRIMARY KEY (`entity_type`, `entity_id`, `deleted`, `delta`' at line 10 。
  • 你的设置已被保存。
   分析了半天,始终找不到原因,google了一下,发现drupal.org上有同样的问题,http://drupal.org/node/735602。看看这个问题的解决办法:
 
=== modified file 'shipping/uc_shipping/uc_shipping.install'
--- shipping/uc_shipping/uc_shipping.install    2010-03-03 15:47:24 +0000
+++ shipping/uc_shipping/uc_shipping.install    2010-03-08 14:35:33 +0000
@@ -251,7 +251,7 @@
         'not null' => FALSE,
       ),
       'label_image' => array(
-        'type' => 'integer',
+        'type' => 'int',
         'unsigned' => TRUE,
         'not null' => FALSE,
       ),
@@ -303,7 +303,7 @@
   $sandbox['#finished'] = 0;
 
   $schema = array(
-    'type' => 'integer',
+    'type' => 'int',
     'unsigned' => TRUE,
     'not null' => FALSE,
   );
 
 
原来,我犯了同样的错误,将”int” 写成了“integer”,看来写程序,仅凭记忆还是不可靠的。下面是我定义的代码:
 return array(
    'columns' => array(
      'value' => array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => FALSE,
        'sortable' => TRUE,
      ),
      'manual' => array(
        'type' => 'integer',
                            'not null' => TRUE,
        'default' => 0,
      ),
    ),
 );

Think in Drupal 7, 区块更多链接

info文件:

name = Block More Link
description = Provide a more link for all blocks.
package = Other
version = VERSION
core = 7.x
configure = admin/config/block/morelink

install文件:

<?php

/**
 * @file
 * Install, update and uninstall functions for the block_morelink module.
 */

/**
 * Implements hook_schema().
 */
function block_morelink_schema() {
  $schema['block_morelink'] = array(
    'description' => 'Stores more link path.',
    'fields' => array(
      'module' => array(
        'type' => 'varchar',
        'length' => 64,
        'not null' => TRUE,
        'description' => "The block's origin module, from {block}.module.",
      ),
      'delta' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'description' => "The block's unique delta within module, from {block}.delta.",
      ),
      'url' => array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'description' => "The more link url of a block.",
      ),
      'title' => array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'description' => "The more link title of a block.",
      ),
    ),
    'primary key' => array('module', 'delta'),
    'indexes' => array(
      'url' => array('url'),
    ),
  );
  return $schema;
}

/**
 * change 'primary key' to array('module', 'delta').
 */
function block_morelink_update_7000(&$sandbox) {
  db_drop_primary_key('block_morelink');
  db_add_primary_key('block_morelink', array('module', 'delta'));
}

 

Think in Drupal 7, 区块更多链接 module文件

module文件中的代码,你可以在drupal.org上下载最新的模块代码:

http://drupal.org/project/block_morelink

<?php

/**
 * Implements hook_form_FORMID_alter().
 *
 * Adds more link path textfield to add block form.
 */
function block_morelink_form_block_add_block_form_alter(&$form, &$form_state) {
  block_morelink_form_block_admin_configure_alter($form, $form_state);
}
function block_morelink_form_block_admin_configure_alter(&$form, &$form_state){
 $result = db_query("SELECT url, title FROM {block_morelink} WHERE module = :module AND delta = :delta", array(
    ':module' => $form['module']['#value'],
    ':delta' => $form['delta']['#value'],
  ))->fetch();
  $default_morelink_url = empty($result)?'':$result->url;
  $default_morelink_title = empty($result)?'':$result->title;
 //$default_value = '';
 // More link settings.
  $form['settings']['morelink'] = array(
    '#type' => 'fieldset',
    '#title' => t('More link settings'),
    '#collapsible' => FALSE,
    //'#description' => t('Specify more link url and title.'),
  '#weight' => -1,
  );
 $form['settings']['morelink']['morelink_url'] = array(
    '#type' => 'textfield',
    '#title' => t('More Link url'),
    '#maxlength' => 255,
    '#description' => t('The More Link url of the block as shown to the user.') ,
    '#default_value' =>  $default_morelink_url,
    '#weight' => 0,
  );
  $form['settings']['morelink']['morelink_title'] = array(
    '#type' => 'textfield',
    '#title' => t('More Link title'),
    '#maxlength' => 255,
    '#description' => t('The More Link title of the block as shown to the user.') ,
    '#default_value' =>  $default_morelink_title,
    '#weight' => 1,
  );
  $form['#submit'][] = 'block_morelink_block_admin_configure_submit';
}

/**
 * Form submit handler for block configuration form.
 */
function block_morelink_block_admin_configure_submit($form, &$form_state){
 db_delete('block_morelink')
    ->condition('module', $form_state['values']['module'])
    ->condition('delta', $form_state['values']['delta'])
    ->execute();
   
  if(!empty($form_state['values']['morelink_url'])){
   $query = db_insert('block_morelink')->fields(array('url', 'title', 'module', 'delta'));
   //foreach (array_filter($form_state['values']['types']) as $type) {
     $query->values(array(
       'url' => $form_state['values']['morelink_url'],
       'title' => $form_state['values']['morelink_title'],
       'module' => $form_state['values']['module'],
       'delta' => $form_state['values']['delta'],
     ));
   //}
   $query->execute();
  }
 
}

/**
 * Process variables for block.tpl.php
 *
 * The $variables array contains the following arguments:
 * - $block
 *
 * @see block.tpl.php
 */
function block_morelink_preprocess_block(&$variables) {
 $result = db_query("SELECT url, title FROM {block_morelink} WHERE module = :module AND delta = :delta", array(
    ':module' => $variables['block']->module,
    ':delta' => $variables['block']->delta,
  ))->fetch();
  $morelink_url = empty($result)?'':$result->url;
  $morelink_title = empty($result)?'':$result->title;
 $variables['block']->more = theme('block_more_link',array('url'=>$morelink_url,'title'=>$morelink_title));
}

/**
 * Implements hook_menu().
 */
function block_morelink_menu() {
 // Block settings.
  $items['admin/config/block'] = array(
    'title' => 'Block',
    'description' => 'Block configuration.',
    'position' => 'left',
    'weight' => -10,
    'page callback' => 'system_admin_menu_block_page',
    'access arguments' => array('access administration pages'),
    'file' => 'system.admin.inc',
    'file path' => drupal_get_path('module', 'system'),
  );
  $items['admin/config/block/morelink'] = array(
    'title' => 'More link',
    'description' => 'the more link lable of block.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('block_morelink_label_settings'),
    'access arguments' => array('administer site configuration'),
    'weight' => -10,
   // 'file' => 'system.admin.inc',
  );
   return $items;
}
function block_morelink_label_settings(){
  $form['morelink_label'] = array(
    '#type' => 'textfield',
    '#title' => t('More Link lable'),
    '#maxlength' => 40,
    '#description' => t('The More Link lable of the block as shown to the user.') ,
    '#default_value' =>  variable_get('morelink_label', 'more'),
    '#weight' => -17,
  );
 
  return system_settings_form($form, TRUE);
}
function block_morelink_theme(){
 return array(
    'block_more_link' => array(
       'variables' => array('url' => NULL,'title' => NULL,)
    ),
   
  );
}

/**
 * Returns HTML for a "more" link, like those used in blocks.
 *
 * @param $variables
 *   An associative array containing:
 *   - url: The url of the main page.
 *   - title: A descriptive verb for the link, like 'Read more'.
 */
function theme_block_more_link($variables) {
 $output = "";
 if(!empty($variables['url'])){
    if (!empty($variables['title'])) {
      $morelink_label = $variables['title'];
    }
    else {
    $morelink_label = variable_get('morelink_label', 'more');
    }
   $output .= '<span class="block-more-link">' . l($morelink_label,$variables['url'],array('attributes'=>array('title'=>$variables['title']))). '</span>';
   //$output .='<span class="block-more-link">' . t('<a href="@link" title="@title">More</a>', array('@link' => check_url($variables['url']), '@title' => $variables['title'])) . '</div>';
 }
 return $output;
}
 

Drupal版本:

drupal成功案例

rzchina.net,融智技术学苑.

融智技术学苑是国内一家提供在线教学管理的网站.也是较早采用Drupal技术的一家教育网站.

我提供的服务:

将融智技术学院提供的具体需求,细化为了Drupal的解决方案,包括特定功能使用什么模块,如何使用Drupal实现.

包括论坛的功能,权限的控制,圈子功能的选择,还有老师,学生角色的划分.以及课程资源问题的解决.

融智技术学苑.的网站虽然不是我实现的,但是完全采用了我提供的Drupal技术方案.我的方案帮助他们少走了很多弯路.

访问网址: http://rzchina.net

Drupal版本:

drupal成功案例(2u4u 悠游外语世界网站)

为外研社的2u4u.com.cn提供drupal技术支持。

悠游外语世界由外语教学与研究出版社主办,面向所有读者和语言爱好者的双语社区。我们总面对很多书,但总是难以找到最适合自己的那本书;我们总有学不完的外语,但总是很难找到最有效的语言捷径;我们总在不断交流,但总是难以找到相同步调的伙伴。

读书、双语、分享,我们的生活方式,我们的人生哲学,在悠游中体验这样的生活乐趣吧。

悠游外语世界网站是由Drupal搭建了,使用了本站提供的Ubercart,OG,Views等汉化包。我为他们提供了如下服务:

编写drupal模块,用来禁用profile的编辑,以及编写模块,简化Ubercart的购物流程,减少了2步确认流程。

解决实际drupal问题,帮助他们解决了drupal多站点的配置,设置问题。

提供drupal网站架构咨询,为特定功能提供模块的选取建议,为上海作文大赛提供了建站建议。

悠游外语世界是圈内多个知名的团队,个人,美工合力而成的网站,我只向他们提供了部分drupal技术支持。尤其是drupal模块编写方面的支持。

 

 

 

Drupal版本:

drupal成功案例(myctf2 周大福下属网站)

myctf2.com是香港周大福珠宝公司下属的网站.

myctf2.com采用Drupal5架构,是一个SNS的社区网站.主要用于通过社区建设,来扩大周大福的影响.

 

我提供的服务,基于buddylist模块的定制服务,以及个人资料的改造,个人注册页面的改造,使其更具有SNS效果。

 

当然整个网站不是我搭建的,我只提供了部分模块定制服务,和咨询服务。

 

Drupal版本:

学员答疑

从开始招收第一个网络学员以后,为付费学员回答了大量的问题.除了少数是通过网站回答的以外.

大多数都是通过QQ,电子邮件,MSN回答的.把这些问题整理一下,想在这里,做一个总结:

问题很多了.

Drupal版本:

咨询个小问题,drupal日期元素的年月日的排序,怎么把年放到前面?

咨询个小问题

我想让年在第一位,怎么搞?

  •  
  • 葛红儒 (55381091)
     

    2009-09-04 10:42:19

    http://zhupou.cn/node/1034

  • 葛红儒 (55381091)
     

    2009-09-04 10:42:30

    Formalin,专门给你写的

  • 葛红儒 (55381091)
     

    2009-09-04 10:42:38

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

  • Formalin (248037973)
     

    2009-09-04 10:57:03

    我自己写个表单,里面有个图片上传功能,靠谱么

  • 葛红儒 (55381091)
     

    2009-09-04 10:58:13

    可以,不过需要更多的技能

     

    问题总结:

    如何将Date表单元素的月日年的顺序改造为年月日 ,参看http://www.thinkindrupal.com/node/1034

 

Drupal版本:

老葛 有没有谁愿意翻译一下这本书呢 (Using Drupal)?

 

  • 牧草人
     

    2009-09-07 22:38:34

    老葛 有没有谁愿意翻译一下这本书呢

  • 牧草人
     

    2009-09-07 22:38:36

    Using Drupal

  • 牧草人
     

    2009-09-07 22:39:06

    看了 这本书 才能真正的知道怎么使用drupal啊

    •  
    yuhe
     

    2009-09-07 22:39:23

    老大,睡前一问

     

  • 葛红儒 (55381091)
     

    2009-09-07 23:52:10

    Using Drupal 已经有人翻译了

  • 葛红儒 (55381091)
     

    2009-09-07 23:54:55

    http://www.verynic.com 这个站的站长在翻译

     

    翻译一本书是一件很辛苦的事情,特别是在Drupal现在还是冷门技术的时候,并不能为译者带来太多的利益, adrupal的站长就翻译了Drupal6模块开发指南,

    verynic的站长在翻译 Using Drupal。这些都是好的事情,如果能够大家共同努力,事情就会好办很多。

    国内的Drupal网站很多,但是坚持做下来的没有几个,开始的时候,会比较投入,但是当投入得不到回报的时候,就会出现问题。Drupal是不是机会现在还很难说。

    我一直想想写一篇文章介绍adrupal的Drupal6模块开发指南,希望等到翻译完了,为其加个链接,但是一直没有等到最终的完整版。

    坦白的说,我翻译的Drupal专业开发指南,没有给我带来任何的经济收益,带来的收入还不及交房租,生活费呢。题外话了。

     

     

     

Drupal版本:

"drupal"必须启动的module有那些

  • ずッ哀ぁい (342542546)
     

    2009-08-23 18:38:55

    老葛,有空解答下

    "drupal"必须启动的module有那些

    因为我发现,node也是一个module

  • ずッ哀ぁい (342542546)
     

    2009-08-23 18:39:11

    核心modules有哪些

 

 

Block 6.13 控制显示在主内容周围的区块。
Filter 6.13 在准备内容显示时对内容进行过滤。
Node 6.13 允许内容被提交到站点并显示。
System 6.13 为管理员处理一般性的网站设定。
User

  • 这几个是核心必选的模块, 但是在Drupal7中,Block模块成为了核心可选的模块,block从核心必选,转变为核心可选,说明了节点的概念进一步得到了加强,Drupal最底层的一种机制就是节点。核心可选的模块有很多,默认启用的只有几个

Drupal版本:

<div class="menu-name-primary-links parent-mlid-0 menu-level-2"> 如何覆写这个class 名呢

问题:

野放客() 22:17:25
<ul id="navlist"><li class="menu-432 active-trail first active"><a href="/?q=project/architecture" title="Architecture" class="active">Architecture</a></li>
<li class="menu-433"> 还有这些class 是在那控制的
葛红儒(55381091) 22:17:53
这些class都是模板文件中控制的
葛红儒(55381091) 22:18:06

觉得不爽的话,可以自己覆写
野放客() 22:18:28
调用的css有没有办法精减
野放客() 22:19:32
<li class="menu-433"> 这个好象是一个随机数吧
野放客() 22:19:52
没有在那个css文件里出现
葛红儒(55381091) 22:20:24
menu-433 这是一个CSS接口,预留的,你可以为它定义CSS规则

野放客() 22:21:09
<div class="menu-name-primary-links parent-mlid-0 menu-level-2"> 这个class怎么解释

野放客() 22:22:19
<div class="menu-name-primary-links parent-mlid-0 menu-level-2"> 这些class 好象模板里没法定义的

解答:

葛红儒(55381091) 22:22:52

class是模板里面动态生成的
葛红儒(55381091) 22:23:17
primary-links是class的名字
葛红儒(55381091) 22:23:42
parent-mlid-0 是父菜单项的id

野放客(17643751) 22:24:52
那 css 里定义 .primary-links 就可以吗?
野放客(17643751) 22:25:17
menu-level-2 这个又是什么意思 呢
葛红儒(55381091) 22:26:42
那 css 里定义 .menu-name-primary-links 就可以了
葛红儒(55381091) 22:27:01
或者css 里定义 .parent-mlid-0也可以
葛红儒(55381091) 22:27:19
或者css  里定义 .menu-level-2
葛红儒(55381091) 22:27:36

这些都可以,推荐你看一本CSS的书,
葛红儒(55381091) 22:28:13
如果你有美工的话,告诉他覆写这个CLass的样式,它自然就知道怎么去做了,
野放客() 22:28:18
css 基本没什么问题,就是drupal 嵌套的比较复杂
葛红儒(55381091) 22:28:43
Drupal提供了一套默认的输出,
葛红儒(55381091) 22:29:04
这些都可以完全的被替换调的,慢慢就知道怎么替换这些东西了
野放客() 22:29:25
<div class="menu-name-primary-links parent-mlid-0 menu-level-2">  如何覆写这个class 名呢
野放客() 22:30:05
template.php 这里好象也没有
葛红儒(55381091) 22:30:57
如果不在模板文件中,就在theme函数里面
野放客() 22:31:34
theme函数 是那个文件
葛红儒(55381091) 22:32:35
对于Drupal主题相关的知识,建议你假期好好看看,drupal制作指南,以及开发指南里面的主题系统一章,
野放客() 22:32:50
好的
葛红儒(55381091) 22:33:13
还有Drupal的核心主题,里面的每一个模板文件,template.php函数,都好好的看一下
野放客(17643751) 22:33:38
嗯,谢谢
葛红儒(55381091) 22:34:04
<div class="menu-name-primary-links parent-mlid-0 menu-level-2"> ,以这个为例,

葛红儒(55381091) 22:34:38
如果你在主题的模板文件中找不到,那么可能在Drupal自带的模块里面的模板中,
葛红儒(55381091) 22:34:53

也有可能在模块的theme函数中
 

葛红儒(55381091) 22:35:15

模板文件等价于一个theme函数
 

Drupal版本:

CCK图片字段的显示问题

问题:

野放客() 20:55:58
我的怎么弄都不成,用什么函数能提取用  cck 设的 说明字段里的内容
葛红儒(55381091) 20:59:27
你想把图片的显示做成什么样子的?

野放客() 21:00:06
http://www.thomaspucher.com/cms/index.php?idcat=81 就是这样,模仿这个网站就成.
 

也就是图片和正文分栏显示.

葛红儒(55381091) 21:03:42
图片,正文左右栏显示,你可以单独的创建一个节点模板文件
葛红儒(55381091) 21:04:08
 
葛红儒(55381091) 21:04:32
把图片放到id为contentleft里面
野放客() 21:04:39
这个我知道
葛红儒(55381091) 21:04:52
然后把正文的内容放到contentright里面

葛红儒(55381091) 21:07:30
你可以在节点模板文件中
葛红儒(55381091) 21:07:45

那个是页面模板文件
葛红儒(55381091) 21:08:08

node.tpl.php里面
葛红儒(55381091) 21:08:36

<?php
// $Id: node.tpl.php,v 1.5 2007/10/11 09:51:29 goba Exp $
?>
<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?>">

<?php print $picture ?>

<?php if ($page == 0): ?>
  <h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>

  <?php if ($submitted): ?>
    <span class="submitted"><?php print $submitted; ?></span>
  <?php endif; ?>

  <div class="content clear-block">
    <?php print $content ?>
  </div>

  <div class="clear-block">
    <div class="meta">
    <?php if ($taxonomy): ?>
      <div class="terms"><?php print $terms ?></div>
    <?php endif;?>
    </div>

    <?php if ($links): ?>
      <div class="links"><?php print $links; ?></div>
    <?php endif; ?>
  </div>

</div>
葛红儒(55381091) 21:08:46
默认的是这样的
葛红儒(55381091) 21:09:05

<div class="content clear-block">
    <?php print $content ?>
  </div>这个地方可以做一下修改
野放客() 21:09:39

野放客() 21:10:32
设计说明   field_description
野放客() 21:10:44
那怎么来输出他的内容
葛红儒(55381091) 21:11:03
<div id="contentleft"〉<?php print  $field_fieldimagesname[0][value] ?></div>
<div id="contentright"〉<?php   print $node->content[body]['#value']?></div>
葛红儒(55381091) 21:11:18
<div id="contentleft"〉<?php print  $field_description [0][value] ?></div>
<div id="contentright"〉<?php   print $node->content[body]['#value']?></div>

葛红儒(55381091) 21:11:28
这样就可以了
葛红儒(55381091) 21:12:03
<?php print  $field_description [0][value] ?>可以在节点模板中输出CCK字段的
葛红儒(55381091) 21:12:24
<?php   print $node->content[body]['#value']?>负责输出正文的
葛红儒(55381091) 21:12:55
这样通过CSS你就能够将其分开了

野放客() 21:13:18
嗯,cck字段输出是用 Views 来设置的吗
葛红儒(55381091) 21:13:44
你的节点模板名字node-project.tpl.php
野放客() 21:13:58

葛红儒(55381091) 21:14:10
views是用来控制节点列表的
葛红儒(55381091) 21:14:28
节点本身的输出,需要节点模板文件的配合

野放客() 21:14:54
嗯,好的。我先研究一下。谢谢

....

Drupal版本:

本周六答疑继续解答了CCK图片字段多图片的显示问题

问题:

野放客() 21:03:53
cck 创建的images字段 里有很多张图片在 node-project.tpl.php 怎么输出

解答:

葛红儒(55381091) 21:05:43
可以写一个循环
葛红儒(55381091) 21:05:52
也可以使用gallery模块
葛红儒(55381091) 21:06:06
galleria?

野放客() 21:06:06
是一张图片一个节点吗
葛红儒(55381091) 21:06:18
一章图片一个字段
野放客() 21:07:08
 
葛红儒(55381091) 21:07:18
一张图片一个字段是目前最主流的方式
葛红儒(55381091) 21:07:47
一张图片一个节点,也是一种常用的方式
野放客() 21:08:10
最是上次跟你说的,我的一个设计方案里需要好多张片的展示
葛红儒(55381091) 21:08:48
可以处理成为节点引用的形式,
葛红儒(55381091) 21:09:21
不过节点引用,现在本身也是一个字段了
葛红儒(55381091) 21:09:35
所以说,这两种方式没有本质区别
野放客() 21:10:24
http://www.thomaspucher.com/cms/index.php?idcat=43 还是个例子,我按你说的用imagefield 实现在这个效果
野放客() 21:11:34
但我需要重新输出时,不知道怎么输出在node-project.tpl.php
野放客() 21:13:47
 [field_images] => Array
        (
            [0] => Array
                (
                    [fid] => 97
                    [list] => 1
                    [data] => Array
                        (
                            [alt] => 01
                            [title] => 01
                        )

                    [uid] => 1
                    [filename] => 01.jpg
                    [filepath] => sites/default/files/images/project/9/01.jpg
                    [filemime] => image/jpeg
                    [filesize] => 53394
                    [status] => 1
                    [timestamp] => 1265445524
                    [origname] => 01.jpg
                    [nid] => 9
野放客() 21:14:12
有你说的<pre><?php print_r($node); ?></pre> 输出的看不太明白
葛红儒(55381091) 21:15:01

你对这个循环一次就可以了,
葛红儒(55381091) 21:15:06

写一个循环函数
葛红儒(55381091) 21:15:30
输出数组field_images下面的元素
葛红儒(55381091) 21:15:58
[filepath] => sites/default/files/images/project/9/01.jpg,只要提取到了这个
野放客() 21:16:10
哦,可帮我举个例子吗
葛红儒(55381091) 21:16:11

你就可以把它拼凑成img的形式
葛红儒(55381091) 21:16:21
我找一个啊
野放客(17643751) 21:16:29
好,谢谢
葛红儒(55381091) 21:17:07
默认没有把field_images这个字段输出么?
野放客() 21:18:21
我用默认模板显示是正常,就是你看到 的参照网站左边的图片效果
野放客() 21:18:35
原图列表行式
野放客() 21:19:15
一张接一张显示出来,但怎么查看他的模板里是怎么输出这样效果的
葛红儒(55381091) 21:24:28
我记得默认就是一张一张的从上向下排的
葛红儒(55381091) 21:24:57

只有需要特别的效果的时候,而默认的不是想要的,才自己负责输出
野放客() 21:25:10
对,但重写一个节点显示的话怎么象它一样输出
葛红儒(55381091) 21:25:27
你直接输出,这个字段
葛红儒(55381091) 21:26:13
我好长时间没有接触过这个问题了
野放客() 21:26:59
<?php print  $field_images [0][value] ?> 这样什么也出不来
葛红儒(55381091) 21:27:09
 
葛红儒(55381091) 21:27:33

在这里,选中exclude
葛红儒(55381091) 21:27:44
两个都选中
野放客() 21:28:03
这是什么地址的设置

。。。。

葛红儒(55381091) 21:28:32
我这是一个例子,我本地的
葛红儒(55381091) 21:28:52
然后直接输出<?php print  $field_images ?> ,可能就可以了

。。。。

葛红儒(55381091) 21:33:17
我记得是Display field里面配置一下就好了,
野放客() 21:33:35
我在看看
野放客() 21:35:33
exclude  为什么叫排除呢
葛红儒(55381091) 21:36:18
exclude 表示,它不显示在content里面

葛红儒(55381091) 21:38:12

把它独立为一个独立的字段,然后直接在模板中直接输出这个字段就可以了
葛红儒(55381091) 21:38:29
我印象中就是这样的

。。。

葛红儒(55381091) 21:48:06
 <?php if ($field_images[0]['view'] > '' ) : ?>
            <?php foreach($field_images as $item) { ?>
            <div class="company-logos">
            <?php print $item['view']; ?>
            </div>
            <?php } ?>
            <?php endif; ?>

葛红儒(55381091) 21:48:13

这样就可以了
野放客(17643751) 21:48:15
这个view 输出的吗+
葛红儒(55381091) 21:48:32

你使用我上面的代码就可以了
葛红儒(55381091) 21:49:04
 
葛红儒(55381091) 21:49:12

这段代码就可已搞定你的问题了
野放客() 21:49:20
好了,
野放客() 21:49:24
谢谢

野放客() 21:50:32
['view'] 这个就是显示的意思吗
野放客() 21:51:11
<?php foreach($field_images as $item) { ?>这个怎么理解

野放客() 21:52:34
field_images 里 的每个项目的意思吗
葛红儒(55381091) 21:55:05
['view'] 指的是数组中的一个键
葛红儒(55381091) 21:55:25
它指的是单个图片的输出文本
葛红儒(55381091) 21:55:44
野放客() 21:52:34
field_images 里 的每个项目的意思吗,
对,就是这个意思

正确答案就是上面给出的代码:这里重复一下:

 <?php if ($field_images[0]['view'] > '' ) : ?>
            <?php foreach($field_images as $item) { ?>
            <div class="company-logos">
            <?php print $item['view']; ?>
            </div>
            <?php } ?>
            <?php endif; ?>

 

Drupal版本:

Cannot modify header information - headers already sent by

学员做的网站,抱错了,错误信息如下,warning: Cannot modify header information - headers already sent by (output started at /nfs/c04/h02/mnt/62979/domains/hcytea.comml/includes/database.mysql.inc:128) in /nfs/c04/h02/mnt/62979/domains/hcytea.comml/includes/common.inc on line 141.
 
这样的错误,通常是由于多加了一个PHP结束标签导致的,很多初学Drupal的朋友,开始写模块,建立template.php文件的时候,习惯于将可有可无的PHP结束标签添加到文件内容的最后面。在PHP中,可以这样用。
但是在Drupal中,通常会遇到问题。就会出现warning: Cannot modify header information - headers already sent by 这样的错误信息。
 
葛红儒 (55381091)
 

2009-08-22 21:39:37

报错了

  • yuhe (914175392)
     

    2009-08-22 21:39:53

    美国光缆断了

  • yuhe (914175392)
     

    2009-08-22 21:40:00

    多联几次

  • 葛红儒 (55381091)
     

    2009-08-22 21:40:11

    warning: Cannot modify header information - headers already sent by (output started at /nfs/c04/h02/mnt/62979/domains/hcytea.comml/includes/database.mysql.inc:128) in /nfs/c04/h02/mnt/62979/domains/hcytea.comml/includes/common.inc on line 141.

  • 葛红儒 (55381091)
     

    2009-08-22 21:40:21

    http://www.hcytea.com/en/node/50

  • yuhe (914175392)
     

    2009-08-22 21:40:41

    哈哈,果然错的一塌糊涂

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:40:42

    在header前有input 是不是php文件?>结尾后有空行

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:40:45

    检查一下

  • yuhe (914175392)
     

    2009-08-22 21:40:55

    好啊好啊

  • yuhe (914175392)
     

    2009-08-22 21:41:32

    我想跟着老葛学上一段时间,好好把网站整一下

Drupal版本:

Drupal的Jquery 的核心是几的?

问题:

二月睿鸟() 22:59:28
Drupal的Jquery 的核心是几的?
我做放大老是有问题

答疑:

葛红儒(55381091) 23:05:53
Drupal有一个Jquery update模块

葛红儒(55381091) 23:06:08
可以更新到最新的Jquery

Jquery update模块介绍:

下载地址: http://drupal.org/project/jquery_update

Drupal核心中的jQuery版本:

 Drupal 6.x: jQuery 1.2.x (Drupal 6.2 以下: 1.2.3, Drupal 6.3 以上: 1.2.6)
jQuery Update 6.x-1.x: jQuery 1.2.x (当前1.2.6)
jQuery Update 6.x-2.x: jQuery 1.3.x (当前 1.3.2)

本模块为Drupal常用模块,周下载量接近3万了快.

参考资料: JQuery Update 模組 - 安裝及介紹, http://drupal.soa.tw/node/68

Drupal版本:

Drupal里面如何实现频道?

yuhe
 

2009-09-02 16:06:30

装好了,1,实现需要的功能。2,更改外观

  • malachuan
     

    2009-09-02 16:07:12

    不是先创建频道吗

  • malachuan
     

    2009-09-02 16:07:16

    在哪创建啊

  • yuhe
     

    2009-09-02 16:07:34

    创建频道?什么频道?

  • malachuan
     

    2009-09-02 16:08:22

    http://www.51rich.net/

  • malachuan
     

    2009-09-02 16:08:34

  • malachuan
     

    2009-09-02 16:08:37

    这不是吗

  • 葛红儒 (55381091)
     

    2009-09-02 16:09:39

    这种频道是国内的CMS特有的

  • malachuan
     

    2009-09-02 16:10:04

    那DRUPAL不也可以吗

  • 葛红儒 (55381091)
     

    2009-09-02 16:10:20

    Drupal可以很方便的实现这样的功能

参考解答:

1,频道是国内的CMS特有的

2,当你熟悉了Drupal以后,发现Drupal可以很方便的实现频道.创建一个节点类型(CCK),列出来(Views)  ,基本上就是一个频道了.

对于刚学Drupal的人来说,特别是国内的用过其它的国产CMS的用户,刚开始肯定有点不习惯.

Drupal版本:

GoDaddy上配置Drupal发邮件遇到问题

GoDaddy是一个很有名的主机提供商,好像国内也有很多人用,我的一个学员曾遇到过这样的问题,那就是drupal中SMTP发不了邮件,使用的是gmail的帐号。

注意,好像下面的文字中学员写错了,godday应该是godaddy

由于godaddy自己好像不直接支持邮件发送,在本地配制好的gmail的邮件发送,放到godaddy的站点上,就失效了。今天又有人问同样的问题,

学员1: 老葛,请教下,我使用smtp模块发送邮件,一直提示“SMTP -> ERROR: Failed to connect to serve”,我的帐户密码肯定填写对了
  这个smtp邮件和站点信息里的邮件帐户一样
16:27 以前按照这个方法都可以的
 我: gmail
16:28 么?
 学员1: 我用gmail和163的都试过了
  gmail端口改为465,ssl
 我: 163的不行
  gmail的可以
  163的付费用户好像可以
16:29 学员1: 不知道是我空间问题,我用的godday空间
  gmail的设置应该也没有问题,很奇怪
16:31 我: godday不可以的
16:32 空间的问题
  以前一个学员问过这样的问题
  不过可以使用godday提供的smtp服务

我已经登陆不了学员的网站的,我大概记得是这样解决的,我让朋友写信给godday,回复我还保留着,

Support Staff Response
Dear Sir/Madam,

We were able to verify the account with the provided information. In order to be able to send email through our hosting accounts that we offer you must use the following relay server in your code:

relay-hosting.secureserver.net

You do not need to provide a user name and password for this relay server as it does not require authentication.

Two non-CGI form mailers are included in Linux shared hosting account default files: webformmailer.php and gdform.php. They reside in the root directory of your hosting account. Incorporating either of these scripts into your website creates a form to capture user information and email it to a specified address.

For more information about designating the destination email address, see Specifying an Email Address for the PHP Form-Mailer.

 

Note: webformmailer.php is for use with accounts running Hosting Configuration 2.0 and above, only. For information, see What functionality does Hosting Configuration 2.0 provide? and How do I upgrade my hosting account to run Hosting Configuration 2.0?

 

 

webformmailer.php

 

 

To Use webformmailer.php

 

Create a Web form, assigning unique names to your form fields.

In the form tag, assign /webformmailer.php to the action attribute and set the form method to post:

<form action="/webformmailer.php" method="post">

 

In addition to the form fields you create, there are three hidden elements you can use.

form_format determines in what format the information is delivered. Its values are 'text', 'csv', 'html', 'xml', and 'default' (same as 'text').

form_order dictates in what order the fields are reported. Its values are 'default' (the same order as they appear on in the form), 'alpha' (alphabetized by field name) or a comma-separated, case-sensitive list of all or some field names.

form_delivery determines the frequency and packaging of delivery. All form submissions are sent via an attachment. You can specify the form_delivery variables as one of the following: 'digest', 'hourly_digest', and 'daily_digest'.

For example:

<form action="/webformmailer.php" method="post">
<input type="hidden" name="subject" value="Submission" />
<input type="hidden" name="redirect" value="thankyou.html" />
First Name: <input type="text" name="FirstName" />
Last Name :<input type="text" name="LastName" />
Email: <input type="text" name="email" />
Comments: <textarea name="comments" cols="40" rows="10">
Type comments here.</textarea>
<input type="submit" name="submit" value="submit"/>
<input type="hidden" name="form_order" value="alpha"/>
<input type="hidden" name="form_delivery" value="hourly_digest"/>
<input type="hidden" name="form_format" value="html"/>
</form>

 

 

 

 

 

 

gdform.php

 

 

To Use gdform.php

 

Create your Web form as normal and assign unique names to your form items.

NOTE: Keep in mind that our form-mailer script will sort the names of your form items alphabetically when it composes the email message. This is the order of precedence: uppercase letters, lowercase letters, numbers.

For the form action line, enter /gdform.php. For example:

<form action="/gdform.php" method="post">

 

Set the form method to "post."

In addition to the fields you create in your form, there are three special fields that you can use: subject, redirect, and email.

Subject. Controls the subject line in the form email.

Redirect. Controls the page that your visitors will see after they submit the form.

Email. Controls the return address for the form email.

For example:

<form action="/gdform.php" method="post">
<input type="hidden" name="subject" value="Form Submission" />
<input type="hidden" name="redirect" value="thankyou.html" />
<p>First Name:<input type="text" name="FirstName" /></p>
<p>Last Name:<input type="text" name="LastName" /></p>
<p>E-Mail:<input type="text" name="email" /></p>
<p>Comments:<textarea name="comments" cols="40" rows="10">
Type comments here.</textarea></p>
<input type="submit" name="submit" value="submit"/>
</form>

 

Save and upload your file to your hosting account.

 

 

 

 

For information on reinstalling your default scripts, see How Do I Reinstall the Default Scripts Directory?

我记得,我把relay-hosting.secureserver.net直接设置为了邮件服务器,连用户名密码都没有设置,就可以发送邮件了。印象中就是这样,直接使用主机提供商的邮件服务器,没有填写用户名,密码,就可以了。具体我也忘了。这里的仅供遇到同样的问题的朋友参考,如果找到正确的解决办法可以在本文下面补充。

 

 

 

For information on reinstalling your default scripts, see How Do I Reinstall the Default Scripts Directory?

 

Drupal版本:

content列表的这些列能否自定义?

关于content列表

 
      默认在/admin/content/node下的列表显示的是:
 
 
Title Type Author Status Language Operations
 
请问这些列能否自定义?我主要想加入个post date字段,以显示发布的日期。
 
这个不能直接加,因为这里面是使用PHP代码写死的,没有提供直接的覆写功能。不过这个本身是一个表单,可以通过表单的覆写来添加一个字段。
这个列表页面没有使用views。系统核心的列表页面,都没有使用views。不要直接修改核心代码,使用表单的覆写功能应该就可以满足你的需求了。
 

Drupal版本:

drupal CCK的学习

CCK的学习,
1,本身的安装配置,这里需要学习的是字段的配置和显示问题,配置很容易看懂,重点是显示,弄懂显示里面的"排除" 的含义.
还有一点是,用了CCK后对应节点类型外观的定制,也就是如何输出一个CCK字段,通常是使这样的:
php print  $field_author[0][value] ;
这里假定CCK字段名字为field_author.你需要注意这里的格式.这里面还有一个需要注意的地方,那就是如何输出body,系统自带的是$content变量,你会发现它包含了所有的字段,你需要把这些字段从正文里面排除,也就是前面所讲的字段的显示问题,这样就可以直接使用 php print  $content了。另外你还可以这样用,php   print $node->content[body]['#value']。
这样你就学会了基本的CCK知识。包括配置,显示,和外观的定制。
2学习CCK的各种字段模块,我们知道CCK自带的一写字段类型,但是掌握这些还是不够的,需要学习很多其它第3方的CCK字段模块,比如说Filefiled,ImageField,email field,link field等等,这些模块,你需要到官方的模块下在中,CCK类别下,去寻找。
 
3,如果有一天需要定制自己的字段模块,那么你需要掌握CCK对外提供的字段钩子了。这样一点也很重要。CCK在Drupal7中,已经成为了核心必选的模块,地位之重要可见一般,基于CCK接口的编程工作,也是未来开发的必备技能之一。
 
Think in Drupal

Drupal版本:

drupal Panels答疑兼总结

2010/2/1  22:51:25  xueyuan  howard.ge  fckeditor 6.x-2.0 出来了,好像改进不少
2010/2/1  22:51:32  xueyuan  howard.ge  你升级了没有
2010/2/1  22:51:38  howard.ge  xueyuan  还没有 
2010/2/1  22:51:44  howard.ge  xueyuan  都有哪些改进? 
2010/2/1  22:51:56  xueyuan  howard.ge  * Overhauled Javascript * Support for file browsers: built-in file browser, IMCE, Image Assist 1 & 2, Web File Manager * Include/exclude areas based on node type * Include/exclude paths support wild cards 
2010/2/1  22:52:09  xueyuan  howard.ge  bug 修了不少
2010/2/1  22:52:10  xueyuan  howard.ge  http://drupal.org/node/700474
2010/2/1  22:52:28  xueyuan  howard.ge  Web File Manager 这个应该挺好
2010/2/1  22:52:30  xueyuan  howard.ge  我装了
2010/2/1  22:52:56  howard.ge  xueyuan  以前都是这样的 
2010/2/1  22:57:35  xueyuan  howard.ge  啥?
2010/2/1  22:57:59  howard.ge  xueyuan  类似的功能,以前都有 
2010/2/1  22:58:57  xueyuan  howard.ge  奥
2010/2/1  22:59:00  xueyuan  howard.ge  没见过
2010/2/1  22:59:08  xueyuan  howard.ge  这是碰到什么用什么
2010/2/1  22:59:23  xueyuan  howard.ge  兄弟,导入了你的翻译
2010/2/1  22:59:24  howard.ge  xueyuan  最新的总比老的好 
2010/2/1  22:59:35  xueyuan  howard.ge  恩
2010/2/1  22:59:39  howard.ge  xueyuan  遇到不准的地方了? 
2010/2/1  22:59:40  xueyuan  howard.ge  刚刚
2010/2/1  22:59:44  xueyuan  howard.ge  觉得找不到北了
2010/2/1  23:00:05  howard.ge  xueyuan  习惯了就好了 
2010/2/1  23:00:18  howard.ge  xueyuan  说真的,里面有不少错误 
2010/2/1  23:00:28  howard.ge  xueyuan  我都没有动力去改进 
2010/2/1  23:00:46  xueyuan  howard.ge  反正,我如果翻译的话,名称词,一般都会保留
2010/2/1  23:00:56  xueyuan  howard.ge  这样,看起来比较舒服
2010/2/1  23:03:11  howard.ge  xueyuan  :D,每个人习惯不一样
2010/2/1  23:03:22  howard.ge  xueyuan  我希望Drupal的用户能更多一些 
2010/2/1  23:06:36  xueyuan  howard.ge  反正,我觉得用drupal的人,一般怎么也是半个程序员
2010/2/1  23:06:50  howard.ge  xueyuan  我现在也这么觉得 
2010/2/1  23:08:14  xueyuan  howard.ge  程序员吗,都喜欢看到他们熟悉的字眼,碰到不熟悉的,哪怕是中文的,也觉得特别别扭
2010/2/1  23:09:21  howard.ge  xueyuan  :) 
2010/2/1  23:09:30  howard.ge  xueyuan  有总比没有好 
2010/2/1  23:09:38  xueyuan  howard.ge  迷你面板 和面板的区别是啥?
2010/2/1  23:11:06  xueyuan  howard.ge  明白了
2010/2/1  23:11:13  xueyuan  howard.ge  看到你的翻译了
2010/2/1  23:11:15  xueyuan  howard.ge  不错
2010/2/1  23:11:38  howard.ge  xueyuan  翻译的还可以吧 
2010/2/1  23:11:48  howard.ge  xueyuan  翻译的时候,通常我用过的, 
2010/2/1  23:13:09  xueyuan  howard.ge  恩,还行
2010/2/1  23:13:11  xueyuan  howard.ge  挺好的
2010/2/1  23:13:38  howard.ge  xueyuan  迷你面板,面板,窗格 
2010/2/1  23:13:40  xueyuan  howard.ge  miniPanel 中的两列蓝三列蓝,那个看起来和Panel 一样
2010/2/1  23:13:50  xueyuan  howard.ge  但是,mini 的是放在区块中的
2010/2/1  23:13:58  howard.ge  xueyuan  对 
2010/2/1  23:14:12  xueyuan  howard.ge  那,你说,分这种几列几列的还有用吗?
2010/2/1  23:14:36  howard.ge  xueyuan  有用 
2010/2/1  23:15:12  xueyuan  howard.ge  就是说,区块之中还可以在细分?
2010/2/1  23:15:33  howard.ge  xueyuan  对 
2010/2/1  23:15:52  howard.ge  xueyuan  很方便的,而且很容易创建一个自己的布局 
2010/2/1  23:16:04  howard.ge  xueyuan  非常简单就可以创建一个自己的布局了 
2010/2/1  23:16:29  xueyuan  howard.ge  创建完了的区块,就可以摆在任何地方?
2010/2/1  23:16:36  xueyuan  howard.ge  这还不错
2010/2/1  23:16:59  howard.ge  xueyuan  panel everywhere模块 
2010/2/1  23:17:15  howard.ge  xueyuan  所有的页面内容都有panels控制 
2010/2/1  23:17:30  howard.ge  xueyuan  整个页面的布局内容 
2010/2/1  23:17:32  xueyuan  howard.ge  everywhere是什么?
2010/2/1  23:17:43  howard.ge  xueyuan  一个模块 
2010/2/1  23:17:55  howard.ge  xueyuan  Views的作者写的 
2010/2/1  23:18:35  xueyuan  howard.ge  是吗,你在用吗?
2010/2/1  23:18:38  xueyuan  howard.ge  怎么样
2010/2/1  23:18:42  xueyuan  howard.ge  这样的东东太好el
2010/2/1  23:18:45  howard.ge  xueyuan  http://drupal.org/project/panels_everywhere 
2010/2/1  23:18:48  xueyuan  howard.ge  就是要这种东东
2010/2/1  23:19:01  howard.ge  xueyuan  我看了一下,模块的思想挺厉害的 
2010/2/1  23:19:08  howard.ge  xueyuan  目前还不是特别成熟 

 
xueyuan 说:
 恩,一会装上试试
 Page Manager 我还没用过
 主要是做什么的?
howard.ge 说:
 

 那个更强大

 比如说一个页面

 你想让用户1,访问内容A

 管理员角色访问内容B

 普通用户访问内容C

 使用 Page Manager 很方便的管理这种情形

xueyuan 说:
 是吗,我靠
 那牛叉了
howard.ge 说:
 以前这种情况需要写模块,

xueyuan 说:
 对
howard.ge 说:
 至少需要在模板文件里面写逻辑

 现在使用Panels,轻松搞定这类问题

 可以处理各种各样的类似的情况,后台配置就可以了

xueyuan 说:
 对
 panel everyWhere 好像需要专门的theme支持?
howard.ge 说:
 不是,它的theme是空theme

 用来占位的

 类似于占位符

xueyuan 说:
 奥
howard.ge 说:
 它其实最终的目的是想把theme的东西,进一步的抽象,最终这些东西也都保存到数据库中

 也就是实现theme的重用

xueyuan 说:
 恩
 

Drupal版本:

drupal performance:为何减小module文件大小能加快速度?

在drupal的handbook:http://drupal.org/node/146172 上有这么一句话

Any module that has more than ~50 lines of code for page handler functions (including form handling functions if applicable) should split them off into a separate file. That reduces the overhead for PHP when loading modules, and therefore speeds up every single request on the site.

大意就是说,Drupal对于每个完整的页面请求,都会加载所有已经启用了的模块的module文件,如果有一个模块,它的*.module文件中,有多于50行的代码是用来处理页面回调的,那么.module文件中的这样的代码,就应该被独立到单独的inc文件中,inc文件分两种,一种是mymodule.admin.inc,另一种是mymodule.pages.inc.如果不是访问这个模块提供的页面回调,那么就不会加载这个模块的Inc文件,通过将模块自身的内部处理放置在inc文件中,就会减小.module文件的大小,从而降低每次页面请求,所加载的总文件大小。间接的实现了缓加载技术,进而提升了性能,这是Drupal6在性能上的一个改进。

我今天刚给朋友讲解的,为什么分出来inc文件,它的好处。顺便纠正一下网络上的上面这段话的译文。

 

Drupal版本:

drupal_mail 怎么发送附件呢?

葛红儒(55381091) 15:31:14
drupal_mail 无法发送附件
葛红儒(55381091) 15:31:18
好像是
葛红儒(55381091) 15:32:40
mimemail这个模块好像可以发送附件

参考解答:

mimemail 的下载地址: http://drupal.org/project/mimemail

这个模块对邮件发送进行了增强,包括允许HTML 邮件,包含图片的邮件,包含样式的邮件,以及包含附件功能.

发送附件的方法为:

$attachments[]=array(        
  'filepath' => '/path/to/file.name',
  'filemime' => 'mime/type',
);

mimemail($sender,
$recipient,
$subject,
$body,
$plaintext = NULL,
$headers=array(),
$text = NULL,
$attachments = array(),
$mailkey = '');
 

 

Drupal版本:

drupal多站点,是不是在sites下面建个站点域名文件夹,再复制setting.php。apache要不要做调整 ?

洛神
 

2009-08-27 11:26:09

老葛,多站点,是不是在sites下面建个站点域名文件夹,再复制setting.php。
apache要不要做调整

  • 葛红儒 (55381091)
     

    2009-08-27 11:50:00

    前面是对的

  • 葛红儒 (55381091)
     

    2009-08-27 11:50:16

    apache可能不需要调整吧

  • 洛神
     

    2009-08-27 11:51:00

    比如,以前是360its.com.我现在要做个hi.360its.com

  • 洛神
     

    2009-08-27 11:51:27

    我在sites下面已建立了一个hi.360its.com

  • 葛红儒 (55381091)
     

    2009-08-27 11:51:30

    那么新建一个文件夹

  • 葛红儒 (55381091)
     

    2009-08-27 11:51:39

    葛红儒 (55381091)
     

    2009-08-27 11:51:53

    调整setting.php文件

  • 葛红儒 (55381091)
     

    2009-08-27 11:52:02

    和一个站点的时候类似

  • 洛神
     

    2009-08-27 11:52:10

    新建了一个hi.360its.com文件夹
     

  • 葛红儒 (55381091)
     

    2009-08-27 11:52:20

    最好也创建一个360its.com目录

  • 洛神
     

    2009-08-27 11:52:39

    也复制了一个setting.php到hi.360its.com

  • 洛神
     

    2009-08-27 11:52:48

    有个360its.com

  • 洛神
     

    2009-08-27 11:53:50

  • 葛红儒 (55381091)
     

    2009-08-27 11:54:19

    就是这样
     

  • 葛红儒 (55381091)
     

    2009-08-27 11:54:25

    创建两个数据库

  •  

    2009-08-27 11:54:49

    又创建两个数据库

  •  

关于Drupal多站点的搭建,可以参看我以前写的: 如何使用Drupal搭建多个站点,

http://zhupou.cn/drupal-handbook/tutorials/set-up-multi-site-using-drupal

这是一个Drupal,多个站点的方法.

Drupal版本:

drupal运行速度太慢了, 有没有加快的办法 ?

牧草人
 

2009-09-03 13:52:10

drupal运行速度太慢了

  • 牧草人
     

    2009-09-03 13:52:19

    有没有加快的办法

 

Drupal本身的运行需要耗费比较多的内存,如果只是使用核心模块的话,还不是很明显.模块越多,需要的内存越多,

没有太好的办法,要么降低模块的数量,要么添加内存,当然还有一些优化措施.

比如启用缓存.

Drupal版本:

drupal里面关于用户权限方面的文件具体在哪里文件里面?大概是怎么调用的?

Drupal中的权限有两部分组成:角色(roles)/权限(permission)
权限可以通过hook_perm钩子函数进行定义,例如:
function user_perm() {
  return array('administer permissions', 'administer users', 'access user profiles', 'change own username');
}
这里面的'administer permissions','administer users',就是一个具体的权限。

角色:可以理解为具有一组特定权限的集合,Drupal自带了两个角色,匿名用户,注册用户,角色可以通过后台(/admin/user/roles)添加,比如添加管理员、编辑等等角色。 添加好角色以后,可以在admin/user/permissions来为该角色定义它具有的权限。

通常启用了很多模块以后,权限列表很多,有很多权限很细的,配置起来很麻烦,可能需要不断的调整,选中,取消选中。如果你的权限不能正常工作,那么可以在admin/content/node-settings重置权限。这里有一个按钮。

Drupal内置的权限不能满足你需求的话,那么可以使用http://drupal.org/project/acl模块,以及相应的其它配套模块,比如Content Access 。
另外也可以通过使用hoook_node这个钩子函数来控制哪些内容显示给那些用户。

用户登录以后,Drupal会自动的加载user对象,$user对象是一个全局变量,里面包含roles属性数组,里面包含了用户所具有的角色。当遇到权限检查时,会检查用户所有的角色当中,是否存在一个角色,包含这个权限,如果存在的话,那么用户就通过了权限检查。

 

Drupal版本:

form_alter与模块的重量

问题:
老师,我怎么给表单元素加验证属性后这个元素就不输出了
 
解答:
Linuser 12:38:09
或许你加错了
Helios 12:38:11

Linuser 12:38:15
你看看手册
Linuser 12:39:11
$form['field_order]['#element_validate'] =   array('example_order_validate'); 
Linuser 12:39:34
后面是一个数组
Helios 12:39:43

Helios 12:39:57
给哪个元素加上那个元素就没了
Linuser 12:41:01
你仔细的对比一下
Linuser 12:41:14
至少说明,你的代码起作用了
Helios 12:41:25
发现在我的form_alter时表单元素数组还没准备好
Helios 12:41:36

Linuser 12:41:45
(&$form,&$form_state,$form_id) {
Helios 12:41:52
还没有页面元素
Linuser 12:42:14
你需要增加模块的重量
Linuser 12:42:32
db_query("UPDATE {system} SET weight=999 WHERE name='example'");
Helios 12:42:47
。。。
Linuser 12:42:59
这样,这个模块的钩子,在数据库中,在后面执行
Helios 12:43:02
还有这个原因啊
Linuser 12:43:13
function example_install(){
drupal_install_schema('example');
db_query("UPDATE {system} SET weight=999 WHERE name='example'");

}
Linuser 12:43:16

Helios 12:43:22
谢谢老师
Linuser 12:43:36
因为那个表单元素可能是其它模块使用form_alter加上的
Helios 12:43:37
我自己怎么也找不到原因
Helios 12:43:49
是cck的
Helios 12:43:54
content模块
Linuser 12:44:22
如果是其它模块form_alter加上的,那么你的模块想要修改里面的元素,你的模块的重量要大一点。
Helios 12:45:00
也就是说在执行form_alter时是根据module的weight来依次修改
Helios 12:45:06
可以这样理解吗
Helios 12:45:43
invoke_hook是这样这行的?
Linuser 12:45:53

Linuser 12:45:59
就是这么理解
Helios 12:46:16
呵呵,真没想到
Helios 12:46:20
谢谢了
Linuser 12:46:27
钩子的执行顺序是按照模块的重量先后执行的

 
总结:module_invoke_all在调用各个模块中钩子实现时,各个模块的钩子的执行顺序,取决于模块的重量,重量越轻,有限级越高。以form_alter为例,drupal中节点表单
默认字段只有标题和正文,对于分类字段还有其它CCK字段,这些都是通过其它模块实现form_alter的钩子函数添加进来的。对于这些后来添加进来的表单元素,如果你想修改他们的属性,那么除了需要实现form_alter钩子函数以外,还需要考虑你定制的模块的自身重量,看它是否大于CCK模块或者分类模块。

 

Drupal版本:

magento 与drupal Ubercart

playboy
 

2009-08-25 21:26:03

是作一个和淘宝功能类似的网站

  • 葛红儒 (55381091)
     

    2009-08-25 21:27:06

    那就复杂了

  • playboy
     

    2009-08-25 21:27:43

    是吗?看来我是无知者无畏

  • 葛红儒 (55381091)
     

    2009-08-25 21:28:38

    Ubercart对于单个网店还是比较合适的,

  • 葛红儒 (55381091)
     

    2009-08-25 21:29:23

    多个网店,可以看看,如何用它作平台

  • playboy
     

    2009-08-25 21:31:39

    多个网店magento不错,Ubercart还得做二次开发吧

  • 葛红儒 (55381091)
     

    2009-08-25 21:32:46

  • 葛红儒 (55381091)
     

    2009-08-25 21:32:51

    肯定需要调整一些了

  • playboy
     

    2009-08-25 21:34:16

    看来做一个单网店就可以啦,要不工程太浩大啦

  • 葛红儒 (55381091)
     

    2009-08-25 21:35:38

 

很多人询问过,能不能使用Ubercart搭建一个taobao一样的网站,Ubercart适用于哪些方面的问题.总的来说,taobao不是一下子就能复制的,即便是使用Ubercart也需要进行定制。

Ubercart的长处,它是一个Drupal模块,相对比较轻量级一点,是基于节点的,这样就可以使用Drupal的其它模块进行扩充。

多个网店magento,这个我不了解,有相应的模块可以与Drupal相集成。它是一个纯网店的软件。

Drupal版本:

ubercar的购物车变量是?

洛神<> 2010-01-12 17:26:17
ubercar的购物车变量是?
葛红儒(55381091) 18:02:01
不记得有这个变量
葛红儒(55381091) 18:02:41

应该可以创建很多的
洛神<> 18:09:34
那从那里可以找到
葛红儒(55381091) 18:12:51
购物车区块对应的代码

葛红儒(55381091) 18:13:02

应该有购物车的相关信息
洛神<> 18:13:29
问之前,翻了下,没有翻到
葛红儒(55381091) 18:16:51
function uc_cart_block($op = 'list', $delta = 0, $edit = array()) {
葛红儒(55381091) 18:17:20
没有直接的变量
洛神<> 18:18:05
没有直接变量的话,那页面是怎么显示的
葛红儒(55381091) 18:18:12

uc_cart_get_contents(
葛红儒(55381091) 18:18:18
有对应的函数
葛红儒(55381091) 18:18:31
可以获取购物车里面的内容
葛红儒(55381091) 18:18:59

你看看uc_cart.module里面,购物车区块里面怎么实现的
洛神<> 18:19:02
 
葛红儒(55381091) 18:19:10
 theme('uc_cart_block_content');
洛神<> 18:19:41
行,我先看看先
葛红儒(55381091) 18:19:41
function theme_uc_cart_block_content() {
葛红儒(55381091) 18:20:01

这个函数里面负责购物车区块的具体显示的
 

总结: Ubercart中,购物车中内容的显示,是通过一个函数uc_cart_get_contents实现的,Ubercart本身,没有提供一个直接的全局变量来负责购物车的内容的存储.

Drupal版本:

zhupou.cn的资源下载出错了?怎么回事

用户购买了培训班后,我会添加一些下载资源.但是用户下载时,很多都抱错了.

  • 牧草人 (582634658)
     

    2009-08-29 20:36:25

    现在倒有个问题啊

  • 牧草人
     

    2009-08-29 20:36:30

    我下载出错

  • 牧草人
     

    2009-08-29 20:36:37

    有一个三次都没有下载下来

  • 牧草人
     

    2009-08-29 20:36:47

    能不能让我重新下载啊

  • 牧草人
     

    2009-08-29 20:36:53

    或给我发邮件也好啊

  • 牧草人
     

    2009-08-29 20:36:56

解决的办法:

这个是由于Ubercart的问题,它管理的下载,只有经过授权才能下载,不能够使用加速软件下载Ubercart管理的资源,迅雷,QQ旋风,Flashget等等,这些都不能.

只能使用最原始的Http的下载方式。

 

不过在下载页面,有相应的提示的,那段提示的文字有点小,不大显眼^_^

 

  • 葛红儒 (55381091)
     

    2009-08-29 20:37:49

    下载的时候不要使用加速工具

  • 牧草人
     

    2009-08-29 20:38:01

    我是用的360 的

  • 牧草人
     

    2009-08-29 20:38:03

    下载工具

  • 牧草人
     

    2009-08-29 20:38:12

    其他的还可以的么

  • 葛红儒 (55381091)
     

    2009-08-29 20:38:19

    不能使用

  • 葛红儒 (55381091)
     

    2009-08-29 20:38:30

    只能使用HTTP下载
     

Drupal版本:

一个drupal用户中心,其它drupal应用不再启用user,直接到drupal用户中心去认证、并登陆?

  • 洛神 (
     

    2009-08-24 10:42:18

    drupal 的open ID,可否做成一个drupal用户中心,负责帐户、用户资料管理,其它drupal应用不再启用user,直接到drupal用户中心去认证、并登陆

  • 葛红儒 (55381091)
     

    2009-08-24 10:43:37

    Drupal的认证和登陆,可以全部委托给外部系统

  • 葛红儒 (55381091)
     

    2009-08-24 10:45:46

    技术上具有可行性,以前项目中就有类似的,是通过service与外部进行交互的

洛神 (
 

2009-08-24 10:47:47

其它系统吗?

  • 葛红儒 (55381091)
     

    2009-08-24 10:48:19

    对,将Drupal的用户管理全部委托给其它系统

  • 葛红儒 (55381091)
     

    2009-08-24 10:49:20

    这个问题在比较大的项目中会经常遇到,因为大项目总有遗留系统,Drupal需要和它们交互,

  • 洛神 (
     

    2009-08-24 10:50:12

    我也是考虑到性能问题,这样分开,就不用一个加载太多模块了

  • 葛红儒 (55381091)
     

    2009-08-24 10:52:04

    如果项目比较大的话,这是比较好的选择,把部分工作委托给别的站点,系统

  • 葛红儒 (55381091)
     

    2009-08-24 10:52:37

    不过仅仅为了性能问题,还不如买个超强的主机划算,

  • 洛神
     

    2009-08-24 10:58:39

    管理也方便

  • 洛神
     

    2009-08-24 10:59:39

    一个drupal功能多了,模块加载多了,打开管理页面时等半天

     

    参考解答:

    有时候,为了性能的考虑,会将一个Drupal切分为多个子站点,这个时候就涉及到用户的共享的问题了,其实,多个站点可以共用同一个数据库表的,http://zhupou.cn/drupal-handbook/tutorials/set-up-multi-site-using-drupal 就给出了这种方式的答案.

    另外就是采用别的办法,比如site network,这也是一种解决办法,但是比较过时了.

    另外就是涉及到Drupal将整个用户的认证,登录委托给外部系统了,这种方式比较复杂.

    现在的drupal.org,groups.drupal.org上,采取的方式,也是值得参考的方式 bakery, http://drupal.org/project/bakery

    不过这个模块还是开发版,不过话又说过来,drupal.org都采用了。

    Domain Access也能够解决这样的问题,http://drupal.org/project/domain

Drupal版本:

一些全局性的变量,会话相关的数据,存放在哪里

 

对了,老葛,我看到 比如global $user

  • 葛红儒 (55381091)
     

    2009-08-23 21:42:17


     

  • ずッ哀ぁい
     

    2009-08-23 21:42:30

    $user->UID 那么, $user是一个类咯?

  • 葛红儒 (55381091)
     

    2009-08-23 21:43:04

    $user是一个对象

  •  

    •  

    通常很多人

    ずッ哀ぁい
     

    2009-08-23 21:43:12

    恩,这对象在哪

    ....

    就是,我不知道,这类叫什么名字,定义在哪

    通常很多人,初次发现,Drupal把所有与会话相关的信息都存在了数据库中,这一点感到很意外.是不是所有的,我不敢确定,但是很多的,都被放到了数据库中,然后不断的存取.

    所以,我们可以在代码中,直接使用$_SESSION[]而不用去考虑,性能,以及其它。以前,做JAVA的时候,我都喜欢把所有的东西放到会话里,因为下次使用会很方便,后来,高手告诉我,不能这样用,这样会占据大量的内存。我想很多人都有类似的想法。

    不过在Drupal7中,这一点可能会有微小的调整。但是,存在数据库中,这一点总体是不变的。因为存在数据库中了,所以不用去关心内存的问题了。其实对于我们的大多数程序员,网站,这些都不是需要关注的问题。

    习惯就好了,Drupal覆写了PHP会话管理的后台的底层机制,用数据库管理这些信息。

  • ずッ哀ぁい
     

    2009-08-23 21:44:53

    还有这些global变量都在哪定义的

    我看api上说,在developer/global.php

     

    解答总结:

Drupal版本:

两个drupal功用一个user系统,如何实现同步登陆和注册(尚未解决)

问一下,两个drupal功用一个user系统,要实现同步登陆和注册,我共用了
'authmap'
'profile_fields'
'profile_values'
'role'
'sessions'
'users'
这6张表,虽然用户权限共用了,但是没有解决同步登录的问题,谁能指教一下.
 

这个问题很有代表性,我也不会,没有解决过。也不知道有没有人解决过这个问题,以及对应的文档。

 

 

Drupal版本:

使用FCKeditor的Teaser控制首页摘要

 

对于推荐到首页的内容,如果想要对其完全控制的话,那么需要将摘要和正文分开显示.
 
这个时候需要使用FCKeditor的”Teaser”标签,
1,首先输入在teaser中要显示的内容,
 
2,插入“Teaser”标签,出现红色的虚线。在红色的虚线下面。
输入正文的内容。
3,取消对右上角的复选框“显示总览全文”的选中,默认是选中的,取消选中。
这样红线上面的teaser和下面的正文就分开了,也就是独立开了,如果文章是推荐到首页的,那么显示在首页的就是摘要了。
 
这样做的好处是,能够100%的控制摘要的显示。

使用features,spaces,Context分析解决一些实际问题

对于一些学科的分类,
比如,理科
           数学
              离散数学
              解析几何
            物理
               原子物理
               天体物理
 
这些可以采用Drupal自带的分类系统实现. 对于数学下面的,论文,课程,课题,其它相关内容,则可处理为特性(Features),一个特性给通常包含一个节点类型,和这个节点类型下的节点的展示.就是说,论文 ,课程,课题,分别对应于各自的节点类型(论文节点类型,课程节点类型,课题节点类型)
 
features,spaces,Context是在Drupal的基础之上,作了进一步的抽象,是目前解决此类问题的最佳途径.在这里,分类中的每个术语,比如离散数学,解析几何,他们本身被看作了一个空间(space), 论文,课程,课题,其它相关内容被处理为features(特性),而特性与空间的关联则是通过上下文(Context)实现的.
 
具体的知识,大家可以参看http://drupal.org/project/spaces,http://drupal.org/project/features, http://drupal.org/project/context
特性,空间,上下文,是Drupal业内最近兴起的一个概念,使用这样的概念,和对应的模块,很容易解决我们现实中的许多问题.
 
version.name是我帮一个学员,使用features,spaces,Context为其课程教学知识点的管理所作的一个简单的实现。不仅仅可以把分类术语作为空间,还可以把og,把用户看作空间。
 
希望这些知识能够帮助大家了解这些概念,进而把这些概念,对应的模块应用于你们实际需求中。

Drupal版本:

使用节点占位符方式来定制复杂的页面模板布局

dyj315 20:20:39
怎样制作子页面,不是指view里的页面,是比较复杂的页面,像首页
dyj315 20:20:54
但不是首页,只是专题
Linuser 20:21:54
panels
Linuser 20:22:10

或者单独的创建一个节点模板
dyj315 20:23:05
我已经创建了模板,类似首页,但怎么把它和菜单路径连起来呢
dyj315 20:24:29
要是我的这个子页面是两栏,而首页是三栏,怎么办呢?
Linuser 20:27:54
比如页面模板为page-node-8.tpl.php
Linuser 20:28:05
那么你只需要创建一个菜单项
Linuser 20:28:21
路径为node/88
Linuser 20:28:26
就可以了
Linuser 20:28:28

8
dyj315 20:32:37
我有page-loupan.tpl.php,但创建一个菜单项loupan就出错
dyj315 20:32:47
loupan 无效,或者您没有访问权限。
Linuser 20:33:08
你需要先创建一个节点 
dyj315 20:33:29
创建一个节点?
Linuser 20:33:35

然后为这个节点创建一个页面模板文件作为loupan的页面模板文件
dyj315 20:33:43
什么节点,怎么建
Linuser 20:33:54
这个节点里面可以不放内容,
Linuser 20:34:05

主要起到占位的作用
Linuser 20:34:45
在这个节点的页面模板里面,放置page-loupan.tpl.php里面的内容就可以了
dyj315 20:36:27
怎么不放内容,又说放置page-loupan.tpl.php里面的内容就可以了
 
Linuser 20:36:49
占位用的
Linuser 20:37:03
这样你就可以有一个可使用的路径了
dyj315 20:37:13
究竟放内容,还是不放?
Linuser 20:37:37

不放内容,你试验一下就知道了
dyj315 20:37:55
创建一个节点===就是创建内容,比如创建一个page,是吧?

Linuser 20:39:04

Linuser 20:39:18
然后,为其创建一个页面模板文件,
Linuser 20:39:40
页面模板文件中的内容,和page-loupan.tpl.php里面的内容一致就可以了
dyj315 20:39:54
这个page,必须有标题吧,这样才能保存
Linuser 20:40:00
你照我说的做一下
Linuser 20:40:04
那当然了
dyj315 20:41:14
我创建了
dyj315 20:41:19
下一步?
Linuser 20:41:58
为它创建一个页面模板文件
dyj315 20:42:11
这个怎么做?
Linuser 20:42:19
然后把page-loupan.tpl.php里面的内容放进来
dyj315 20:42:20
我有一个模板
Linuser 20:42:38
page-node-888。tpl。php
dyj315 20:42:51

Linuser 20:42:52
这里假定节点ID为888
dyj315 20:45:13
这样做了后,怎么把它和loupan联系起来
dyj315 20:45:34
这样做了后,怎么把它和loupan菜单联系起来呢?

Linuser 20:47:31
创建一个菜单项,名字叫loupan,
Linuser 20:47:46
路径为node/888
Linuser 20:47:59
这里假定节点ID为888

dyj315 20:48:40
我创建一个菜单项,路径是loupan,但出错了
Linuser 20:48:54

路径是node/888

dyj315 20:50:24
好,可以了
Linuser 20:51:19
,仔细体会一下,节点占位符在Drupal中的使用吧
Linuser 20:51:24

很方便的,
Linuser 20:52:09
创建的节点是个"伪节点" ,就是一个壳子,
dyj315 20:52:17
但我怎么把菜单改成楼盘,而不是loupan啊?
dyj315 20:52:52
我傻了
Linuser 20:52:54
菜单项的名字改为楼盘就可以了
dyj315 20:52:57
直接改
dyj315 20:54:45
好,谢谢你。我发现书里或网文里,我都没有看明白这个呢?
Linuser 20:55:17
知识是实践出来的
dyj315 20:55:25
好像没有详细谈这个问题吗?
Linuser 20:56:24

我很久以前的文章写过类似的,
Linuser 20:56:54
只是你没有看到,
dyj315 21:03:11
怎么把路径node/888
改成loupan呢?
Linuser 21:03:52
为node/888设置一个别名,别名为loupan
Linuser 21:04:47
如果你想在页面模板中也改为loupan,那么需要编写预处理函数,

dyj315 21:06:03
预处理函数?
dyj315 21:06:08
怎么弄?
Linuser 21:07:11
明年你再学习吧
Linuser 21:07:22
等你积累积累自己的知识,
Linuser 21:07:25
高级技术
dyj315 21:09:44
现在不管这个高级技术
Linuser 21:10:23
嗯,
dyj315 21:10:37
我现在想做的是怎么为这个模板定制不一样info文件
dyj315 21:11:19
就是和首页的三栏不一样,比如是两栏
Linuser 21:11:47
你在这个页面模板里面,可以任意的修改的
dyj315 21:12:03
甚至前面还有其他特殊区块
Linuser 21:12:23
自己任意的添加各种html markup
dyj315 21:12:45
不需要info文件
Linuser 21:13:02
然后再里面嵌套各种PHP代码就可以了 
Linuser 21:13:20
你实践一下
dyj315 21:18:41
<?php
$block = module_invoke('blog', 'block', 'view', 0);
echo $block['subject'];//显示区块的标题
echo $block['content'];//显示区块的主内容区。
?>
dyj315 21:19:43
像这样显示区块,就不需要与首页定义的栏目一致了?
Linuser 21:28:52
对头
Linuser 21:29:30
就是这样,在这个页面模板里面,可以调用自己的函数,views_embed_view

dyj315 21:29:37
views 里面的定义的区块名字是怎么弄的?
Linuser 21:32:51
你自己想想,我先忙了
dyj315 22:20:21
print views_embed_view("houses","block_4");
 

 
总结:有时候我们需要一个复杂的聚合页面,使用views创建部出来这样的页面,很多人又不愿意使用panels,编写模块又不划算,这个时候,就可以考虑节点占位符这种方式,所谓的节点占位,就是说,我创建一个节点,这个节点只是一个壳子,用来装东西的,而不是用来呈现节点本身,而通过这个节点,我们就可以为其创建一个单独的页面模板文件,在页面模板文件中,我们可以不输出title,content,在里面我们做一些处理,输出一些其它的PHP函数,输出一些特定的html markup。这种方式有优点,也有缺点,很实用的方法。

Drupal版本:

修改节点编辑表单元素的权限回调函数

帮学员写的一个实例函数,主要作用是用来控制node/nid/edit页面的访问权限的,因为现有的访问权限,满足不了学员的需求,而且没有直接的模块可用,

通过覆写菜单,实现自己的权限控制,在自己的权限控制函数中,实现自己的逻辑。

Drupal的90%以上的功能,都是可以替换掉的,而且不用修改源代码,这就是Drupal的灵活性,在很多其它的CMS中,这是很难实现的。

function mymodule_menu_alter(&$items){
 //修改这个页面回调函数的访问权限控制汉书
 $items['node/%node/edit']['access callback'] = 'mymodule_nodeaccess';
}
function mymodule_nodeaccess($op, $node, $account = NULL){
 global $user;
//在原来的控制函数user_access前面加上了判断,如果任务完成了,并且当前用户不具有'站点管理员'角色,那么就不能访问
 /*
 if($op =='update' && $node->field_task_over[0]['value'] =='yes' && !in_array('站点管理员',$user->roles)){
  return FALSE;
 }else
 */

//这里是用户的逻辑
 if($node->type=='task'){
  if(in_array('站点管理员',$user->roles)){
   return TRUE;
  }elseif($op =='update' && $node->field_task_over[0]['value'] =='no' && $user->uid == $node->uid && $user->uid != 0){
   return TRUE;
  }else{
   return FALSE;
  }
 }else{

//这里是系统默认的逻辑,执行完前面的,起到兜底的作用。
  return node_access('update',$node);
 }

}

Drupal版本:

关于css 的一些问题。<?php print $styles ?> 的css 怎么控制输出

问题:

野放客() 22:14:35
请教葛老师,关于css 的一些问题。<?php print $styles ?> 的css 怎么控制输出

 

解答:

野放客) 22:15:10
<link rel="shortcut icon" href="/sites/default/files/dooo_favicon.jpg" type="image/x-icon" />
         <link type="text/css" rel="stylesheet" media="all" href="/sites/all/modules/admin_menu/admin_menu.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/node/node.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/system/defaults.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/system/system.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/system/system-menus.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/user/user.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/modules/cck/theme/content-module.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/modules/filefield/filefield.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/modules/cck/modules/fieldgroup/fieldgroup.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/dooo/style.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/dooo/pu_moz.css?2" />
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/dooo/pu_nav.css?2" />
葛红儒(55381091) 22:15:29
这个是由程序控制的,
野放客() 22:15:32
输出这么多的css 感觉很乱
葛红儒() 22:15:48
$styles是一个页面变量,
葛红儒() 22:16:07
它的内容是由与处理函数生成的
葛红儒() 22:16:18
这一点和其它的变量一样
葛红儒() 22:16:26
在与处理函数中,
野放客() 22:16:32
可以在那是调
野放客() 22:16:47
有些是没有用的css
葛红儒(55381091) 22:17:19
会搜集到所有使用drupal_add_css添加近来的CSS ,以及主题中定义的默认css,这一点和其它的变量一样
葛红儒(55381091) 22:20:58
你可以在页面中不使用变量styles

葛红儒(55381091) 22:21:24
自己硬编码式的加入CSS

葛红儒(55381091) 22:22:24
<link type="text/css" rel="stylesheet" media="all" href="<?php print base_path().path_to_theme() ?>fieldgroup.css" />

总结:

$styles是一个页面变量,它的内容是由与处理函数生成的,这一点和其它的变量一样,在与处理函数中,
 

Drupal版本:

各位有谁碰到过这样的问题?用views输出用户信息的时候,某几个用户连续重复输出了几十次。如何搞?

yuhe
 

2009-09-07 22:41:34

各位有谁碰到过这样的问题?用views输出用户信息的时候,某几个用户连续重复输出了几十次。如何搞?

  • 葛红儒 (55381091)
     

    2009-09-07 23:55:32

    有一个distinct选项

  • 葛红儒 (55381091)
     

    2009-09-07 23:55:46

    可以把重复的过滤掉,

  • 葛红儒 (55381091)
     

    2009-09-07 23:55:53

    Views里面的

  • 葛红儒 (55381091)
     

    2009-09-08 11:30:24

    解决了没有?

  • yuhe
     

    2009-09-08 11:31:16

    改了,没用,依然重复显示。我觉得是不是Views对于不同内容的判定依据,在所有的重复项中有区别。而我没有找到这个判定依据

yuhe
 

2009-09-08 11:31:36

sorry,表达不清楚

  • 葛红儒 (55381091)
     

    2009-09-08 11:31:56

    我从来没有遇到过

  • yuhe
     

    2009-09-08 11:32:00

    Views对于重复项的判定,是根据某个,比如说字段的

  • yuhe
     

    2009-09-08 11:32:06

    比如说UID

  • yuhe
     

    2009-09-08 11:32:22

  • yuhe
     

    2009-09-08 11:32:56

  • 葛红儒 (55381091)
     

    2009-09-08 11:33:19

    你的views有问题吧

  • yuhe
     

    2009-09-08 11:33:38

    啊?那么,要怎么搞呢?重新安装码?

  • 葛红儒 (55381091)
     

    2009-09-08 11:33:42

    有网址没有,我帮你看看

  • yuhe
     

    2009-09-08 11:33:51

    呵呵,公司内部网

葛红儒 (55381091)
 

2009-09-08 11:34:08

你是不是选成节点,应该选用户的,

  • yuhe
     

    2009-09-08 11:34:36

  • yuhe
     

    2009-09-08 11:35:04

    吧Views卸载掉,重新装一遍?

  • yuhe
     

    2009-09-08 11:36:25

  • yuhe
     

    2009-09-08 11:37:44

    我先搞一遍再说,因为前几天不小心把Views文件夹删掉了,后来又从新文件复制了一份过来

  • 葛红儒 (55381091)
     

    2009-09-08 11:39:42

    从这里看不出来

  • 葛红儒 (55381091)
     

    2009-09-08 11:41:14

    你重新创建一边吧,把缓存清空了

  • yuhe
     

    2009-09-08 11:43:38

    好,老大吃饭,我开搞

  • 葛红儒 (55381091)
     

    2009-09-08 11:46:37

    我上传了webform的汉化包

  • yuhe
     

    2009-09-08 11:46:58

    好,老大辛苦,感谢老大

但是,不同的是,我在新建Views时,没有选节点,选了用户

  • 葛红儒 (55381091)
     

    2009-09-08 11:50:29

    啊?那么,要怎么搞呢?重新安装码?
    葛红儒(55381091) 11:33:42
    有网址没有,我帮你看看
    yuhe<> 11:33:51
    呵呵,公司内部网
    葛红儒(55381091) 11:34:08
    你是不是选成节点,应该选用户的,

  • 葛红儒 (55381091)
     

    2009-09-08 11:50:43

    看看我的猜测有多么精准阿

  • yuhe
     

    2009-09-08 11:59:41

    哈哈,原来如此

 

问题总结:

yuhe创建了一个关于用户的视图,但是视图类型选择了节点,这样导致出现了莫名其妙的问题,

在我的提醒下,重新创建视图,选择了用户视图类型,问题解决了.

其实很多问题,而是开始的时候选错了方向,这就是一个例子,选对了,就好解决,选错了,就不知道错在哪里了.

Drupal版本:

后台查询(搜索)管理功能该怎么实现?

问题: 后台查询(搜索)管理功能该怎么实现?

解答:

在Drupal中么?
 
1,上面的查询,每个过滤条件都可以保存到$_SESSION中,使用表单API实现,当点击查询时,在表单的submit函数中,处理查询操作。
2,下面的使用table显示。
3,分页有专门的分页函数,http://www.thinkindrupal.com/node/958
大概的框架,你需要按照下面的思路进行细化,并且设计数据库表结构,以及具体的实现:
 
页面菜单回调:
mymodule__menu{
}
 
mymodule__page{
$output= '';
$output .=  drupal_get_form('mymodule_searchuser');
$output .= mymodule_get_search_result_table();
return;
}
 
表单实现:
mymodule_searchuser(){
$form = array();
 
...
return $form;
}
 
表单处理:
 
mymodule_searchuser_submit(){
//这里把form_state中的表单元素的值存放到对应的Session中。
比如$_SESSION['start'] = $form_state['values']['start'];
}
 
mymodule_get_search_result_table(){
$start = $_SESSION['start'];
 
....
根据上面的3个过滤条件,生成SQL,并查询数据库,将返回的结果放到table中,
 
最后返回输出 $output;
 
.....
return $output;
}

反馈: 收到了,之前没有想到用session实现。
只想着用 像block模块一样,在模块中是用主题函数,页面内容就是默认搜索(所有搜索参数为空)结果,然后在表单提交查询符合条件的。

这样有个问题:搜索后都放入session中,也就是说无论什么时候点开这个页面都是这个搜索结果只要在这个session周期内,无法返回到默认搜索结果状态,除非所有搜索条件全部为空再次搜索一下才行。
若是在 mymodule_page(){
  令搜索条件($_session['star']) = null ;
  翻页就无法实现了,因为我发现,翻页一次就貌似调用这个 mymodule_page()一次,
  ($_session['star']) = null 这样的话就等于翻页的时候把session = null 了,条件又没了。
}
能不能 在下次点击回来的时候 ,$_session['star'] = null 一下,这样问题就解决了。

难道不能用 $_POST 提交到本页面?

解答:

可以这样.但是很多时候,Drupal内部的表单,都是可以记录最近一次的状态的.
 
不可以用Post.
Drupal的Session是存放在数据库中的,简单的字段,没有特别大的影响.

mymodule__page{
$output= '';
$output .=  drupal_get_form('mymodule_searchuser');
$output .= mymodule_get_search_result_table();
 
//在这里unset一下就可以了,返回output之前。
unset($_session['star']);
unset($_session['end']);
这样下次访问的时候,就是空的了

return $output ;
}

 

总结:这是使用Drupal,作为框架进行开发,经常遇到的问题,一个页面,上面是一个表单,用来查询(过滤)内容,下面是一个table。除了上面所写的框架性代码,这里需要注意的是$_SESSION的应用,很多学过PHP的人,刚学Drupal的时候,很不适应这种方式。POST的方式,不是Drupal的方式,是一种PHP的解决办法。在页面直接传递参数,Drupal中最地道的方式就是使用$_SESSION。

Drupal的$_SESSION是保存在数据库中的,Drupal自己对PHP的会话作了自己的实现。

 

Drupal版本:

在views中如何排除最新的一篇文章

问题:

老葛你好
在views中如何排除最后一篇文章

把所有日记输出,有分页,除了最后发表的一篇

Linuser 17:52:25

 

 

 

解决办法:

 

Linuser 16:56:37
唯一的办法是使用argument
 
Linuser 16:57:14
添加一个node:nid的参数
 
Linuser 16:57:37

这个参数等于最新的日志节点的ID

 

 

注意 事项:

 

 
二月睿鸟 17:41:14
参数没有起作用
二月睿鸟 17:41:46
 
Linuser 17:42:09
$ret返回的不是ID
 
二月睿鸟 17:42:40
 
Linuser 17:42:35
你可以先写一个静态的,比如
 
Linuser 17:43:04
$nid =26;
return $nid;

 

 
分页采用Use pager: Yes 就可以了

 

 
Linuser 16:59:20
参数的提供采用PHP代码的方式
 
Linuser 16:59:30
就是你写一段PHP代码
 
 
Linuser 16:59:42
作为node:nid的参数 

.

 

Do not use <?php ?>. You 

 

Linuser 17:52:40

 

 

 

二月睿鸟 17:52:54

啊?

Linuser 17:53:23

这样就排除了

 

Linuser 17:53:50

 

有的地方需要<?php ?>,有的地方不需要,

Drupal版本:

在views中,如果有多个filters,默认多个filters之间的关系是“与”(AND),请问能不能使用“或”(OR)关系?

在views中,如果有多个filters,默认多个filters之间的关系是“与”(AND),请问能不能使用“或”(OR)关系?

      比如 (条件A满足 OR 条件B满足) AND 条件C满足 ,这样的。
 
对于Views2,filter之间是与的关系,这是无法改变的.不能够使用或.
如果你想使用"或",那么可以尝试一下arguments,argument其实作用和filter非常类似,也能够起到过滤得作用,而arguments里面支持PHP代码,所以可以实现“或”关系。
 

Drupal版本:

在一个模块中 使用了 drupal_set_title() 怎么所有页面 都成了 这个title了?

小权<> 21:57:57
在一个模块中 使用了  drupal_set_title() 怎么所有页面 都成了 这个title了?
葛红儒(55381091) 21:58:26
你在模块的什么位置设置的
小权<> 21:58:50
'title callback' => 'user_news',
葛红儒(55381091) 21:58:53
通常在返回的页面
小权<> 21:59:05
title callback
葛红儒(55381091) 21:59:16
你用错地方了
小权<> 21:59:35
function user_news(){
drupal_set_title('<center>帐户创建确认</center>');
}
葛红儒(55381091) 21:59:40
drupal_set_title(),应该在一个页面回调函数中调用
小权<> 22:00:01
不是title回调
葛红儒(55381091) 22:00:13
通常很少用'title callback'的
葛红儒(55381091) 22:00:26
对,不是title回调
葛红儒(55381091) 22:00:43
title回调,我在项目中,可以说从来没有用过
葛红儒(55381091) 22:01:00
只是在翻译开发指南的时候,学习了一下
小权<> 22:01:07
哦,可以了,呵呵
 

Drupal版本:

如何使用views列出带有重点项的列表

我们经常看到这样的列表,有10项,前一项或者前3项显示的内容不同于后面的几项.这种列表也可以使用views实现,但是通常需要两个views.

我看了你给的那个网站,像这样的我还是不会弄
Linuser 20:41:22
你可以为这种类型的文章添加一个图片字段
 
drupal 20:41:47
这我会
Linuser 20:42:16

对第一篇文章,取标题和图片
 
Linuser 20:42:29
剩下的九个取标题就可以了
 
Linuser 20:42:39
使用两个views
 

Linuser 20:43:01
或者一个view取10个标题
 
Linuser 20:43:10

一个view取一个图片
 
Linuser 20:43:17

或者使用一个view
 
Linuser 20:43:25
图片做成静态的
 
Linuser 20:43:46
好像就这3种方式了
 
Linuser 20:46:11
使用两个view的时候,
 
Linuser 20:46:22

一个view是页面形式的,
 
Linuser 20:46:36
一个view是attachement形式的
 
Linuser 20:47:02

也就是它作为一个附件的形式附加到另一view上
 

drupal 21:05:48
页面形式,怎么放到首页上啊
drupal 21:05:56
区块不行吗
Linuser 21:06:20
区块应该也可以
 

Drupal版本:

如何实现日志访问密码类似功能?

drupal 19:59:16
看到别人的那些博客上都有那个日志访问密码

drupal 19:59:19
那个怎么弄啊
Linuser 20:00:37

打不开图片
drupal 20:00:59

http://eblog.cersp.net/userlog27/191386/archives/2008/877680.shtml
Linuser 20:01:58

打不开
Linuser 20:02:09

这个需要简单的定制
 

Linuser 20:02:14
没有现成的
drupal 20:02:21

drupal 20:02:29
能不能写个函数啊
Linuser 20:02:39

需要写个模块
drupal 20:02:48

Linuser 20:02:49
来做这样的事,
drupal 20:02:57
又要写模块
Linuser 20:03:02

可能还没有这样的模块
drupal 20:03:09

Linuser 20:03:24

至少Drupal是可以实现的,
Linuser 20:03:37

就是没有现成的,有时
drupal 20:03:40
难吗
Linuser 20:03:53
没什么用
Linuser 20:03:58
的功能
drupal 20:04:04
呵呵
Linuser 20:04:29

你要做这样的站点,其实直接使用wordpress就可以了 
Linuser 20:04:54
wordpress应该有现成的
drupal 20:04:55
不是,我看到那个日志访问密码
Linuser 20:05:28

我见过,QQ空间就有
drupal 20:07:53
编写这样的模块
drupal 20:07:55
难吗
Linuser 20:11:18
不难得
drupal 20:11:46
你给个思路
Linuser 20:13:16

使用nodeapi
Linuser 20:13:34
在节点显示的时候,检查
Linuser 20:13:52
这个节点是否需要密码,需要,则让用户输入
drupal 20:14:05

Linuser 20:16:44
比较好的办法就是这样
Linuser 20:17:06
不过还需要,设计数据库,存放密码
drupal 20:17:23

drupal 20:18:02
需要哪些文件呢
drupal 20:18:16
rizhifangwen.info
drupal 20:18:27
rizhifangwen.module
Linuser 20:20:19
rizhifangwen.install

Linuser 20:20:36
不过还是比较难的
Linuser 20:20:43
这样的功能
drupal 20:20:49
这个用来安装数据库吗
Linuser 20:20:53

Linuser 20:21:02
需要用来存储密码
Linuser 20:21:19

你不要老想这些细节的问题
drupal 20:21:35
呵呵
Linuser 20:21:36

很麻烦,也不实用
drupal 20:22:07
我看到那个功能挺有趣的所以,就想在drupal里实现它
drupal 20:22:10
呵呵
drupal 20:22:38
没想到总是那么难
drupal 20:22:41

Linuser 20:23:07
说难也不难,
Linuser 20:23:26
你可以尝试一下,自己写个模块解决它
drupal 20:23:32
对你来说当然不难了
drupal 20:24:23
要弄个设置密码的表单是吗
Linuser 20:24:44

Linuser 20:24:58

有个学生,要做一个很复杂的系统,
Linuser 20:25:25
他老板说,3个月搞不定,工资减半
Linuser 20:25:35
他就搞定了
drupal 20:25:35
呵呵
drupal 20:27:36
使用nodeapi
Linuser  20:13:34
在节点显示的时候,检查
你能给大概的框架吗
Linuser 20:28:20
我帮你找找
Linuser 20:30:17

http://drupal.org/project/premium
Linuser 20:30:27
你模仿一下这个模块

Linuser 20:30:39
原理一样的
 

 
premium模块,在控制节点访问上面,为我们提供了另一种解决办法,这种办法才用Nodeapi的形式,实战中经常用到。我记得以前在文章中提到过这个模块。

Drupal版本:

如何给自建的分类添加字段呢?

老大好啊,
Ubercart的Catalog分类的术语有个IMAGE字段,
而自建的却没有,

如何给自建的分类添加字段呢?
 

参考解答: 

Drupal6不能自动支持这一点,Drupal7可以自动支持这一点.
 

在Drupal6中,有个第3方模块 术语字段(term fields)解决了这个问题, 下载地址 http://drupal.org/project/term_fields

这个模块的作用,就是为了能够向term添加字段,类似于向节点类型添加字段.不过过功能没有CCK强大,对于文件的支持仅限于file id.显示的时候需要自己去定制主题外观。

 

Drupal7的FieldAPI完美解决了这样的问题。

Drupal版本:

如何让,这个词汇表的术语,显示为多个CHECKBOX,而不是一个多选框呢?

我定义了一个词汇表,里面有几个术语
设置了 多重选择,

在添加节点的时候,如何让,这个词汇表的术语,显示为多个CHECKBOX,而不是一个多选框呢?
 

参考解答:

Drupal默认好像就支持多选框吧,你可以定制一下,把多选框隐藏,自己定义一个Checkboxes.你可以参考一下这段代码,http://drupal.org/node/84286 ,改造为checkboxes的.

 

这里的代码是drupal4.7的,需要改造一下,根据Drupal6的表单API。总之,需要写模块的这里。

<?php
function test_form_alter($form_id, &$form) {
  if (isset(
$form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
    if (
is_array($form['taxonomy'])) {
      foreach (
$form['taxonomy'] as $vid => $taxonomy) {
        if (
is_numeric($vid)) {
          if (
$taxonomy['#multiple']) {
           
$form['taxonomy'][$vid]['#type'] = 'checkboxes';
          }
          else {
           
$form['taxonomy'][$vid]['#type'] = 'radios';
           
$form['taxonomy'][$vid]['#default_value'] = $form['taxonomy'][$vid]['#default_value'][0];
          }

          unset(

$form['taxonomy'][$vid]['#theme']);
          if (
$form['taxonomy'][$vid]['#options'][0]) {
            unset(
$form['taxonomy'][$vid]['#options'][0]);
          }
          else {
           
$form['taxonomy'][$vid]['#required'] = TRUE;
          }
         
$form['taxonomy'][$vid]['#prefix'] = '<div class="taxonomy-form">';
         
$form['taxonomy'][$vid]['#suffix'] = '</div>';
        }
      }
    }
  }
}
?>

 

Drupal版本:

如何阅读一本技术书籍

学员里面的人经常问,如何才能学好Drupal,这个很难回答,就像如何学好英语一样,只要你花足够的时间了,你就能够学会,当然,如果有人加以指导,确实能帮助你节省一点时间.

学习技术,我的建议是囫囵吞枣,尤其是阅读技术数据,自从从事软件开发和技术工作以来,其实是读过很多书的.特别是技术书籍,读书是掌握一门技术的最佳途径.

一定要读一些好书.我以前学习JAVA的时候,就读了很多书,hibernate,spring的,ant,struts的,当然还有很多其它,那个时候,以为一辈子都要做JAVA的,

世面上的书籍很多,买一本比较好的,或者说是相对比较经典的。很多技术人员不愿意读中文的技术书籍,或许他们有他们的道理,我是读中文书籍的,大多数的技术书籍,我读的都是中文的,说真的,读中文的技术书籍,速度至少是英文的5倍,至少不需要语言关。即便是我认为英文,技术都比较厉害的人,他们也认为阅读英文的技术书籍,比中文的,需要花费多出2,3倍的时间。

 

英文的技术文章,当然是需要读的,包括技术书籍,也是认真的读过很多的,印象最深的是JAVA编程思想的英文版,我看了很多遍,感觉进步很慢,但是能够帮助学习英文的技术术语。

一个比较关键的就是读书的速度,一本600页的中文技术书籍,对于一个技术人员,没有接触过的技术人员,应该能够在2天内读完的。这是我一再鼓吹的一个观点了,我也见过很多技术方面的高手,真的,对于技术文档的阅读速度,真的是衡量一个程序员是否优秀的一个方面。

当然不能用这样的标准去要求所有的人。

Drupal版本:

如果想实现直接在页面修改内容并保存,可能吗?

  • yuhe
     

    2009-09-04 11:50:38

    如果想实现直接在页面修改内容并保存,可能吗?

  • yuhe
     

    2009-09-04 11:51:03

    比如说List页面上面有下拉菜单,选择以后保存

葛红儒 (55381091)
 

2009-09-04 11:51:25

没有明白

  • yuhe
     

    2009-09-04 11:51:27

    而不是点开node,编辑

  • yuhe
     

    2009-09-04 11:51:43

    说的不明白,

  • 葛红儒 (55381091)
     

    2009-09-04 11:51:57

    我大概猜到你想实现什么

  • 葛红儒 (55381091)
     

    2009-09-04 11:52:13

    有现成的模块,或者类似的,适用ajax的

  • yuhe
     

    2009-09-04 11:52:21

  • 葛红儒 (55381091)
     

    2009-09-04 11:52:40

    可以编辑的表格

  • 葛红儒 (55381091)
     

    2009-09-04 11:52:48

    自动保存

  • yuhe
     

    2009-09-04 11:52:55

    这个表中的名字和制作状态,在这个页面直接编辑,而不用到NODE

  • 葛红儒 (55381091)
     

    2009-09-04 11:53:22

    你找找吧,我印象中见过有这样的模块,但是没有用过

 

yuhe
 

2009-09-04 11:53:36

哦,明白

  • yuhe
     

    2009-09-04 11:53:44

    感谢老大指路

  • 葛红儒 (55381091)
     

    2009-09-04 11:54:06

    这个不是很难的问题,

  • yuhe
     

    2009-09-04 11:54:16

    那就好

  • yuhe
     

    2009-09-04 11:54:28

    单位要用,呵呵

  • yuhe
     

    2009-09-04 11:55:11

    吃饭!

  • yuhe
     

    2009-09-04 11:55:49

    老大,你要是在西安,我天天请你吃饭,哈哈

  • 葛红儒 (55381091)
     

    2009-09-04 11:56:19

    谢谢了

  • 葛红儒 (55381091)
     

    2009-09-04 11:56:36

    http://drupal.org/project/editview

  • 葛红儒 (55381091)
     

    2009-09-04 11:56:52

    我记得有一个跟你需求一样的模块

yuhe
 

2009-09-04 12:09:10

哇~!天助我也。一会儿试试。感谢老大。老大万岁!

  • yuhe
     

    2009-09-04 14:36:51

    哇~!老大!实现了!

  • yuhe
     

    2009-09-04 15:16:54

    加上模块就可用。在样式里面设置成editview就好了

  • 葛红儒 (55381091)
     

    2009-09-04 15:17:27

    发现Drupal的强大了吧

  • yuhe
     

    2009-09-04 15:17:59

    这个早知道,就是还不清楚Drupal强大到如此细致的地步

  • yuhe
     

    2009-09-04 15:18:05

    领教了

问题总结:

yuhe想实现实时编辑,实时保存的功能,我推荐了http://drupal.org/project/editview ,方便得解决了问题.

Drupal版本:

学习1万个模块,不如掌握一些基本的drupal模块

老虎说,他想用两个月的时间,学习Drupal 1万个模块.我觉得这个不现实,也没有太多的用处.

QQ群相关记录

  • 泰山老虎 (372948992)
     

    2009-08-22 21:10:40

    花2个月的时间把这一万多个模块 仔细看一遍

  • 泰山老虎 (372948992)
     

    2009-08-22 21:11:09

    老葛在深圳如何

  • 葛红儒 (55381091)
     

    2009-08-22 21:12:04

    在深圳感觉一般,学习1万个模块,不如把基本的模块用好了

  • yuhe (914175392)
     

    2009-08-22 21:12:39

    找到了,感谢

  • 葛红儒 (55381091)
     

    2009-08-22 21:12:42

    核心的模块和常用的模块,这些要熟悉,领域的模块

  • 泰山老虎 (372948992)
     

    2009-08-22 21:12:48

    哦 对 哈哈 我发现就是CCK views这些还没开始学呢

  • 葛红儒 (55381091)
     

    2009-08-22 21:12:57

    不客气

  • 泰山老虎 (372948992)
     

    2009-08-22 21:13:35

    不过先把这些模块看一遍 看看人家都做到哪些功能了

  • 葛红儒 (55381091)
     

    2009-08-22 21:14:09

    我以前就把所有的模块都看了一遍,没有效果

Drupal版本:

实现Drupal首页的多语言

首页可以创建一个page-front.tpl.php
 

  • yuhe
     

    2009-09-02 22:33:50

    的确获益不浅

  • 葛红儒 (55381091)
     

    2009-09-02 22:34:21

    在page-front.tpl.php中写个if语句

  • yuhe
     

    2009-09-02 22:34:31

  • 葛红儒 (55381091)
     

    2009-09-02 22:34:41

    当中文的时候,输出中文,日文的时候输出日文

  • 葛红儒 (55381091)
     

    2009-09-02 22:34:58

    当当前语言为中文时

  • 葛红儒 (55381091)
     

    2009-09-02 22:35:11

    写很多if语句就可以了

  • 葛红儒 (55381091)
     

    2009-09-02 22:35:32

    你把这段话记下来,对你有用

  • yuhe
     

    2009-09-02 22:35:43

    了解,记下了

     

参看解答:

首页可以使用单独的页面模板文件,在这个页面模板文件中,有时候为了省事,常常写PHP逻辑代码,比如上面所说的if语句.这样可以方便的解决首页多语言的问题.

Drupal版本:

对于Drupal的论坛节点,如何只为部分人显示标题,不显示正文

问题: 2010/2/6  20:04:19  xueyuan  howard.ge  能不能对主贴 的node进行一些改装,让它可以带很多的其他属性,然后对这个node 进行access 控制
2010/2/6  20:04:33  xueyuan  howard.ge  因为,对node access的模块好像有
2010/2/6  20:05:51  howard.ge  xueyuan  可以写个模块,专门的进行控制
2010/2/6  20:05:58  howard.ge  xueyuan  不过比较麻烦 
2010/2/6  20:06:13  howard.ge  xueyuan  比如说实现只有回帖的人才能看贴 
2010/2/6  20:06:21  howard.ge  xueyuan  是可以实现的, 
2010/2/6  20:07:19  howard.ge  xueyuan  只需要在节点模块里面加上判断就可以了, 
2010/2/6  20:07:34  howard.ge  xueyuan  这个判断可以放到template.php里面 
2010/2/6  20:21:28  xueyuan  howard.ge  恩,我就想把帖子的标题露出来,大家可以看到
2010/2/6  20:21:49  xueyuan  howard.ge  回帖和看帖子的内容,只有几个人可以做就行了
2010/2/6  20:22:00  xueyuan  howard.ge  可以通过用户名,或者角色控制就行

解答:
2010/2/6  20:22:53  howard.ge  xueyuan  可以的, 
2010/2/6  20:23:06  howard.ge  xueyuan  需要在节点模板上写段代码 
2010/2/6  20:24:04  howard.ge  xueyuan  比如你允许哪些角色看,允许的角色为B集合 
2010/2/6  20:24:18  howard.ge  xueyuan  用户具有的角色为A集合 
2010/2/6  20:24:27  howard.ge  xueyuan  那么你需要写个判断语句 
2010/2/6  20:25:09  howard.ge  xueyuan  判断A集合众的每一个元素,是不是存在一个属于B集合的
2010/2/6  20:25:19  howard.ge  xueyuan  如果存在返回真,就可以了 
2010/2/6  20:27:15  howard.ge  xueyuan  把这段逻辑,放到template.php里面,然后在对应的节点模板里面调用这个函数就可以了 
2010/2/6  20:27:35  xueyuan  howard.ge  恩,看来你思路挺好

Drupal版本:

小公司通常选用开源技术,比如Drupal

  • 很多小公司,是最早采用Drupal技术的.作为开源的技术,很多小公司,小团队是最早拿Drupal赚钱的,通过给国外的客户做网站.
    Drupal对多语言的支持是比较优秀的,也是很多其它CMS不能比拟的,这就是为什么很多外包公司,外贸公司采用Drupal技术的缘故.
     
    yuhe (914175392)
     

    2009-08-22 21:42:12

    哎!没有用Drupal啊

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:42:35

    恩,那时候不会用呢 后来有次去找工作,老板问会不会开源cms

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:42:41

    额,不会 @ @ 给刷了 55

  • yuhe (914175392)
     

    2009-08-22 21:42:44

    卖木头的

  • yuhe (914175392)
     

    2009-08-22 21:43:05

    哦?现在老板都知道开源CMS了?

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:43:18

    哦,他本身也是搞技术的

  • yuhe (914175392
yuhe (914175392)
 

2009-08-22 21:43:37

船小好调头

  • 葛红儒 (55381091)
     

    2009-08-22 21:43:55

    是啊,现在很多小公司都使用开元的CMS

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:44:03

    恩那,我这没大公司 而且刚毕业,一般都是先找小公司
     

  • yuhe (914175392)
     

    2009-08-22 21:44:16

    我觉得倒不是支持开源,而是因为免费吧,呵呵

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:44:16

    恩,他们是用drupal来帮别人做网站

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:44:28

    效率比较主要

  • 葛红儒 (55381091)
     

    2009-08-22 21:44:31

    Drupal对外外包是很不错的

  • yuhe (914175392)
     

    2009-08-22 21:44:47

    是啊,我也有这个打算

  • 葛红儒 (55381091)
     

    2009-08-22 21:44:51

    很多网站都需要多语言

  • yuhe (914175392)
     

    2009-08-22 21:45:03

    但是高技术和做老板完全是两个领域,呵呵

Drupal版本:

怎么学习Drupal主题

很多学员都会问到的问题,因为对于大多数接触Drupal的人来说,首先打交道的就是修改Drupal的默认外观,这就涉及到Drupal的主题了。

zhupou.cn提供的资源有:http://zhupou.cn/theme-guide-drupal-6http://zhupou.cn/node/1043 Drupal专业开发指南的主题系统一章。

熟悉常用的模板文件,熟悉主题info文件中每一项的含义,熟悉常见模板变量,熟悉模板建议(模板覆写机制),然后是尝试着在template.php中编写一些自定义的函数,在模板文件中可以调用这些函数。在template.php中覆写一些其它模块的主题函数。接着就是在模板文件中,使用PHP代码,编写IF语句,比如

if(分类页面为真) then include 分类页面模板文件;

最后是了解Drupal的预处理函数,编写预处理函数,通常大多数人用不到这些知识,而且比较难懂。

学员问题:

潇翔() 19:13:30
有主题的教程没,现在在看这个,下载的东西里好像这方面的东西少呀
葛红儒(55381091) 19:34:49
你在 主体制作的哪方面有问题
葛红儒(55381091) 19:34:56

还是都不大懂
潇翔() 19:40:09
这两天在认真看主题,正在看。
潇翔() 19:40:17
已经有了些了解
葛红儒(55381091) 19:41:30
还有哪些不会
潇翔() 19:41:52
现在学习中,看的是些英文的书,边看边实践,主要是对一些变量的形成还不太懂

drupal首页的模板要如何定义
Linuser 22:44:20
通常自己创建一个page-front就可以了
Linuser 22:44:31
然后在里面硬编码

Linuser 22:45:44
然后可以在template.php里面编写一些输出函数
潇翔 22:45:57
分类的模板文件要如何命名?
Linuser 22:46:00
在模板文件中调用这些函数就可以了
Linuser 22:46:19
分类的,可以使用Drupal路径
潇翔 22:47:06
drupal路径?不太明白
Linuser 22:47:06
实在不行就写一些if语句,加上iinclude
Linuser 22:47:12
内部路径
潇翔 22:48:19
要如何写呢,不太明白
Linuser 22:49:17
你看过开发指南的主题系统一章了没有
Linuser 22:49:38
看看Drupal自带的机制能否解决你的问题,通常是可以的
潇翔 22:49:57
没看,里面有吗?
Linuser 22:49:59

潇翔 22:50:17
好,我先认真看看
Linuser 22:50:16
http://zhupou.cn/theme-guide-drupal-6
Linuser 22:50:28
通常能够解决大部分问题
Linuser 22:50:54
你主要做主题开发,还是模块开发?
潇翔 22:51:31
现在主要还是在看主题,模块开发现在还没有看
Linuser 22:52:01
主题是这样学习的,
Linuser 22:52:05
实践
Linuser 22:52:19
先学习页面模板中的常见变量
Linuser 22:52:26
接着是节点模块
Linuser 22:52:51
然后学习模板建议机制,也就是模板覆写
潇翔 22:53:04
是呀,这两天都在看主题的东西
Linuser 22:53:17
最好是找一个现成的主题,比如garland主题
Linuser 22:53:23
作为例子
Linuser 22:53:33
照抄照搬,就可以了
潇翔 22:54:03
嗯,现在也是在拿一个例子来练习
Linuser 22:54:18
接着,可以学习在template.php写一些硬编码式的函数,直接在模板文件中输出
Linuser 22:54:57
然后可以使用hard coding的方式,解决一些常见的问题,比如你所说的分类的模板
Linuser 22:55:22
最后再学习Drupal的预处理机制,
Linuser 22:55:35
覆写一些预处理函数
 

 

 

Drupal版本:

怎么用user_save更新用户信息呢

问题:

牧草人(582634658) 10:34:56
怎么用user_save更新用户信息呢
【提示:牧草人()正在使用WebQQ:http://web.qq.com/?w

解答:
Formalin() 11:08:22
$result = user_save($user, $new_user);
Formalin() 11:08:45
第一个是你的已有用户,第二个是你修改后的用户数组信息

 

不仅我帮助解答学员的问题,已经很厉害的学员,有空的时候也会帮助新来者解答问题.

Drupal版本:

想问有没有办法把views页面导出到excel,刚发现有一个views excel export 模块?

yuhe
 

2009-09-02 10:26:49

想问有没有办法把views页面导出到excel,刚发现有一个views excel export 模块。该模块虽然还在完善当中,先下来看看。感谢老大。 

 

参考答案,

可以采用Views bonus pack里面的导出功能,里面包含了导出CSV格式的.数据导入导出是件比较麻烦的事情.

当处理Excel数据与Drupal的导入导出的时候,记住一点,数据的格式.Drupal支持的是UTF-8,这个格式在Excel中不支持。

Excel另存为的文本文件,需要重新保存为Unicode的格式。

格式的转换可以通过记事本的另存为实现。

 

Drupal版本:

我下载了,lightbox2模块,可cck图片字段不能起作用

我下载了,lightbox2模块,可cck图片字段不能起作用:

 

我有一个节点类型,默认是不出现lightbox的
这是图片字段的显示方式:
 
注意这里:
是可以调整的:
 
我修改为了:
保存.
这时:
访问刚才的节点:
出现了lightbox效果。

Drupal版本:

我对汉化包的兴趣到不大,据说汉化后DRUPAL性能损失很严重?

xxxxxx 20:54:43
我对汉化包的兴趣到不大,据说汉化后DRUPAL性能损失很严重?
Linuser 20:54:54
也不是很严重
Linuser 20:55:08
开启缓存后,
Linuser 20:55:19
汉化对性能基本上没有影响
 

很多人做过测试,加了汉化包以后,Drupal的性能降低了很多,Drupal对于字符串的查找替换严重影响了性能.这种测试是科学的,但是也是非常片面的,就像瞎子摸大象一样.网上流行着一片很有名的文章,而且刊登在了程序员这样的杂志上了.里面好像就提到了汉化对Drupal性能的影响,遇到很多程序上的元老级的人物,他们很多也持这种态度.

这种观点是很片面的,它仅仅是考虑了Drupal在处理一个完整页面请求周期,这一前提的下数据.但是在现实中,Drupal提供了N多的缓存措施,能够从完整页面请求周期中多个不同阶段,返回页面,只要稍微的改进一下缓存,上面的影响就会降到接近于0了.

对于一个页面,加了汉化包,所有的影响就是这个页面第一次生成的时候,必不加汉化包慢了40%,但是在接下来的100次,1000次,10000次请求中,用户得到的仅仅是一个缓存了的页面,对于缓存了的页面,前面有没有汉化,其实这个时候一点影响都没有了. 0.4除以100,或者1000,这个数字相当小了,完全可以忽略不计.所以,在实际中,加了汉化包,对于性能来说,影响可以忽略的.

有人可能会觉得,我说的是匿名用户情况下,现实是这样的,匿名的用户永远多于注册用户.

如果还说注册的用户呢?还有其它的缓存技术,是专门用于注册用户的,加了这些缓存措施,仍然可以把汉化带来的损失可以忽略.这就好比Drupal的模块列表页面,访问起来非常慢,但是这个页面的访问频率,非常低,开发人员不能因为我在开发Drupal的时候,经常需要访问这个页面,而认为,普通用户也会经常访问这样的页面,这种担心是很多余的.

通常持这种观点的人,都是那种在PHP,Java或者.net,很厉害的高手,学了Drupal一个月,就得出了上面的结论,一句话,他们根本就不懂Drupal,瞎子摸大象,只摸到了一个尾巴,就说大象的腿原来只有这么粗阿.

 

Drupal版本:

我有个问题呢 大家谁知道,用zend studio怎么建自定义的lib呢

总结实现了如何创建一个自定义lib,实现Drupal的代码补全工作。这个是学员实现的。这里知道这个是可行的就好了。
目前针对Drupal的开发工具比较少,什么时候有专门的针对Drupal的开发工具就好了。
 
 
ずッ哀ぁい (342542546)
 

2009-08-22 21:20:12

我有个问题呢 大家谁知道,用zend studio怎么建自定义的lib呢

目的是为了使用zs的代码补全功能

  • 葛红儒 (55381091)
     

    2009-08-22 21:20:49

    这个我不会

  • 葛红儒 (55381091)
     

    2009-08-22 21:21:21

    Eclipse上有代码补全功能吧,

  • yuhe (914175392)
     

    2009-08-22 21:21:30

    听不懂

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:21:46

    对,但是没有针对drupal

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:22:17

    我想把drupal里面用到的函数文件,包含到里面

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:22:58

    我试了下,好像在project下建个.library文件就好

    可是,还是有些变量不会自动提示

ずッ哀ぁい (342542546)
 

2009-08-22 21:23:13

文件夹..不是文件 恩

  • 葛红儒 (55381091)
     

    2009-08-22 21:23:16

    他的意思是说,drupal_get

  • 葛红儒 (55381091)
     

    2009-08-22 21:23:48

    输入后,系统会提示,drupal_get_message这样的一个函数

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:23:55

    恩,这个会

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:24:15

    就是,有的变量.$content 什么有 $head_title有,但没$head

  • 葛红儒 (55381091)
     

    2009-08-22 21:24:42

    我是不是说错了,

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:24:47

    没错呢

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:24:50

    就是这意思

  • 葛红儒 (55381091)
     

    2009-08-22 21:25:47

    Drupal、里面好像没有这样的工具,

  • 葛红儒 (55381091)
     

    2009-08-22 21:26:06

    代码提示,

 

Drupal版本:

我翻译的,编写的东西有版权么?

自从从事Drupal工作以来,无论是在eskalate全职工作的时候,还是自己作为自由职业的时候,先后翻译整理了大量的Drupal中文资料,这些资料很多是翻译Drupal.org上的,很多是翻译开发指南的,也有不少是自己整理编写的。这些东西我是否拥有版权呢,问过一些朋友,他们大多数说,放到网络上的都是没有版权的。但是yule告诉我说,凡是通过劳动创造的,都是有版权的。

最近,因为业务全部移到西安了。所以我打算学习一下,然后用Drupal做一个协作网站

  • ずッ哀ぁい (342542546)
     

    2009-08-22 22:09:50

    恩~ 我先下了呢 很高兴认识你们 :) good night

  • yuhe (914175392)
     

    2009-08-22 22:10:07

    现在,西安的Drupal环境还不好。我公司底下有个培训学校。现在一直停滞着呢。我想,有一天购买老葛的版权,做Drupal类的培训

  • yuhe (914175392)
     

    2009-08-22 22:10:19

    认识你,我也很高兴,晚安

  • yuhe (914175392)
     

    2009-08-22 22:11:05

    关键是知识产权在国内比较难弄,要想个比较好的办法来搞

  • yuhe (914175392)
     

    2009-08-22 22:11:13

    呵呵,话题远了

  • yuhe (914175392)
     

    2009-08-22 22:11:44

    现在,西安开始有PHP培训了,大约是从去年开始的。我想,Drupal也就不远了。

  • 葛红儒 (55381091)
     

    2009-08-22 22:11:52

    我的有版权么

  • yuhe (914175392)
     

    2009-08-22 22:12:10

    有啊,有劳动就一定有版权

  • 葛红儒 (55381091)
     

    2009-08-22 22:12:29

    我不知道翻译的东西有多少版权,

yuhe (914175392)
 

2009-08-22 22:12:51

问律师吧,哈哈

  • 葛红儒 (55381091)
     

    2009-08-22 22:12:52

    我把一些东西放到网上,就没有版权了,是不是

  • yuhe (914175392)
     

    2009-08-22 22:13:02

    未必

  • yuhe (914175392)
     

    2009-08-22 22:13:53

    老葛,你的影响力越来越大了。现在唯一能做的是在你的作品上留下自己的名字,进一步扩大知名度

  • yuhe (914175392)
     

    2009-08-22 22:14:35

    我觉得,Drupal发展的时机,在国内还没有到。等到到了,就是老葛你收获的时候了

  • 葛红儒 (55381091)
     

    2009-08-22 22:15:38

    嗯,

很多时候,我是想靠我翻译,整理得资料卖钱的,实际上,这个不但没有赚钱,还亏空了不少。唯一的好处就是有了一点点知名度。如果这些东西能够给我带来收益,我真的就不用东奔西走了。

Drupal版本:

是否可以可以在DRUPAL里建立很多文件夹,实现批上传

学员问题:

可以在DRUPAL里建立很多文件夹
可以批上传
文件
批上传文件后 可以检索 最好做到全文检索
 

答疑:

Linuser 20:33:27

用其他软件处理批上传的
Linuser 20:33:51

因为PHP最大允许商船的程序有限制的

Linuser 20:33:27

用其他软件处理批上传的
Linuser 20:33:51

因为PHP最大允许商船的程序有限制的
泰山老虎 20:33:54

Linuser 20:34:00

很多网站只有2M
泰山老虎 20:34:12

Linuser 20:34:13
大一点的,16M
泰山老虎 20:34:17
这个是内部网用
Linuser 20:34:23

再大就不合适了
泰山老虎 20:34:30
不用考虑内存大小 只要能上传上去

Linuser 21:01:30
文件这个处理为节点
Linuser 21:01:39
文件夹可以处理为分类

Linuser 21:01:59
文件夹的创建使用http://drupal.org/project/filefield_paths
Linuser 21:02:29
可以设置根据节点的分类创建文件夹结构

Linuser 21:04:18
而文件的转移,则可以自定义模块实现

总结:Drupal,基本可以实现这样的功能,文件夹可以处理为分类,文件可以处理为节点,使用filefield_paths根据节点的分类创建文件夹结构,而文件在文件夹的转移,则可以通过自定义模块实现。而对于对上传文件内容的索引,我没有想到很好的办法,不过可以把文件的简介存放到节点的正文中,作为文件的描述。以及为文件添加元数据。这只是我的大致的思路。

 

 

 

 

Drupal版本:

用户状态改变时,不发送电子邮件

问题描述:

我想问下的Drupal 中当用户的状态(Active,Blocked)发生改变时,会向用户发送一个Email,这个是Drupal 中的触发器产生的吗?怎么让Email 不发出去,谢谢!
 

解答:

可以在admin/user/settings ,找到帐户激活电子邮件,在其下面有一个复选框"帐户激活时通知用户" ,取消选中就可以了.
 
Linuser 21:36:14
可以在这个页面,配置是否发送电子邮件通知
 

用户选择选择自定义次数之外的选项时,下面的自定义次数不可用,如何实现?

用户选择选择自定义次数之外的选项时,下面的自定义次数不可用

  • Formalin
     

    2009-08-31 16:41:19

    比如现在这个状态下边的textfield就应该不可用,出了些js之外,drupal能解决么?

  • 葛红儒 (55381091)
     

    2009-08-31 19:10:01

    这个应该使用jquery吧

  • 葛红儒 (55381091)
     

    2009-08-31 19:10:20

    在Drupal里面,这样的问题就是用jQuery解决的

     

    这样的问题,在实际的项目中也非常常见,就是使用jquery控制特定表单元素的显示,比如说一个单选按钮,最下面有个其它选项,选了这个出现一个文本字段.

    这样的问题,最好用jquery实现。用来控制特定元素的显示与隐藏。当然,在你提交的逻辑中,你也需要做出相应的判断。如果用户选择的“其它”,那么把显示的文本字段中输入的内容,读取出来,并用它来替换“其它”选项。当然,这里需要根据你的实际去写逻辑了。

Drupal版本:

知不知道php5.2较5.14有哪些升级

  • Drupal支持的PHP版本,对于Drupal,最好使用PHP5,具体一点就是最好使用PHP5.2。
    很多模块都涌到了PHP5.2中特有的函数。比如date模块,里面用到的函数,只有5.2有,我们把搭好的网站迁移到别的地方,就出现函数找不到的错误。
     
     
    ずッ哀ぁい (342542546)
     

    2009-08-23 13:03:46

    老葛,知不知道php5.2较5.14有哪些升级

  • ずッ哀ぁい (342542546)
     

    2009-08-23 13:04:05

    好像5.2要配apache 2.2+版本吧

  • 葛红儒 (55381091)
     

    2009-08-23 13:07:40

    我不知道,不过

  • 葛红儒 (55381091)
     

    2009-08-23 13:07:53

    很多图片处理模块需要php5.2

  • ずッ哀ぁい (342542546)
     

    2009-08-23 13:08:07

    恩,我去看下changelog

  • ずッ哀ぁい (342542546)
     

    2009-08-23 13:08:12

    看看有哪些升级

  • 葛红儒 (55381091)
     

    2009-08-23 13:08:12

    php5.14不支持

Drupal版本:

老大 http://127.0.0.1/civicrm/event/info?reset=1&id=4这个url地址中的http://127.0.0.1/用什么函数替换比较好啊

  • 牧草人
     

    2009-09-04 11:19:37

    老大 http://127.0.0.1/civicrm/event/info?reset=1&id=4这个url地址中的http://127.0.0.1/用什么函数替换比较好啊

  • 牧草人
     

    2009-09-04 11:19:51

    使得不论什么域名都能正常访问

  • 葛红儒 (55381091)
     

    2009-09-04 11:20:30

    base_path

  • 葛红儒 (55381091)
     

    2009-09-04 11:20:37

    base_path()

  • 牧草人
     

    2009-09-04 11:20:45

    奥 晓得了 3Q

     

    问题总结:

    base_path()函数的使用,获取网站根路径。这样的问题,其实是大家对于常用的Drupal钩子不熟悉的原因,常去api.drupal.org上看看,会有用的。

Drupal版本:

老大,Drupal站点很长时间不运行cron,会怎么样?

  • yuhe
     

    2009-09-02 21:35:12

    老大,Drupal站点很长时间不运行cron,会怎么样?

  • yuhe
     

    2009-09-02 21:35:56

    我的一个站,很久没运行,现在好像数据库出问题了。也登录不进去,有没有办法搞? 

     

    参考答案:

    poormanscron ,通常使用这个模块就可以了.

    Drupal7好像自带了这个模块的功能.很多人不会设置服务器端的cron,我也不会.

    Drupal中的定时任务很重要的,很多操作是通过hook_cron实现的。包括对垃圾数据的处理,如果不运行cron,垃圾数据会越来越多,就会出现yuhe所说的问题。

Drupal版本:

老大,如果没有root权限,就没办法删除sites里面的setting.php了?那就是说我的虚拟主机里面的测试站点,还需要管理员帮忙删除了?

老大,如果没有root权限,就没办法删除sites里面的setting.php了?那就是说我的虚拟主机里面的测试站点,还需要管理员帮忙删除了?
 

  •  

    2009-09-03 18:45:43

    yule,你自己的权限不够了,

  • 葛红儒 (55381091)
     

    2009-09-03 18:45:57

     
    可以覆盖setting.php文件吧
     
     
    参考解答:
    与Drupal相关的权限有两种,一种是服务器端的权限,由于很多用户使用的是虚拟主机,所以,可能权限不够,唯一的办法就是联系相关的主机提供商,实在不行就是更换主机提供商.
     
    Drupal站点目录下面的权限问题,常常会使Drupal本身不能正常工作,安装的时候,CSS,JS优化的时候,图片文件处理的时候,等等,特别对于那些需要写权限的操作,这个时候就需要注意权限问题了.
     
    Drupal自身的权限,就是拥护权限,这个话题大了,大家好好学习吧

Drupal版本:

老葛 怎么改变drupal form 生成的html啊 ?

  • 牧草人
     

    2009-09-02 17:03:44

    老葛 怎么改变form 生成的html啊

  • 牧草人
     

    2009-09-02 17:04:44

    form api 自动会增加很多html代码 我怎么改变这些form api 自动添加的html呢

  • 牧草人
     

    2009-09-02 17:05:43

对于form api 的答复:
theme_element函数

Drupal表单自带了很多元素的默认主题函数,这些函数是可以覆写的.另外,可以为表单元素单独的定一个主题函数,负责表单元素的输出.

在覆写原来的默认函数时,你可以直接先把原来的代码复制过来,根据自己的需求做出修改.主要就是label和input的输出.

可以100%的控制表单元素的输出的.

不过通常很少这样用,通常的解决办法是使用CSS控制.

Drupal版本:

能不能给我介绍下,这班的大概流程

很多学员报名的时候,都希望知道流程,也就是整个培训班的过程.但是由于所有的付费学员,情况各不相同.再加上我个人的原因,导致很多方面不能做到最初的承诺.
但是从整体上来看,我所提供的资源,以及向学员回答的问题,帮助大部分付费学员少走了很多弯路.因为付费学员不是很多,所以分配给每个学员的答疑时间,次数都是非常可观的.
 
培训班是我在不知道如何收钱的时候,想出来的办法,开始的初衷就是打算靠他活下去,挣点生活费.从招收的学生,来看,人数是很少的.这些学费,加到一起,可能还不如一个PHP高手一个月的薪水多.
不管怎么样,非常感谢那些付费的朋友.也希望这里的资源,能够切实的帮助大家减轻Drupal学习使用的负担.
 
ずッ哀ぁい (342542546)
 

2009-08-22 21:34:11

对了,老葛,能不能给我介绍下,这班的大概流程

  • 葛红儒 (55381091)
     

    2009-08-22 21:34:48

    我也在想这个流程

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:35:27

    恩那 有个流程就比较清晰

  • 葛红儒 (55381091)
     

    2009-08-22 21:35:29

    我刚开始想的是.培训大家写模块,发现大家都不愿意

  • 葛红儒 (55381091)
     

    2009-08-22 21:35:56

    每个人的需求都不一样,

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:36:15

    恩,可能从主题入手比较块

    模块我觉得,可以介绍一些好的模块

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:36:42

    一般drupal就是做cms,做特别定制的开发,用drupal也麻烦

  • 葛红儒 (55381091)
     

    2009-08-22 21:36:54

    以后四个月的,主要是介绍3种类型网站的,

  • 葛红儒 (55381091)
     

    2009-08-22 21:37:06

    多语言,Ubercart,社区

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:37:22

    恩 很好的概念

Drupal版本:

让IDE的代码提示功能更友好的支持Drupal

  • ずッ哀ぁい
     

    2009-08-23 21:50:55

    其实我就是图方便哈

    我问有哪些module主要也是因为,我想把这些module都放到library下

    这样代码制动完成

  • ずッ哀ぁい
     

    2009-08-23 21:51:39

    我开始看到 node_get_type 这function 没提示,我就奇怪,我都吧include里的都包括了,怎么会没提示

  • ずッ哀ぁい
     

    2009-08-23 21:52:05

    后来去找,发现,这方法是在 node.module下的,后来我才明白,原来node也是作为一个module

  • 葛红儒 (55381091)
     

    2009-08-23 21:52:15

    我不知道,我以前看到过一个高手

  • 葛红儒 (55381091)
     

    2009-08-23 21:52:31

    也不用提示的

  • 葛红儒 (55381091)
     

    2009-08-23 21:52:45

    我不知道怎么才能让IDE支持Drupal

  • 葛红儒 (55381091)
     

    2009-08-23 21:53:10

    因为Drupal的命名和其他的PHP有点不同吧

  • ずッ哀ぁい
     

    2009-08-23 21:53:25

    恩,这是的

答案整理:

这个问题我还真不知道,因为从来没有用过提示功能,不过有时候,我发现,我的ZEND studio可以支持一点点Drupal的代码提示的.代码提示在很多时候,对于程序员都是有用的.

幸运的是ずッ哀ぁい 解决了这个问题,不过没有看到答案.我记得有截图的,以后遇到同样的问题,再把解决办法放过来吧.

 

 

 

 

Drupal版本:

请问Panels 3 配置视图里的“显示种子图标”有什么作用,我勾上了也看不出那有变化(附有上下文的解释)

学员甲(176...) 21:19:27
葛老师,请问Panels 3 配置视图里的“显示种子图标”有什么作用,我勾上了也看不出那有变化。还有配置视图里的控制贴子数为什么不管用呢。

 

老葛(55381091) 21:37:56
请问Panels 3 配置视图,这里面是对视图覆写的,我也不知道为什么不起作用,最好不在这里配置,而是在views里面配置好,
老葛(55381091) 21:38:17

“显示种子图标”有什么作用 就是显示feed icon的意思
老葛(55381091) 21:38:36

如果你没有feed display那么就不起作用
 

学员甲(176...)  21:39:12
是吗?是想这里显示比如10条,点更多链接到views 里显示30条一页
老葛(55381091) 21:40:08
你可以在views里面多建几个display,其中一个比如说是block,
老葛(55381091) 21:40:36

block的显示10条,它有一个更多链接,指向page display
老葛(55381091) 21:41:05

page display是个页面显示,里面可以显示30条,

学员甲(176...)  21:41:07
只有你说这个方法比较好一些吧
学员甲(176...)  21:41:18

老葛(55381091) 21:41:40
我刚说的应该更常用一点
 
学员甲(176...) 21:43:23
明白
学员甲(176...)  21:44:17
feed display 这个是做什么用的
学员甲(176...)  21:44:29
就是rss?
老葛(55381091) 21:44:36

野放客(17643751) 21:47:12
还有配置视图里那个分页器,分页ID 是什么呢?
野放客(17643751) 21:47:27
分页器ID
老葛(55381091) 21:48:25
分页用的,具体我也没有用过
老葛(55381091) 21:48:47

我通常不在panels里面配置views
学员甲(176...)  21:49:17
只在views 就区块在panels 调用吗?
老葛(55381091) 21:49:22

分页ID 是什么呢? 可能是从哪个开发,0,1,3,4
老葛(55381091) 21:50:19

你最好装上views pane模块,可能你装了吧

 
老葛(55381091) 21:50:33

所有的view都可以在panels调用的,
学员甲(176...)  21:50:34
是说从那开始分页吗? 我看一下
老葛(55381091) 21:50:45

只要装了views pane模块
老葛(55381091) 21:50:54
可能是那样,你试试
学员甲(176...)  21:51:49
好象没装,是个单独的模块吧
老葛(55381091) 21:52:07
ctools下面的子模块
学员甲(176...)  21:52:40
Views content panes 这个启用了
老葛(55381091) 21:53:05
那就可以了
老葛(55381091) 21:53:21

就是这个,这样在panels里面可以调用任意的view 

学员甲(176...)  21:53:24
好,谢谢,我在研究研究
老葛(55381091) 21:53:45

不过通常都是调用的block和pane
学员甲(176...)   21:54:10

学员甲(176...)   22:03:10
我看到views 里的分页器ID:
 
Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible.后面没太懂
学员甲(176...)  22:03:44
是利用这个可动态控制输出条目吗?
老葛(55381091) 22:03:50
不要管它就是了
野放客(17643751) 22:04:17

老葛(55381091) 22:04:19

应该不可以吧
野放客(17643751) 22:27:10
 葛老师,搞清楚那个分页ID了,一般ID为0 url显示http://127.0.0.1/news/13?page=2  如果ID为3 url显示http://127.0.0.1/news/13?page=0,0,2 

老葛(55381091) 19:30:38

上下文,是一个比较高级的概念了,其实一个panel也可以有多个display,
我举个例子,比如用户登录后,都访问myspace这个页面,但是角色不同,希望看到的内容不同,

老葛(55381091) 19:31:15
这个时候就可以使用panels解决这个问题,创建一个page panel,路经为myspace,
老葛(55381091) 19:31:34
然后设置上下文为用户角色,
老葛(55381091) 19:32:08
然后分别为不同的角色创建多个display(变体),
老葛(55381091) 19:33:32

比如角色分为,教师角色,学生角色,那么你可以在一个panel页面创建两个变体,每个变体对应一个角色,这样就解决了这个经常让人头痛的问题了
老葛(55381091) 19:34:21
教师访问myspace页面,看到的是教师角色的变体;学生访问myspace页面,看到的是学生角色的变体。
老葛(55381091) 19:35:45

通常这样的问题需要编写模块的,而且分支多了,需要多个if语句,使用panel的上下文,就可以省去这些工作,管理起来也很方便
 

 
 

Drupal版本:

请问葛老师,FlashVideo 是需要video 才能工作吗? 我怎么弄FlashVideo页面就是出不来呢查看

请问葛老师,FlashVideo 是需要video 才能工作吗? 我怎么弄FlashVideo页面就是出不来呢
学员()  23:23:03
视频出不来,只有附件显示

葛红儒(55381091)  23:24:24
好像需要一个播放器

葛红儒(55381091)  23:24:35
我一般直接使用video模块
学员()  23:24:42
播放器放上去了

葛红儒(55381091)  23:24:50
不过里面也需要放播放器
葛红儒(55381091)  23:25:03
video 好像放上就可以了,
葛红儒(55381091)  23:25:13

FlashVideo 这个我没有用过
学员()  23:25:31
video 好象跟FlashVideo 有重复功能

学员()  23:25:57
video 设好就能用,但一开页面就播放了

学员()  23:26:31
xspf_playlist 这个播放列表也一直没弄成功

葛红儒(55381091)  23:27:15
学员()  23:25:57
video 设好就能用,但一开页面就播放了 这个可以配置吧
葛红儒(55381091)  23:27:36

xspf_playlist 这个我也从来没有用过,
学员()  23:28:35
video 没有缩更图,打开节点就是一个视频,摘要也显示一个完整 的视频
葛红儒(55381091)  23:30:44
可以自己设置一个图片字段作为多略图
葛红儒(55381091)  23:32:11

有的模块能够从视频中,提取一针作为图片,有的提取不了,
学员()  23:32:11
http://www.whitehouse.gov/photos-and-video/video/weekly-address-finishing-job-wall-street-reform  像白宫的视频需要那些模块来搭建呢,
学员()  23:32:35
是ffmpeg kc

葛红儒(55381091)  23:33:33
我不知道,
葛红儒(55381091)  23:34:00
视频就像像册一样,
葛红儒(55381091)  23:34:09
模块很多,不知道哪个好
学员()  23:34:13

学员()  23:34:28
但它不是一个节点是吧

葛红儒(55381091)  23:34:58

好像就是一个节点
葛红儒(55381091)  23:35:20
一个视频,在Drupal中,通常就被处理为节点,
学员()  23:35:42
kaltura 是简介能直接出来这个效果但,它的文件都要上传到kaltura的服务器上的

葛红儒(55381091)  23:37:47
http://www.whitehouse.gov/sites/all/modules/swftools/shared/flash_media_player/player5x1.swf
葛红儒(55381091)  23:38:07
swftools 模块了
葛红儒(55381091)  23:38:11
你可以用这个,
学员()  23:38:14
是吗
葛红儒(55381091)  23:38:37
你看刚才页面的源文件就可以看到了
 
总结: 有时候,想知道一个Drupal网站究竟使用了哪些模块,我们需要借此参考一下,查看页面的源文件,也就是HTML源代码,是最有效的方式,在上面,我通过查看源代码,看到了美国白宫,使用了swftools模块,作为他们的视频模块,这样当我们搭建网站需要视频模块时,我可能就会优先的选用swftools模块
 

Drupal版本:

请问葛老师,Taxonomy menu建立的drupal菜单出问题了,但分类取消了,菜单下还是有,怎么移除啊

野放客() 23:55:56
请问葛老师,Taxonomy menu建立的菜单出问题了,但分类取淜了,菜单下还是有,怎么移除啊
野放客() 23:56:42
取消了分类菜单,单原来建的还没有移除
葛红儒(55381091) 23:59:00
这个我用过,

葛红儒(55381091) 23:59:06
新建一个菜单
葛红儒(55381091) 23:59:21
把去不掉的菜单项移到新建的菜单下
葛红儒(55381091) 23:59:29
然后把新建的菜单删除
野放客() 23:59:32

葛红儒(55381091) 23:59:37
好像就解决了
野放客() 23:59:51
我把到了,只直在后面加个/delete
野放客() 23:59:57
可以删除日期:2010/4/26
葛红儒(55381091) 0:02:08
搞定了?
野放客() 0:02:18

野放客() 0:02:49
点编辑,把edit 换成delete .

 

注解: 这里面有两种解决办法,点编辑,把edit 换成delete .这是第一种.如果这种方式不行的话,可以尝试第2种,新建一个菜单,把去不掉的菜单项移到新建的菜单下,然后把新建的菜单删除

Drupal版本:

在用户信息编辑页面,用$op:'update':$account -> pass;得到的是md5密码,能不能得到,drupal用户输入的原值、?

小权<> 13:16:40
在用户信息编辑页面,用$op:'update':$account -> pass;得到的是md5密码,能不能得到,用户输入的原值、?
葛红儒(55381091) 13:18:33
$edit['pass']
葛红儒(55381091) 13:18:56
$account -> pass是md5的
葛红儒(55381091) 13:19:09
$edit['pass'] 是用户输入的原值
小权<> 13:19:18

葛红儒(55381091) 13:19:27
hook_user($op, &$edit, &$user, $category = NULL){
小权<> 13:20:01
恩,好了
 

总结: 使用$account -> pass,得到的是md5加密后的,而使用$edit['pass'] 则是用户输入的原值

 

Drupal版本:

请问,有没有什么drupal模块可以限制只有特定的ip才能访问用户登录和管理页面

Login Security,你可以尝试一下这个模块,http://drupal.org/project/login_security,能够限定失败的登录次数,

以及一些其它的限制.

 

不过不能直接限制特定IP才能访问.如果你想实现只有特定IP才能访问登录和管理页面,那么可以通过服务器端的配置,解决这个问题,不过这个我不会.

另外,如果你的特定IP不是很多的话,或者有特定的规律的话,那么可以编写一个模块,来根据IP控制访问权限.

 

我想Login Security应该可以部分满足你的需求了.

 

Login Security,http://drupal.org/project/login_security,功能,它向登录功能添加了很多限制,包括限制登录失败的次数,时间等等,以及自动限制特定IP,账号.

Drupal版本:

采用Drupal技术外包建站是个不错的发财门路

到目前为止,国内比较好的Drupal团队,都开展外包业务,很多都是专门从事对欧美外包的.在对欧美的外包中,Drupal是一个非常流行的技术.

很多公司,个人,采用Drupal技术,在外包市场上都小赚了一笔.对欧美的外包,对日本,澳大利亚的外包.如果有市场的话,还是很有处路的.

 

  • yuhe (914175392)
     

    2009-08-22 21:51:59

    哦,技术咨询。西安的外包还处于初级阶段。利润谈不上。能接到日本一手包的不多,多是二手,三手。利润被层层盘剥,到员工手里,每月就几百块,呵呵

  • yuhe (914175392)
     

    2009-08-22 21:52:07

    办公室还豪华得不得了

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:52:41

    恩,听说日本外包的价格还澳大利亚这边差不多
    前一段有和朋友了解过

  • 葛红儒 (55381091)
     

    2009-08-22 21:52:43

    一手包的利润其实很高了,包括二手包

  • 葛红儒 (55381091)
     

    2009-08-22 21:53:17

    不过我更看好Drupal在国内的发展,

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:54:01

    国内现在主流用的是什么

  • 葛红儒 (55381091)
     

    2009-08-22 21:54:03

    对于有资源的,外包是个很好的生意

  • ずッ哀ぁい (342542546)
     

    2009-08-22 21:54:32

    jommla? ,额,好像拼错了

  • 葛红儒 (55381091)
     

    2009-08-22 21:55:36

    joomla对外外包前景并不好

问下drupal权限控制有没有好的模块,现在发现总是有点问题,明明给了,就是不能

问题:

问下drupal权限控制有没有好的模块,现在发现总是有点问题,明明给了,就是不能
葛红儒(55381091) 22:24:18
你都用了那几个模块来控制权限?
洛神 22:26:19
就系统自带的
葛红儒(55381091) 22:27:11
有时候,权限会出现一些问题
葛红儒(55381091) 22:27:18

可以重构权限
葛红儒(55381091) 22:27:46

admin/content de-settings

葛红儒(55381091) 22:28:06

admin/content/ node-settings

ontent_access,acl两个专门控制节点权限的
 

洛神<> 22:42:43
我那个权限重建,也没用
洛神<> 22:43:28
我用了webform模块,建立一个webform节点,已经允许访问,但测试就是不行,
洛神<> 22:44:10
 webform模块的权限图,这里省略了
洛神< 22:44:20
 您未被授权访问此页面
洛神< 22:44:29
访问,就提示上面那个
 

葛红儒(55381091) 22:44:59

有网址么,发给我
葛红儒(55381091) 22:45:16
我大概知道怎么回事,以前也有人遇到过类似的问题
葛红儒(55381091) 22:45:35
可能是你允许的提交次数不够用了,
葛红儒(55381091) 22:45:52
比如你允许一小时提交1次,你已经提交一次了
葛红儒(55381091) 22:46:05
再访问时就会提示没有权限
洛神<> 22:46:20
我允许提交5次/小时,但一次还没有提交
葛红儒(55381091) 22:46:49
用户1可以访问么?

最终答案:
你把某一列,也就是某一个角色,下面的复选框,选部选中

看看这个角色是否可以访问了
然后取消一半的选中,看是不是不能访问了
1/2,1/4,1/8
最终你会知道哪个权限是起作用的

葛红儒(55381091) 23:06:43
我说的是一列所有的权限,不是说就这几个
葛红儒(55381091) 23:07:01
把其它模块的权限也都选中了
葛红儒(55381091) 23:07:33
我最初都用我上面说的笨办法解决这样的问题

总结:

涉及到访问权限的时候,对于新手来说,有时候不知道哪一个权限在起作用,这个时候可以使用我上面所说的笨办法,先赋予所有的权限,然后减半,再减半,从而逐步的判断出来哪一个权限真的起作用.可能起作用的权限,不在当前模块的权限下,这是有可能的.上面提到的重建权限也常常用到.

Drupal版本:

问下各位,到那里设置某个类型或URL禁用Wysiwyg

洛神<> 14:09:44
问下各位,到那里设置某个类型或URL禁用Wysiwyg
葛红儒(55381091) 14:10:30
好像有个模块,Drupal默认是没有这个选项的
洛神<> 14:10:53
要专门一个模块吗?
葛红儒(55381091) 14:11:09

洛神<> 14:12:09
我用过FCKeditor模块可以做到
洛神<> 14:13:03
但FCKeditor模块又没有Wysiwyg模块自定义按钮那么方便
洛神<> 14:13:38
有没有比这两个更好的模块域者说综合两者优点的模块
葛红儒(55381091) 14:13:41
FCKeditor模块,是可以的
葛红儒(55381091) 14:13:52
没有了,最好的两个了
洛神<> 14:19:58
你说得那个模块名字是什么?
葛红儒(55381091) 14:28:39
我记不了了
葛红儒(55381091) 14:29:12
好像是特定节点类型使用不同的输入格式,和你说的不完全一样
 

总结:1,FCKeditor(CKeditor)功能非常强大,不过有时候太具有侵略性了.

2,Wysiwyg正在成为官方的标准.

3,我记得有模块,可以用来设置特定节点类型使用不同的输入格式,但是忘记名字了.

Drupal版本:

问下,那个drupal图片模块能够提供图片编辑、加水印等功能

问题描述:

洛神<> 14:07:48
问下,那个图片模块能够提供图片编辑、加水印等功能
洛神<> 14:08:03
最好能给出图片URL
葛红儒(55381091) 14:08:32
有一个watermark模块
葛红儒(55381091) 14:08:46
专门的加水印的模块
洛神<> 14:09:16
那简简单编辑,给出URL的
葛红儒(55381091) 14:09:47
这个不需要单独的模块吧
葛红儒(55381091) 14:10:10
有专门crop模快Ajax的

解答:

葛红儒(55381091) 19:43:57
现在的水印的制作是通过imagecache完成的,而不是单独的watermark模块,
葛红儒(55381091) 19:44:32
http://drupal.org/project/Imagecache_Actions
葛红儒(55381091) 19:45:46
Imagechache和ImageCahce_actions,结合就可以实现洛神所提到的功能了

葛红儒(55381091) 21:37:20
ImageCache我记得支持批量上传的图片的
葛红儒(55381091) 21:37:55
它采用的是后缓存的方式,请求了再生成cache图片
 

洛神<> 21:52:07
每个用户一个以用户名的文件夹,往下是按规则建文件夹
葛红儒(55381091) 21:52:34
好像可以这样的
葛红儒(55381091) 21:52:56
每个用户上传的文件存放到他自己的文件夹下
葛红儒(55381091) 21:53:17
filefield path好像时

Drupal版本:

成功案例(sekaiweb全球网)

sekaiweb全球网

sekaiweb是家在香港注册的网站建设公司,由精通中文的,熟悉英文的日本人永岛先生创建.公司主要专注于向日本本土客户提供网站建设服务.

是家专注于对日外包的公司.公司主要采用Drupal技术.

 

我提供的服务:

提供技术支持,帮助解决实际的问题,和开发特定功能的模块.

提供培训,帮助公司员工快速的学习Drupal技术.

提供Drupa团队建设方面的建议和咨询.

 

sekaiweb在我提供的技术支持下,快速的成长壮大。由一家频临破产的网站建设公司,变为了一个蓬勃发展的公司。有一个采用xoops技术的公司,转向了全部采用Drupal的公司。有一个一人公司,转向了拥有4-5个人的小团队,正在不断扩张发展中。公司的蓬勃发展,主要原因在于创始人的勤奋和锐意进取。当然我的技术支持,也是公司成功的必要因素。自从遇到我后,sekaiweb再也没有遇到过解决不了的Drupal技术问题了。

公司地址: http://www.sekaiweb.com/ 

 

Drupal版本:

成功案例http://technologyprovider.intel.com

     今天浏览Dries的网站,发现Intel也在使用Drupal了.其实很早就使用Drupal了.在帖子的下面,有人跟贴,Intel的两个项目也使用了Drupal,就包括这一个technologyprovider.intel.com。

    对于这个网站technologyprovider.intel.com,我是网站建设的参与者之一,中方的,网站的建设是由中国团队,印度团队,和英国团队共同完成的。

    我在项目中的工作,这个项目主要参与了Drupal的主题制作工作,我和George Wang(公司的美工)共同完成了主题制作,George Wang负责将PSD转化为HTML,我负责将HTML转化为Drupal主题。我的工作主要涉及区域的设置,变量的替换,主题预处理函数的编写,那个时候George还不会做Drupal主题,所以涉及到PHP和Drupal相关的都有我负责。根据多个HTML,分析出来需要哪些区域,以及主题的部分预处理函数的编写,也是需要经验的。主题的精度,要求完全和psd效果图保持一致,0px误差,不过这部分工作是同事George Wang完成的。

   后来,主题拿到印度那边,和他们加载的JS冲突了,遇到了问题,他们找不到原因,是我找到了问题的所在。可能还有一两个小的问题,也是我帮着解决的。这个项目我做的工作就是这些。

Drupal版本: