<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>cakephp・baserCMS忘備録-Materializing [マテリアライジング]</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/" />
    <link rel="self" type="application/atom+xml" href="http://www.materializing.net/atom.xml" />
   <id>tag:www.materializing.net,2006://1</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1" title="Materializing [マテリアライジング]" />
    <updated>2020-12-06T23:03:43Z</updated>
    <subtitle>web的暮らし と銘打ち、その足跡を遺していくサイトです。Movabletype,wordpress,EC-CUBE等のCMSをローカルサーバ立てて楽しんでます。それとちょびっとだけPHP。便利なソフトウェアや楽しそうなサイトも紹介中。</subtitle>
 

<entry>
    <title>BurgerEditorで作った記事内容を簡単に2箇所に分割表示して楽しむ手法</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2020/12/07080327.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=614" title="BurgerEditorで作った記事内容を簡単に2箇所に分割表示して楽しむ手法" />
    <id>tag:www.materializing.net,2020://1.614</id>
    
    <published>2020-12-06T23:03:27Z</published>
    <updated>2020-12-06T23:03:43Z</updated>
    
    <summary> 昨年の baserCMS Advent Calendar 2019に続き、今年もbaserCMS Advent Calendar 2020が始まってます。 さてその7日担当です。=[ &apos;ω&apos; ] ﾄｳﾌｰ baserCMS4のご紹介 baserCMSとは、C...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
昨年の <a href="https://adventar.org/calendars/4498">baserCMS Advent Calendar 2019</a>に続き、今年も<a href="https://adventar.org/calendars/5393">baserCMS Advent Calendar 2020</a>が始まってます。<br />
さてその7日担当です。=[ 'ω' ] ﾄｳﾌｰ
</p>


<h3>baserCMS4のご紹介</h3>

<p>
baserCMSとは、CMS（Contents Management System）です。<br />
世の中には、WordpressとかMovableTypeとかSHIRASAGIなどいろんなCMSがありまして、その中で、PHPのフレームワークであるCakePHPを用いてできてるCMSです。
</p>

<pre>baserCMS（ベーサーシーエムエス）とは、Webサイト制作プラットフォームとして最適な国産CMSです。</pre>

<p>
です。<br />
■ <a href="https://basercms.net/">baserCMS - 国産オープンソース！フリー（無料）でコンテンツ管理に強いCMS</a>
</p>

<p>
プラグインとかテーマの配布・販売やってます。<br />
■ <a href="https://market.basercms.net/">baserマーケット</a>
</p>

<p>
導入事例いっぱいあります。着々と増加中です。<br />
■ <a href="https://basercms.net/works/">baserCMS導入事例 | baser CMS』</a>
</p>

<p>
それから、記事をブロック単位で作ることができる、ハンバーガみたいに積み上げていく感覚で簡単に記事作成ができるBurgerEditorというプラグインがあります。<br />
■ <a href="https://market.basercms.net/products/detail.php?product_id=66">BurgerEditor（baserCMS３対応）（baserCMS４対応） ダウンロード | baserマーケット</a>
</p>


<h3>この記事で紹介すること</h3>

