Drupal Camp Taipei 2013

今年有幸再一次被邀請到台灣 Drupal Camp
提交了一個我自己使用 migrate 的 case study
順利獲選 http://2013.drupalcamp.tw/session/83
之後便開始訂機票,住宿,準備 slideshow
報名參加第二日的 hackathon 等等
要感謝 TKY 一直的提名,協助
正好在自己開展事業的一年到外交流
打一下名氣,也看看和台灣的同行有沒有合作的機會

感覺台灣的開發者們對自己工作上的東西還是會花下班的時間的
我曾經想過很多原因,例如台灣的人口比較多
從事科技業的也多很多,科技業在台灣算是比較吃香的一個行業
香港只覺得自己是宅男
還有很多其他的可能
最終都不知道為什麼香港的 Drupal 社區 (其實其他的技術社群也類似)比較小的原因
台灣短短的七月就有 Drupal Camp Taipei, HITCON, COSCUP 等社群主辦的大型會議
而香港的是 WIDS,還是由有政府背景的香港互聯網協會主辦
而香港的珠寶展,貿易展等的大型展覽可是世界知名的....
(好啦,香港還是有 Barcamp 的)

還是談一下會議的感想吧
就是熱情呀,到處都感覺到熱血
我自己大學的時候都是活動的義工
都會知道一點事前的準備工作的辛苦
《開會千日,用在兩天》就是非常好的總結
參加者對技術的熱血,義工們的熱血
和自己的工作,興趣無關的但都義工一下
(香港的 WIDS 是上班時間星期四,五的活動,可以不用上班 XD)
「兩年前接觸過 Drupal,但現在沒有在用了」
聽到這樣的不知道是高興他們現在還會幫助 Drupal 社區,還是失望於 Drupal 的工作還是不夠多?

第二日的 hackathon 對我來說是全新的體驗
之前一直沒有「圓桌式」圍在一起 coding 的經驗
而且是幫 Ubuntu TW 這一種 NGO
我是有一點點壓力的
限時式的實況 coding 對於我這種随心的 programmer 就是比較...難?
幸好我在前一晚己經偷步開始的情況下
還是在限時之內完成了工作
比較可惜的是其間和其他人合作溝通的機會比較少
可以偷一下其他人的秘技還是很不錯的 XD

最後是一點,工商服務的部份可以加強一下
Drupalcon 有贊助商專用的 sessions
可能是情況不一樣
但作為 Drupal 社區,為開發者和公司之間建立良好溝通橋樑
還是社區的成長非常重要的
畢竟開發者要吃飯,公司要找開發者開發
各最所需才是永續的最基本條件

就這樣,最後多謝 TKY,
各位有聽我不是一般爛的普通話的聽眾
幫我拍得超好的攝影師
各位志工們
熱情的台灣朋友們
師大附近的正妹
和香蕉味的啤酒

最後,下個月 COSCUP 再戰台灣!!

Drupal Camp Taipei 2013 雜記

從台灣 Drupal Camp Taipei 2013 安全的回來了
先寫雜記再寫感想文

算起來近五年是一年來台一次,甚至更多
台北就是咖啡店多,天氣比香港涼一點
但大下午天還是要進室內休息一下

這次住的是近師大夜巿的 1983 hostal
是沖著師大的美女來的
但我看來夜巿的確小了很多
女生也少了
但還是有一些風格的酒吧 (insomnia cafe),咖啡店(中西美食)
都試過,不錯不錯
人的心情放輕鬆就自然能享受身邊的事了

話說第一天到台電大樓站的hostal 放下行李之前
第一件事是到7-11拿我訂的一本書 "字型之不思議"
我在一篇 blog 上看到這書的介紹便已經想買
但台灣的出版社,而且香港找不見
唯有網上預訂,再宅配到7-11
這是多方便啊,但台灣人覺得這沒什麼
後來才發覺這書在台灣賣個滿堂紅
誠品都將它放在當眼處
白花了網上訂書的時間....

