Drupal実践プログラミング徹底入門(株式会社トップスタジオ 株式会社トップスタジオ John K.VanDyk Drupal Japan Drupal Japan Drupal Japan)|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. Drupal実践プログラミング徹底入門

Drupal実践プログラミング徹底入門

翻訳
原著

監修
翻訳
原著

形式:
書籍
発売日:
ISBN:
9784798118130
定価:
4,950(本体4,500円+税10%)
仕様:
B5変・648ページ
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発
シリーズ:
徹底入門

CMSベースのWebアプリ開発のための必携書!

Drupalには、一般のエンドユーザの観点から見た、使いやすく柔軟性のある高性能なコンテンツ管理システム(以下、CMSと呼ぶ)という一面と、開発者の観点から見た、多機能・高性能なウェブアプリケーションフレームワークとしての一面があります。
本書は、Drupalのウェブアプリケーションフレームワークとしての一面を徹底的に解説し、海外ではDrupal開発者のバイブルともなっている、『Pro Drupal Development, Second Edition』を日本語に翻訳した開発者向けの解説書です。Drupalのインストールの方法も、サイトを構築するための環境設定やコンテンツ作成の方法も一切掲載されていませんが、その代わりにDrupalの機能性を自由自在に拡張するために必要なあらゆる情報が、微に入り細を穿ち解説されています。
本書は、Drupalに携わる開発者はもちろんのこと、他のCMSに携わる開発者の方々にも是非一読されることをお勧めします。特に、これまで他のCMSで「単純な機能を追加するためだけに、なぜこれほどまで多くのファイルを作成し、多くのコードを書き、入力から出力まですべての面倒を見なければならないのか」と一度でも考えたことがあるのなら、迷わず本書を携え、Drupalでの開発に切り替えることをお勧めします。Drupalでは、『フック』と呼ばれるイベントドリブンの仕組みを利用することにより、面倒な処理はDrupalに任せ、ロジックに集中し、わずかな量のファイルとコードで、短時間で簡単に望みどおりの機能を追加できることでしょう。

第1章 Drupalの動作の仕組み

1-1 Drupalとは
1-2 テクノロジスタック
1-3 コア
1-4 管理インターフェイス
1-5 モジュール
1-6 フック
1-7 テーマ
1-8 ノード
1-9 ブロック
1-10 ファイルのレイアウト
1-11 リクエストの処理
まとめ

第2章 モジュールの作成

2-1 ファイルの作成
2-2 フックの実装
2-3 モジュール固有の設定の追加
2-4 データ入力フォームの追加
2-5 独自の管理セクションの定義
2-6 ユーザへの設定フォームの表示
2-7 ユーザによってサブミットされ設定の検証
2-8 さらなるステップ
まとめ

第3章 フック、アクション、トリガ

3-1 イベントとトリガについて
3-2 アクションについて
3-3 アクションにおけるコンテキストの使用
3-4 コンテキストの調査
3-5 アクションの格納方法
3-6 actions_do()によるアクションの直接コール
3-7 hook_hook_info()による独自のトリガの定義
3-8 既存のフックへのトリガの追加
まとめ

第4章 メニューシステム

4-1 コールバックマッピング
4-2 メニューのネスト
4-3 アクセスコントロール
4-4 タイトルのローカライズとカスタマイズ
4-5 メニュー項目におけるワイルドカード
4-6 他のモジュールから提供されるメニュー項目の変更
4-7 他のモジュールから提供されるメニューリンクの変更
4-8 メニュー項目の種類
4-9 一般的なタスク
4-10 menuモジュールの使用
4-11 よくある間違い
まとめ

第5章 データベースとの連携

5-1 データベースパラメータの定義
5-2 データベース抽出化レイヤについて
5-3 データベースへの接続
5-4 単純なクエリの実行
5-5 クエリ結果の取得
5-6 スキーマAPI
5-7 dropal_write_record()による挿入と更新
5-8 hook_db_rewrite_sql()による他のモジュールへのクエリの提示
5-9 Drupal内での複数のデータベースへの接続
5-10 一時テーブルの使用
5-11 独自のデータベースドライバの記述
まとめ

第6章 ユーザと認証

6-1 $userオブジェクト
6-2 hook_user()の概要
6-3 ユーザ登録の処理
6-4 ログイン処理
6-5 外部ログイン
まとめ

第7章 ノードとノードタイプ

7-1 ノードとは
7-2 すべてがノードであるとは限らない
7-3 ノードモジュールの作成
7-4 ノードの格納方法
7-5 CCKによるノードタイプの作成
7-6 ノードへのアクセス制限
まとめ

第8章 テーマシステム

