concrete5デザインカスタマイズに
必要なPHP
第27回concrete5大阪勉強会
注)分かりやすさ優先で資料を作っています
  用語は正確でない場合がありますのでご了承ください
concrete5では、テーマやブロックテン
プレートを作成する際、プログラミング
の知識はほとんど必要ありません。
concrete5は、MVCという考え方に基
づいて設計されています。
モデル(M): データベースからの情報
の出し入れや処理を担当
ビュー(V): データを画面に表示
コントローラー(C): MとVの間を取り
持つ係
デザインカスタマイズを行なう際は、
ビュー(View)だけ触ればOK
!
(プログラミングの知識が必要になるM
やCは、基本的に触らなくていい)
concrete5デザインカスタマイズに
必要なPHP
!
=
どんなPHP?
<?php

$a = new Area( Main );

$a->display($c);

?>
$c = Page::getCurrentPage();

$title = $c->getCollectionName();
$th = Loader::helper( text );
echo $th->entities($title);
<?php

$ih = Loader::helper( image );

foreach ($pages as $page):
$img = $page->getAttribute( page_thumbnail );
$thumb = $ih->getThumbnail($img, 64, 9999, false);
?>
<img src="<?php echo $thumb->src ?>" width="<?php
echo $thumb->width ?>" height="<?php echo
$thumb->height ?>" alt="" />
<?php endforeach; ?>
難しそうやないか!

(╯ □ )╯︵ ┻━┻
!
ひとつひとつ見て行きましょう!
超基本編

̶ まずはここから。
PHP
•開始タグ <?php
•終了タグ ?>
•HTMLの中にプログラムを埋め込む

= 開始タグと終了タグの間がPHP
•PHPだけのファイルの場合は、終了タ
グを書かない
コメント
•処理されないメモ書き
•単一行

// で始まり改行するまでがコメント
•複数行

/* ではじまり

改行を挟んでもコメントのまま

コメントの終了は */
コメント
•複数行コメントは、中間の行がコメン
トかどうか分かりにくくなるため、慣
例的に中間の行の先頭にも * が書かれ
ることが多い



/*

* コメント

*/
代入
•左辺に右辺の値(実行結果)を設定
•$text = Hello ; // 文字列を代入

echo $text; // 画面に出力 Hello
•$sum = 5 + 3; // 右辺の実行結果を
代入(8)
•$a = new Area( Main );

// Areaクラスのインスタンスを代入
変数
•データを一時的に保存し再利用するた
めのしくみ
•$text = Hello ;
•この場合 $text が変数
•$ で始まる名前をつけることができる
•echo $text; // は

echo Hello ; // と同じ結果になる
関数と引数
•PHPで行なえる処理 : 関数
•関数に渡すパラメーター : 引数
•書き方 : 関数(引数)
関数と引数
•$text = concrete5

osaka ;

$text = nl2br($text); // 改行をbrタ
グに変換する関数

echo $text;
•結果は

concrete5<br />

osaka
クラス編
̶ ちょっと難しいけど重要な概念
オブジェクト指向プログラミング
•システムをオブジェクトの集合体として
とらえる手法
•オブジェクト : システムを構成する概念
•オブジェクトは、それ自身が自分が何者
であるか、何をすべきかを知っている
concrete5
•ページ
•エリア
•ブロック
•ユーザー
•ファイル
クラス =
•オブジェクトの種類を定義
•オブジェクトがどんなデータを持てる
かを定義 = プロパティ
•オブジェクトで何ができるかを定義

= メソッド
クラスの例
•プロパティー

$cID : 各ページごとの固有なID
クラスの例
•メソッド

自分自身に対する情報
getCollectionName() : ページ名を取得

isEditMode() : ページが編集モードか

自分自身に対する操作

add() : ページを追加

delete() : ページを削除
インスタンス
•クラスはあくまで設計図。設計図をも
とに実体を作成する必要がある
•クラスをもとに作成したオブジェクト
の実体をインスタンスと呼ぶ
•class Area エリアの設計図
•$a = new Area( Main );

Main を引数として、設計図を元に
Main エリアのインスタンスを作成
class
Page
ホーム
ページ 概要
ページ
お問い合わせ
ページ
インスタンス(実体)
クラス(設計図)
インスタンス
•インスタンス内のプロパティーやメソッ
ドにアクセスするには、アロー演算子

(->)を使う
•$a = new Area( Main );

$a->display($c);
•Areaクラスのdisplayメソッドを実行
•引数は $c(Pageクラスのインスタンス)
new
•$c = Page::getCurrentPage();
•getCurrentPage() はメソッド
•-> を使う場合はインスタンス(実体)
が持つメソッド
•:: を使う場合はクラス(設計図)自身
が持つ特殊なメソッド
•スコープ定義演算子(ダブルコロン)
new
•$c = Page::getCurrentPage();
•Pageクラスの設計図に、現在見てい
るページのインスタンスを取得すると
いうメソッドが定義されている
•他に

