【完全保存版】 concrete5.6.x テーマスニペット集

concrete5 トリック集

テーマを作る上で、良く使うスニペット集を殴り書きです。PHPの開始&閉じタグを省いているので、適宜、<?php ?> の追加をお願いします。このコードは 5.6.3.1.ja で確認済み。h() など 5.6.2.1以降でないと使えない関数も使っています。

説明は時間があるときに別記事で行っていきます。 Katz がテーマ作成の時によく使うコードのたまり場です。

※ 殴り書きなので、もしかしたら間違っているコードあるかも。その場合はお知らせいただくと幸いです。

このページは concrete5.6.x 版です。 5.7.x 以降のコードスニペットはこちらから。

初稿: 2014/5/28 (木) ※ このページは随時更新していきます。
更新日: 2014/6/26 (木)

PHP コードスニペット

<?php
// 必須タグ

// 最初の直接アクセス禁止
defined('C5_EXECUTE') or die(_("Access Denied."));

// <head> 直後に配置
Loader::element('header_required');

// </body> 直前に配置
Loader::element('footer_required');

//エリア宣言
$a = new Area('【エリア名】');
$a->display($c);

//グローバルエリア宣言
$a = new GlobalArea('【グローバルエリア名】');
$a->display();

// view.php (Single ページ) 表示用
print $innerContent;

// 便利なコード集

// ログインエラーを表示 (view.php に記述)
Loader::element('system_errors', array('error' => $error));

// 現在のページ情報を格納する。ファイルの最初に宣言しておいた方がいい(下記のコードもこれを使っている所あり)
$c = Page::getCurrentPage();

// テーマへのパス
echo $this->getThemePath();

// テーマのカスタマイズ機能を使って CSS をセットする場合
echo $this->getStyleSheet('【CSSファイル名】.css');

// ヘッダーやフッター部分のコードなど、別ファイルに共有部分を追加し埋め込みたい場合
$this->inc('elements/header.php');
$this->inc('elements/footer.php');
$this->inc('【その他任意のファイル名】');

// エリア内のブロック数を制限する
<?php
$a = new Area('【エリア名】');
$a->setBlockLimit(1); // 1 のところを変えて制限数を変える
$a->display($c);
?>

//エリアがゼロだったら表示しない(Global にしたらグローバルエリアでも可能)
$a = new Area('【エリア名】');
if ($c->isEditMode() | $a->getTotalBlocksInArea($c) > 0) {
 $a->display($c);
}

$a = new GlobalArea('【グローバルエリア名】'); // 未検証・要テスト
if ($c->isEditMode() | $a->getTotalBlocksInArea() > 0) {
 $a->display();
}

// グローバルエリアの編集を表から行わない
// HTML ブロック流しこみなどで、編集モードにした時に、表示が崩れすときなどの対策に使います。
$a = new GlobalArea('【グローバルエリア名】');
$a->disableControls();
$a->display();

// 編集モードだった場合の条件分岐
if ($c->isEditMode()) {
// ここにコードや、HTML を書く。
}

// 編集ツールバーが見えたときの条件分岐 (テーマや、ブロックの view.php内:5.6.x 以降)
$cp = new Permissions($c);
if ($cp->canViewToolbar()) {
    // ここにコードや、HTML を書く。
}

// 編集ツールバーが見えたときの条件分岐 (テーマ・ブロック以外:5.6.x 以降)
$cp = new Permissions($c);
$canViewToolbar = (isset($cp) && is_object($cp) && $cp->canViewToolbar());
if ($canViewToolbar) {
// ここにコードや、HTML を書く。
}

// 編集ツールバーが見えたときの条件分岐 (テーマ・ブロック以外:5.6.x 未満)
global $cp;
$canViewToolbar = (isset($cp) && ($cp->canWrite() || $cp->canAddSubContent() || $cp->canAdminPage() || $cp->canApproveCollection()));
if ($canViewToolbar) {
    //do something...
}

// ページタイプのデフォルトページだった場合
if ($c->isMasterCollection()) {
    // ここにコードや、HTML を書く。
}

// ログイン・ログアウトURL (ログイン後に元いたページに戻ります)
$u = new User(); // これはファイルの最初に一回宣言したら良いだけです
if ($u->isRegistered()) { ?>
<p class="login_button inner-cell"><a href="<?php echo $this->url('/login', 'logout')?>"><?php echo t('Logout');?></a></p>
<?php } else { ?>
<p class="login_button inner-cell"><a href="<?php echo $this->url('/login', 'forward') . $c->getCollectionID() . '/';?>"><?php echo t('Login');?></a></p>

<?php } ?>

<?php
// ページ情報の取得

// ページ名を取得し htmlentitle エンコード
echo h($c->getCollectionName());

// ページ名・親階層のページを表示
$c = Page::getCurrentPage();
$nh = Loader::helper('navigation');
// concrete5 第4階層以降であれば、第3階層 のページタイトルを表示させる。
// [現在のページタイトル] - [第2階層のページタイトル]
// ページ属性 display_secondary_title がチェックされていれば第2階層のタイトルを表示しない
// $trail [0] はトップ
// $trail [1] は第2階層
echo h($c->getCollectionName());
if (!$c->getAttribute('display_secondary_title')){
	$trail = $nh->getTrailToCollection($c))
	$breadcrumb = array_reverse ($trail);
	if ($breadcrumb[1]) {
		echo . ' - ' .h($breadcrumb[1]->getCollectionName());
	}
}

// ページの「説明」を取得
echo h($c->getCollectionDescription());

// ページの公開日 (Y/m/d) という日付フォーマットで表示
echo $c->getCollectionDatePublic('Y/m/d');

// ページの所有者を表示
$user = User::getByUserID($c->getCollectionUserID());
$username = $user->getUserName();
echo $username;

// ページの所有者の公開プロフィールURLを取得
$profileurl = View::url('/profile/',$c->getCollectionUserID());
echo $profileurl;

// ページを最初に作った人のIDを取得
$original_author = Page::getByID($c->getCollectionID(), 1)->getVersionObject()->getVersionAuthorUserName();
echo $original_author;

// 最後に編集した人のユーザーIDを取得
$last_edited_by = $c->getVersionObject()->getVersionAuthorUserName();
echo $last_edited_by;

// ページ属性の値を出力
echo $c->getAttribute('【ページ属性のハンドル】');

// ページ属性の値を出力(エスケープ処理)
echo h($c->getAttribute('【ページ属性のハンドル】'));

// ページ属性の値を出力(複数行に <br> つける)
echo nl2br(h($c->getAttribute('【ページ属性のハンドル】'));

// 日付属性を表示させる(いろんなバージョン)をちょっとすっきり
$date = strtotime($c->getAttribute('【ページ属性のハンドル】'));
echo date ('Y年m月d日 H:i', $date));
echo date ('Y/m/d', $date));
echo date ('H:i', $date));

// ページ属性で画像を読み込む(リサイズなし)
$img = $c->getAttribute('【画像が入っているページ属性のハンドル】');
list($img_width, $img_height) = getimagesize($img->getPath()); //元画像の縦、横ピクセルを取得
echo $img->getRelativePath(); // 画像URL
echo $img_width; // 横ピクセル数
echo $img_height; // 縦ピクセル数
// 上記3コードを適宜 <img> タグの中に埋め込む

// ページ属性で画像を読み込む(リサイズあり)
$ih = Loader::helper('image'); // イメージヘルパー読み込み。リサイズ処理で必要
$img = $c->getAttribute('【画像が入っているページ属性のハンドル】');
$thumb = $ih->getThumbnail($img, 縦, 横, true); //リサイズ処理。無制限の場合9999と指定
echo $thumb->src; // リサイズされた画像のURL
echo $thumb->width; // リサイズされた画像の横ピクセル
echo $thumb->height; // リサイズされた画像の縦ピクセル
// 上記3コードを適宜 <img> タグの中に埋め込む

// ページリスト関連 (ページリストのループ内の $c を $cobj と定義)
$cobj = $cArray[$i]; 

// ページリスト等:ページの小ページの数を取得 (ページリストなどに使える)
echo $cobj->getNumChildren();

// ページリスト等:ページが外部リンクで「_blank」指定があるかどうか
$cobj->getCollectionPointerExternalLink(cID)

// ターゲット属性「nav_target」を取得
$target = $cobj->getAttribute('nav_target');

// ページタイプのハンドルを取得する
$c->getCollectionTypeHandle();

// 特定のページタイプだったらエリアを表示させる
$pageType = $c->getCollectionTypeHandle();
if ($pageType =='【ページタイプのハンドル】') {
    $a = new Area('【エリア名】');
    $a->display($c);
}

// ヘッダーに js や css を追加させる
// テーマフォルダにリンクが飛ぶ。下層ディレクトリのファイルを指定することも可能。
$html = Loader::helper('html');
$this->addHeaderItem($html->css('somecss.css'));
$this->addHeaderItem($html->javascript('js/somejs.js')); // 仮想ディレクトリの JS 「テーマ/js/somejs.js」を読み込んでいる例

// ヘッダーに js や css を追加させる(パッケージに同梱させた場合)
$html = Loader::helper('html');
$this->addHeaderItem($html->css('somecss.css'), '【パッケージハンドル】');
$this->addHeaderItem($html->javascript('somejs.js'), '【パッケージハンドル】');

CSS コードスニペット

CSS のカスタマイズ機能をオンにした時に使えるパラメーター一覧
/* 【カスタマイズ定義の宣言】*/ デフォルトの値 /* 【カスタマイズ定義の宣言終わり】*/

「echo $this->getStyleSheet(‘【CSSファイル名】.css’);」
でCSSを読み込む必要あり。

/* 背景色カスタマイズ */

/* customize_body-background */ background-color: #dff5ff; /* customize_body-background */
/* customize_header-background */ background-color: #fff; /* customize_header-background */
/* customize_main-background */ background-color: #fff; /* customize_main-background */
/* customize_footer-background */ background-color: #a0dbe3; /* customize_footer-background */
/* customize_tag-highlight */ background-color: #A0DBE3; /* customize_tag-highlight */

/* フォント色 */
/* customize_nav-links */ color: #000; /* customize_nav-links */
/* customize_nav-hover */ background-color: #a0dbe3; /* customize_nav-hover */
/* customize_site-title */ color: #000; /* customize_site-title */
/* customize_links */ color: #0099ff; /* customize_links */
/* customize_headings */ color: #000; /* customize_headings */
/* customize_text */ color: #000; /* customize_text */
/* customize_footer-text */ color: #000; /* customize_footer-text */

/* フォント種類 */
/* customize_paragraph_font */ font: normal normal normal 14px/1.8em 'Merriweather', Georgia, serif; /* customize_paragraph_font */

/* その他なんでも CSS を入れれるところ */
/* customize_miscellaneous */ /* customize_miscellaneous */

Javascript コードスニペット

// 相対URLパスの書き方 (via @acliss19xx)
//CCM_BASE_URL + CCM_REL + '/index.php'
//
// htmlブロックタイプはjavascriptの記述を許可していますので
//以下のように書けば絶対パスをべた書きしなくて済みます。
<a href ="#" onclick="location.href = CCM_BASE_URL + CCM_REL + '/index.php'">ホーム</a>

菱川教授

■ 多言語グローバルエリア
Internationalization アドオンを使った多言語サイトで、グローバルエリアを言語ごとに自動生成する追加機能
https://gist.github.com/hissy/7396557

■ ページリスト掲載中の新着記事に「New」マークを付ける方法
https://gist.github.com/hissy/9616508