8-1 テーマシステムの構成要素
8-2 テーマのインストール
8-3 PHPTemplateテーマの構築
8-4 テンプレートファイルについて
8-5 高度なテーマ化
まとめ

第9章 ブロック

9-1 ブロックとは
9-2 ブロックの設定オプション
9-3 ブロックの配置
9-4 ブロックの定義
9-5 ブロックの構築
9-6 モジュールのインストール時におけるブロックの有効化
9-7 ブロックの表示設定の例
まとめ

第10章 フォームAPI

10-1 フォーム処理について
10-2 基本的なフォームの作成
10-3 フォームAPIのプロパティ
まとめ

第11章 ユーザ入力の操作:フィルタシステム

11-1 フィルタ
11-2 フィルタと入力書式
11-3 カスタムフィルタの作成
11-4 悪意のあるデータからの保護
まとめ

第12章 コンテンツの検索とインデックス付け

12-1 カスタム検索ページの構築
12-2 検索HTMLインデクサの使用
まとめ

第13章 ファイルの処理

13-1 Drupalのファイル供給方法
13-2 PHPの設定
13-3 メディアの処理
13-4 ファイルAPI
まとめ

第14章 タクソノミー

14-1 タクソノミーとは
14-2 タクソノミーの種類
14-3 タームによるコンテンツ表示
14-4 タクソノミーの格納
14-5 モジュールベースのボキャブラリ
14-6 一般的なタスク
14-7 タクソノミー関数
14-8 その他のリソース
まとめ

第15章 キャッシュ

15-1 キャッシュの使用が適切なケース
15-2 キャッシュの動作
15-3 Drupalコアで使用されるキャッシュ
まとめ

第16章 セッション

16-1 セッションとは
16-2 セッションの利用方法
16-3 セッション関連の設定
16-4 セッション情報の格納
16-5 セッションのライフサイクル
16-6 セッションの会話
16-7 一般的なタスク
まとめ

第17章 jQueryの活用

17-1 jQueryとは
17-2 従来の方法
17-3 jQueryの動作
17-4 Drupal内でのjQuery
17-5 jQuery投票ウィジェットの作成
17-6 さらなる学習
まとめ

第18章 ローカライズと翻訳

18-1 localeモジュールの有効化
18-2 ユーザインターフェイスの翻訳
18-3 新しい翻訳の開始
18-4 言語翻訳のインストール
18-5 右から左へ表記する言語のサポート
18-6 言語ネゴシエーション
18-7 コンテンツの翻訳
18-8 ローカライズと翻訳の関連ファイル
18-9 追加リソース
まとめ

第19章 XML-RPC

19-1 XML-RPCとは
19-2 XML-RPCの必須条件
19-3 XML-RPCクライアント
19-4 単純なXML-RPCサーバ
19-5 組み込みのXML-RPCメソッド
まとめ

第20章 安全なコードの記述

20-1 ユーザ入力の処理
20-2 URLの安全な処理
20-3 db_query()によるクエリの安全化
20-4 db_rewrite_sql()によるプライベートデータの状態の維持
20-5 動的なクエリ
20-6 パーミッションとページコールバック
20-7 クロスサイトリクエストフォージェリ(CSRF:Cross-Site Request Forgeries)
20-8 ファイルのセキュリティ
20-9 メールヘッダのエンコード
20-10 cron.phpの保護
20-11 SSLのサポート
20-12 独立したPHP
20-13 AJAXのセキュリティ
20-14 フォームAPIのセキュリティ
20-15 スーパーユーザのアカウントの保護
20-16 eval()の使用
まとめ

第21章 開発のベストプラクティス

21-1 コーディングスタンダード
21-2 PHPのコメント
21-3 プログラムによるコーディングスタイルの点検
21-4 コードのテストと開発
21-5 module builderモジュール
21-6 アプリケーションのプロファイリングとデバック
まとめ

第22章 インストールプロフィール

22-1 プロフィールの格納場所
22-2 インストールプロフィールの動作
まとめ

付属データはこちら

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

追加情報はありません。

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2009年11月09日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 108
1つ目の網掛け
SELECT FROM role WHERE rid > 1 and rid != 7
SELECT name FROM role WHERE rid > 1 and rid != 7
2009.07.09
1刷 150
網掛けコードブロック
// セッションを書き、タイムスタンプを更新し、userフックの'login'を実行する user_authenticate_finalize($form_state['values']);
// セッションを書き、タイムスタンプを更新し、userフックの'login'を実行する user_authenticate_finalize($form_values);

