svn import 的問題

Svn import 的使用原意是, 將一個已經建立好的專案匯入到 svn 的管理之下
作為第一次的提交, 是假設專案已經開展了, 一次匯入多個檔案

但 svn import 最後卻得不到廣大使用者的支持
svn 的文檔中也建議使用另一個方法匯入 (ref2)
原因有二:
1. 匯入之後的本機文件不會處於svn 的客戶端管理之下 (ref1)
意思其實是 import 了 c:\htdocs\abc 之後,
你需要再從 repo 之中 checkout svn 中的檔案
因為 import 之後, 本機的文件是不會有任何改變, 包括svn 的改變

2. 匯入的文件結構指令很容易出錯
我應該匯入 c:\htdocs\abc 還是 c:\htdocs\abc\* ?
checkout 時應該 checkout 根目錄還是子目錄?

3. 應該習慣建立 trunk, branches, tags 等的根目錄作為分支時使用 (ref3)
但import 方法不支持先建立以上的目錄樹

所以, svn 的官方文件建議的做法是,
先 checkout 空的根目錄, 再用一般的 add + commit 的方式提交第一次的源代碼

ref1: http://svnbook.red-bean.com/en/1.0/re12.html
ref2: http://subversion.apache.org/faq.html#in-place-import
ref3: http://svnbook.red-bean.com/en/1.4/svn.tour.importing.html

views 表格頭 theming (table header theming)

先修文章:
http://joetsuihk.com/node/94
http://joetsuihk.com/node/95

Views 的table header是可以使用 *.tpl.php 修改的,
常見的應用包括使用 icon 而不使用 text 作為 label
只要修改 style output 的 views-view-table.tpl.php

<?php
// $Id: views-view-table.tpl.php,v 1.8 2009/01/28 00:43:43 merlinofchaos Exp $
/**
 * @file views-view-table.tpl.php
 * Template to display a view as a table.
 *
 * - $title : The title of this group of rows.  May be empty.
 * - $header: An array of header labels keyed by field id.
 * - $fields: An array of CSS IDs to use for each field id.
 * - $class: A class or classes to apply to the table, based on settings.
 * - $row_classes: An array of classes to apply to each row, indexed by row
 *   number. This matches the index in $rows.
 * - $rows: An array of row items. Each row is an array of content.
 *   $rows are keyed by row number, fields within rows are keyed by field ID.
 * @ingroup views_templates
 */
?>

<table class="<?php print $class; ?>">
  <?php if (!empty($title)) : ?>
    <caption><?php print $title; ?></caption>
  <?php endif; ?>
  <thead>
    <tr>
<?php //表格頭輸出開始: ?>
      <?php foreach ($header as $field => $label): ?>
        <th class="views-field views-field-<?php print $fields[$field]; ?>">
          <?php print $label; ?>
        </th>
<?php //表格頭輸出完結:?>
      <?php endforeach; ?>
    </tr>
  </thead>
  <tbody>
    <?php foreach ($rows as $count => $row): ?>
      <tr class="<?php print implode(' ', $row_classes[$count]); ?>">
        <?php foreach ($row as $field => $content): ?>
          <td class="views-field views-field-<?php print $fields[$field]; ?>">
            <?php print $content; ?>
          </td>
        <?php endforeach; ?>
      </tr>
    <?php endforeach; ?>
  </tbody>
</table>

開發者只需要將 foreach 改成多個 if
就個別欄位表格頭輸出所需之 icon 圖像

看似簡單, 但如果表格頭需要 sortable, 並指示排序方向的話
便要再加一個 if case 檢查 $_GET['order'] 作不同輸出
奇怪 $views 變數之中竟然沒有 sort order 的資料

魔鬼都在細節之中...

Drupal7 的 模版改變 Drupal7 theming changes

DrupalCon SF 之後, 有很多 video 和session 都放到網上了
花了幾天的時間看了些自己喜歡的, 例如 A peek at Drupal 7 theme system changes

翻譯一下 http://www.slideshare.net/pingv/grok-drupal-7-theming (不是全部的改變, 詳情參考 ref2)
1. Drupal 7 theme 需要有以下元素:

  • CSS file
  • image
  • template (*.tpl.php)
  • js
  • preprocess 和 process (new)
  • .info

