[Drupal6]在自製模組中運用 CCK + imagefield 產生圖片欄位

edited 十一月 -1 in Drupal
這兒有找到比較正式的作法:
http://www.poplarware.com/cckfieldmodule.html

因為要動手當時沒辦法連到網路,所以看著程式碼硬是把它刻出來,不過好像不是非常穩固 ;)

原本是觀察手動操作 CCK 過程對資料庫產生的異動,直接在 hook_install() 塞進去同樣的資料,不過這個過程不是非常順利,可能是中間經過太多關,有些我沒有注意到的細節吧。於是,我就開始從程式碼去挖,發現在 modules/filefield/tests/filefield.test 有個 function createFileField() 有類似的操作,只是它的目的是測試檔案欄位的新增過程,我要的是圖片欄位,於是花了些時間找出一個勉強可以的方案。

首先,在自製模組的 xxx.info 檔案加入關聯需求:
dependencies[] = imagefield


接著在模組的 xxx.module 加入自訂 node 設定
function xxx_node_info() {
return array(
'xxx' => array(
'name' => t('Product'),
'module' => 'xxx',
'description' => t('A product node inside xxx module.'),
'title_label' => t('Product Name'),
)
);
}


在 xxx.install 檔案的 function xxx_install() 放入下面程式來為這個自訂 node 加入圖片欄位
module_load_include('inc', 'content', 'includes/content.crud');
$field = array(
'label' => 'Picture',
'field_name' => 'field_picture',
'type' => 'filefield',
'widget_type' => 'imagefield_widget',
'weight' => -1,
'parent' => 0,
'type_name' => 'product',
'list_field' => 0,
'list_default' => 1,
'description_field' => 0,
);

$field = content_field_instance_create($field);

$widget = array(
'type' => 'imagefield_widget',
'file_extensions' => 'png gif jpg jpeg',
'progress_indicator' => 'bar',
'type' => 'imagefield_widget',
'module' => 'imagefield',
);

$field['widget'] = array_merge($field['widget'], $widget);
$field = content_field_instance_update($field);
if(!db_column_exists('content_type_product', 'field_picture_fid')) {
db_query('ALTER TABLE {content_type_ic_product}
ADD COLUMN field_picture_fid int(11) DEFAULT NULL AFTER nid,
ADD COLUMN field_picture_list tinyint(4) DEFAULT NULL AFTER field_picture_fid,
ADD COLUMN field_picture_data text AFTER field_picture_list');
}


加入 db_column_exists() 判斷的原因是在測試時有時候會發現這幾個欄位沒有自動加進去,不確定哪個環節出問題,所以加入了額外判斷來避免發生問題。

如果希望在模組移除時同時將這個欄位的資料拿掉,可以在 xxx.install 的 hook_uninstall() 加入下面程式碼
module_load_include('inc', 'content', 'includes/content.crud');
content_field_instance_delete('field_picture', 'product');


原則上還是建議使用最上面提到的正式作法,不過既然已經弄出一個雛型就先忙其他部份了,等這個作法出現問題時再考慮用正式作法 ;)

也相對的,想這樣玩的人心臟要夠大嚕 ^^||

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=4985
Sign In or Register to comment.