欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

重新创建表单_调用原来的编辑表单 有大用 有大大用

shiping1 的头像

重新创建表单_调用原来的编辑表单
node_menu 这个 hook_menu 要研究一下
新建自定义表单充当 node /add
node add 前, node_load(8)
然后form中的值默认设置为 $node->field_value

广州┊分头诗人(19323354)  21:58:17
新建自定义表单充当 node /add
node add 前, node_load(8)
然后form中的值默认设置为 $node->field_value
我只想到这个方法,而且是能走通的
其他方法不太了解
你可以参考下
江苏┊泪痕(958186957)  21:59:23
好的
广州┊nemo(1838199902)  21:59:24
模拟node edit form?
江苏┊泪痕(958186957)  21:59:32

广州┊分头诗人(19323354)  22:00:28
模拟node/add node/[nid]/edit
自定义form 就可以
广州┊nemo(1838199902)  22:01:23
$node = node_load(8)


drupal_get_form('page_node_form', $node)

 $items['node/%node/edit'] = array(
    'title' => 'Edit',
    'page callback' => 'node_page_edit',
    'page arguments' => array(1),
    'access callback' => 'node_access',
    'access arguments' => array('update', 1),
    'weight' => 1,
    'file' => 'node.pages.inc',
    'type' => MENU_LOCAL_TASK,
  );


 case 'node/%/edit':

$items['node/%node/revisions/%/delete'] = array(
    'title' => 'Delete earlier revision',
    'load arguments' => array(3),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('node_revision_delete_confirm', 1),
    'access callback' => '_node_revision_access',
    'access arguments' => array(1, 'delete'),
    'file' => 'node.pages.inc',
    'type' => MENU_CALLBACK,
  );

<?php

//这里重新定义表单
function recreateevent_menu()
{
     $nid = arg(1);
     $items['node/addwzdlevent/%node/edit'] = array(
    'title' => 'Edit',
    'page callback' => 'node_page_edit',
    'page arguments' => array(1),
    'access callback' => 'node_access',
    'access arguments' => array('update', 1),
    'weight' => 1,
    'file' => 'node.pages.inc',
    'type' => MENU_LOCAL_TASK,
  );





覆写表单
//hellodrupal 这是模块名
function hellodrupal_form_alter(&$form, &$form_state, $form_id) {
    // 先判断form id,只修改某form
    if ($form_id == 'event_wzdl_node_form') {
       //event_wzdl_node是节点类型名
        // 调试时候,打印$form出来看下
        //print '<pre>'. check_plain(print_r($form, 1)) .'</pre>';
        
        // 修改form跳转路径
        $form['#redirect'] = url('xxoo');
    }
}
 

重建表单


node_menu 这个 hook_menu 要研究一下
新建自定义表单充当 node /add
node add 前, node_load(8)
然后form中的值默认设置为 $node->field_value

广州┊分头诗人(19323354)  21:58:17
新建自定义表单充当 node /add
node add 前, node_load(8)
然后form中的值默认设置为 $node->field_value
我只想到这个方法,而且是能走通的
其他方法不太了解
你可以参考下
江苏┊泪痕(958186957)  21:59:23
好的
广州┊nemo(1838199902)  21:59:24
模拟node edit form?
江苏┊泪痕(958186957)  21:59:32

广州┊分头诗人(19323354)  22:00:28
模拟node/add node/[nid]/edit
自定义form 就可以
广州┊nemo(1838199902)  22:01:23
$node = node_load(8)


drupal_get_form('page_node_form', $node)

%node 表示节点为num的对象
%表示是num数字

 $items['node/%node/edit'] = array(
    'title' => 'Edit',
    'page callback' => 'node_page_edit',
    'page arguments' => array(1),
    'access callback' => 'node_access',
    'access arguments' => array('update', 1),
    'weight' => 1,
    'file' => 'node.pages.inc',
    'type' => MENU_LOCAL_TASK,
  );


 case 'node/%/edit':

$items['node/%node/revisions/%/delete'] = array(
    'title' => 'Delete earlier revision',
    'load arguments' => array(3),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('node_revision_delete_confirm', 1),
    'access callback' => '_node_revision_access',
    'access arguments' => array(1, 'delete'),
    'file' => 'node.pages.inc',
    'type' => MENU_CALLBACK,
  );

<?php

//这里重新定义表单
function recreateevent_menu()
{
     $nid = arg(1);
     $items['node/addwzdlevent/%node/edit'] = array(
    'title' => 'Edit',
    'page callback' => 'node_page_edit',
    'page arguments' => array(1),
    'access callback' => 'node_access',
    'access arguments' => array('update', 1),
    'weight' => 1,
    'file' => 'node.pages.inc',
    'type' => MENU_LOCAL_TASK,
  );













}
 

 

Drupal问答

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

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

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

Acquia drupal和drupal比较

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

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

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

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

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

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

相关链接: http://acquia.com/http://zhupou.cn

Google cse模块常见错误分析

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

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

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

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

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

<div>

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

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

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

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

</div>

</form>

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

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

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

url传值和表单传值

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

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

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

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

'title' => 'aaa',

'page callback' => 'show_sub',

'page arguments' => array(1),

'access callback' => TRUE,

'access arguments' => '',

'type' => MENU_NORMAL_ITEM,

);