2. 將 page.tpl.php 分成 html.tpl.php 和 page.tpl.php
html.tpl.php 會放 DOCTYPE 一類的 tag

3. node.tpl.php 需要用 <?php render($content['comments']); ?> 才會顯示留言 (D6是預設自動加上)

4. 新增 region.tpl.php

5. node-[contenttype].tpl.php 改成 node--[contenttype].tpl.php
單劃表示連接字, 例如 content type 為 "super story" 時, 便使用 node--super-stoty.tpl.php

ref1: A peek at Drupal 7 theme system changes http://pingv.com/blog/a-peek-at-drupal-7-theme-system-changes

ref2: Converting 6.x themes to 7.x http://drupal.org/update/theme/6/7

2010-05-18 Drupal db_query vs views 的比較, 開發時要注意的地方

一直看到國內的進階 Drupal 教程都會提到使用 db_query() 用以代替 views, 例如: http://drupalchina.org/node/9021
觀點大概是 views 使用太多資源了, 使用 db_query() 能直接存取數據資料, 性能上會比較好,
也更自由等等

以下是我的個人意見:

雖然是進階的教程, 但開發者在有其他可使用的方法之下直接存取是不可取的, 原因:

1.安全問題
這是最重要的一點, 避開 sql-injection, xss
在自定義的代碼之中, 有太多入門的開發者忽視或不重視數據安全的問題
在不清楚如何編寫安全的 Drupal 代碼之前已經開始開發
而 views 的設計上已經極大量的考量安全問題
至少, views 之類的大型模組, 單單是測試者的數量可能已經比美你的訪客人數
所以, "自定義的代碼 會/可以 和 views 一樣安全" 是不成立的
views 一定比自定義的代碼安全
ref: http://drupal.org/writing-secure-code

2. 可變性
使用 views 的好處還有可變性強
這很明顯, 使用views 的 web admin 修改代碼一定會比修改自定義的快
在這個永遠活在 beta 版的網頁開發世界, 這一定是一個重要的優勢
多出的時間應該要用於編寫幫助文件或者用於測試等等的地方

3. 性能
這是一個沒有正確答案的問題:
使用views 是否一定會比較慢?
views 本身並不只是一個sql 產生器, 它還內建緩存機制
就好像 variables_get() 函數, Drupal 會將會個 variables table 放到一個 cache
一個 select 便可以存取全個 variables table 之內的數值
而類似的機制也出現在views
當然, 一個精心設計的 sql 會比 views 快,
但這個精心設計所帶來的性能是否可以補回以上的問題便值得仔細研究了

4. 培養良好的開發習慣
"良好的開發習慣" 很抽象
但基本的例如 *.tpl.php 之內不應該有顯示視圖以外的功能/代碼
又或者 CSS 應集中於一個css 檔之內而不應使用inline: <a style="color:red;">joe</a>
不應修改 Drupal 的核心代碼等等
這些習慣其實是可以由使用 contributed modules 來培養的
因為它們會定好習慣, 而你順著使用便會是最快的開發方式
然後藉此 "培養更多的良好的開發習慣"

最後, 這些都是我的觀點, 也是我見過的其他 Drupal 國外高手的潛規則
希望大家深入討論, 思考

提供"可使用的 tpl 檔" Working with template suggestion

Preprocess function 的另一個少用但重要的功能就是提供 "可使用的 tpl 檔"

簡單點說明, Drupal 本身已經提供的 page-story.tpl.php 就是 temple_preprocess_page() 提供的
同樣, page-front.tpl.php 都是由 drupal 自帶的 temple_preprocess_page 提供

或者用 node.tpl.php 做例子,
Drupal 自帶的 template_preprocess_node() 提供 node-[nid].tpl.php 作為 "可使用的 tpl 檔"

當然, 我們的目的是提供一種 Drupal 沒有自帶的 tpl 命名方式,
例如另一種 content-type 的 tpl 命名: node-type-[type].tpl.php:

<?php
//mytheme 的 template.php 之內:
//1. 留意, 使用你自定的theme 的名稱
//2. 留意使用了 pass by reference 參數
function mytheme_preprocess_node(&$variables) {
 
$variables['template_files'][] =  'node-type-'.$variables['node']->type;
}
?>

$variables之內的變數可以參考 的提示

ref: Working with template suggestions http://drupal.org/node/223440

Pages

Google