Drupal feeds module: FeedsProcessor with ubercart Order
使用者情境:批量使用 CSV 匯入 ubercart 訂單
Feeds 模組已經有一個 CSV 格式讀取 parser,又有批量 batch 支持,能處理大檔案 CSV ,Feeds 的代碼也有很多使用的經驗,而且最重要的是,模組自己已經有四種內容可以匯入:(nodes, users, terms, feednode?),有更高的機會支持其他內容 (ubercart orders)
Drupal feeds module: FeedsProcessor with ubercart Order
Use case: need to import batch ubercart orders from a CSV
Feeds module have a CSV parser already, have batch process build in, can process a large CSV already, and proven code. The most import, there are already 4 type of content that can be import (nodes, users, terms, feednode?), so likely there are other ways to import new content as well.
Custom feeds tamper plugin
feeds tamper module can map multiple columns inside a CSV to the same field as multiple value
But there is a constraint, each field can only "rewrite" once
For example, convertabc.jpg
tosites/default/files/abc.jpg
and then multiple them intosites/default/files/abc.jpg,sites/default/files/def.jpg
Two rewrite is needed in this case
There is no solution from feeds tamper module, you can only use a full path inside the CSV to skip the first rewrtie
客製自定義 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 了
建立一個自定義的區塊模組, 管理複雜的內容和權限設定 custom block module for complex block content and visability
專為右欄複雜的內容和複雜的顯示設定而建立一個模組管理有幾個好處:
1. 返回NULL 便可以令系統跳過
很方便的就可以處理不顯示的狀態
先檢查顯示與否, 不顯示或權限不足便返回 NULL
2. 源碼管理軟件 (scm) 可以助管理
傳統的 add block 方法將block 內容和顯示的邏輯放到資料庫
不利於 scm 管理
而且使用文件的方式儲存代碼更加有更新容易, 除錯容易等等的優點
身為開發者, 而不是使用者, 有責任為網站提供一個更容易維護的環境
3. 避免將錯誤的PHP 放到資料庫
在顯示設定很多時候都會用到 PHP code
而錯誤的 syntax error 的 PHP code 放到資料庫,
會為頁面不能顯示, 也不可以使用 web 介面修改
要到資料庫中修改, 很麻煩
implement hook_block()
hook_block() 是一個給 Drupal 提供block 的方法
假如你發覺自己在 add block 的時候用了 input method 使用了php
那你其實應該建立一個 module, 使用 hook_block()
原因: "module" vs "add block"
- php 的 syntax error 不會因為寫進了 DB 而做成修正的極大麻煩 vs 要直接修改 DB record
- File 方便 version control vs DB record 的 version control 和沒有做差無幾..
- customization 集中方便修改 vs 源碼分散
- File deployment vs DB deployment
所以, 不要懶了, 而且建立hook_block() 也很簡單
假設 module 名為 joe
Drupal 模組開發
模組開發是需要你有 PHP 的開發能力的
一般的想法是, contributed module 做不到我想要的功能
便自己開發一個
但其實, 遇到這樣的情況的機會實在不多
因為 Drupal 的用戶群已經足夠大了, 一般的問題都會有模組解決
但遇到定製的需求, 為了代碼維護性, 完整性, 便免不了需要自己寫一個module 了
Module development - introduction [module].info
要自己建立一個 module, 先要跟從 Drupal 的一些規定
令 Drupal 知道有這麼一個新的 module 存在
假設要寫的是一個名為 my_module 的模組 (真正的模組只可以使用 a 到 z 和 _ )
- 先到 sites/all/modules 建立一個資金夾, 名為 my_module
- 在資料夾之內建立兩個檔案
- my_module.info (模組的基本資料)
- my_module.module (模組的 php code)
my_module.info: (只介紹最基本的要求, 以後再補上非必要的設定)