星期五的午後到敦化站逛街
逛熱了便到了LAVAZZA老咖啡
一間推友介紹的咖啡店
也有蛋榚甜點的
但竟然沒有我最愛的 flat white!
我到過的每一間咖啡店都沒有 flat white!
沒有 flat white!
太失望了
cappuccino,唯有由你頂一下了

最後一天沒有行程
所以又到了誠品信義店
看到專賣吉他的,賣唱片附有台灣獨立樂隊專櫃的
其中有一個 "革命" 的專題
我以為會看到馬克思的
卻發現了Banksy 官方作品集
我站在那用了一小時看完
反轉看到這240頁全彩厚粉紙的作品集只賣台幣 395
台幣 395 !!!!!
我心裡講了粗口之後想到
作者其實是提倡免費藝術的
而且我的行李已經放滿了吧
還是將這商品放下了

雜記之後要努力寫 Drupal Camp Taipei 2013 的感想文

客製自定義 feeds tamper plugin

feeds tamper 是一個可以將多個 CSV column map 到同一個多值欄位 (multiple value) 的 module
但問題是使用 "rewrite" 只可以在一個 column 使用
例如要將:
abc.jpg
變為
sites/default/files/abc.jpg
再變為多值
sites/default/files/abc.jpg,sites/default/files/def.jpg
就需要在 image 欄位使用兩次 rewrite
feeds tamper 無辦法解決,只可以在 CSV 上直接使用 full path

但把心一橫,自己寫一個對應 list 的 prefixer 都不是太難

abc.jpg,def.jpg
變為
sites/default/files/abc.jpg,sites/default/files/def.jpg
就只需要一次 rewrite 了

因為 feeds tamper 使用了 ctools 的 plugin
所以要擴展可以使用:

<?php
// prefix_feeds_tamper_plugin.module
function prefix_feeds_tamper_plugin_ctools_plugin_directory($owner, $plugin_type) {
  if (
$owner == 'feeds_tamper' && $plugin_type == 'plugins') {
    return
'plugins/';
  }
}
?>

知會 feeds tamper 這邊有一個客製 plugin

實作代碼:

<?php
// plugins/list_prefix.inc

// plugin 資料,有需要的話抄 feeds tamper module 內的代碼就可以了,不難
$plugin = array(
 
'form' => 'prefix_feeds_tamper_plugin_list_prefix_form',
 
'callback' => 'prefix_feeds_tamper_plugin_list_prefix_callback',
 
'name' => 'prefix',
 
'multi' => 'direct',
 
'single' => 'skip',
 
'category' => 'List',
);

// 使用 form API,也是抄 feeds tamper 的代碼
function prefix_feeds_tamper_plugin_list_prefix_form($importer, $element_key, $settings) {
 
$form = array();
 
$form['prefix'] = array(
   
'#type' => 'textfield',
   
'#title' => t('Prefix'),
   
'#default_value' => isset($settings['prefix']) ? $settings['prefix'] : '',
   
'#description' => t('The string to use for prefix.'),
  );
  return
$form;
}

// 這邊是真正的實現,要留意 $fields 可以是 string, 可以是 array,取決於你的定義了
function prefix_feeds_tamper_plugin_list_prefix_callback($result, $item_key, $element_key, &$field, $settings) {
 
$out = array();
  foreach (
$field as $f) {
   
$out[] = $settings['prefix'].$f;
  }
 
$field = $out;
}
?>

p.s. feeds_tamper-7.x-1.0-beta4

信報論壇 revamp

都有一段時間忙得要死,沒有更新這個 blog 了
這次的 project 總算順利完成,穩定進入維護階段的同時
花點時間寫一寫這次使用 Drupal 的經驗好了

這個在三月中開始版面設計的網站,當然是使用 Drupal7 開發
結構上不算太複雜,只有首頁,文章內頁,用戶頁,「著名博主」頁
但因為用戶可以自行編寫文章,node edit form 都需要使用客製化的 theme
而且那個 form 需要一定程度的簡化,令一般使用者可以比較容易上手