function show_sub($cat1 = ''){

        echo $cat1;

        }

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

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

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

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

很清楚。

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

print drupal_get_form('test_form', $node);

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

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

        $form['title'] = array(

'#type'=> 'textfield',

'#title' => '主题',

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

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

);

        return $form;

}

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

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

'title' => 'aaa',

'page callback' => 'drupal_get_form',

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

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

'access arguments' => '',

'type' => MENU_NORMAL_ITEM,

);

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

$form['title'] = array(

'#type'=> 'textfield',

'#title' => '主题',

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

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

);

return $form;

}

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

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

老葛的Drupal培训班 http://zhupou.cn

我们在表单元素中,很多时候都会使用date这样的元素,但是,你会发现,这个元素由3个select组成,他们的顺序为月,日,年,这是不符合中国的习惯的。

我在帮人指导建站的时候,就遇到了这样的问题,但是找不到答案。我判断,可以通过theme层搞定这个问题,这样就去找了对应的theme函数。这个问题在网上好像是找不到答案的,我google了多次,但是都找不到,也有人遇到了同样的问题,但是都是绕道而行。

我决定尝试着解决这样的问题,因为我相信,一定存在一个方法,将月日年的顺序调整为年月日。先看系统生成的默认元素里面的markup。然后就去找对应的主题函数,这样就找到了theme_date。

代码如下:

function theme_date($element) {

return theme('form_element', $element, '<div class="container-inline">'. $element['#children']
.'</div>');

}

container-inline就是这里生成。但是3个子元素的顺序不是这里决定的。我的第一个想法是,覆写这个函数,print_r($element['#children']),这样就可以到定这个顺序问题了。

不过我很想知道,核心代码中,哪部分决定了3个子元素的顺序,这样,就找到了expand_date($element)。代码如下:

function expand_date($element) {

// Default to current date

if (empty($element['#value'])) {

$element['#value'] = array('day' => format_date(time(), 'custom', 'j'),

'month' => format_date(time(), 'custom', 'n'),

'year' => format_date(time(), 'custom', 'Y'));

}

$element['#tree'] = TRUE;

// Determine the order of day, month, year in the site's chosen date format.

$format = variable_get('date_format_short', 'm/d/Y - H:i');

$sort = array();

$sort['day'] = max(strpos($format, 'd'), strpos($format, 'j'));

$sort['month'] = max(strpos($format, 'm'), strpos($format, 'M'));

$sort['year'] = strpos($format, 'Y');

asort($sort);

$order = array_keys($sort);

// Output multi-selector for date.

foreach ($order as $type) {

switch ($type) {

case 'day':

$options = drupal_map_assoc(range(1, 31));

break;

case 'month':

$options = drupal_map_assoc(range(1, 12), 'map_month');

break;

case 'year':

$options = drupal_map_assoc(range(1900, 2050));

break;

}

$parents = $element['#parents'];

$parents[] = $type;

$element[$type] = array(

'#type' => 'select',

'#value' => $element['#value'][$type],

'#attributes' => $element['#attributes'],

'#options' => $options,

);

}

return $element;

}