Page::getByID($cID);

Page::getByPath( /about );

など。クラスによって違う
静的メソッド
•:: を使う、インスタンス化しなくても
使える、クラス自体(設計図)が持っ
ているメソッドを静的な(static)メ
ソッドと呼ぶ
復習(1)
<?php
// テーマ内でエリアを表示するのに使うコード

$a = new Area( Main );

$a->display($c);

?>
<?php
// 変数 $a に Area クラスのインスタンスを代入
// 引数は Main 

$a = new Area( Main );
// Area クラスのメソッド display() を実行
// 引数は $c(Pageクラスのインスタンス)

$a->display($c);

?>
<?php
// 応用例
// 概要ページ(about)のインスタンスを取得

$aboutPage = Page::getByPath( /about );
// Main エリアのインスタンスを取得

$a = new Area( Main );
// 概要ページのMainエリアの内容を表示

$a->display($aboutPage);

?>
// 応用例その2
// 現在見ているページのタイトルを表示
$c = Page::getCurrentPage();

$title = $c->getCollectionName();
$th = Loader::helper( text );
echo $th->entities($title);
// Pageクラスの静的メソッドを使い、現在見ているページ
のインスタンスを取得
$c = Page::getCurrentPage();
// Pageクラスのインスタンスのメソッドを使い、ページ名
を取得して変数に代入

$title = $c->getCollectionName();
// textヘルパーの取得(Loaderクラスを使う)
$th = Loader::helper( text );
// セキュリティ対策メソッド entities() を利用してページ名
を表示
echo $th->entities($title);
制御編
̶ 条件分岐、ループ
条件分岐 : if
•if ($foo == foo ) {

// 条件に合致する時

} else {

// 条件に合致しない時

}
•単に if ($foo) で値が空ではないとき
ループ : foreach
•複数のデータを順番に処理する
•ページリストブロックの場合

foreach ($pages as $page) :

/* 変数 $pages に表示するページの

* インスタンスが複数入っている

* 変数 $page に順番に代入される

*/

endforeach;
ループ : foreach
•そもそも $pages はいつ作成される?
•→ コントローラー(C)の領域なので、
デザインカスタマイズの際は気にしな
いでOK
if と foreach 以外にもたくさんありますが
デザインカスタマイズでは使いません
復習(2)
<?php
// ページリストブロックのview.phpからの抜粋

$ih = Loader::helper( image );

foreach ($pages as $page):
$img = $page->getAttribute( page_thumbnail );
$thumb = $ih->getThumbnail($img, 64, 9999, false);
?>
<img src="<?php echo $thumb->src ?>" width="<?php
echo $thumb->width ?>" height="<?php echo
$thumb->height ?>" alt="" />
<?php endforeach; ?>
<?php

// imageヘルパーを取得

$ih = Loader::helper( image );

// foreach文でループしている

foreach ($pages as $page):

// 変数 $page に代入されている Page クラスの

// インスタンスの getAttribute() メソッドを使って

// page_thumbnail というハンドルのページ属性を取得
$img = $page->getAttribute( page_thumbnail );
// imageヘルパーのメソッドを使い、

// 幅64pxにリサイズした画像のサムネイルを取得
$thumb = $ih->getThumbnail($img, 64, 9999, false);
// 続き

$thumb = $ih->getThumbnail($img, 64, 9999, false);

/* 

* 変数 $thumb に代入されたオブジェクトから、画像の

* URL、幅、高さのプロパティを echo で表示している

*/

?>
<img src="<?php echo $thumb->src ?>" width="<?php
echo $thumb->width ?>" height="<?php echo
$thumb->height ?>" alt="" />
<?php endforeach; ?>
時々出てきた「ヘルパー」という用語は
PHPの用語ではなくconcrete5で使う用語です。
説明は省きましたが詳細はブログ記事
「デザイナーさんも必見、concrete5の
ヘルパーの使い方まとめ」
を見てみてください!
http://notnil-creative.com/blog/archives/2866
concrete5のクラスがどんなメソッドを持ってい
るかは、API検索、または開発者ドキュメントで調
べることができます(和訳協力者絶賛募集中)
http://www.concrete5.org/api/
http://www.concrete5.org/documentation/
developers/
今日ご紹介した話や用語は、覚えてなく
ても特に支障ありません。
!
そういう仕組みなのか∼と思って忘れて
ください

(:D)¦ ̄¦_
おしまい

concrete5デザインカスタマイズに必要なPHPの知識