在網站也使用了 responsive web design 的版面設計
令手機的使用者可以使用一個比較簡單的版面
但 js based 的 responsive 有反應慢,需要等待 js 執行的問題
有機會再和大家分享這方面的心得

而比較特別的是一般的文章在首頁是使用日期分類的
信報編輯和「特選的博主」會出現在頁面上半部份
其餘一般使用者的文章會出現在頁面下半部份
而除了特定的文章之外,首頁只會出現當日的文章
而昨日,以至七日之前的文章可以使用 dropdown 瀏覽
我們客製了數個 views 的 arguments 來處理這種有時效性的頁面設定
date based frontpage

而整個 project 比較大的挑戰有三個方面:論壇文章管理,資料轉移和使用者 single sign on

論壇文章管理
因為一般的注冊使用者可以和信報編輯一樣建立文章
所以信報編輯在文章排序方面需要很大的權力
而每一天都有上下兩半部份的排序,而且經常會因為文章的突發性而修改排序
第二是編輯刪除,博主刪除的功能
在遇到離題,人身攻擊或誹謗的時候編輯需要隱藏文章
但原作者需要看到已經被刪除的字眼,並保留證據
而文章的回應更可以由該文章的原作者管理
所以不可以使用 "未發表" 這種 Drupal 原有的控製
我們在實作的時候大量使用 flags 和 draggable views
flags module 本身提供一個可靠的 API
可以客製 flag 時後續的權限處理
檢舉的功能也是 flag module 的延伸
加上 rules 就可以發出警示的電郵給編輯

資料轉移
這個論壇是一個 revamp ,論壇原有的文章可以追溯到零八年
零八年至今五年的使用者,發表的文章,回應等等資料的數量超過一百二十萬
而資料轉移的工作其間必須下線,直到資料轉移的過程完美的完成才可以上線
最後資料由舊系統匯出,匯入到新系統總共使用了九個小時
由黄昏六時開始,一直到第二日的淩晨三時完成
為了確保轉移的工作不會在最後一刻的淩晨出現錯誤
我們花了大量的時間開發了一個基於 migrate 的 module
透過一個可維護的,持續的,可反覆匯入的方法
將舊的系統中的資料過渡到 Drupal,並對應 Drupal 中的各種主要 entity, node, comment, user, files 等等
其中的代碼開發秘密,我會在 Drupal camp taipei 2013 詳細講解 http://2013.drupalcamp.tw/session/83

使用者 single sign on
最後是使用者的單一登入
舊有的系統因為是使用同一組伺服器,只需要登入一次便可以
同一登入的習慣在兩個不同的伺服器和 sub domain 之下有完全不同的難度
為此我們也客製了整合使用者的模組
令使用者不會發覺論壇和新聞是完全兩個不同的伺服器
其中的代碼我們也會在 Drupal camp taipei 2013 詳細講解
我回來之後才將 ppt 放在這裡

最後,當然是讓大家看看 screencap
還有,未報名 Drupal Camp Taipei 2013 的立即到 http://2013.drupalcamp.tw/ 注冊參加!

Snapshot: 

Drupal Migrate user pictures 的小小心得

-
Free tags: 

(Migrate 2.5, D7):

  • 建立一個 UserPictureMigration class (你會看到 file_managed table 有新增行數)
  • 在 UserMigration class 中的 prepare(), 用 $this->handleSourceMigration('UserPicture', $row->uid);指定 UserPictureMigration 中的 fid
  • 使用正常的用戶頭像上載的話 file_usage table 會新增紀錄。你可以自己在 complete() 和 completeRollback() 手動補上

又花了兩日的時間:
$this->addFieldMapping('picture')->defaultValue() 傳入 int

public function prepareRow() 會顯示路徑, 但唯讀
最後在
public function prepare() 傳入 fid

http://drupal.org/node/1349632#comment-7348466

Pages

Google