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

テーマを作る上で、良く使うスニペット集を殴り書きです。PHPの開始＆閉じタグを省いているので、適宜、&lt;?php ?&gt; の追加をお願いします。このコードは 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 コードスニペット

```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を読み込む必要あり。

```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 コードスニペット

```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