引数名に誤りがありました。
2009.07.23
1刷 164
図7-2以下
 ダイレクトリンクを追加したくない場合は、hook_menu_alter()を使用して削除することができます。例えば次のコードは、「ノードの管理」 権限を持たないユーザからページを削除するコードです。 /** * hook_menu_alter()の実装 */ function joke_menu_alter(&$callbacks) {  // ユーザが「ノードの管理」権限を持たない場合、  // access callbackをFALSEに設定してjokeメニュー項目を無効にする  if (!user_access('administer nodes')) {  $callbacks['node/add/joke']['access callback'] = FALSE;  // デフォルトのアクセスコールバックとしてuser_access()を使用されないために、  // access argumentsを破棄する必要がある  unset($callbacks['node/add/joke']['access arguments']);  } }
 ダイレクトリンクを追加したくない場合は、hook_menu_link_alter()を使用して削除することができます。例えば次のコードは、「jokeの作成」ページへのダイレクトリンクを非表示にするコードです。 /** * hook_menu_link_alter()の実装 */ function joke_menu_link_alter(&$item, $menu) {  // 「jokeの作成」ページへのダイレクトリンクを非表示にする  if ($item['link_path'] == 'node/add/joke') {   $item['hidden'] = 1;  } }

hook_menu_alter()はコールされる条件が特殊であり、Drupalリクエストのライフサイクルで必ずコールされるものではないため、例に挙げられているコードは意図したとおりに動作しません。
また、この段階ではモジュールにパーミッションが定義されていないため、パーミッションを用いた例は適当ではありません。

なお、この修正に伴い、セクションのタイトルも「menuコールバックの変更」から「ダイレクトリンクの削除」に変更となります。
2009.09.29
1刷 210
「$secondary_links」項目のコードブロック内3行目
'links primary-links'))
'links secondary-links'))

設定すべきクラス名に誤りがありました。
2009.11.09
1刷 249
図10-1内
hook_form_id_alter()
hook_form_FORM_ID_alter()

関数名に誤りがありました。
2009.09.29
1刷 263
網掛けコードブロック
function formexample_nameform_submit($form_id, $form_state) {
function formexample_nameform_submit($form_id, &$form_state) {

2番目の引数の & が抜けています。
2009.07.16
1刷 264
2番目の網掛けコードブロック
function formexample_nameform_submit($form_id, $form_state) {
function formexample_nameform_submit($form_id, &$form_state) {

2番目の引数の & が抜けています。
2009.07.16
1刷 329
網掛けコードブロック内下部
/** * hook_search_page()の実装 */ function pathfinder_search_page($rows) {  $header = array(   array('data' => t('Alias'), 'field' => 'dst'), ('Operations'));
/** * hook_search_page()の実装 */ function pathfinder_search_page($rows) {  $header = array(   array('data' => t('Alias'), 'field' => 'dst'), t('Operations'));

t('Operations') の t が抜けています。
2009.07.16
1刷 37
上から5~6行目
variable_set($key, $value)を使用することでそれを取得することができます。
variable_get($key, $value)を使用することでそれを取得することができます。

関数名に誤りがありました。
2009.08.07
1刷 375
コードブロック内の6行目
if (empty($vid) || is_null(taxonomy_vocabulary_load($vid))) {
if (empty($vid) || (taxonomy_vocabulary_load($vid) === FALSE)) {

taxonomy_vocabulary_load() は、ボキャブラリが存在しない場合に NULL ではなく FALSE を返します。
2009.09.29
1刷 392
14~15行目
CACHE_ERMANENTでマーク付けされたアイテムは、キャッシュから削除されません
CACHE_PERMANENTでマーク付けされたアイテムは、キャッシュから削除されません

CACHE_PERMANENT の P が抜けていました。
2009.10.10
1刷 449
3番目のコードブロック内11行目
if ($is_author) { // ユーザが投稿者自身の場合は投票を許可しない
if ($is_author || !user_access('rate content')) { // ユーザが投稿者自身、または「rate content」権限を持たない場合は投票を許可しない

投票権限を持たないユーザに対する処理が抜けていました。
2009.11.09
1刷 83
最下部の網掛けコードブロック
function menufun_title() { drupal_set_title(t('The page title')); $now = format_date(time()); return t('It is now @time', array('@time' => $now)); }
function menufun_hello() { drupal_set_title(t('The page title')); return t('Hello!'); }

タイトルコールバック関数内でページタイトルを変更した場合、当該メニュー項目が表示されるすべてのページのページタイトルが変更されてしまいます。
したがって、83ページで説明しているように、特定のメニュー項目のタイトルとそのメニュー項目が指すページのタイトルを別々に設定したい場合は、メニューコールバック関数内で変更するのが妥当です。
2009.07.09