您在這裡

把 Drupal 的功能,套進自己寫的程式裏頭

drakeguan's 的頭像
drakeguan 在 2008-03-19 (三) 22:17 發表

如果,我想要寫支 .php 的程式,但要使用到 Drupal 的功能的話,要怎麼做呢?
Drake@Drupal
因為某些原因,我要寫一支獨立於 Drupal 之外,但卻要撈出 Drupal 資料庫裏的東西出來秀的程式。正在不知從何著手時,發現到 Drupal 根目錄的 cron.php 不正是一個這樣的程式嗎? 於是發現只要在自行寫的 .php 一開頭加上如下的程式碼,就可以了!

<?php
include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

於是我試著利用 Views 來撈出資料來:
<?php
include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$view_name = 'daily_list'; //name of view
$limit = 6; // number of returns
$view_args = array();
$view = views_get_view($view_name);
print views_build_view('embed', $view, $view_args, FALSE, $limit);

結果成功了!! 後來我又想把這支程式放到別的目錄去,不想把它和 Drupal 放在一起,但這麼一移,程式就不能跑了。研究了一下,發現到是 bootstrap.inc 在 include 的路徑是寫死的…靈機一動,繼出 chdir 大法 就成了。舉個例子,我在使用 Drupal 架的網站的一個叫 ooxx 的子目錄下寫了個 ooxx.php 的程式,於是我只要剛剛的程式碼開頭加上:

chdir(../);

就行了。

範例: http://drakeguan.org/front/front05/index.php (或是你連到 http://drakeguan.org/ 然後多 reload 幾次也行…)

附加檔案大小
Image icon drake_at_drupal.jpg109.25 KB

其實... 如果只要讀資料庫...
drupal_bootstrap( ); 的參數下 DRUPAL_BOOTSTRAP_DATABASE 就好了。
不然會因為讀了許多「有的沒有的東西」,造成回應時間變慢。

詳細的參數... 在 api 文件裡有。
函數說明文件

優點是方便,不用去理會一些有的沒有的設定。
缺點是效能上還是比直接寫mysql程式慢一些。

之前曾經過用,那個時候需要先下一個 chdir( ); 把工作目錄指到 Drupal 根目錄下。
不然require_once 的地方就會出錯,會找不到檔案。
不知道新版本是不是就沒有這個問題了。

現在我改用 PEAR 模組的 MDB2 來作資料庫的連線。功能上比 drupal 的 db_foo 強得多(畢竟是專門為連DB作的)。
因為是作為 api 給其它網站呼叫,所以用不到前台的畫面。所以就不用引用 drupal 的函數管理。

但是要作排序,資料表格呈現的話,感覺還是 drupal 的比較好用。
user, watchlog 的使用者列表、日誌排序功能,一直是我覺得神奇... 但仍沒搞懂的部分。居然可以用同一段 SQL 語法作那麼多變化....

我只是一個撰碼員,靠寫程式過活。
自從 Drupal 在 4.7 版的時候知道他的存在,但是後來跳去其它程式語言很久沒回來。
變成 D5 比較熟,D6 知道一點,D7 還在學的狀況…

架構是一個主站,多個子站。
支站登入是使用主站的帳號密碼,所以子站需要向主站要求帳號密碼。
也許有人會覺得奇怪,Drupal 本身不是就有分散認證的功能嗎?
但因為兩個原因,我不得不另外寫一個認證用的模組。
(1) Drupal 的分散式認證,是直接把遠端帳號的資料 copy 一份回來。
所以就算這個帳號在主站主機被停用,子站依然可以正常的登入。
這樣就無法由主站作帳號的管理。
(2) 除了登入完成後,除了本身帳號的資料外,還有其它客製的屬性是profile無法作到的。
所以還是要特別作一個傳和接的程式。

接收的部分還是用 Drupal hook 的功能作出。

傳值的部分則是用 PEAR::MDB2 連資料庫, 加上 PHP 5 的 SOAP 類別來傳值。
因為完全不用在意畫面,單純傳值,所以以能最快回應的方式來撰寫程式。

我只是一個撰碼員,靠寫程式過活。
自從 Drupal 在 4.7 版的時候知道他的存在,但是後來跳去其它程式語言很久沒回來。
變成 D5 比較熟,D6 知道一點,D7 還在學的狀況…