<p>
この記事では、baserCMS＋BurgerEditorで記事を作るときに、記事の1編集領域でBurgerEditorを利用して作成した内容を、2箇所に分割表示する手法を紹介します。<br />
どちらかと言えば開発者さん向けですが大丈夫。<br />
少しがんばる気力があればたぶん運営者でもできちゃいます。
</p>]]>
        <![CDATA[<h3>記事内容を2箇所に分割表示するってどういうこと？</h3>

<p>
1記事の編集領域は通常1つです。<br />
なので、BurgerEditorで作成する記事内容も1つということになります。
</p>

<p>
■ 管理側の記事サンプル<br />
<a rel="lightbox" href="/images/sc_20201207191443.png"><img alt="sc_20201207191443.png" src="/images/sc_20201207191443.png" width="500" height="384" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a><br />
■ 公開側の表示サンプル<br />
<a rel="lightbox" href="/images/sc_20201207193443.png"><img alt="sc_20201207193443.png" src="/images/sc_20201207193443.png" width="500" height="398" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a>
</p>

<p>
記事編集領域の内容を2箇所に表示する、ということなので、<br />
手っ取り早く固定ページテンプレートに、編集領域で書いた内容を反映する箇所を2つに増やします。<br />
BcPage->content() を2箇所に書いちゃえば良いですね。
</p>

<pre><code>&lt;?php $this-&gt;BcPage-&gt;content();?&gt;
&lt;section&gt;
&lt;hr&gt;
※この部分はどのページでも表示される共通部分
&lt;br&gt;
　固定ページテンプレート（/theme/bc_sample/Pages/templates/default.php）に記載する
&lt;hr&gt;
&lt;/section&gt;
&lt;?php $this-&gt;BcPage-&gt;content(); ?&gt;
</code></pre>

<p>
結果、公開側はどうなるか？<br />
もちろん編集領域で作成した同じ内容が2つ表示されます。<br />
<a rel="lightbox" href="/images/sc_20201207194540.png"><img alt="sc_20201207194540.png" src="/images/sc_20201207194540.png" width="500" height="806" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a>
</p>

<p>
やりたいことは「この見出しより下のブロック群は別の箇所に表示したい」なので、もちろんこれではNGです。<br />
なので記事の編集内容を分割し、「この見出しより下のブロック群は別の箇所に表示したい」部分は、「※この部分はどのページでも表示される共通部分」より下の段に表示されるようにします。
</p>

<p>
分割するには規則が必要なので、今回はバーガーブロックの「独自class設定」を用いて、独自classに「bottom-content」が設定されたブロックは、共通部分の下段に表示されるようにしてみます。
</p>

<h3>パースして分割しちゃうのが手っ取り早い</h3>

<p>
必要なのは以下。<br />
・A. 独自classに bottom-content が設定されていないブロックの一覧でできたHTML<br />
・B. 独自classに bottom-content が設定されたブロックの一覧でできたHTML
</p>

<p>
ということでテーマヘルパを利用して必要なHTMLが取得できるようにします。<br />
テーマヘルパについてはこちら。<br />
■ <a href="https://basercms.net/functions/theme_helper">テーマヘルパー https://basercms.net/functions/theme_helper</a><br />
テーマヘルパに以下2つのメソッドを追加します。<br />
※今回、テーマヘルパはbaserCMSインストール時に標準テーマとして入る bc_sample テーマに同梱されている ContestSampleHelper を利用している前提とします。<br />
　・/theme/bc_sample/Helper/ContestSampleHelper.php
</p>

<pre><code>	/**
	 * 指定した独自classを設定したブロック以外のブロックでできたHTMLを取得する
	 *
	 * @param string $content 記事編集領域の内容
	 * @return string
	 */
	public function getArticleCustomClassBlock($content, $className = '') {
		$contentList = [];

		$DOM = new DOMDocument;
		// 文字化けを防ぐ目的で mb_convert_encoding() を利用する
		$content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8');
		// @はHTML記述に誤りがあった場合にエラー表示しないため
		@$DOM-&gt;loadHTML($content);
		$XPath = new DOMXPath($DOM);
		$blockList = $XPath-&gt;query('//div[@data-bgb]');

		if ($className) {
			foreach ($blockList as $node) {
				$hasTargetClass = false;
				$attributes = $node-&gt;attributes;
				foreach ($attributes as $attr) {
					if ($attr-&gt;name === 'class') {
						if(strpos($attr-&gt;value, $className) !== false){
							// class名に bottom-content が含まれている場合
							$hasTargetClass = true;
						}
					}
				}
				// 特定のclass名のみを持ったブロックを取得する
				if ($hasTargetClass) {
					$contentList[] = $DOM-&gt;saveHTML($node);
				} else {
					continue;
				}
			}
		} else {
			foreach ($blockList as $node) {
				$contentList[] = $DOM-&gt;saveHTML($node);
			}
		}

		unset($DOM, $blockList);
		return implode('', $contentList);
	}

	/**
	 * 指定した独自classを設定したブロック以外のブロックでできたHTMLを取得する
	 *
	 * @param string $content 記事編集領域の内容
	 * @return string
	 */
	public function getArticleExcludeCustomClassBlock($content, $className = '') {
		$contentList = [];

		$DOM = new DOMDocument;
		// 文字化けを防ぐ目的で mb_convert_encoding() を利用する
		$content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8');
		// @はHTML記述に誤りがあった場合にエラー表示しないため
		@$DOM-&gt;loadHTML($content);
		$XPath = new DOMXPath($DOM);
		$blockList = $XPath-&gt;query('//div[@data-bgb]');

		if ($className) {
			foreach ($blockList as $node) {
				$hasTargetClass = false;
				$attributes = $node-&gt;attributes;
				foreach ($attributes as $attr) {
					if ($attr-&gt;name === 'class') {
						if(strpos($attr-&gt;value, $className) !== false){
							// class名に bottom-content が含まれている場合
							$hasTargetClass = true;
						}
					}
				}
				// 特定のclass名のみを持ったブロックを取得する
				if ($hasTargetClass) {
					continue;
				} else {
					$contentList[] = $DOM-&gt;saveHTML($node);
				}
			}
		} else {
			foreach ($blockList as $node) {
				$contentList[] = $DOM-&gt;saveHTML($node);
			}
		}

		unset($DOM, $blockList);
		return implode('', $contentList);
	}</code></pre>

<p>
次に、ページテンプレート側では内容を以下のように変えます。
</p>

<pre><code>&lt;?php
ob_start();
$this-&gt;BcPage-&gt;content();
$content = ob_get_contents();
ob_end_clean();

echo $this-&gt;ContestSample-&gt;getArticleExcludeCustomClassBlock($content, 'bottom-content');
?&gt;
&lt;section&gt;
&lt;hr&gt;
※この部分はどのページでも表示される共通部分
&lt;br&gt;
　固定ページテンプレート（/theme/bc_sample/Pages/templates/default.php）に記載する
&lt;hr&gt;
&lt;/section&gt;

&lt;?php
ob_start();
$this-&gt;BcPage-&gt;content();
$content = ob_get_contents();
ob_end_clean();

echo $this-&gt;ContestSample-&gt;getArticleCustomClassBlock($content, 'bottom-content');</code></pre>

<p>
BcPage-&gt;content() では、内部的にechoするメソッドなので、出力されている内容をバッファして保持することで、表示内容のHTMLを加工するための文字列として取ってます。<br />
あとは記事内容であるブロックを加工したHTMLを表示するだけです。
</p>

<p>
結果はこんな感じになりました。<br />
画像4つブロックと2カラムブロックは「この見出しより下のブロック群は別の箇所に表示したい」の下段に移動し、上段のブロック群には表示されていません。
</p>

<p>
<a rel="lightbox" href="/images/sc_20201207232340.png"><img alt="sc_20201207232340.png" src="/images/sc_20201207232340.png" width="500" height="438" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a>
</p>

<p>
上記の仕組みを用いることで、デザイン・HTMLの構造上、記事をどうしても分割表示しなければならないときにも対応できます。<br />
別で入力欄を作るとか、code欄を用いる等の手法はいろいろありますが、バーガエディタのブロックは追加も編集も簡単なので、このブロックは活かしたまま、容易に分割する手法を考えてみました。
</p>

<h4>あとがき</h4>

<p>
画像内で「画像4列リンク・テキスト付」ブロックなのに、5列と書いてしまってるのにあとから気づいたけどもういいやってなってそのままなのです。
</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS4系用 TextReplace2.0.0 リリース</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2020/01/18181017.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=612" title="baserCMS4系用 TextReplace2.0.0 リリース" />
    <id>tag:www.materializing.net,2020://1.612</id>
    
    <published>2020-01-18T09:10:17Z</published>
    <updated>2020-01-18T09:10:27Z</updated>
    
    <summary> baserCMS用TextReplaceプラグインを4系化していただきました。 @ryuring 本当にありがとうございます_(．．)_ なので、調整メンテしてbaserCMS4系対応版2.0.0をリリースです。 テキストリプレイス プラグイン テキストリプ...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
baserCMS用TextReplaceプラグインを4系化していただきました。<br />
<a href="https://twitter.com/ryuring">@ryuring</a> 本当にありがとうございます_(．．)_
</p>

<p>
なので、調整メンテしてbaserCMS4系対応版2.0.0をリリースです。
</p>

<h3>テキストリプレイス プラグイン</h3>

<p>
<strong>テキストリプレイスプラグインは、任意のキーワードを一括で変更できるbaserCMS専用のプラグインです。</strong>。。。です。<br />
記事内の文字列探したり、指定文字列で置換できるので、運用・運営を少しお手伝いできます。<br />
ファイルのダウンロードはいつものgithubよりどうぞ。<br />
<big>■ <a href="https://github.com/materializing/TextReplace/releases/tag/TextReplace-2.0.0">Release TextReplace-2.0.0 · materializing/TextReplace</a></big>
</p>

<p>
開発状況とかちょろっと見てみたいときもgithubよりどうぞ。<br />
<big>■ <a href="https://github.com/materializing/TextReplace">https://github.com/materializing/TextReplace</a></big>
</p>

<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>
]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 4.3.0</li>
	<li>PHP 5.6.10</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>できることとか</h3>

<ul>
	<li>検索語句を指定し、「検索置換対象の指定」で指定したデータを検索することができます。</li>
	<li>検索語句を指定し、置換後の指定し、「検索置換対象の指定」で指定したデータを検索＆置換した結果を確認できます。</li>
	<li>検索語句を指定し、置換後の指定し、「検索置換対象の指定」で指定したデータを検索＆置換した結果の中から、置換＆保存する対象を選択して実行できます。</li>
	<li>置換＆保存したログは「テキスト置換ログ」で確認できます。
	<ul><li>ログを削除できるのはシステム管理グループのユーザーです。</li></ul>
</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルをDLして解凍したら、/app/Plugin/TextReplace に配置します。</li>
	<li>baserCMS管理システムに入ります。</li>
	<li>プラグイン管理に入ります。</li>
	<li>テキストリプレイス プラグインを有効化します。</li>
	<li>システムナビにある「テキスト置換」画面に入ります。</li>
</ol>


<h3>テキストリプレイス プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/TextReplace/issues">githubでのチケット発行</a></li>
</ul>


<h4>あとがき</h4>

<p>
4系になって、固定ページはコンテンツ管理下となり、コンテンツデータと固定ページデータに分離されました。<br />
この辺りをどうしたものかなぁ、と考えてはいたのですが、すっかり「あとで考える」リストに入れたままでした＿|￣|○<br />
ただ、どうやら一部では利用ユーザがいるとの情報が得られまして、それはうれしいのものです。
</p>

<p>
あと、こんな辺境の地に置いてるプラグインを一瞬で4系化しちゃうとか驚きすぎてハナヂ出ますね＜<a href="https://twitter.com/ryuring">@ryuring</a>
</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS4系でフォームの受信一覧表示をカスタマイズする</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2019/12/09075504.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=610" title="baserCMS4系でフォームの受信一覧表示をカスタマイズする" />
    <id>tag:www.materializing.net,2019://1.610</id>
    
    <published>2019-12-08T22:55:04Z</published>
    <updated>2019-12-09T22:57:36Z</updated>
    
    <summary> どうもです･ω･ 昨年の baserCMS Advent Calendar 2018に続き、今年もbaserCMS Advent Calendar 2019が始まってます。 さてその10日担当です。=[ &apos;ω&apos; ] ﾄｳﾌｰ baserCMS4のご紹介 ba...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
どうもです･ω･<br />
昨年の <a href="https://adventar.org/calendars/3481">baserCMS Advent Calendar 2018</a>に続き、今年もbaserCMS Advent Calendar 2019が始まってます。<br />
さてその10日担当です。=[ 'ω' ] ﾄｳﾌｰ
</p>


<h3>baserCMS4のご紹介</h3>

<p>
baserCMSとは、CMSです。<br />
世の中には、WordpressとかMovableTypeとかSHIRASAGIとかWordpress（2回目）とか、いろんなCMSがありまして、その中で、PHPのフレームワークであるCakePHPを用いてできてるCMSです。
</p>

<pre>baserCMS（ベーサーシーエムエス）とは、Webサイト制作プラットフォームとして最適な国産CMSです。</pre>

<p>
です。<br />
■ <a href="https://basercms.net/">baserCMS - 国産オープンソース！フリー（無料）でコンテンツ管理に強いCMS</a>
</p>

<p>
プラグインとかテーマの配布・販売やってます。<br />
■ <a href="https://market.basercms.net/">baserマーケット</a>
</p>

<p>
導入事例いっぱいあります。着々と増加中です。<br />
■ <a href="https://basercms.net/works/">baserCMS導入事例 | baser CMS』</a>
</p>


<h3>この記事で紹介すること</h3>

<p>
この記事では、baserCMSを利用する中で良く使う、イベント処理＋メールフォームの受信一覧について紹介します。<br />
どちらかと言えば開発者さん向けの記事です。<br />

</p>]]>
        <![CDATA[<h3>管理側の受信メール一覧表示をカスタマイズする</h3>

<p>
baserCMSでは、メールフォームを超簡単に複数作成できる機能があって、その受信データ一覧画面も、各フォーム毎に表示することができます。<br />
その受信データの表示を、ある特定の条件にそった内容だけ表示するようにしてみます。<br />
CSVダウンロード機能で落ちてくるCSVの内容も、特定の条件に絞った内容にできます。
</p>

<a data-flickr-embed="true" href="https://www.flickr.com/photos/materializing/49179977523/in/dateposted-public/" title="お問い合わせ｜受信メール一覧｜お問い合わせ_管理｜コンテンツ一覧｜baserCMS_inc_"><img src="https://live.staticflickr.com/65535/49179977523_46165f10b3.jpg" width="500" height="275" alt="お問い合わせ｜受信メール一覧｜お問い合わせ_管理｜コンテンツ一覧｜baserCMS_inc_"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

<p>
せっかくなのでプラグイン形式で作ってみて、簡単に動作をON／OFFできるようにしてみます。<br />
できるようになることはこんな感じです。
</p>

<ul>
	<li>ユーザーIDが2のユーザでログインし、受信一覧画面を開いた場合、メールフィールドとして name_1 フィールド（例えば名前）が存在しているとき、受信データ内の name_1 フィールに「ほげ」と入ってるデータのみを一覧表示できる</li>
	<li>ユーザーIDが2のユーザでログインし、受信一覧画面からダウンロードするCSVデータが、受信データ内の name_1 フィールドに「ほげ」と入ってるデータのみとなる</li>
</ul>


<h4>ファイルを作る</h4>

<p>
以下の内容でファイルを作ります。
</p>

<ul>
	<li>/app/Plugin/CustomMailMessage/Event/CustomMailMessageModelEventListener.php</li>
</ul>

<pre><code>&lt;?php
/**
 * [ModelEventListener] CustomMailMessage
 */
class CustomMailMessageModelEventListener extends BcModelEventListener {
	/**
	 * 登録イベント
	 *
	 * @var array
	 */
	public $events = [
		'MailMessage.beforeFind',
		'Mail.MailMessage.beforeFind',
	];

	/**
	 * mailMessageBeforeFind
	 * - 管理側受信一覧画面の受信一覧を指定条件で絞り込んで表示する
	 *
	 * @param CakeEvent $event
	 */
	public function mailMessageBeforeFind (CakeEvent $event) {
		if (!BcUtil::isAdminSystem()) {
			return;
		}

		$user = BcUtil::loginUser();
		if (in_array($user['id'], ['2'])) {
			$Model = $event-&gt;subject();
			// 存在しないフィールドを検索条件に指定することで起こるエラーを防止するため
			if ($Model-&gt;hasField('name_1')) {
				if (empty($event-&gt;data[0]['conditions'])) {
					$conditions = [];
				} else {
					$conditions = $event-&gt;data[0]['conditions'];
				}
				$event-&gt;data[0]['conditions'] = Hash::merge($conditions, [$Model-&gt;alias . '.name_1' =&gt; 'ほげ']);
			}
		}
	}

	/**
	 * mailMailMessageBeforeFind
	 * - 管理側受信一覧CSVを指定条件で絞り込んでダウンロードする
	 *
	 * @param CakeEvent $event
	 */
	public function mailMailMessageBeforeFind (CakeEvent $event) {
		if (!BcUtil::isAdminSystem()) {
			return;
		}

		$user = BcUtil::loginUser();
		if (in_array($user['id'], ['2'])) {
			$Model = $event-&gt;subject();
			// 存在しないフィールドを検索条件に指定することで起こるエラーを防止するため
			if ($Model-&gt;hasField('name_1')) {
				if (empty($event-&gt;data[0]['conditions'])) {
					$conditions = [];
				} else {
					$conditions = $event-&gt;data[0]['conditions'];
				}
				$event-&gt;data[0]['conditions'] = Hash::merge($conditions, [$Model-&gt;alias . '.name_1' =&gt; 'ほげ']);
			}
		}
	}

}</code></pre>

<p>
<br />
。。。。。終わり。<br />
なんとたったの1ファイルで終わっちゃいました。<br />
あとは管理側のプラグイン一覧画面から CustomMailMessage プラグインを有効化するだけです。
</p>


<h4>動作について説明</h4>

<p>
何をしてるのかを少し説明。<br />
受信一覧表示とCSVダウンロード側でのやってる内容はほぼ同じですが、2つに分けているのには理由があります。
</p>

<p>
MailMessageモデルのbeforeFindに対して差し込んでいるイベント処理ですが、CSVダウンロードのときは、イベント名が「MailMessage.beforeFind」では引っかかりません。<br />
これはなんでかなぁ？と探っていたのですが、CSVダウンロードの処理時は、モデルのエイリアス名が受信テーブル名となっていたので、モデルイベントに引っかからないようです。<br />
（例: テーブル名が mysite_mail_message_1 のときは、モデルエイリアス名は mailMessage1 となる）<br />
管理側の受信一覧表示のときは、反対にイベント名が「Mail.MailMessage.beforeFind」で引っ掛けることができませんでした。
</p>

<p>
なので、<br />
管理側受信一覧表示のとき: MailMessage.beforeFind で、<br />
管理側受信一覧CSVダウンロードのとき: Mail.MailMessage.beforeFind <br />
と分ける形になってます。
</p>

<p>
他ポイントとしては以下です。<br />
・BcUtil::isAdminSystem() で管理側のアクセスであることを判定<br />
・BcUtil::loginUser() でログイン中のユーザ情報を取得<br />
・$Model-&gt;hasField('name_1') でテーブル内のフィールドの存在チェック<br />
・$event-&gt;data[0]['conditions'] でデータの検索条件を指定
</p>


<h3>最後に。。。</h3>

<p>
baserCMSでは、このように簡単にプラグインを作ることができます。<br />
サンプルのプラグインの内容はあくまで例ですので、他にもログインしているユーザグループでの判定や、複数フィールドに対する検索条件の指定等を、目的に応じていろいろできると思います。
</p>

<p>
ではでは、baserCMSで楽しい開発ライフを送りましょう。<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>簡単に独自の設定画面を追加作成できるbaserCMSプラグイン「AddConfig」さわってみた</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2019/09/21172927.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=608" title="簡単に独自の設定画面を追加作成できるbaserCMSプラグイン「AddConfig」さわってみた" />
    <id>tag:www.materializing.net,2019://1.608</id>
    
    <published>2019-09-21T08:29:27Z</published>
    <updated>2019-09-22T11:58:42Z</updated>
    
    <summary> baserCMSのプラグイン「AddConfig」が公開されていたので触ってみました。 どうやら「【ちょっとした入力項目】を作るためのカスタムフィールド」という内容で、インストールすることで独自の設定を保存できるようになるようです。 これはなんとも便利そうで...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
baserCMSのプラグイン「AddConfig」が公開されていたので触ってみました。
</p>

<p>
どうやら「【ちょっとした入力項目】を作るためのカスタムフィールド」という内容で、インストールすることで独自の設定を保存できるようになるようです。<br />
これはなんとも便利そうです。
</p>

<h3>AddConfig プラグイン</h3>

<p>
■ <a href="https://github.com/BigFly3/AddConfig">https://github.com/BigFly3/AddConfig</a><br />
■ 作者さんの記事: <a href="https://qiita.com/BigFly/items/eccbe4e1ce14b46a9c75">CakePHPユーザーがbaserCMSを開発しやすくするためのカスタムフィールドを作ってみた。 - Qiita</a><br />

</p>]]>
        <![CDATA[<h3>インストールについて</h3>

<p>
baserCMSのプラグインは、app/Plugin/配下に、プラグインのパッケージをフォルダごと配置すると良いので、そんな感じで配置してインストール実行です。<br />
※元記事には「テーマ配下推奨」とあります。その理由も明記してあります。<br />
　https://qiita.com/BigFly/items/eccbe4e1ce14b46a9c75#注意点など<br />
　ひとまず確認なので今回はapp配下で。
</p>

<p>
インストールすると、良く使う項目に「カスタムコンフィグ 管理」が追加されます。<br />
すぐに設定画面にアクセスできます。<br />
入ってみると、サンプルで設定してある入力項目一覧が表示されます。<br />
サンプルの充実って大事ですよね。。これは見てみると、どんな項目ができるの？というのがぱっと見てつかみやすくて素敵です。
</p>

<p>
データの方はどうなってるのかな？と覗いてみると、DB内にテーブル「mysite_add_configs」が追加されてました。
</p>


<h3>実際に保存してみる</h3>

<p>
とりあえず適当に入力して保存してみると、<br />
「入力チェックはOKです。AddConfigの設定で更新されないようになっています。」と表示されて保存されません。
</p>

<p>
なるほど。。設定で確認だけできるようになってるですね。<br />
baserCMSの設定ファイルは、たいてい Config/setting.php で定義されているのでその辺りを覗いてみます。
</p>

<pre><code>$config['AddConfig']['debug'] = false; //trueにしておくとフォーム項目のテスト中にデータ更新が出来ないようにすることができます。バリデーションチェックは可能です。</code></pre>

<p>
ん！？falseになってるけどなんだろう。。なんか間違えたかな(　▽|||)<br />
と、あちこち見て回っていると、サンプルで入ってるフォームのビューファイルに記載がありました。
</p>

<pre><code>app/Plugin/AddConfig/Config/sample-form.php
$config['AddConfig']['debug'] = true; //無駄なデータが誤って登録されないようにデバッグモードにしています。</code></pre>

<p>
あくまでサンプル用なので、安全設計がなされている状態でした。<br />
この行をコメントアウトして再度保存に挑戦。<br />
。。。今度はうまく行って一安心です。
</p>

<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.materializing.net/assets_c/2019/09/sc_01_addconfig-57.php" onclick="window.open('http://www.materializing.net/assets_c/2019/09/sc_01_addconfig-57.php','popup','width=1265,height=3104,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.materializing.net/assets_c/2019/09/sc_01_addconfig-thumb-600x1472-57.png" width="600" height="1472" alt="sc_01_addconfig.png" class="mt-image-none" style="" /></a></span>
</p>

<h3>サンプルフォームはサンプルなので、別で作って利用する</h3>

<p>
初期インストール時に利用されるビュー用のファイルはあくまでサンプルなので、<br />
（AddConfig/Config/sample-form.php）<br />
実際に利用するときには、<br />
AddConfig/Config/sample-form.php → ファイル複製とかして AddConfig/Config/addconfig-form.php のようにして置いて利用する、というのが良さそうです。
</p>

<p>
あとは設定ファイルの中で、以下の行箇所でファイル名の指定を行うこと。<br />
（AddConfig/Config/setting.php）
</p>

<pre><code>include &quot;sample-form.php&quot;; //使用時にコメントアウトするか削除してください。</code></pre>

<p>
各設定項目について説明が載せてあるのでとてもわかりやすく作成してあるなぁ、と思いました。
</p>


<h3>フロント側での利用</h3>

<p>
公開側ではこんな感じでデータを取ってきて利用できました。
</p>

<pre><code>■ テキスト: &lt;?php echo $this-&gt;AddConfig-&gt;f('text01'); ?&gt;</code></pre>

<pre><code>■ テキストエリア: &lt;?php echo $this-&gt;AddConfig-&gt;f('textarea01'); ?&gt;</code></pre>

<pre><code>■ セレクト: 
&lt;?php
$selectList = Hash::extract(Configure::read('AddConfig'), 'form.{n}.fields.select01.parts.options');
echo $this-&gt;BcText-&gt;arrayValue($this-&gt;AddConfig-&gt;get('select01'), $selectList[0]);
?&gt;</code></pre>

<pre><code>■ ラジオ: 
&lt;?php
$radioSelectList = Hash::extract(Configure::read('AddConfig'), 'form.{n}.fields.radio01.parts.options');
echo $this-&gt;BcText-&gt;arrayValue($this-&gt;AddConfig-&gt;get('radio01'), $radioSelectList[0]);
?&gt;</code></pre>

<pre><code>■ チェックボックス: &lt;?php echo $this-&gt;AddConfig-&gt;f('checkbox01'); ?&gt;</code></pre>

<pre><code>■ CkEditor: &lt;?php echo $this-&gt;AddConfig-&gt;get('editor01'); ?&gt;</code></pre>

<pre><code>■ 年月日: &lt;?php echo $this-&gt;AddConfig-&gt;f('datepicker01'); ?&gt;</code></pre>

<pre><code>■ 年月日日時: &lt;?php echo $this-&gt;AddConfig-&gt;f('dateTimePicker01'); ?&gt;</code></pre>

<pre><code>■ アップロードファイル（アップローダ）: &lt;?php echo $this-&gt;AddConfig-&gt;img('upload01'); ?&gt;</code></pre>

<pre><code>■ マルチチェックボックス: 
&lt;?php foreach ($this-&gt;AddConfig-&gt;explodeArray('multicheck01') as $multiCheckboxValue): ?&gt;
	&lt;?php echo h($multiCheckboxValue); ?&gt;
&lt;?php endforeach; ?&gt;</code></pre>

<pre><code>■ 都道府県選択: &lt;?php echo $this-&gt;AddConfig-&gt;f('pref01'); ?&gt;</code></pre>

<p>
個々に設定した値が簡単に取れますね。
</p>

<h4>あとがき</h4>

<p>
設定ファイルの記述で、入力項目の追加や削除を簡単に管理できて、設定した項目の値はグローバル扱いでどこでも基本的に利用できます。
</p>

<p>
アップローダで上げたファイルを自由に設定できるのもすごいですね。<br />
この仕組みって、baserCMSコアが持っているテーマコンフィグに入れちゃっても良いんじゃないでしょうかね。<br />
アップローダが、Wordpressでいうところのメディア管理みたいに利用できそうです。
</p>

<p>
なんとも便利ですごいプラグインが出てますので、baserCMSでサイト構築される際には導入すると良いと思います。<br />
すばらしいプラグインだと思います。<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS3系用 TextReplace1.2.2 リリース</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2018/05/03082731.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=607" title="baserCMS3系用 TextReplace1.2.2 リリース" />
    <id>tag:www.materializing.net,2018://1.607</id>
    
    <published>2018-05-02T23:27:31Z</published>
    <updated>2019-12-31T10:46:35Z</updated>
    
    <summary> ずっと前に作成したbaserCMS用TextReplaceプラグインをメンテして、1.2.2上げてみました。 きっかけは「検索した文字がハイライトされないケースがある」ってフィードバックいただけたんで、これは対応策を考えたく。 テキストリプレースは、記事内の...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
ずっと前に作成したbaserCMS用TextReplaceプラグインをメンテして、1.2.2上げてみました。
</p>

<p>
きっかけは「検索した文字がハイライトされないケースがある」ってフィードバックいただけたんで、これは対応策を考えたく。
</p>

<p>
テキストリプレースは、記事内の文字列探したり、指定文字列で置換できるので、運用・運営を少しお手伝いできるプラグインです。
</p>

<h3>テキストリプレイス プラグイン</h3>

<p>
<strong>テキストリプレイスプラグインは、任意のキーワードを一括で変更できるbaserCMS専用のプラグインです。</strong>。。。です。<br />
ファイルのダウンロードはいつものgithubよりどうぞ。<br />
<big>■ <a href="https://github.com/materializing/TextReplace/releases/tag/TextReplace-1.2.2">Release TextReplace-1.2.2 · materializing/TextReplace</a></big>
</p>

<p>
開発状況とかちょろっと見てみたいときもgithubよりどうぞ。<br />
<big>■ <a href="https://github.com/materializing/TextReplace">https://github.com/materializing/TextReplace</a></big>
</p>

<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>
]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 3.0.6〜3.0.15</li>
	<li>PHP 5.4.19</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>できることとか</h3>

<ul>
	<li>検索語句を指定し、「検索置換対象の指定」で指定したデータを検索することができます。</li>
	<li>検索語句を指定し、置換後の指定し、「検索置換対象の指定」で指定したデータを検索＆置換した結果を確認できます。</li>
	<li>検索語句を指定し、置換後の指定し、「検索置換対象の指定」で指定したデータを検索＆置換した結果の中から、置換＆保存する対象を選択して実行できます。</li>
	<li>置換＆保存したログは「テキスト置換ログ」で確認できます。
	<ul><li>ログを削除できるのはシステム管理グループのユーザーです。</li></ul>
</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルをDLして解凍したら、/app/Plugin/TextReplace に配置します。</li>
	<li>baserCMS管理システムに入ります。</li>
	<li>プラグイン管理に入ります。</li>
	<li>テキストリプレイス プラグインを有効化します。</li>
	<li>システムナビにある「テキスト置換」画面に入ります。</li>
</ol>


<h3>テキストリプレイス プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/TextReplace/issues">githubでのチケット発行</a></li>
</ul>


<h4>あとがき</h4>

<p>
大きく解消したのはこんな点でした。<br />
■ <a href="https://github.com/materializing/TextReplace/issues/1">検索時、ダブルクオートがある場合とでない場合で、コードのマッチ文字がハイライトされない · Issue #1 · materializing/TextReplace</a><br />
「この辺があやしい」と原因まで見ていただいて本当にありがとうございました_(．．)_<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>Qiitaに書き続けたbaserCMSのTipsを振り返る</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2016/12/25084817.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=606" title="Qiitaに書き続けたbaserCMSのTipsを振り返る" />
    <id>tag:www.materializing.net,2016://1.606</id>
    
    <published>2016-12-24T23:48:17Z</published>
    <updated>2016-12-24T23:48:32Z</updated>
    
    <summary> ふと気付いたら baserCMS Advent Calendar 2016 - Adventar が始まっていたので書いてみました。 その24日担当です。1日遅れちゃいました。 この記事では「Qiitaに書き続けたbaserCMSのTipsを振り返る」ことに...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
ふと気付いたら <a href="http://www.adventar.org/calendars/1703">baserCMS Advent Calendar 2016 - Adventar</a> が始まっていたので書いてみました。<br />
その24日担当です。1日遅れちゃいました。
</p>

<p>
この記事では「Qiitaに書き続けたbaserCMSのTipsを振り返る」ことにしてみました。
</p>


<h3>baserCMS3のご紹介</h3>

<p>
baserCMSとは、CMSです。<br />
■ <a href="http://basercms.net/">baserCMS</a>・・・公式サイト<br />
■ <a href="http://barket.jp/">baserマーケット</a>・・・プラグインとかテーマの配布・販売<br />

</p>]]>
        <![CDATA[<h3>baserCMS Tips on Qiitta</h3>

<p>
■ <a href="http://qiita.com/materializing/items/b0a2ad9eaba0c4e779ce">[baserCMS]少し古いバージョンで、管理側プラグイン一覧が表示されない場合 - Qiita</a><br />
通常動作には影響ないけど、少し古いbaserCMS3系を利用していると起こること。<br />
見つけたときにびっくりしたので載せたこと。
</p>

<p>
■ <a href="http://qiita.com/materializing/items/f1575532cb86d5cfbeeb">[baserCMS]データキャッシュ用ファイルが大量に生成されることを防止する - Qiita</a><br />
トラブルを防ぐための手法のひとつとして載せたこと。
</p>

<p>
■ <a href="http://qiita.com/materializing/items/341369445081648746fb">[baserCMS]CPIサーバでWAFに引っ掛かって記事更新できないとき - Qiita</a><br />
いつも必ず起こるワケではないので、発生した際の対処策として。
</p>

<p>
■ <a href="http://qiita.com/materializing/items/d267c8957797390ec56b">[baserCMS]オプショナルリンク利用時、リンク中にブロック要素を含む場合のサンプル - Qiita</a><br />
組込みの際に、ある条件下ではプラグインの動作だけで対処できないため載せたこと。
</p>

<p>
■ <a href="http://qiita.com/materializing/items/df5487e1a08e77623058">[baserCMS]バージョン番号を比較して動作を分ける - Qiita</a><br />
文字列・数値比較でもなくどうしようかな？と思って探っていたら丁度良さそうだったため。
</p>

<p>
■ <a href="http://qiita.com/materializing/items/902e7fac87ece1bf0eab">[baserCMS]メールフォームの和暦日付の範囲指定の仕方 - Qiita</a><br />
フォームの日付に、範囲指定が効くという便利なことを残しておきたかったため。
</p>

<p>
■ <a href="http://qiita.com/materializing/items/7637b29887ed0e872be1">[baserCMS] メールフォームの通知メールにフィールドの値を入れる - Qiita</a><br />
フォームの通知機能にも、ちょっと便利な仕様が入っていることを伝えたかったため。
</p>

<p>
■ <a href="http://qiita.com/materializing/items/e7e58480e97be0983534">[baserCMS] 固定ページでcode欄を入力欄に見立てて使ってみるTips - Qiita</a><br />
CakePHPのビューブロックの仕組みを取り入れるとラクにできることを伝えたかったため。
</p>

<h3>意外と少なかった</h3>

<p>
もうちょっといろいろ書いてた気がしてたのですが、思ったより少なかったです。<br />
制作時にちょっと悩んだことや、少し工夫したらラクになることをこれからもシェアしていきたいなー、とか思ってます。
</p>

<p>
で、最後にあとひとつTipsを。。。
</p>


<h3>pull request 前に Travis CI でテストしてみよう</h3>

<p>
baserCMSのコア開発プロジェクトでは、Travis CI を利用して、テストのチェックを行っています。<br />
■ <a href="https://travis-ci.org/">Travis CI - Test and Deploy Your Code with Confidence</a><br />
流れとしてはこんな感じです。<br />
※ローカルでのテスト手順もあるのですが、ここでは Travis CI 利用を前提とします。
</p>

<ol>
	<li><a href="https://github.com/baserproject/basercms">https://github.com/baserproject/basercms</a> をフォークして、自身の github アカウントにリポジトリを作る</li>
<li>作成したリモートリポジトリを clone してローカルに持って来る</li>
<li>トピックブランチを切って開発する</li>
<li>自分のリポジトリに push する</li>
<li>自分のリポジトリから、baserCMSプロジェクト側のリポジトリに対して pull request 送る（※コア開発メンバーにアラートが飛ぶ）</li>
<li>baserCMSプロジェクトと連携している Travis CI で、テストが動く</li>
<li>テストが通ったら、該当 pull request にテスト通過のマークが付く</li>
<li>テストが通らなかったら、該当 pull request にテスト通過ダメでしたのマークが付く</li>
<li>開発メンバーによりマージされる or リジェクトされる</li>
</ol>

<p>
Travis CI でのテストが通らなかった場合はリジェクトされるワケですが、このテスト実行は「baserCMSプロジェクトと連携している Travis CI で実行」されている状態です。<br />
つまり、push して pull request 送るまで、テスト動作の結果が判りません。<br />
このことは何を指しているかというと、送った pull request のテストが通らなかった場合、プロジェクトの開発メンバーに、テスト失敗による差し戻しの手間を生むことを示します。<br />
もちろん、自分で送った pull request のテストの状況を確認して、自身の手で差し戻すこともできますが、テストが実行され、その結果が返って来るまで画面の前で待つのか？というとそんなことはやってられないですね。
</p>

<p>
そこで、上記のような手間を解消するためにどうするか？というと、自分のアカウントにフォークしているプロジェクトを、Travis CI と連携させる方法を取っておくと良いです。
</p>

<ol>
	<li>「Sign in with GitHub」を利用して Travis CI にログインする</li>
	<li>自分のアカウントのbaserCMSリポジトリでの有効化を指定する</li>
</ol>

<p>
これだけです。<br />
baserCMSプロジェクトには、動作に必要な.travis.yml は既に存在しているため、あとは自分のリポジトリに push したタイミングでテストが実行されます。
</p>

<h4>あとがき</h4>

<p>
baserCMS Advent Calendar 2016、いろんな記事が出て面白かったですね。<br />
おつかれさまでした。<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS用「コーラブルエディターテンプレート プラグイン」作りました。</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2016/03/21163437.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=605" title="baserCMS用「コーラブルエディターテンプレート プラグイン」作りました。" />
    <id>tag:www.materializing.net,2016://1.605</id>
    
    <published>2016-03-21T07:34:37Z</published>
    <updated>2019-12-31T10:51:10Z</updated>
    
    <summary> 今回のbaserCMSスキマ産業活動は、エディターテンプレートに目を向けてみました。 「エディターテンプレート」機能は、記事編集欄のエディタ操作ボタンにある&quot;これ&quot;です。 このエディターテンプレートは、記事本文内に定形文を差し込む際に非常に便利な機能です。 ...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
今回のbaserCMSスキマ産業活動は、エディターテンプレートに目を向けてみました。<br />
「エディターテンプレート」機能は、記事編集欄のエディタ操作ボタンにある"これ"です。
</p>

<p>
<a href="https://farm2.staticflickr.com/1653/25953628315_ef97403341_c.jpg" rel="lightbox"><img alt="エディタテンプレート" src="https://farm2.staticflickr.com/1653/25953628315_ef97403341.jpg" /></a>
</p>

<p>
このエディターテンプレートは、記事本文内に定形文を差し込む際に非常に便利な機能です。<br />
呼び出して選択するだけで、登録済の定型文を入れ込むことができます。<br />
※URL: /admin/editor_templates/index
</p>

<p>
この便利機能にもう少し陽の目を当てるべく、作ってみたのが「コーラブルエディターテンプレート プラグイン」です。<br />
きっかけは、記事本文を表示するメインコンテンツ部分の下部に、簡単にエディターテンプレートで作成した定型文を表示させることができる仕組みを備えておき、エディターテンプレートを編集することで、全ての表示箇所を一括で切り替えることができれば、更新の手間を省くことができると考えたから、です。
</p>

<p>
<strong>▼ どんなときに使えるの？</strong><br />
用途としては、記事の下部にお問い合わせ先を掲載したり、Adsense等の広告を載せたりするときが挙げられます。<br />
エディターテンプレートを編集すると、利用している箇所全てを一括で編集できるので、共通パーツのように扱うことができまする。
</p>


<h3>コーラブルエディターテンプレート プラグイン</h3>

<p>
<strong>コーラブルエディターテンプレート プラグインは、記事にエディタテンプレート設定欄を追加できるbaserCMS専用のプラグインです。</strong>。。。です。<br />
ファイルのダウンロードは、いつものgithubよりどうぞ。<br />
<big>■ <a href="https://github.com/materializing/CallableEditorTemplate">https://github.com/materializing/CallableEditorTemplate</a></big><br />
■ 概要・説明: <a href="https://github.com/materializing/CallableEditorTemplate/wiki">https://github.com/materializing/CallableEditorTemplate/wiki</a>
</p>

<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 3.0.9</li>
	<li>PHP 5.5.3</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>できることとか</h3>

<p>
固定ページ、ブログコンテンツ別に、登録中のエディターテンプレートを、メインコンテンツの上下どちらかに差し込むことができます。
</p>

<p>
<a href="https://farm2.staticflickr.com/1704/25928221176_5d58ceaaf4_c.jpg" rel="lightbox"><img alt="エディタテンプレート" src="https://farm2.staticflickr.com/1704/25928221176_5d58ceaaf4.jpg" /></a><br />
※チェックボックスはラジオボタンに変更となりました。
</p>

<ul>
	<li>記事編集画面への表示の有無（利用の有無）を指定することができます。</li>
	<li>記事編集画面に表示するラベル名（th箇所）を指定することができます。</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルを解凍後、BASERCMS/app/Plugin/CallableEditorTemplate に配置します。</li>
	<li>管理システムのプラグイン管理にアクセスし、表示されている CallableEditorTemplate プラグイン をインストール（有効化）して下さい。</li>
	<li>コーラブルエディターテンプレート設定一覧画面にアクセスし、利用するコンテンツ毎に有効化します。</li>
	<li>設定一覧画面の「新規追加」より、利用するコンテンツを追加します。</li>
	<li>設定追加後、記事の投稿画面にアクセスすると、入力項目が追加されてます。</li>
</ol>

<h3>コーラブルエディターテンプレート プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/CallableEditorTemplate/issues">githubでのチケット発行</a></li>
</ul>


<h3>作成裏話(表に出しちゃってるけど裏話)</h3>

<p>
アイデア自体は以前から温めてましたが、BurgerEditorの登場と拡散がきっかけです。<br />
■ <a href="https://market.basercms.net/products/detail.php?product_id=61&category_id=1">BurgerEditor 機能限定版 | baserマーケット</a><br />
バーガーエディターは、記事編集を、ブロック単位で非常に簡単便利な仕組みにしてくれるエディターですが、このプラグインを導入すると、エディターテンプレートが利用できなくなります。<br />
そのため、なんとかして、baserCMSのコア機能でもあるエディターテンプレートを利用できる場面を作りたかった。。。というね。
</p>

<p>
これで運営者さんも制作者さんも、少しでもラクになればうれしいです。
</p>

<h4>あとがき</h4>

<p>
CakeのControllerには、$Controller->set() でビューへ値を渡せる仕組みがあるのと同様に、Viewにも $View->set() で値を渡せる仕組みがあるのが勉強になりました。<br />
ビューの中身はもう少し学ぶ必要がありそうです。
</p>

<p>
エディターテンプレートは便利な機能なので、みんな使えば良いと思う。<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMSの固定ページで入力欄がどうしてもあとひとつ必要なときのTips</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2016/02/20043329.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=604" title="baserCMSの固定ページで入力欄がどうしてもあとひとつ必要なときのTips" />
    <id>tag:www.materializing.net,2016://1.604</id>
    
    <published>2016-02-19T19:33:29Z</published>
    <updated>2016-05-04T07:44:01Z</updated>
    
    <summary> baserCMSでサイト作ってるときにたまに起こるのが、 「あとひとつ入力欄要る」 です。 そんなときに対応できる方法を考えてみました。 本記事の対象は固定ページです。 ブログ？この辺使えばなんとかなるですかね。 選択肢としては以下になるかなぁ？と思います。...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
baserCMSでサイト作ってるときにたまに起こるのが、<br />
<big>「あとひとつ入力欄要る」</big><br />
です。
</p>

<p>
そんなときに対応できる方法を考えてみました。<br />
本記事の対象は固定ページです。<br />
ブログ？<a href="https://github.com/materializing/PetitCustomField">この辺使えばなんとかなる</a>ですかね。
</p>

<p>
選択肢としては以下になるかなぁ？と思います。
</p>

<ul>
	<li>キーワードプラグインを導入する</li>
	<li>条件分岐でなんとかする</li>
	<li>code 欄使う[今回の提案策]</li>
</ul>]]>
        <![CDATA[<h3>ベースとなるHTML構造</h3>

<p>
こんな感じの一般的なベースを例にします。<br />
「&lt;h2&gt;この辺に追加表示したいテキスト&lt;/h2&gt;」が、固定ページのタイトルでもなく本文でもなく、どこかで設定したい箇所。
</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
	&lt;?php $this-&gt;BcBaser-&gt;title() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaDescription() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaKeywords() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;scripts() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;element('google_analytics') ?&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php $this-&gt;BcBaser-&gt;header() ?&gt;

&lt;h1&gt;&lt;?php echo $this-&gt;BcBaser-&gt;getContentsTitle() ?&gt;&lt;/h1&gt;

<span style="color:#FF0000">&lt;h2&gt;この辺に追加表示したいテキスト&lt;/h2&gt;</span>

	&lt;section id=&quot;mainContents&quot;&gt;
		&lt;?php $this-&gt;BcBaser-&gt;flash() ?&gt;
		&lt;?php $this-&gt;BcBaser-&gt;content() ?&gt;
	&lt;/section&gt;

&lt;?php $this-&gt;BcBaser-&gt;footer() ?&gt;
&lt;?php $this-&gt;BcBaser-&gt;func() ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>


<h3>キーワードプラグインを導入する</h3>

<p>
固定ページとブログ記事に、キーワードの設定欄を追加するプラグインがあります。<br />
■ <a href="https://github.com/materializing/keyword">https://github.com/materializing/keyword</a><br />
これ導入するのはてっとり早いです。
</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
	&lt;?php $this-&gt;BcBaser-&gt;title() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaDescription() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaKeywords() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;scripts() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;element('google_analytics') ?&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php $this-&gt;BcBaser-&gt;header() ?&gt;

&lt;h1&gt;&lt;?php echo $this-&gt;BcBaser-&gt;getContentsTitle() ?&gt;&lt;/h1&gt;

<span style="color:#FF0000">
&lt;?php if (Hash::get($dataForView, 'Keyword.keywords')): ?&gt;
&lt;h2&gt;&lt;?php echo h(Hash::get($dataForView, 'Keyword.keywords')) ?&gt;&lt;/h2&gt;
&lt;?php endif ?&gt;
</span>

	&lt;section id=&quot;mainContents&quot;&gt;
		&lt;?php $this-&gt;BcBaser-&gt;flash() ?&gt;
		&lt;?php $this-&gt;BcBaser-&gt;content() ?&gt;
	&lt;/section&gt;

&lt;?php $this-&gt;BcBaser-&gt;footer() ?&gt;
&lt;?php $this-&gt;BcBaser-&gt;func() ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>
とか、キーワード設定管理でできるカスタムテキストを有効化して以下。
</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
	&lt;?php $this-&gt;BcBaser-&gt;title() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaDescription() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaKeywords() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;scripts() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;element('google_analytics') ?&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php $this-&gt;BcBaser-&gt;header() ?&gt;

&lt;h1&gt;&lt;?php echo $this-&gt;BcBaser-&gt;getContentsTitle() ?&gt;&lt;/h1&gt;

<span style="color:#FF0000">
&lt;?php if (Hash::get($dataForView, 'Keyword.name')): ?&gt;
&lt;h2&gt;&lt;?php echo h(Hash::get($dataForView, 'Keyword.name')) ?&gt;&lt;/h2&gt;
&lt;?php endif ?&gt;
</span>

	&lt;section id=&quot;mainContents&quot;&gt;
		&lt;?php $this-&gt;BcBaser-&gt;flash() ?&gt;
		&lt;?php $this-&gt;BcBaser-&gt;content() ?&gt;
	&lt;/section&gt;

&lt;?php $this-&gt;BcBaser-&gt;footer() ?&gt;
&lt;?php $this-&gt;BcBaser-&gt;func() ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>
管理側から設定できるのでラクですね。<br />
ただし、キーワードプラグインを導入して設定し、レイアウトファイルを改修する、というコストが掛かります。
</p>

<h3>条件分岐でなんとかする</h3>

<p>
URLから決め打ちで判定して表示する手法です。<br />
以下のようにURLによる条件分岐を書いて対応します。
</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
	&lt;?php $this-&gt;BcBaser-&gt;title() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaDescription() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaKeywords() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;scripts() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;element('google_analytics') ?&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php $this-&gt;BcBaser-&gt;header() ?&gt;

&lt;h1&gt;&lt;?php echo $this-&gt;BcBaser-&gt;getContentsTitle() ?&gt;&lt;/h1&gt;

<span style="color:#CC0000">&lt;?php if ($this-&gt;request-&gt;here === '/hoge/fuga'): ?&gt;
&lt;h2&gt;ここに表示したいテキスト&lt;/h2&gt;
&lt;?php endif ?&gt;</span>

	&lt;section id=&quot;mainContents&quot;&gt;
		&lt;?php $this-&gt;BcBaser-&gt;flash() ?&gt;
		&lt;?php $this-&gt;BcBaser-&gt;content() ?&gt;
	&lt;/section&gt;

&lt;?php $this-&gt;BcBaser-&gt;footer() ?&gt;
&lt;?php $this-&gt;BcBaser-&gt;func() ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>
。。。これひとつならまだ良いですが、複数に渡るとメンテナンス・コストが膨れ上がりそうです。<br />
設定ファイルにでもURLの定義リスト作っておいて、対応とかでしょうか。
</p>

<h3>code 欄使う[今回の提案策]</h3>

<p>
固定ページには、「オプション」で開いて利用できる code欄があります。<br />
今回はここに着目。
</p>

<p>
<a data-flickr-embed="true"  href="https://farm2.staticflickr.com/1685/24501773584_20fcc5a7b8_c.jpg" title="Untitled"><img src="https://farm2.staticflickr.com/1685/24501773584_20fcc5a7b8.jpg" width="500" height="262" alt="Untitled"></a>
</p>

<p>
この code欄に入力した内容は、通常、メインコンテンツ部分の上部に表示されます。<br />
以下のような具合です。
</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
	&lt;?php $this-&gt;BcBaser-&gt;title() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaDescription() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaKeywords() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;scripts() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;element('google_analytics') ?&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php $this-&gt;BcBaser-&gt;header() ?&gt;

&lt;h1&gt;&lt;?php echo $this-&gt;BcBaser-&gt;getContentsTitle() ?&gt;&lt;/h1&gt;

	&lt;section id=&quot;mainContents&quot;&gt;
		&lt;?php $this-&gt;BcBaser-&gt;flash() ?&gt;
<span style="color:#CC0000">この辺に code欄の内容は出力される</span>
		&lt;?php $this-&gt;BcBaser-&gt;content() ?&gt;
	&lt;/section&gt;

&lt;?php $this-&gt;BcBaser-&gt;footer() ?&gt;
&lt;?php $this-&gt;BcBaser-&gt;func() ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>
※ちなみにこの code欄の表示はどんな仕様になってるか見てみたところ、<br />
/lib/Baser/Model/Page.php の addBaserPageTag() で付与処理されました。
</p>

<p>
これではあとちょっと、目的とする位置に表示するためには一工夫必要そうです。<br />
例えば、class や id 割り当てておいて、jQuery で目的とする位置に移動する、とかでしょうか。<br />
そうした処理もコスト増です。もうちょっとなんとかしたいです。<br />
そこで以下のように下準備します。
</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
	&lt;?php $this-&gt;BcBaser-&gt;title() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaDescription() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;metaKeywords() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;scripts() ?&gt;
	&lt;?php $this-&gt;BcBaser-&gt;element('google_analytics') ?&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php $this-&gt;BcBaser-&gt;header() ?&gt;

&lt;h1&gt;&lt;?php echo $this-&gt;BcBaser-&gt;getContentsTitle() ?&gt;&lt;/h1&gt;

<span style="color:#CC0000">&lt;?php $this-&gt;fetch('subTitleBlock') ?&gt;</span>

	&lt;section id=&quot;mainContents&quot;&gt;
		&lt;?php $this-&gt;BcBaser-&gt;flash() ?&gt;
		&lt;?php $this-&gt;BcBaser-&gt;content() ?&gt;
	&lt;/section&gt;

&lt;?php $this-&gt;BcBaser-&gt;footer() ?&gt;
&lt;?php $this-&gt;BcBaser-&gt;func() ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>
準備のポイントは<br />
「&lt;?php $this-&gt;fetch('subTitleBlock') ?&gt;」を書いておくことだけです。<br />
※ 名称 subTitleBlock はあくまで例です。これが決まりではなくなんでも良いです。
</p>

<p>
そして、code欄側には以下のように記述します。
</p>

<pre><code>&lt;?php $this-&gt;start('subTitleBlock') ?&gt;
&lt;h2&gt;ちょっと出したいテキスト&lt;/h2&gt;
&lt;?php $this-&gt;end() ?&gt;
</code></pre>

<p>
こうすることで、メインコンテンツ部分の上部には何も表示されず、目的の場所に目的のテキストを表示することができます。<br />
code 欄に記載がない場合は、何も表示されません（何もしない）し、start〜end の範囲が利用・表示されるため、code欄に他の記載用途があった場合も影響受けることがありません。
</p>

<p>
これで、特別な作業コストをかけることもなく、表示を追加することができますね。
</p>


<h3>表示する仕組みについて</h3>

<p>
どんなことを利用してるかというと、Cakephpのビューブロックの仕組みを利用しているだけです。<br />
ビューブロックは、表示内容を各ビューに定義しておいて利用できる仕組みです。<br />
上記の例を用いると、baserCMSのブログのindexビュー（例: /app/webroot/theme/YOUR_THEME/Blog/default/index.php）に、同じ記載をした場合、レイアウト内の subTitleBlock を定義している箇所に、その内容が表示されます。
</p>

<p>
もうちょっと知りたい場合は以下の記事でとてもわかりやすく解説されてます。<br />
ぜひご参照ください。<br />
■ <a href="http://nextat.co.jp/staff/archives/123">レイアウトのmetaタグやサイドバーの内容をコンテンツテンプレートから上書き｜baserCMS｜CMS｜スタッフブログ｜京都のホームページ制作　株式会社Nextat（ネクスタット）</a>
</p>

<h4>あとがき</h4>

<p>
ビューブロックの仕組みを利用すると、余分な条件分岐を減らすことができ、かつ、表示内容の責任を各ビューに持たせることができるため、非常にすっきりとしてレイアウトを作ることができます。<br />
また、ビューブロックには append、prepend、assign 等の他にも便利に使える仕組みが備わっているため、これらを併用することで、更に調整を行いやすくなります。<br />
■ <a href="http://book.cakephp.org/2.0/ja/views.html#view-blocks">ビュー -- CakePHP Cookbook 2.x ドキュメント</a>
</p>

<p>
ちなみにですが、fetch() で定義する文言には予約後があります。<br />
content、css、script は利用しないようにしましょう。<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS用「テキストリプレイス プラグイン」作りました。</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/10/19163459.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=602" title="baserCMS用「テキストリプレイス プラグイン」作りました。" />
    <id>tag:www.materializing.net,2015://1.602</id>
    
    <published>2015-10-19T07:34:59Z</published>
    <updated>2019-12-31T10:57:50Z</updated>
    
    <summary> さてさて、今回のbaserCMSスキマ産業活動は、コンテンツのメンテナンスに目を向けてみました。 作ってみたのは「テキストリプレイス プラグイン」です。 きっかけは、サイトリニューアルとか更新メンテナンスの際に、ある記事のURLや文字列が変わった場合に、1記...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
さてさて、今回のbaserCMSスキマ産業活動は、コンテンツのメンテナンスに目を向けてみました。<br />
作ってみたのは「テキストリプレイス プラグイン」です。<br />
きっかけは、サイトリニューアルとか更新メンテナンスの際に、ある記事のURLや文字列が変わった場合に、1記事ずつチェックして更新する、という手間を省いて欲しかったところです。
</p>


<h3>テキストリプレイス プラグイン</h3>

<p>
<strong>テキストリプレイスプラグインは、任意のキーワードを一括で変更できるbaserCMS専用のプラグインです。</strong>。。。です。<br />
ファイルのダウンロードは、いつものbaserマーケットよりどうぞ。<br />
<big>■ <a href="https://market.basercms.net/products/detail.php?product_id=87">テキストリプレイス | baserマーケット</a></big>
</p>

<p>
開発状況とかちょろっと見てみたいときは github どうぞ。<br />
<big>■ <a href="https://github.com/materializing/TextReplace">https://github.com/materializing/TextReplace</a></big>
</p>


<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 3.0.6〜3.0.8</li>
	<li>PHP 5.5.3</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>できることとか</h3>

<ul>
	<li>検索語句を指定し、「検索置換対象の指定」で指定したデータを検索することができます。</li>
	<li>検索語句を指定し、置換後の指定し、「検索置換対象の指定」で指定したデータを検索＆置換した結果を確認できます。</li>
	<li>検索語句を指定し、置換後の指定し、「検索置換対象の指定」で指定したデータを検索＆置換した結果の中から、置換＆保存する対象を選択して実行できます。</li>
	<li>置換＆保存したログは「テキスト置換ログ」で確認できます。
	<ul><li>ログを削除できるのはシステム管理グループのユーザーです。</li></ul>
</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルをDLして解凍したら、/app/Plugin/TextReplace に配置します。</li>
	<li>baserCMS管理システムに入ります。</li>
	<li>プラグイン管理に入ります。</li>
	<li>テキストリプレイス プラグインを有効化します。</li>
	<li>システムナビにある「テキスト置換」画面に入ります。</li>
</ol>


<h3>テキストリプレイス プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/TextReplace/issues">githubでのチケット発行</a></li>
</ul>


<h3>作成裏話(表に出しちゃってるけど裏話)</h3>

<p>
アイデア自体は以前から温めていて、それをようやくカタチにすることができました。<br />
1年と少し前に、<br />
「baserCMSのシステム上で、特定の文字列を検索・一括置換できる機能はありませんか？」<br />
と質問をくださったiさん。ようやくできました！
</p>

<p>
＞ そのときの心情「<strong>うぉぉおああぁぁ〜！？</strong>」<br />
＞ いまの心情「<strong>(･∀･)</strong>」
</p>

<p>
作っているときはけっこう山あり谷ありでした。<br />
文字列を指定して検索・置換することを、置換後の文字列指定を前提にしちゃってたり（空文字化＝削除できないっす）、ログをテキストファイルに取るようにはしてみたものの、なんかしっくりこなかったり。<br />
内部の処理においても、これまでになかった新しい試みが必要だったので、トライ＆エラーの連続でした。
</p>

<p>
もうちょっとやっていきたいこともあるので、これからもちょいちょいメンテしていきますよ。
</p>

<h4>あとがき</h4>

<p>
このプラグインの制作に当り、<a href="https://twitter.com/Garyuten">俳人 我流(@Garyuten)</a>さんに多大なる助言・アドバイスをいただきました。<br />
本当にありがとうございました_(．．)_
</p>

<p>
ちょっと膝が折れそうになっていたあの機能この機能は、我流さんからの言葉がなければ、次のフェーズに持ち越されっぱなしになっていました。<br />
骨は折れましたが、折れた分の価値ある良い機会をくださってありがとうございました_(．．)_<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMSで新しくVagrant環境作る時に出た「Unknown configuration section &apos;omnibus&apos;.」</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/09/26192421.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=601" title="baserCMSで新しくVagrant環境作る時に出た「Unknown configuration section 'omnibus'.」" />
    <id>tag:www.materializing.net,2015://1.601</id>
    
    <published>2015-09-26T10:24:21Z</published>
    <updated>2015-09-26T11:08:41Z</updated>
    
    <summary> どうもです。 本日は baserCMS勉強会Vol.14＠福岡でした。 http://www.zusaar.com/event/7087003 おいしかったです(´ρ`) さて、去る09/25、新しいbaserCMS 3.0.8 がリリースされました。 ■ ...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
どうもです。<br />
本日は baserCMS勉強会Vol.14＠福岡でした。<br />
<a href="http://www.zusaar.com/event/7087003">http://www.zusaar.com/event/7087003</a>
</p>

<p>
おいしかったです(´ρ`)
</p>

<p>
さて、去る09/25、新しいbaserCMS 3.0.8 がリリースされました。<br />
■ <a href="http://basercms.net/news/archives/312">baserCMS 3.0.8 がリリースされました | baser CMS - 国産オープンソース！フリー（無料）で『コーポレートサイトにちょうどいいCMS』</a><br />
リリースノート見てみると、Vagrant 周り、認証プレフィックス周り、スマホ周り、めったに起きないだろうけど偶然見つかって安心度合いが格段に高くなったりしてますね。<br />
あと。。。<br />
<small>『テストの拡充』</small><br />
『テストの拡充』<br />
<big>『テストの拡充』！！！</big><br />

</p>]]>
        <![CDATA[<h3>新しくなったんで新しいVagrant環境作った</h3>

<p>
素の動作を見るときに使ってるVagrant環境を、バージョンも上がったし作り直すことにしました。<br />
Vagrant で baserCMS はとっても簡単です。
</p>

<pre><code>■ VirtualBox をインストールします。
     ・https://www.virtualbox.org/
■ Vagrant をインストールします。
     ・https://www.vagrantup.com/downloads.html
■ git clone git@github.com:baserproject/basercms.git します。
■ clone したフォルダのトップへ移動します。
     ・$ cd
     ・$ cp Vagrantfile.default Vagrantfile
     ・$ vagrant up
■ 起動終わったら http://192.168.33.10/ をブラウザで叩く
■ 管理画面が開く
■ DB接続: root / root
     ・DB: basercms
■ そのままインストールします。
■ おわり
</code></pre>

<h4>「Unknown configuration section 'omnibus'.」</h4>

いつもの「vagrant up」したら
<pre><code>Unknown configuration section 'omnibus'.</code></pre>
で止まって起動できませんでした。

そんなときは、
<pre><code>$ vagrant plugin install vagrant-omnibus</code></pre>

<p>
して omnibus プラグインを入れると良いです。<br />
以下のようになります。
</p>

<pre><code>$ vagrant plugin install vagrant-omnibus
Installing the 'vagrant-omnibus' plugin. This can take a few minutes...
Installed the plugin 'vagrant-omnibus (1.4.1)'!
</code></pre>

<p>
<br />
おしまいです。
</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS用「ポピュラーブログポスト プラグイン」作りました。</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/09/07212552.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=600" title="baserCMS用「ポピュラーブログポスト プラグイン」作りました。" />
    <id>tag:www.materializing.net,2015://1.600</id>
    
    <published>2015-09-07T12:25:52Z</published>
    <updated>2016-05-04T13:40:39Z</updated>
    
    <summary> 9月でございます丶(･ω･)ノ さて、今月のbaserCMSスキマ産業活動は、baserCMSのコア・プラグインに当たるブログ機能に目を向けてみました。 作ってみたのは「ポピュラーブログポスト プラグイン」です。 きっかけは facebook で「だれか作っ...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
9月でございます丶(･ω･)ノ<br />
さて、今月のbaserCMSスキマ産業活動は、baserCMSのコア・プラグインに当たるブログ機能に目を向けてみました。<br />
作ってみたのは「ポピュラーブログポスト プラグイン」です。<br />
きっかけは facebook で「だれか作ってくれないかなぁ？」とのコメントを見たので。
</p>


<h3>ポピュラーブログポスト プラグイン</h3>

<p>
<strong>ポピュラーブログポストプラグインは、ブログ記事のアクセス数を記録して、人気の高い記事（閲覧数の多い記事）を表示できるbaserCMS専用のプラグインです。</strong>。。。です。<br />
ファイルのダウンロードは、いつものbaserマーケットよりどうぞ。<br />
<big>■ <a href="https://market.basercms.net/products/detail.php?product_id=88">ポピュラーブログポスト | baserマーケット</a></big>
</p>

<p>
開発状況とかちょろっと見てみたいときは github どうぞ。<br />
<big>■ <a href="https://github.com/materializing/PopularBlogPost">https://github.com/materializing/PopularBlogPost</a></big>
</p>


<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 3.0.7</li>
	<li>PHP 5.5.3</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>できることとか</h3>

<ul>
	<li>公開側ブログ記事詳細へのアクセス数を記録できます。</li>
	<li>公開側で、ウィジェットを利用して、アクセスランキングを表示できます。</li>
	<li>管理システム側で、記事別のアクセス数を確認できます。
<ul>
	<li>ブログ別、期間を指定して検索できます。</li>
</ul>
</li>
	<li>ブログ別に、アクセス数記録の有効・無効を設定できます。</li>
	<li>ブログ別に、管理システムにログイン中はカウントしないようにすることができます。</li>
	<li>アクセス記録を全削除（記事単位での個別削除も可）し、データのリセットができます。</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルをDLして解凍したら、/app/Plugin/PopularBlogPost に配置します。</li>
	<li>baserCMS管理システムに入ります。</li>
	<li>プラグイン管理に入ります。</li>
	<li>ポピュラーブログポスト プラグインを有効化します。</li>
	<li>ポピュラーブログポスト設定一覧画面に入ります。</li>
	<li>利用するブログを追加し、有効化を行ないます。</li>
<li>ウィジェット管理に入り、追加表示されているランキング表示用ウィジェットを設定します。</li>
</ol>


<h3>ポピュラーブログポスト プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/PopularBlogPost/issues">githubでのチケット発行</a></li>
</ul>


<h3>作成裏話(表に出しちゃってるけど裏話)</h3>

<p>
プラグイン側からのウィジェット追加は久しぶりでした。<br />
この辺の作り方を紹介したいなぁ、と思いました。<br />
といっても、実はbaserCMSはウィジェットの追加が簡単にできるような仕組みは既に出来ていて、ザックリこんな手順で可能。
</p>

<ol>
	<li>管理側への追加: /View/Elements/admin/widgets/your_widget_file.php</li>
	<li>公開側で利用されるViewの追加: /View/Elements/widgets/your_widget_file.php</li>
</ol>

<p>
詳細はその内Qiitaにでも書こうかな。テマコンもあるし。<br />
■ <a href="http://qiita.com/tags/basercms">http://qiita.com/tags/basercms</a><br />
■ <a href="http://contest.basercms.net/">http://contest.basercms.net/</a>
</p>

<h4>あとがき</h4>

<p>
9〜10月であと2つくらいプラグイン出すかもしれませんね。
</p>]]>
    </content>
</entry>

<entry>
    <title>「Cakebox」でCakePHP3のお試し環境がすぐできる件</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/08/30183009.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=599" title="「Cakebox」でCakePHP3のお試し環境がすぐできる件" />
    <id>tag:www.materializing.net,2015://1.599</id>
    
    <published>2015-08-30T09:30:09Z</published>
    <updated>2015-08-30T09:31:15Z</updated>
    
    <summary><![CDATA[きっかけはこちらのTweet。 @arata ぜひぜひ！CakeBoxで環境構築ができるので、何かと便利っぽいです。『っぽい』というのは、何故か私がDBのマイグレーションに失敗してしまい、一部の恩恵が得られなかったからです。。。&mdash; 馬庭吾一 (@g...]]></summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>きっかけはこちらのTweet。</p>

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/arata">@arata</a> ぜひぜひ！CakeBoxで環境構築ができるので、何かと便利っぽいです。『っぽい』というのは、何故か私がDBのマイグレーションに失敗してしまい、一部の恩恵が得られなかったからです。。。</p>&mdash; 馬庭吾一 (@goichi_m) <a href="https://twitter.com/goichi_m/status/637643967010488321">2015, 8月 29</a></blockquote>

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Cakeboxとはなんぞ？ということで見てみました。</p>

<ul>
    <li>Cakebox: <a href="https://github.com/alt3/cakebox">alt3/cakebox</a></li>
<li>Cakebox Document: <a href="https://cakebox.readthedocs.org/en/latest/">Cakebox</a>
</ul>

<p>Virtualbox と Vagrant 使って、Cake3の動作環境をすぐに立ち上げることができるツールです。</p>
]]>
        <![CDATA[<p>README.md 読んでやってみます。</p>

<h3>Vagrant up まで</h3>

<pre><code>$ mkdir cakebox
$ cd cakebox/
$ git clone git@github.com:alt3/cakebox.git ./
$ cp Cakebox.yaml.default Cakebox.yaml
$ vagrant up</code></pre>

<p>これで起動完了です。 <br />
サイトアクセスとsshログインは以下。</p>

<ul>
<li>Login to your Virtual Machine using the vagrant ssh command</li>
<li>Login to your Cakebox Dashboard by browsing to http://10.33.10.10
<ul>
<li>ログイン画面がでますが、ID、パスワードは不要です。</li>
</ul></li>
</ul>

<h3>ブログチュートリアル用のアプリケーションを作成する</h3>

<p>今回の目的は、Cake3 のブログチュートリアルができる環境を作ることなので、続けて「Create your first website」を見てみます。
<a href="http://cakebox.readthedocs.org/en/latest/tutorials/creating-your-first-website/">http://cakebox.readthedocs.org/en/latest/tutorials/creating-your-first-website/</a></p>

<pre><code>$ vagrant ssh
$ cakebox application add blog-tutorial.app</code></pre>

<p>これやったあと、先ほどのダッシュボードへアクセスすると、アプリケーションがひとつ追加されてます丶(･ω･)ノ</p>

<h4>hosts ファイルへの追記</h4>

<p>Remember to update your hosts file with: 10.33.10.10 blog-tutorial.app
というワケで hosts へ追記します。</p>

<pre><code>10.33.10.10    blog-tutorial.app</code></pre>

<p>「確認のため ping 打ってみて」と書いてあるのでテストん。</p>

<pre><code>$ ping blog-tutolia.app</code></pre>

<p>返って来たらOKですね。</p>

<h3>作成したブログチュートリアルへアクセス</h3>

<p>http://blog-tutorial.app/ でアクセスOK。 <br />
Cakeのスタート画面が出て来ます。 <br />
Dashboard にある「Applications」の「blog-tutorial」からも行けます。</p>

<h3>ファイルの編集</h3>

<p>cakebox の共有ファイルは以下です。 <br />
YOUR_CAKEBOX/Apps/blog-tutorial.app <br />
ファインダー上からは、右クリックして「パッケージの内容を表示」から開けます。 <br />
表示されたパッケージの内容のフォルダのパスを、任意のエディタのプロジェクトに登録すると良いですね。</p>

<h4>あとがき</h4>

<p>Cake3を見てみたかったので、おもしろいツールと併せて体験できて良かったです。</p>

<p>それからもひとつ気になったのはこちら。 <br />
■ <a href="https://readthedocs.org/">トップページ | Read the Docs</a> <br />
Cakebox では、この「Read the Docs」というサービスを用いてドキュメントが管理されてるようです。 <br />
github、bitbucket等のリポジトリとも連携できて、ドキュメント作成に便利そうです。</p>
]]>
    </content>
</entry>

<entry>
    <title>baserCMS用「ユーザーツールバースウィッチ プラグイン」作りました。</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/08/22045721.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=598" title="baserCMS用「ユーザーツールバースウィッチ プラグイン」作りました。" />
    <id>tag:www.materializing.net,2015://1.598</id>
    
    <published>2015-08-21T19:57:21Z</published>
    <updated>2015-08-21T19:57:31Z</updated>
    
    <summary> 今回のbaserCMSスキマ産業活動は、ツールバーの機能にちょっと目を向けてみました。 作ってみたのは「ユーザーツールバースウィッチ プラグイン」です。 きっかけはフォーラム。 ユーザーツールバースウィッチ プラグイン ユーザーツールバースウィッチ プラグイ...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
今回のbaserCMSスキマ産業活動は、ツールバーの機能にちょっと目を向けてみました。<br />
作ってみたのは「ユーザーツールバースウィッチ プラグイン」です。<br />
きっかけは<a href="http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1828&forum=9">フォーラム</a>。
</p>


<h3>ユーザーツールバースウィッチ プラグイン</h3>

<p>
<strong>ユーザーツールバースウィッチ プラグインは、ユーザー別にツールバー表示・非表示を選択し、設定できるbaserCMS専用のプラグインです。</strong>。。。です。
</p>

<p>
<big>■ <a href="https://market.basercms.net/products/detail.php?product_id=83">ユーザーツールバースウィッチ | baserマーケット</a></big><br />
<big>■ <a href="https://github.com/materializing/UserToolbarSwitch">https://github.com/materializing/UserToolbarSwitch</a></big>
</p>

<p>
ファイルのダウンロードは、いつものbaserマーケット or githubよりどうぞ。
</p>

<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 3.0.7</li>
	<li>PHP 5.5.3</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルをDLして解凍したら、/app/Plugin/UserToolbarSwitch に配置します。</li>
	<li>baserCMS管理システムに入ります。</li>
	<li>プラグイン管理に入ります。</li>
	<li>ユーザーツールバースウィッチ プラグインを有効化します。</li>
	<li>ユーザーアカウント設定編集画面に入ります。</li>
	<li>「ツールバー表示状態」が追加表示されてますので、ユーザー別にツールバー表示状態を設定できます。</li>
</ol>

<a data-flickr-embed="true" data-header="false" data-footer="false" data-context="false"  href="https://www.flickr.com/photos/materializing/20757798692/in/dateposted-public/" title="20150822_sc_admin_users_edit"><img src="https://farm6.staticflickr.com/5807/20757798692_c48ffaec07.jpg" width="500" height="230" alt="20150822_sc_admin_users_edit"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>


<h3>ユーザーツールバースウィッチ プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/UserToolbarSwitch/issues">githubでのチケット発行</a></li>
</ul>


<h3>作成裏話(表に出しちゃってるけど裏話)</h3>

<p>
公開側での処理と管理側での処理に大きく異なる箇所があって、そこをどうするか？が悩んだところ。
</p>


<h4>あとがき</h4>

<p>
baserCMSへ応援お願いします_(．．)_<br />
■ <a href="http://basercms.net/donate">baserCMS寄付受付</a><br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS用「メールサインスウィッチ プラグイン」作りました。</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/04/27000011.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=597" title="baserCMS用「メールサインスウィッチ プラグイン」作りました。" />
    <id>tag:www.materializing.net,2015://1.597</id>
    
    <published>2015-04-26T15:00:11Z</published>
    <updated>2019-12-31T10:58:34Z</updated>
    
    <summary> 今回のbaserCMSスキマ産業活動は、メールフォームの署名機能にちょっと目を向けてみました。 作ってみたのは「メールサインスウィッチ プラグイン」です。 きっかけはこちらのTweet。 baserCMSのメールフォーム、超絶使いやすいんだけど署名トラップに...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
今回のbaserCMSスキマ産業活動は、メールフォームの署名機能にちょっと目を向けてみました。<br />
作ってみたのは「メールサインスウィッチ プラグイン」です。<br />
きっかけはこちらのTweet。
</p>

<blockquote class="twitter-tweet" lang="ja"><p>baserCMSのメールフォーム、超絶使いやすいんだけど署名トラップにまたハマった。&#10;サイトの設定が反映されない！ってコアファイルの中身まで触ってたけど、メールプラグイン設定の中で署名設定できるのを毎回忘れてしまう。&#10;（だいたいテスト送信してクライアントさんから指摘されて気づく）</p>&mdash; 俳人 我流 (@Garyuten) <a href="https://twitter.com/Garyuten/status/590685430296752128">2015, 4月 22</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>
そういえばbaserCMSの署名設定は、メールフォームの設定画面とは別に準備されているなぁ、と。<br />
その問題解決として、メールフォーム個別の設定画面内で署名が設定できるようにしてみたらどうだろう？と思ったんで作ってみました。
</p>

<p>
メールフォーム別に備えることになるので、署名もフォーム毎に持てるカタチ。<br />
複数のメールフォームを設置して、Aフォームでは日本語の署名、Bフォームでは英語の署名とか、フォーム毎に担当部署が異なるので、署名内容を変えておきたい、という場面が挙げられます。
</p>


<h3>メールサインスウィッチ プラグイン</h3>

<p>
<strong>メールサインスウィッチ プラグインは、メールフォーム別に利用する署名を設定できるbaserCMS専用のプラグインです。</strong>。。。です。
</p>

<p>
<big>■ <a href="https://github.com/materializing/MailSignSwitch">https://github.com/materializing/MailSignSwitch</a></big><br />
■ <a href="https://github.com/materializing/MailSignSwitch/issues">プロジェクト管理</a>
</p>

<p>
ファイルのダウンロードはいつものgithubよりどうぞ。
</p>

<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 3.0.7</li>
	<li>PHP 5.4.19</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルをDLして解凍したら、/app/Plugin/MailSignSwitch に配置します。</li>
	<li>baserCMS管理システムに入ります。</li>
	<li>プラグイン管理に入ります。</li>
	<li>メールサインスウィッチ プラグインを有効化します。</li>
	<li>メールフォーム設定編集画面に入ります。</li>
	<li>画面下部に「署名設定」が追加表示されてますので、メールフォーム別に署名内容を設定できます。</li>
</ol>

<p>
<a rel="lightbox" href="https://farm8.staticflickr.com/7714/17276797645_3de020cd4e_o.png" title="sc_admin_user_edit by nai arata, on Flickr"><img src="https://farm8.staticflickr.com/7714/17276797645_c327b15535.jpg" width="500" height="261" alt="sc_admin_mail_contents_edit"></a>
</p>

<h4>その他の動作</h4>

<ul>
	<li>プラグインインストール時は、メールフォーム基本設定で設定されている署名内容が、メールフォーム個別に設定されます。</li>
	<li>メールフォーム基本設定で設定されている署名内容が、各入力欄の placeholder として表示されます。</li>
</ul>


<h3>メールサインスウィッチ プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/MailSignSwitch/issues">githubでのチケット発行</a></li>
</ul>


<h3>作成裏話(表に出しちゃってるけど裏話)</h3>

<p>
baserCMSのイベント処理に、dispatchAfterForm というイベントがあります。<br />
これは、管理側の入力・編集画面内のフォームで、入力欄の最後に処理を差し込むことができるイベントです。<br />
今回は、このイベント処理を用いてプラグイン側に用意しているエレメントを表示させてみました。
</p>

<p>
Form.afterForm と Form.afterOptionForm の2種類があって、Optionとついてる側は、画面内の「オプション」をクリックして表示される範囲側の最後に当たる作りとなってるようですね。
</p>

<p>
それから、ModelEventの処理は、最近 <a href="https://twitter.com/gondoh_jp">＠gondoh_jp</a>よりアドバイスを受け内容を早速反映したのです。
</p>


<h4>あとがき</h4>

<p>
MailConfigのテーブルを覗いてみてわかったことは、署名設定は1レコードに収められてること。<br />
このテーブルに外部キー備えたら、フォーム別の署名はできるのです。<br />
が、それはシンプルなbaserCMSの考え方とは反するのかもですね。わかんないけど。<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>gulpを利用して、baserCMSのテーマ制作やプラグイン開発時にブラウザをオートリロードする</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/03/22190508.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=596" title="gulpを利用して、baserCMSのテーマ制作やプラグイン開発時にブラウザをオートリロードする" />
    <id>tag:www.materializing.net,2015://1.596</id>
    
    <published>2015-03-22T10:05:08Z</published>
    <updated>2015-03-23T15:34:12Z</updated>
    
    <summary> gulpは、フロントエンドのタスクを自動化できるツールです。 その gulp には、複数のブラウザ動作を同時に確認できる browser-sync プラグインがあります。 そして、browser-sync にはブラウザのオートリロード機能があるので、これを利...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
gulpは、フロントエンドのタスクを自動化できるツールです。<br />
その gulp には、複数のブラウザ動作を同時に確認できる browser-sync プラグインがあります。<br />
そして、browser-sync にはブラウザのオートリロード機能があるので、これを利用して、baserCMSのテーマやプラグインを作っている最中のリロードの省エネやってみました。
</p>

<h3>やりたいこと</h3>

<ul>
	<li>テーマ作ってる最中のリロードを省きたい</li>
	<li>複数のブラウザでまとめて確認したい</li>
	<li>制作時間の短縮図りたい</li>
</ul>
]]>
        <![CDATA[<h3>試してみた環境</h3>

<ul>
	<li>サーバ: MAMP</li>
	<li>PHP 5.4.19</li>
	<li>baserCMS 3.1.0-dev（ローカルで動作するなら何でも良い）</li>
</ul>
<ul>
	<li>Node.js v0.12.0</li>
	<li>npm: 2.7.3</li>
	<li>gulp: CLI version 3.8.11</li>
	<li>browser-sync: 2.4.0</li>
</ul>


<h3>導入</h3>
Node.js と gulp のインストールの詳細については省略。
この辺とか見てみると良いです。

<ul>
	<li><a href="http://www.atmarkit.co.jp/ait/articles/1408/19/news035.html">http://www.atmarkit.co.jp/ait/articles/1408/19/news035.html</a></li>
	<li><a href="http://www.webcreatorbox.com/tech/gulp/">http://www.webcreatorbox.com/tech/gulp/</a></li>
</ul>

<p>
というワケで、MacPorts を利用した場合でのメモ。
</p>


<h4>Node.js と Node Package Manager をインストール</h4>

<pre>$ port install nodejs
$ port install npm</pre>

<p>
※エラー出たら sudo で実行
</p>


<h4>package.json の作成</h4>
プロジェクトフォルダに移動して以下。

<pre>$ npm init</pre>

<p>
package.json が作成されます。<br />
この json ファイルには、gulp の情報が記載されます。<br />
全部 Enter でOK。必要あれば書きます。
</p>


<h4>プロジェクトフォルダに移動して browser-sync と gulp をインストール</h4>

<pre>$ npm install browser-sync gulp --save-dev</pre>

<p>
※ --save-dev で package.json へのgulp情報の追記<br />
　 → 別の環境に package.json 持って行って <strong>$ npm install</strong> と叩くだけで、package.json に記載内容と同一の内容が構築できる<br />
※エラー出たら sudo で実行
</p>

<p>
インストールすると「node_modules」フォルダが作成されます。<br />
この中身に動作に必要なファイル群が入ってます。<br />
バージョン管理からは ignore しとくと良いです。
</p>


<h4>gulpfile.js の作成</h4>

<p>
プロジェクト直下に gulpfile.js を作成して内容記載。<br />
「proxy」のURLにはこのプロジェクトのURLを記載します。
</p>

<pre>'use&nbsp;strict';
var&nbsp;gulp&nbsp;=&nbsp;require('gulp');
var&nbsp;browserSync&nbsp;=&nbsp;require('browser-sync');

gulp.task('browser-sync',&nbsp;function&nbsp;()&nbsp;{
	browserSync({
&nbsp;&nbsp;&nbsp;&nbsp;	proxy:&nbsp;'example.localhost:8888',
&nbsp;&nbsp;&nbsp;&nbsp;	//&nbsp;external&nbsp;指定すると、実行時のアクセスURLがIPアドレス指定側で開くことができる
		open:&nbsp;'external',
	});

	//&nbsp;指定フォルダ以下のファイルを監視
	gulp.watch(['theme/**',&nbsp;'app/Plugin/**'],&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;	//&nbsp;ファイルに変更があれば同期しているブラウザをリロード
		browserSync.reload();
	});
});

gulp.task('default',&nbsp;['browser-sync']);</pre>

<p>
ここまでで準備完了です。
</p>


<h3>実施: browser-sync を利用したオートリロード</h3>

<p>
プロジェクト直下で以下のコマンド実行。
</p>

<pre>$ gulp</pre>

<ul>
	<li>External のURLでブラウザが起動し、ページが開かれます。</li>
	<li>theme 配下を何か変更して保存。</li>
	<li>ブラウザの開いてるページがオートリロードされたらOKです。</li>
</ul>

<p>
もともとは browser-sync という名の通り、複数のブラウザで同じ動作をさせるためのプラグインです。<br />
Chrome、Firefox、Safari で同じ External のURLを開いていると、それらもまとめてリロードされます。
</p>


<h3>その他のTips</h3>

<p>
■ フロントのビュー確認時<br />
install.php の debug モードを 1 にしてビューキャッシュが利用されない状態にしておくと吉です。
</p>

<p>
■ package.json にURLを指定しておく例
</p>

<pre>"name": "example.localhost:8888",</pre>

<p>
gulpfile.js は以下。
</p>

<pre>'use&nbsp;strict';
var&nbsp;gulp&nbsp;=&nbsp;require('gulp');
var&nbsp;browserSync&nbsp;=&nbsp;require('browser-sync');
var&nbsp;pkg&nbsp;=&nbsp;require('./package.json');	//&nbsp;これが追加

//&nbsp;タスクの設定
gulp.task('browser-sync',&nbsp;function&nbsp;()&nbsp;{
	browserSync({
&nbsp;&nbsp;&nbsp;&nbsp;	proxy:&nbsp;pkg.name,	//&nbsp;package.json&nbsp;の&nbsp;name&nbsp;が設定できる
		open:&nbsp;'external',
	});

	//&nbsp;指定フォルダ以下のファイルを監視
	gulp.watch(['theme/**',&nbsp;'app/Plugin/**'],&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;	//&nbsp;ファイルに変更があれば同期しているブラウザをリロード
		browserSync.reload();
	});
});

gulp.task('default',&nbsp;['browser-sync']);</pre>


<h4>参考記事</h4>

<ul>
	<li><a href="http://www.browsersync.io/docs/options/#option-open">http://www.browsersync.io/docs/options/#option-open</a></li>
	<li><a href="http://ics-web.jp/lab/archives/3405">http://ics-web.jp/lab/archives/3405</a></li>
	<li><a href="http://qiita.com/katapad/items/00f87c0dd959ecb17ac9">http://qiita.com/katapad/items/00f87c0dd959ecb17ac9</a></li>
	<li><a href="http://whiskers.nukos.kitchen/2014/12/11/gulp-browser-sync.html">http://whiskers.nukos.kitchen/2014/12/11/gulp-browser-sync.html</a></li>
	<li><a href="http://qiita.com/hrfmmymt/items/59aa2d9921f3432aa130">http://qiita.com/hrfmmymt/items/59aa2d9921f3432aa130</a></li>
	<li><a href="http://kojika17.com/2014/06/browser-sync.html">http://kojika17.com/2014/06/browser-sync.html</a></li>
</ul>

<h5>あとがき</h5>

<p>
勝手にリロードしてくれるんでおいしいです丶(･ω･)ノ<br />
これからバシバシ使ってこうと決めました。
</p>

<p>
Qiita載せておきました。<br />
■ <a href="http://qiita.com/materializing/items/fa6c11e17af65783c9f5">http://qiita.com/materializing/items/fa6c11e17af65783c9f5</a>
</p>

<p>
そういやこの方法、自分の環境だとbaserCMSに限らずローカル稼働してる色んなものに使えそう。
</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS用「マイエディター」バージョンアップ。エディタ切替えを簡単にしました。</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/03/01002240.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=594" title="baserCMS用「マイエディター」バージョンアップ。エディタ切替えを簡単にしました。" />
    <id>tag:www.materializing.net,2015://1.594</id>
    
    <published>2015-02-28T15:22:40Z</published>
    <updated>2015-02-28T15:22:53Z</updated>
    
    <summary> 先日出したbaserCMS用プラグインである「マイエディター」バージョンアップしました。 ■ baserCMS用「マイエディター プラグイン」作りました。 	ツールバーに利用中エディタを表示 	ツールバーに表示中のエディタをクリックすると、利用可能エディタを...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
先日出したbaserCMS用プラグインである「マイエディター」バージョンアップしました。<br />
■ <a href="http://www.materializing.net/archives/2015/02/22044009.php">baserCMS用「マイエディター プラグイン」作りました。</a>
</p>

<ul>
	<li>ツールバーに利用中エディタを表示</li>
	<li>ツールバーに表示中のエディタをクリックすると、利用可能エディタを一覧表示し、選択して切替え可能</li>
</ul>]]>
        <![CDATA[<h3>エディター切替え</h3>

<p>
インストール（バージョンアップ）後、こんな風にエディターを選択できるようになります。
</p>

<p>
<a rel="lightbox" href="https://farm9.staticflickr.com/8570/16671231652_258ba00646_o.png" title="sc_my_editor by nai arata, on Flickr"><img src="https://farm9.staticflickr.com/8570/16671231652_f4ac34c7dd.jpg" width="500" height="236" alt="sc_my_editor"></a>
</p>

<p>
選択切替え時は、記事に変更内容があっても引き継がない旨のアラートを出します。<br />
その後、もといた画面へ戻ってきます。<br />
固定ページやブログ記事の記事編集画面を開き、この切替え選択を利用すると、編集欄のエディターが切り替わることを確認できマス。
</p>

<p>
これでユーザー設定画面まで行かなくともエディタの切替ができますよ。
</p>

<h5>あとがき</h5>

<p>
インストール直後、ログインし直さなくてもツールバーに選択欄が表示されるように試行錯誤でした。<br />
で、よくよく考えたら、イベントで引っ掛けようにも、そもそもマイエディターのインストール前では、マイエディター内で作ったイベント自体が引っ掛かるワケないっす。<br />
ということに格闘後気付いて脱力(||| Д )=з<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMS用「マイエディター プラグイン」作りました。</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/02/22044009.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=593" title="baserCMS用「マイエディター プラグイン」作りました。" />
    <id>tag:www.materializing.net,2015://1.593</id>
    
    <published>2015-02-21T19:40:09Z</published>
    <updated>2015-02-21T20:46:34Z</updated>
    
    <summary> ついクワッとなって作りました。baserCMSスキマ産業活動。 今回作ってみたのは「マイエディター プラグイン」です。 マイエディター プラグイン マイエディター プラグインは、ユーザー別に利用するエディターを設定できるbaserCMS専用のプラグインです。...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
ついクワッとなって作りました。baserCMSスキマ産業活動。<br />
今回作ってみたのは「マイエディター プラグイン」です。
</p>

<h3>マイエディター プラグイン</h3>

<p>
<strong>マイエディター プラグインは、ユーザー別に利用するエディターを設定できるbaserCMS専用のプラグインです</strong>。。。です。
</p>

<p>
<big>■ <a href="https://github.com/materializing/MyEditor">https://github.com/materializing/MyEditor</a></big><br />
■ <a href="https://github.com/materializing/MyEditor/issues">プロジェクト管理</a>
</p>

<p>
ファイルのダウンロードはいつものgithubよりどうぞ丶(･ω･)ノ
</p>

<ul>
	<li><a href="http://basercms.net/">baserCMS本体はこちら</a>。</li>
<li><a href="http://wiki.basercms.net/">baserCMS公式wikiはこちら</a></li>
	<li><a href="http://doc.basercms.net/">baserCMSのユーザーマニュアルはこちら</a></li>
</ul>]]>
        <![CDATA[<h3>動作環境</h3>

<ul>
	<li>baserCMS 3.0.6.1</li>
	<li>PHP 5.4.19</li>
	<li>MySQL 5.5.33</li>
</ul>


<h3>インストール（使い方）</h3>

<ol>
	<li>圧縮ファイルをDLして解凍したら、/app/Plugin/MyEditor に配置します。</li>
	<li>baserCMS管理システムに入ります。</li>
	<li>プラグイン管理に入ります。</li>
	<li>マイエディター プラグインを有効化します。</li>
	<li>ユーザー情報編集画面に入ります。</li>
	<li>「エディタタイプ」列にある設定項目で、ユーザー別に利用するエディターを設定できます。</li>
</ol>

<p>
<a rel="lightbox" href="https://farm9.staticflickr.com/8584/16603182892_76930eedd3_z.jpg" title="sc_admin_user_edit by nai arata, on Flickr"><img src="https://farm9.staticflickr.com/8584/16603182892_76930eedd3.jpg" width="500" height="266" alt="sc_admin_user_edit"></a>
</p>

<h4>その他の動作</h4>

<ul>
	<li>新規ユーザー追加時は、システム設定＞サイト基本設定 で指定されているエディターが初期選択値になります。</li>
	<li>インストール時は、システム設定＞サイト基本設定 で指定されているエディターが、ユーザー別のエディターとして設定されます。</li>
</ul>


<h3>マイエディター プラグイン についてのご意見・問合せ先</h3>

<p>
以下にて気軽にどうぞー ･ω･<br />
バグ報告、機能要望、感想とかなんでも受け付けてマス。
</p>

<ul>
	<li><a href="http://twitter.com/arata">Twitter＠arata</a></li>
	<li><a href="https://github.com/materializing/MyEditor/issues">githubでのチケット発行</a></li>
</ul>


<h3>作成裏話(表に出しちゃってるけど裏話)</h3>

<p>
誰かが喜ぶかもしれない、という情報を<a href="https://twitter.com/ryuring">@ryuring</a>さんより得て、着手決定。<br />
プラグイン名もネーミングセンス皆無の私に代わり名付けてくれました。ナイスセンススンマセンス。
</p>


<h4>あとがき</h4>

<p>
このプラグイン作成の件から私が得るべき教訓は、<br />
BcAppModel::findExpanded() では、EventのafterFind() が引っ掛からないことだー。
</p>

<p>
あと、記事を書いた作成者紹介欄を表示するプラグイン作りたくなた。
</p>

<p>
いきおいで作った。反省はしてる。<br />

</p>]]>
    </content>
</entry>

<entry>
    <title>baserCMSで、プラグインを用意せずにイベント処理を発動させる方法例</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/02/14163530.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=591" title="baserCMSで、プラグインを用意せずにイベント処理を発動させる方法例" />
    <id>tag:www.materializing.net,2015://1.591</id>
    
    <published>2015-02-14T07:35:30Z</published>
    <updated>2015-02-16T07:14:24Z</updated>
    
    <summary> baserCMS（CakePHP）には、プラグイン側から、処理途中に別の処理を割り込ませるイベント処理を手軽に作って利用することができます。 そのイベント処理ですが、たまーにプラグインを作るまでもなく実行したい場面があります。 ( 三)＜いや、そういうときっ...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
baserCMS（CakePHP）には、プラグイン側から、処理途中に別の処理を割り込ませるイベント処理を手軽に作って利用することができます。<br />
そのイベント処理ですが、たまーにプラグインを作るまでもなく実行したい場面があります。
</p>

<blockquote>( 三)＜いや、そういうときってたいていの場面、専用の処理をプラグインにまとめておきたいときじゃね？</blockquote>

<p>
そんな意見はもちろんあります。が、ちょびっとだけ必要な場面もあるんです。<br />

</p>]]>
        <![CDATA[<h3>イベント処理の作成</h3>

<p>
イベント処理自体がないのに、先にイベントを呼び出そうとするともちろんエラーになります。<br />
そのため、先ずは先に利用したい処理を作成しておきます。
</p>

<p>
とりあえず startup() とか作って、適当な文字列をエコーさせておくとかのテスト書いて、処理が通ることから確認すると良いです。
</p>

<p>
ここでは以下にサンプル例載せておきます。<br />
ブログコンテンツIDが1のカテゴリアーカイブを表示し、そのカテゴリ名が info の場合は、1ページの表示件数を強制的に1,000件にしてみました。<br />
というサンプルです。
</p>

<pre><code>&lt;?php
/**
&nbsp;*&nbsp;[ControllerEventListener]
&nbsp;*
&nbsp;*/
class&nbsp;HogeControllerEventListener&nbsp;extends&nbsp;BcControllerEventListener&nbsp;{
/**
&nbsp;*&nbsp;登録イベント
&nbsp;*
&nbsp;*&nbsp;@var&nbsp;array
&nbsp;*/
	public&nbsp;$events&nbsp;=&nbsp;array(
		'Blog.Blog.startup',
	);
	
/**
&nbsp;*&nbsp;blogBlogStartup
&nbsp;*&nbsp;ブログのカテゴリアーカイブ表示の際、指定カテゴリではページ分割を無効化する
&nbsp;*&nbsp;
&nbsp;*&nbsp;@param&nbsp;CakeEvent&nbsp;$event
&nbsp;*/
	public&nbsp;function&nbsp;blogBlogStartup(CakeEvent&nbsp;$event)&nbsp;{
		$Controller&nbsp;=&nbsp;$event-&gt;subject();
		if&nbsp;(!BcUtil::isAdminSystem())&nbsp;{
			if&nbsp;($Controller-&gt;blogContent['BlogContent']['id']&nbsp;==&nbsp;1)&nbsp;{
				if&nbsp;($Controller-&gt;request-&gt;params['action']&nbsp;==&nbsp;'archives')&nbsp;{
					if&nbsp;(isset($Controller-&gt;request-&gt;params['pass'][1]))&nbsp;{
						if&nbsp;($Controller-&gt;request-&gt;params['pass'][0]&nbsp;==&nbsp;'category')&nbsp;{
							if&nbsp;($Controller-&gt;request-&gt;params['pass'][1]&nbsp;==&nbsp;'info')&nbsp;{
								$Controller-&gt;blogContent['BlogContent']['list_count']&nbsp;=&nbsp;1000;
							}
						}
					}
				}
			}
		}
	}
	
}</code></pre>


<h3>イベント処理の追加</h3>
イベントが発動できるように、処理したいイベントリスナーをアタッチ（取り付け）します。
<strike>ここでは、標準で入っている設定ファイル（setting.php）を利用してます。</strike>
「Attach Events」以下が追記した内容。


<h5>2015/02/16 追記</h5>

<blockquote>setting.php は、Configureクラス用の設定ファイルなので、配列で設定だけを記述する。<br />
なので bootstrap が良いのでは？というアドバイスいただきました。</blockquote>

<p>
■ 参考URL: <a href="http://basercms.net/functions/plugin_setting">http://basercms.net/functions/plugin_setting</a><br />
というワケで、記述箇所は「/app/Config/bootstrap.php」が良さそうですね！
</p>

<pre><code>//&nbsp;Attach&nbsp;Events
App::uses('HogeControllerEventListener',&nbsp;'Event');
App::uses('CakeEventManager',&nbsp;'Event');
CakeEventManager::instance()-&gt;attach(new&nbsp;HogeControllerEventListener());</code></pre>


<h4>参考記事</h4>

<ul>
	<li><a href="http://blog.candycane.jp/%E3%83%96%E3%83%AD%E3%82%B0/2012/12/04/%25e3%2582%25b3%25e3%2583%25bc%25e3%2583%25ab%25e3%2583%2590%25e3%2583%2583%25e3%2582%25af%25e3%2581%25af%25e3%2582%2582%25e3%2581%2586%25e5%258f%25a4%25e3%2581%2584%25ef%25bc%2581cakephp%25e3%2581%25aeevent%25e3%2582%2592%25e4%25bd%25bf%25e3%2581%258a%25e3%2581%2586.html">コールバックはもう古い！CakePHPのEventを使おう</a></li>
	<li><a href="http://basercms.net/manuals/3/programmers/4.html">プラグイン開発について | baser CMS</a></li>
</ul>


<h5>あとがき</h5>

<p>
プラグインを作るほどでもないときは、こんな風にして手軽に処理を入れ込むことができます。<br />
baserCMSはCakeの仕組みをそのまま使えるので便利ですね丶(･ω･)ノ
</p>

<p>
Qiita載っけときます。<br />
■ <a href="http://qiita.com/materializing/items/64aa5d6fdc1978ada4f1">http://qiita.com/materializing/items/64aa5d6fdc1978ada4f1</a>
</p>

<p>
ちなみに冒頭のキャラはアイザックさんです。
</p>

<blockquote>(; 三)＜確かにゲーム中は色んなイベントあるけどこんなとこで呼び出さんでもいいやん</blockquote>]]>
    </content>
</entry>

<entry>
    <title>baserCMSでユーザー別にアクセス制限設定を調整したいとき</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/02/08130729.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=590" title="baserCMSでユーザー別にアクセス制限設定を調整したいとき" />
    <id>tag:www.materializing.net,2015://1.590</id>
    
    <published>2015-02-08T04:07:29Z</published>
    <updated>2015-02-08T04:07:31Z</updated>
    
    <summary> baserCMSでは、ユーザーグループ別に、機能単位や画面単位でアクセス制限を設けて、不要なメニュー表示を調整したり、余分な機能を扱わせないようにすることで、管理システム利用者にとってシンプルで扱い易い管理システムを提供することができます。 	アクセス制限設...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
baserCMSでは、ユーザーグループ別に、機能単位や画面単位でアクセス制限を設けて、不要なメニュー表示を調整したり、余分な機能を扱わせないようにすることで、管理システム利用者にとってシンプルで扱い易い管理システムを提供することができます。
</p>

<ul>
	<li>アクセス制限設定の一覧画面URL例: /admin/permissions/index/2</li>
	<li>システムナビ → ユーザーグループ一覧 → ユーザーグループの鍵アイコンへアクセス</li>
</ul>

<p>
この<strong>アクセス制限設定は、ユーザーグループ単位</strong>となっているため、ユーザー単位で調整するには少しカスタマイズが必要です。<br />
イベント処理使って調整できます。<br />

</p>]]>
        <![CDATA[<h3>必要な状況</h3>

<ul>
	<li>baserCMSのアクセス制限設定を、ユーザー単位で調整入れたいとき</li>
	<li>例: Aグループでは固定ページ機能を許可するが、Aグループ内のhogeユーザーには許可したくない場面</li>
</ul>


<h3>前提条件</h3>

<ul>
	<li>ユーザーグループでのアクセス制限設定の調整を行っていることが前提</li>
	<li>紹介しているやり方はプラグイン・イベント</li>
</ul>


<h3>ファイルの作成</h3>

<p>
プラグイン内に ModelEventListener 作ります。
</p>

<ul>
	<li>/app/Plugin/HogePlugin/Event/HogeModelEventListener.php</li>
</ul>

<pre><code>&lt;?php
/**
&nbsp;*&nbsp;[ModelEventListener]&nbsp;Hoge
&nbsp;*
&nbsp;*/
class&nbsp;HogeModelEventListener&nbsp;extends&nbsp;BcModelEventListener&nbsp;{
/**
&nbsp;*&nbsp;登録イベント
&nbsp;*
&nbsp;*&nbsp;@var&nbsp;array
&nbsp;*/
	public&nbsp;$events&nbsp;=&nbsp;array(
		'Permission.afterFind',
	);

/**
&nbsp;*&nbsp;permissionBeforeFind
&nbsp;*&nbsp;ユーザーIDが2のユーザーでは固定ページ管理へのアクセスを不可にする
&nbsp;*&nbsp;
&nbsp;*&nbsp;@param&nbsp;CakeEvent&nbsp;$event
&nbsp;*/
	public&nbsp;function&nbsp;permissionAfterFind(CakeEvent&nbsp;$event)&nbsp;{
		$Model&nbsp;=&nbsp;$event-&gt;subject();
		if&nbsp;(BcUtil::isAdminSystem())&nbsp;{
			$user&nbsp;=&nbsp;BcUtil::loginUser();
			if&nbsp;($user['id']&nbsp;==&nbsp;'2')&nbsp;{
				foreach&nbsp;($event-&gt;data[0]&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$permission)&nbsp;{
					if&nbsp;($permission['Permission']['url']&nbsp;==&nbsp;'/admin/pages/*')&nbsp;{
						$event-&gt;data[0][$key]['Permission']['auth']&nbsp;=&nbsp;false;
					}
				}
			}
		}
	}
	
}</code></pre>


<h4>何をやっているの？</h4>

<p>
アクセス制限設定は、/lib/Baser/Controller/BcAppController.php の beforeFilter() でチェックされており、beforeFileter() では、Permissionモデルの check() が走ってます。<br />
check() では、ログイン中ユーザーのユーザーグループIDから、そのユーザーグループのアクセス制限設定の全データを取得してます。<br />
そのため、find したあとのタイミングを利用して、ユーザーIDをもとに、取得したアクセス制限設定の中身を書換えることで、任意のユーザーIDのアクセス制限を設けることを実現してます。
</p>


<h4>その他のアプローチ</h4>

<ul>
	<li>ID判定じゃなくても、ユーザーアカウント名での判定でも良い</li>
	<li>権限設定の1行分のデータを配列で作成して追加するやり方でも良い（けど、グループで既に設定済みのを使う方がラクだよね）</li>
</ul>


<h5>あとがき</h5>

<p>
Qiita載っけときます丶(･ω･)ノ<br />
→ <a href="http://qiita.com/materializing/items/e37f570056d29741090b">http://qiita.com/materializing/items/e37f570056d29741090b</a><br />

</p>]]>
    </content>
</entry>

<entry>
    <title>KeyValueBehavior[cakephp-tools]のご紹介</title>
    <link rel="alternate" type="text/html" href="http://www.materializing.net/archives/2015/01/11084207.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.materializing.net/weblog/mt-atom.cgi/weblog/blog_id=1/entry_id=589" title="KeyValueBehavior[cakephp-tools]のご紹介" />
    <id>tag:www.materializing.net,2015://1.589</id>
    
    <published>2015-01-10T23:42:07Z</published>
    <updated>2015-01-11T11:16:21Z</updated>
    
    <summary> 今回はCakePHPで利用できるKeyValueBehaviorについて、実際に使ってみたのでご紹介。 Key-Value Store 先ずはKey-Value Storeについて。 データの保存・管理手法の一つで、任意の保存したいデータ(値：value)に...</summary>
    <author>
        <name>arata</name>
        <uri>http://www.materializing.net/</uri>
    </author>
    
        <category term="cakephp・baserCMS忘備録" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.materializing.net/">
        <![CDATA[<p>
今回はCakePHPで利用できるKeyValueBehaviorについて、実際に使ってみたのでご紹介。
</p>

<h3>Key-Value Store</h3>

<p>
先ずはKey-Value Storeについて。
</p>

<blockquote>
データの保存・管理手法の一つで、任意の保存したいデータ(値：value)に対し、対応する一意の標識(key)を設定し、これらをペアで保存する方式。
</blockquote>
■ <a href="http://e-words.jp/w/KVS.html">KVSとは 〔 Key-Valueストア 〕 〔 キーバリューストア 〕 - 意味/解説/説明/定義 ： IT用語辞典</a>

<p>
DB内の1レコードのデータが key ＝ "hoge"、value = "fuga" でできてるものです。
</p>

<p>
CakePHPには、この仕組みを簡単に取り入れることができるツールがあります。<br />
それが KeyValueBehavior です。<br />

</p>]]>
        <![CDATA[<h3>導入</h3>

<p>
以下で配布されてます。<br />
<strong>■ <a href="https://github.com/dereuromark/cakephp-tools">dereuromark/cakephp-tools</a></strong><br />
この中の以下。<br />
■ <a href="https://github.com/dereuromark/cakephp-tools/blob/master/Model/Behavior/KeyValueBehavior.php">cakephp-tools/KeyValueBehavior.php at master · dereuromark/cakephp-tools</a>
</p>

<p>
ファイルは利用したいプロジェクト内で同じように配置します。<br />
<strong>/app/Model/Behavior/KeyValueBehavior.php</strong>
</p>


<h3>DBのテーブルを準備</h3>

<p>
以下のように保存先のテーブルを作成します。<br />
foreign_id でグルーピングしてひとまとまりのデータとして取扱うカタチです。
</p>

<pre><code>CREATE TABLE `sample_tables` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `foreign_id` int(11) DEFAULT NULL,
  `key` varchar(255) DEFAULT NULL,
  `value` text,
  `model` varchar(255) DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);</code></pre>

<h4>モデルに設定</h4>

<p>
KeyValue形式で扱いたいモデルで以下の指定を行います。
</p>

<pre><code>public $actsAs = array(
	'KeyValue',
);</code></pre>

<p>
これで準備完了です。
</p>


<h3>コントローラでの処理</h3>

<p>
保存時の処理を簡単に書いてみます。
</p>

<pre><code>public function edit($foreignId = null) {
	if (empty($this->request->data)) {
		$this->request->data = $this->{$this->modelClass}->getSection($foreignId);
	} else {
		if (!$this->{$this->modelClass}->saveSection($foreignId, $this->request->data)) {
			$this->Session->setFlash('エラー');
		}
		$this->redirect(array('action' => 'index'));
	}
}</code></pre>

<h4>getSection</h4>

<p>
KeyValue形式で保存されているデータはこのメソッドで取得できます。<br />
$foreignIdでグルーピングされたデータを取得できます。<br />
元のソースは以下のようになってます。
</p>

<pre><code>public function getSection(Model $Model, $foreignKey, $section = null, $key = null)</code></pre>

<ul>
	<li>$foreignKey：グルーピングするIDを指定</li>
	<li>$section：モデル名を指定。指定するとモデル名のキーを含まない配列が取得できる</li>
	<li>$key：指定したキーのデータのみ取得できる</li>
</ul>

<h4>saveSection</h4>

<p>
KeyValue形式でデータを保存する際はこのメソッドを利用します。<br />
元のソースは以下のようになってます。
</p>

<pre><code>public function saveSection(Model $Model, $foreignKey, $data, $section = null, $validate = true)</code></pre>

<ul>
	<li>$foreignKey：保存時のIDを指定</li>
	<li>$data：保存するデータを指定</li>
	<li>$section：保存時のモデル名を指定</li>
	<li>$validate：バリデーションを実施を指定</li>
</ul>

<p>
key に保存されるデータの形式は以下のようになります。<br />
→ ModelName.key<br />
$validate の指定を false にした場合、保存時にバリデーションの処理が行われません。
</p>

<h4>resetSection</h4>

<p>
KeyValue形式で保存されているデータを削除する際はこのメソッドを利用します。<br />
元のソースは以下。
</p>

<pre><code>public function resetSection(Model $Model, $foreignKey = null, $section = null, $key = null)</code></pre>

<ul>
	<li>$foreignKey：削除する対象のグループIDを指定</li>
	<li>$section：削除対象とするモデル名を指定</li>
	<li>$key：指定したキーのデータのみ削除</li>
</ul>

<p>
$sectionと$keyの両方の指定がないときは、テーブルを Truncate します。
</p>


<h3>バリデーションの指定</h3>

<p>
KeyValueBehaviorを利用している際にも、バリデーションを利用することができます。<br />
通常、Cakeではモデルのvalidateプロパティに指定します。<br />
このビヘイビアを利用する際は、モデル内に $keyValueValidate プロパティを作り、バリデーション・ルールを指定するカタチになります。<br />
ルールの記述方法に変わりはありません。<br />
■ <a href="http://book.cakephp.org/2.0/ja/models/data-validation.html">データバリデーション -- CakePHP Cookbook 2.x ドキュメント</a>
</p>


<h3>初期値の指定</h3>

<p>
KeyValueBehavior利用時には、初期値の指定も可能です。<br />
初期値を指定しておきたい場合は、モデル内にkeyValueDefaultsプロパティを設定し、当て込みたいフィールドと値を記述します。
</p>

<pre><code>public $keyValueDefaults = array(
	'ModelName' => array(
		'field' => value,
	),
);</code></pre>


<h3>ビヘイビアの設定</h3>

<p>
モデルにビヘイビアを設定する際には、以下の設定を引き渡すことができます。
</p>

<ul>
	<li>'foreignKeyField' => 'foreign_id',・・・グループIDのフィールド名を指定</li>
	<li>'keyField' => 'key',・・・保存キーのカラム名を指定</li>
	<li>'valueField' => 'value',・・・保存値のカラム名を指定</li>
	<li>'defaults' => null,・・・フォーム初期値を指定</li>
	<li>'validate' => null,・・・バリデーションルールを指定</li>
	<li>'defaultOnEmpty' => false,・・・保存データを何も送らない場合は、指定グループIDのデータを削除するかどうか、を指定</li>
	<li>'deleteIfDefault' => false,・・・保存データがフォーム初期値と同一の場合は、そのデータを削除するかどうか、を指定</li>
</ul>


<h3>その他</h3>

<p>
1つのデータを配列で処理する場合には、モデルの beforeSave でシリアライズ（or json_encode）し、文字列として保存するようにします。<br />
取り出す際には、モデルの afterFind でアンシリアライズ（or json_decode）し、復元して利用すると良いです。
</p>


<h3>導入するメリット</h3>

<p>
KeyValueビヘイビアを利用すると、Key-Value ストアの仕組みをコアに手を入れず手軽に導入することができます。<br />
バリデーションを作成する際にも、通常のルール指定と同様で作成することができます。<br />
追加時の初期値指定も簡単に行うことができるため、かなり便利なビヘイビアとなってます。
</p>


<h5>あとがき</h5>

<p>
KeyValue形式で作っておくと、あとから項目追加となった場合にもテーブル構造を変更する必要がありません。<br />
マスタデータとしても、ログデータとしても利用できます丶(･ω･)ノ<br />

</p>]]>
    </content>
</entry>

</feed>