注意代码中红色的部分,3个子元素的顺序,是由日期格式决定的,我猜测,调整日期格式,就可以改变3个子元素的顺序,我尝试着将日期格式都改为了年月日:导航到admin/settings/date-time,将3中长,中,短的日期格式都调整为自定义格式,Y/m/d(D)
H:i。

这样,date元素中的顺序,就从“月,日,年”调整为了“年,月,日”。

玩转Drupal

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

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

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

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

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

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

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

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

Drupal是什么

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

首先,什么是drupal呢?

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

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

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

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

官网上的回答:http://drupal.org/about

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

drupal中国的回答:http://drupalchina.org/about

百度知道fhileo的回答http://zhidao.baidu.com/question/44832523.html

相关链接: http://zhupou.cn

Parse error: syntax error, unexpected T_VARIABLE

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



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



我写的代码如下:

function zixun_menu() {

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

'title' => 'zixun',

'description' => 'peizhi',

'page callback' => 'drupal_get_form',

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

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

);

return $items;

}

function zixun_admin_settings(){

}

/*

function zixun_admin_settings(){ 

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

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

'#maxlength' => 255,

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

'#required' => TRUE,

);

return system_settings_form($form);

}*/

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

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

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

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

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

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

// );

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

// return system_settings_form($form);

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

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

相关链接:http://zhupou.cn

Zend debugger 的配置安装

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

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

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

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

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

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

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

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

;zend_optimizer.enable_loader = 0

;zend_optimizer.optimization_level=15

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

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

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

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

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

相关联接:http://zhupou.cn , http://loveboat0204.blog.hexun.com/12433730_d.html

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

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

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

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

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

drupal缓存清除小技巧

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

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

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

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

drupal表单重构

function test_form(){

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

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

$form['item_data'] =

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

'#value' => $markup,

'#weight' => 10, );

}

return $form; }

function test_form_submit(){

$form_state['amazonbob_item'] = $item;

$form_state['rebuild'] = TRUE; }

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

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

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

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

相关链接: http://zhupou.cn

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

问题:

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

答复:

这个函数:
<?php
function _phptemplate_variables($hook, $vars = array()) {
switch ($hook) {
case 'node':
$vars['template_files'] = array('node-'. $vars['nid']);
break;
}
return $vars;
}
?>
你可以使用这种方法,如果用的是drupal5.X的话, 6.x我不知道这个方法是不是可行,不过也有相同的类似的方法.
就是在主题下面,建立一个template.php,然后向里面添加function _phptemplate_variables()函数,这个函数,里面根据你的实际作以下修改:
$vars['template_files'] = array('node-'. ‘front');
$vars['template_files'] = array('node-'. 'taxonomy');
$vars['template_files'] = array('node-'. 'page');

这样你就可以在你的主题下面使用node-front.tpl.php,node-taxonomy.tpl.php,node-page.tpl.php,这些模板的用法和node-nodetype.tpl.php是一样的。不过你需要在代码中加上一些判断条件,判断哪个是front,哪个是taxonomy,哪个是page。

具体怎么判断我就不多说了。
你可以参看相关的手册,特别是节点的那部分。

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

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

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

如何将drupal节点置顶

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

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

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

相关链接:http://zhupou.cn

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

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

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

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

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

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

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

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

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

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

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

相关链接: http://zhupou.cn







}
 

普通分类: