テーマを作る上で、良く使うスニペット集を殴り書きです。PHPの開始&閉じタグを省いているので、適宜、<?php ?> の追加をお願いします。このコードは 5.6.3.1.ja で確認済み。h() など 5.6.2.1以降でないと使えない関数も使っています。
説明は時間があるときに別記事で行っていきます。 Katz がテーマ作成の時によく使うコードのたまり場です。
5.7.x以降対応版
concrete5.7.x 以降は、フレームワークが変更され、テーマの記述方法も若干変わっています。そのため、新しいスニペット記事を用意しました。こちらからご覧ください。
http://ja.katzueno.com/2015/08/3492/
お断り
この記事は、下記ブログからの転載です。
原文
http://ja.katzueno.com/2014/05/3104/
※ 殴り書きなので、もしかしたら間違っているコードあるかも。その場合はお知らせいただくと幸いです。
更新日: 2014/6/20 (金)
※ このページは随時更新していきますが、ブログ記事のほうが更新頻度は高いです。
コードスニペット集
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;
// 便利なコード集
// 現在のページ情報を格納する。ファイルの最初に宣言しておいた方がいい(下記のコードもこれを使っている所あり)
$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();
}
// 編集モードだった場合の条件分岐
if ($c->isEditMode()) {
// ここにコードや、HTML を書く。
}
// 編集ツールバーが見えたときの条件分岐 (5.6.x 以降)
global $cp;
$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...
}
// ログイン・ログアウト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/7396557