修改 form 元素的表單 hook_element() #process

需求:
因為上載的圖片太多, 又會分開數次上載/更新圖片, 編輯們想要知道上載某圖片的日期, 以決定刪除/更新某圖片

使用 devel 參考 filefield 的參數, 發覺 filefield 是有將 timestamp 儲存的, 只要在合適的 form 處顯示就可以了

顯示 timestamp 的代碼參考了 imsgefield extended module 的代碼, 使用 hook_element 的方式將 timestamp 加到 form API 之中:

<?php
function ge_filefield_timestamp_elements() {
  return array(
   
'imagefield_widget' => array(
     
'#process' => 'ge_filefield_timestamp_widget_process',
    );
}
?>

以上的代碼在 form API 處理/顯示表單 imagefield widget 的時候會呼叫一次, 而將 timestamp 加到表單的代碼:

<?php
if(isset($element['#value']['timestamp']))
  {
   
$element['data']['timestamp']['body'] = array(
     
'#type' => 'markup',
     
'#title' => 'timestamp',
     
'#default_value' => '123',
     
'#value' => 'Timestamp: ' .date('Y-m-d H:i', $element['#value']['timestamp']),
     
'#prefix' => '<div>',
     
'#suffix' => '</div>',
    );
  }
  return
$element;
?>

就更簡單, 其中, $element['#value']['timestamp'] 可以取得 timestamp, 轉換為編輯們可讀的日期格式就可以了

完整模組的代碼可以見 https://github.com/joetsuihk/filefield_timestamp

AttachmentSize
Image icon hook_element_timestamp.PNG25.26 KB

簡介 Git

AttachmentSize
Image icon Step1.png7.84 KB
Image icon Step2.png7.96 KB
Image icon Step3.png9.37 KB
Image icon Step4.png14.52 KB

Edit: 2012-01-30 新增4圖, p.s.

隨著 Drupal 放棄 CVS 而使用 Git 之後,
作為一個 Drupal developer, 你便需要使用 Git 了

如果你之前有看過的的 SVN 教學的話,
你便會發覺 CVS 和 SVN 很類似
而這次我也會使用很多 SVN/CVS 的詞彙令大家更容易過渡到 Git

Git 是一種分散式的代碼管理系統 (DCVS)
相比 SVN/CVS, 各種操作都可以單機完成, 最後再上交到一個或者多個伺服器
具體的分別有:


1. 你可以在沒有網路的情況之下, 例如在飛機上, commit 代碼
在 SVN 的年代, 如果你要在沒有網路的地方開發的話, 你便不可以 commit
需要一次性在網路再開的時候將全部修改都放到一個 commit
違反 "一個 commit 修改一個功能" 的原則
變相令 merge 更困難
在 Git 上便沒有這個問題,
你可以 commit, 直到有網路的時候, 將積壓的多個 commit 一次再提交到網路上分享

2. 你還可以沒有網路的情況下開 branch, merge branch
同樣等到有網路的時候, 將commit 連同 branch 的資料一次提交
所以你的本機已經有整個 repo 的全部資料
可以斷線之下 checkout 舊 code, 開發另一個 branch 等等


3. 本機的 repo 需要 push 到遠端的 repo
99% 的專案你都需要和其他人一起開發
你需要用網路同步大家的 repo, 而網路上的 repo 稱為 remote
將 local 的 repo 傳送到 remote 的動作稱為 push
相反則為 pull

所以開發的流程是 pull -> commit -> commit -> ... -> push

p.s. 從圖中你還可以看到更多 git 的特性, 例如
git pull 和 push 是將 commit tree 全部複製一次
git 的 filesystem 使用連結處理內容完全相同的檔案
每一部電腦都有完整的, 每一個版本的檔案

SVN Merge

使用了 SVN 一段時間之後, 你便會遇到複雜的情況: Conflicts
例如你和你的拍擋同時在修改同一個文件, 大家都是基於 r27
你的拍擋 commit 了, 變成 r28
但係也 commit 一個基於 r27 的檔案, 想要變作 r28
而且大家修改的行數相當接近, 自動的 merge 不能完成的時候
SVN 便會提示你, 已經發生了一個 Conflict
要求你先 solve Conflict 再 commit, 也即你需要 Merge 了

有 conflict 的檔案會標示為 conflict state, 檔案的內容也會有相關 conflict 的資料

你需要做的便是先 update, 將你的拍檔修改的部份了解一下
再手動修改這個檔案, 直到它能正常執行
也包含了你和你的拍檔的修改之後
儲存, 將這個檔案摽示為 "已解決"

你便可以正常的將這個 merge 了的檔案 commit 了

AttachmentSize
Image icon Step1.png11.02 KB
Image icon Step2.png5.57 KB
Image icon Step3.png7.2 KB
Image icon Step4.png9.87 KB

vim 中設定正確的 php 文法高亮 filetype php.html sinppets

Drupal 的 php, module, tpl.php 檔會包含 html 和 php 的代碼
而vim 預設的情況之下不會對 php 檔內的 html 碼高亮
但只要設定使用 php.html 就可以先高亮處理 php, 再處理 html 高亮, 例:

augroup php
  "php file also use html snippnets
  autocmd BufRead,BufNewFile *.php set filetype=php.html
augroup END

而如果你有使用 snipemate 的話,
Drupal 有一個snipmate 的庫可以使用
Vim SnipMate for Drupal
https://github.com/theunraveler/Drupal-Snippets-for-Vim

multi-site 要如何共用 user 帳號密碼

multi-site 共用同一個 mysql 的話, 例如:
site1:

<?php
//settings.php:
$db_url = 'mysql://root@127.0.0.1/site1';
$db_prefix = array(
       
'default' => '',
       
'users' => 'shared_',
       
'sessions' => 'shared_'
);
?>

site2:

<?php
//settings.php:
$db_url = 'mysql://root@127.0.0.1/site2';
$db_prefix = array(
       
'default' => '',
       
'users' => 'site1.shared_',
       
'sessions' => 'site1.shared_'
);
?>

Pages

Google