Published:
二月 12th, 2010
|
Categories:
蝌蚪转文
|
原文链接;作者:Fabien Potencier
我利用休假的机会回顾思考了一下每天的工作。作为Sensio公司的CEO,我有机会做很多不同的工作,但是我最喜欢做的事情还是hacking。我说的hacking是为了快乐开发软件,而不是为某某用户去开发软件。正因为这样,hacking在本质上不能成为每天的工作,只是业余时间偶尔为之的东西,是一种爱好,一种热情。开源可能就是分享这些hack的最好方式。
我为什么喜欢hack呢?很显然因为我可以随心所欲的做我想做的事情,选择喜欢的工具和开发方式。但是更重要的是因为我拥有没有时间压力下的反复迭代的自由。开发一个软件是一个漫长的迭代过程。我喜欢去写一些代码,然后忘记它一段时间,过些日子后又回过头来增强它,或者干脆把它扔掉。那么让我们看看艺术家做事情的方式。你认为达芬奇用了多长时间来画蒙娜丽莎?按照这篇维基说的,他在1503年开始画蒙娜丽莎,在1519年他去世之前才完成。什么?一幅画画了13年?那太荒唐了。或许吧,但是艺术家们就是这样做事情的。我在2004年开始开发symfony,但是到了2009年还没有完成,而且可能永远都不会结束。hacking是一种艺术,hacker们应该像艺术家一样工作。hacker和画家在很多地方有共同点,Paul Graham写过一篇极佳的短文和一本书来说这个问题,我就不再赘述了。如果你是一个hacker或者程序员,我强烈推荐你去看这篇文章和那本书。
hacking是一种创造,利用计算机作为表达的媒介。我所知道的最好的hacker和艺术家是Why the lucky stiff。从优美的camping框架到优秀的著作《Poignant Guide to Ruby》,他曾经多产而且是真正的艺术家。我说的是曾经,因为他最近删除了他所有的网上据点。
每一天我都在学习新的途径去书写优美的php代码(谁在笑话我?)。你可以通过symfony代码的演变来跟踪我的进展。
如果你正在寻找“编程艺术”,我已经通过Twitto和Twittee这两个twitter实验做过一些尝试。
回到九十年代初期,我也做过一些类似的实验。那个时候我的目标是在十行代码之内做尽量多的事情。我曾经再法国的ST杂志(1990年8月)发表过一个完成的项目。
如果你问我,一个hacker绝对应该是一个艺术家,但是一个在公司里工作的开发者可以做一个艺术家吗?很不幸,我认为不能。做一名艺术家,你必须拥有时间和自由,但是在为客户服务的时候,你没有。
Published:
一月 7th, 2010
|
Categories:
蝌蚪转文
|
从今天开始,我要陆续把工作中遇到的一些跟Drupal有关的小问题发上来,希望会给其他同学一些参考。这些问题基本上都是Drupal Core和一些比较常用Contribututed Module衍生出来的,在不修改核心代码的前提下,通过Hook系统或者主题来完成我们想要的效果。
Drupal的CCK模块有一个很方便的特性:多值字段。在field的setting里面,可以选择Number of values。官方的Help是这样描述的:
Maximum number of values users can enter for this field.
‘Unlimited’ will provide an ‘Add more’ button so the users can add as many values as they like.
当选择Unlimited之后,编辑node的时候在这个field的下面会出现一个”Add another item”的按钮。这样用户可以添加无数个这样的字段。我们可以利用这个特性让用户上传无限量的文件,图片。
但是这里有一个问题,这个按钮上面的文字“Add another item”是硬编码到CCK模块里面的,这个不好。我们如果想做一个对用户友好的系统,不能让用户上传普通文件的时候显示”Add another item”, 上传图片的时候还是显示”Add another item”,我希望他们分别显示”Add another file”和”Add another image”。那我们该怎么做呢?
我的思路是:通过hook_form_alter来修改form的值。
function testmodule_form_alter(&$form, $form_state, $form_id) {
if( $form['#id'] == 'node-form') {
if(!isset($form['#field_info'])) {
return;
}
foreach($form['#field_info'] as $key => $info) {
if ( $info['type'] == 'field_image' ) {//假设图片的字段名是field_image
$form[$key][$key.'_add_more']['#value'] = t('Add another image');
}
}
}
这样图片字段的”Add another item”就变成”Add another image”了。但是这还不够。当你点击”Add another image”之后,这个按钮又变成了”Add another item”了,这是因为这是一个Drupal的AHAH调用。点击按钮触发了另外一个form,这个form的id不是node-form, 而是content_add_more_js。找到原因之后,我们只需要在前面的testmodule_form_alter函数里加上对content_add_more_js的修改:
if( $form_id == 'content_add_more_js' ) {
foreach($form as $key => $element) {
if ( isset($element[0]) && isset($element[0]['#type']) && $element[0]['#type'] == 'field_image' ) {
$form[$key][$key.'_add_more']['#value'] = t('Add another image');
}
}
}
好了,大功告成。
最后完整的form_alter是这样的:
function testmodule_form_alter(&$form, $form_state, $form_id) {
if( $form['#id'] == 'node-form') {
if(!isset($form['#field_info'])) {
return;
}
foreach($form['#field_info'] as $key => $info) {
if ( $info['type'] == 'field_image' ) {//假设图片的字段名是field_image
$form[$key][$key.'_add_more']['#value'] = t('Add another image');
}
}
}
if( $form_id == 'content_add_more_js' ) {
foreach($form as $key => $element) {
if ( isset($element[0]) && isset($element[0]['#type']) && $element[0]['#type'] == 'field_image' ) {
$form[$key][$key.'_add_more']['#value'] = t('Add another image');
}
}
}