MENU

ブログ

baserCMSをバージョンアップしたら管理画面ダッシュボードにエラーが表示される時にできること

baserCMSの4.0.1から4.0.5.1にアップしたら、突然管理画面にエラーが表示されるようになりました。

処理に失敗しました。

(404) Nor Found
Error: The request sent to the address '/undefined/contents/ajax_contents_info' was invalid.

20348216_10155589513447277_963490422_o.png

〇システムナビ → ユーティリティ → アセットファイル再配置

※管理システム用のアセットファイル(画像、CSS、Javascript)を削除したり、コアパッケージよりサイトルートフォルダに再配置します。

〇サーバーキャッシュは、いつもおまじないの様に削除します。

〇ブラウザのキャッシュも削除。(私はここで躓きました)

これで無事にエラーが解消されました。

≫ 続きを読む

2017/07/25        admin   |    タグ:baserCMS

baserCMSで本文が長すぎて保存できない時

baserCMSで記事を登録するときに、本文が長すぎて保存できない場合はMySQLの型変更をすると保存できるようになりました。

mysite_pages > contents

型がtextだったので、これをmediumtextへ変更しました。

これでも足りない場合はlongtextに変更したらいいかも!
大は小を兼ねるのであればlongtextにしたいところだけどmin値があるみたいなので長さに応じて変更が必要かもしれません。

 

min max
1 255 TINYTEXT
256 65535 TEXT
65536 16777215 MEDIUMTEXT
16777216 4294967295 LONGTEXT

 

今回は固定ページだったけれど、ブログ本文でも同じかな。

≫ 続きを読む

2016/12/20        admin   |    タグ:baserCMS

開発版のbaserCMSコアを反映させる方法

開発版の入手先
https://github.com/baserproject/basercms

■ 開発版のバージョン確認

/lib/Baser/VERSION.txt は、baserCMSのバージョン番号が記述されているファイルです。
このファイルに、末尾「-dev」のバージョンが記載されているものが、開発版になります。

■ 開発版をアップデートする前に

開発版コアのアップデートもリリース版と同様、バージョンによってはアップデートスクリプトを実行してDBデータを更新する必要があります。

データベースの更新が不要な場合
データベースの更新が必要な場合

 

■ アップデートスクリプト確認方法

DBデータ更新の必要性は、バージョンアップスクリプトの有無で判断します。
バージョンアップスクリプトが存在する場合は、以下のフォルダ内にバージョン番号と同じフォルダ名で格納されています。
/lib/Baser/Config/update/

・データベースの更新が不要な場合

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/lib/Baser/ フォルダをダウンロードしたファイルで上書き
※メンテナンス画面に遷移される場合は、/lib/Baser/VERSION.txtを上書きする前の番号に戻します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

・データベースの更新が必要な場合

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. /lib/Baser/ フォルダをダウンロードしたファイルで上書き
2. /lib/Baser/VERSION.txt の1行目が-dev付きの番号の場合は、プログラムを反映する前のバージョン(例:4.0.0) に書き換える
3. ブラウザで管理画面にログイン
4. ブラウザで、/admin/updaters/exec_script にアクセス
5. タイプをコア、バージョンを プログラム反映後のバージョン(-devを取り除いたバージョン 例:4.0.1) と入力し実行
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

■データベース格納のバージョン番号と、ファイル記述のバージョン番号

例えば、4.0.0 で利用していた場合、データベース内(site_configs)に、4.0.0 という情報が保存されています。
この番号と、/lib/Baser/VERSION.txt の番号が違う場合、メンテナンス画面に強制遷移しています。
上記2つの番号を合わせる為に、アップデーターによってアップデートを行う事になります。

ただし、開発版の場合、4.0.0-dev みたいな感じに-devが付与されていて、アップデーターが動作しない仕様となっています。
これは、開発版のアップデーターが中途半端な状態である可能性が高い為、「サポートしていない」という事を意味しているようです。

サポートしていないバージョンなのであれば、VERSION.txt との相違は気にせず、メンテナンス画面に遷移しないようにしようという事になります。
その場合、データベースの更新がない場合は、上書きしたVERSION.txt を元の番号に戻す(=データベースに保存されているバージョン番号と同じにする)だけでいいのですが、データベースの更新が発生している場合は、スクリプトを実行する必要があるという事になります。

 

※ 開発版はあくまで開発版なので不具合が存在する可能性がある事を認識した上で利用しましょう。

 

株式会社キャッチアップ 江頭さん 監修

≫ 続きを読む

2016/11/22        admin   |    タグ:baserCMS

baserCMSで「簡単なブログ」プラグインを作ってみるチュートリアル

baserCMSのプラグインを作るための準備はできたけど、具体的にどうやって作ったらいいの?という人のためのチュートリアル記事です。
今回は、「簡単なブログ」プラグインを作成してみましょう。baserCMSの管理画面から「記事一覧を表示」、「記事を編集」、「新規記事を追加」、「記事を選んで削除」の機能と、閲覧側の「記事一覧表示」、「記事詳細を表示」の機能を実装します。

あらかじめ、baserCMSで初めてプラグインを作ってみる時の基本知識を参考に、プラグインの名前は bcforum で準備しておきます。

1. データベースを作成する

まずは、ブログ記事を保存しておくデータベースを作成します。

テーブル名 bc_pg_bcforum_posts

id int(8) primery_key auto_increment not_null
name int(255)
contents text
created datetime
modified datetime

id(プライマリーキー用), created(レコード作成日時), modified(レコード更新日時) の3項目は基本的には必須項目です。
created と modified は自動更新されます。ちなみに、プラグインテーブルの命名ルールは、bc_pg_プラグイン名_テーブル名で作成すること、となっているので、このルールに沿って作成くださいね。

2. ディレクトリ構成の確認

今回チャレンジする、「簡単なブログ」で作成するディレクトリやファイルの一覧です。

ディレクトリ構成

おおまかに分けると、

  • モデル → models
  • コントローラー → controllers
  • ビュー → views

の3つを作成することになります。

3. モデルを作成する

bcforum/models/bcforum_post.php

<?php
class BcforumPost extends AppModel {
// $name には、モデル名と同じ値をセットします
var $name = 'BcforumPost';
// plugin プロパティを設定します
var $plugin = 'Bcforum';
// データベースの接続設定をします。
var $useDbConfig = 'plugin';
}
?>

$name は、CakePHPでは、PHP4との互換用に書くもののようですが、baserCMSではPHP5を使っていても必須項目になっているみたいです。プラグインで利用するモデルでは、プラグイン名を設定する $plugin プロパティを設定します。app/config/database.php には、データベースへの接続設定が書かれてあります。そこでは、デフォルトの接続設定 baser と、プラグイン用の接続設定 plugin が用意されています。2つの違いはプレフィックスです。デフォルトであれば、プレフィックスは bc_ だけなのですが、プラグインの命名ルールでは、bc_pg_ までとなっているので、ここで設定しておきます。

4. コントローラとビューを作成する

bcforum/controllers/bcforum_posts_controller.php

<?php
// 継承するコントローラのpluginsをインポートする
app::import('Controller', 'Plugins');
// baserCMS にパッケージされている PluginsController を継承させます
class BcforumPostsController extends PluginsController {
// nameプロパティをちゃんと定義しておきます【重要】
var $name = "BcforumPosts";
// モデル宣言 (Plugin,プラグイン名.モデル名)
var $uses = array('Plugin', 'Bcforum.BcforumPost');
// このコンポーネントを読み込むと、このコントローラーに認証がかかります
var $components = array('BcAuth','Cookie','BcAuthConfigure');

function beforeFilter() {
}

function index() {
// ブログ一覧を表示させる
}

function view($id) {
// ブログ詳細を表示させる
}

function admin_index() {
// 管理画面からブログ一覧を表示させる
}

function admin_edit($id) {
// ブログを編集する
}

function admin_add() {
// ブログを新規登録する
}

function admin_delete($id) {
// ブログを削除する
}

?>

ディレクトリ構成の一覧と比較してみると、view ファイルとだいたい一致してますよね。

http://{baserCMS設置URL}/bcforum/bcforum_posts/index

上記のアドレスをリクエストすると、 function index() が実行されます。

http://{baserCMS設置URL}/admin/bcforum/bcforum_posts/index

上記のアドレスをリクエストすると、 function admin_index() が実行されます。

つまり、アクション名の先頭に、プレフィックス admin_ がある場合は、アドレスのルート直下に admin ディレクトリが必要になります。

index() と view() の認証を許可する

コンポーネントで定義したことで、コントローラー全体に認証がかかってしまっています。ログインしていなくても、ブログの閲覧だけはできるようにしたいですよね。そこで、beforFilter() に、下記を記述しましょう。

function beforeFilter() {
$this->BcAuth->allow('index', 'view');
}

これで、2つのアクションは、ログインしてなくても実行できるようになりました。
でも、今は2つでも、プラグイン開発を進めていくと、認証外したいアクションが増えるかも・・・ 管理画面の admin_ がつくやつだけ認証かけれないの?という時は、下記のように書き換えちゃいましょう。

function beforeFilter() {
if (!preg_match('/^admin_/', $this->action)) {
$this->BcAuth->allow($this->action);
}
}

admin_ で始まるアクション以外の認証を解除してくれるようになりました。これだけだと、継承元の記述が全部上書きされてしまうので、お約束の

parent::beforeFilter();

も忘れずに記述しておいてくださいね。

アクション admin_index() を作成する

管理画面のトップページ処理を作成します。ブログ一覧を表示させて、それぞれの記事への編集ボタンを作成しましょう。

function admin_index() {
// タイトルをセットします
$this->pageTitle = '記事一覧';
// 管理画面のサブメニュー
$this->subMenuElements = array('bcforum_posts_index'); 
// モデルから今回のブログデータのテーブル情報を全て取得します
$datas = $this->BcforumPost->find('all');
// 取得したデータを view へセットします
$this->set('datas', $datas);
}

$this->pageTitle は、タイトルをセットします。タイトルタグや、ぱんくずリスト、h1タグなどに使われます。$this->subMenuElements は、ナビゲーターリンクに使用できます。 bcforum/views/elements/admin/submenus/bcforum_posts_index.php を作成して、「新規ブログ登録」や「ブログ一覧表示」などのナビゲーションメニューを作成することで、呼び出すことができます。詳しくは、ナビゲーションメニューを作成する を参照ください。

admin_index() を表示するビューを作成する

bcforum/views/bcforum_posts/admin/index.php

<table class="list-table">
<tr>
<th></th>
<th></th>
<th>ID</th>
<th>タイトル</th>
</tr>
<?php foreach ($datas as $data): ?>
<tr>
<td><?php $bcBaser->link('編集する', array('plugin' => 'bcforum', 'plugin' => 'bcforum', 'controller' => 'bcforum_posts', 'action' => 'edit', $data['BcforumPost']['id'])) ?></td>
<td><?php $bcBaser->link('削除する', array('plugin' => 'bcforum', 'plugin' => 'bcforum', 'controller' => 'bcforum_posts', 'action' => 'delete', $data['BcforumPost']['id'])) ?></td>
<td><?php echo $data['BcforumPost']['id'] ?></td>
<td><?php echo $data['BcforumPost']['name'] ?></td>
</tr>
<?php endforeach ?>
</table>

$datas を var_dump してみると分かりますが、bc_pg_bcforum_posts の情報が配列で格納されています。これを、foreach 文で回して一覧を表示させましょう。
編集ボタンも追加して、アクション edit へリンクを作成し、 id を引数として渡します。環境によって左右されないURLを作成してくれるので、HTMLヘルパーを使いましょう。

アクション admin_edit() を作成する

記事の編集画面の表示と、編集登録処理を行います。データが存在する項目は、フォームに初期値として表示させます。

function admin_edit($id) {
// タイトルをセットします
$this->pageTitle = '記事編集';
//管理画面のサブメニュー
$this->subMenuElements = array('bcforum_posts_index');
if (!$this->data) {
// フォームにDBデータを表示
$this->data = $this->BcforumPost->read(null, $id);
} else {
// 送信データをDBに保存
$this->BcforumPost->set($this->data);
if ($this->BcforumPost->save()) {
$this->Session->setFlash('保存しました');
$this->redirect('index');
} else {
$this->Session->setFlash('失敗!');
}
}
}

$this->data は、送信されてきたフォームデータが格納されます。
!$this->data ということは、フォームからデータが送信されていないということですから、ビュー画面のフォームに初期値を表示するため、データベースの情報を取得してくる必要があります。$this->data が存在する場合は、フォームからデータが送信されている=編集しましたよ、ということなので、そのデータをデータベースへ格納します。

admin_edit() を表示するビューを作成する

bcforum/views/bcforum_posts/admin/edit.php

<?php echo $bcForm->create('BcforumPost'); ?>
<?php echo $bcForm->hidden('BcforumPost.id') ?>
<table class="form-table">
<tr>
<th>ID</th>
<td><?php echo $bcForm->value('BcforumPost.id') ?></td>
</tr>
<tr>
<th>タイトル</th>
<td><?php echo $bcForm->text('BcforumPost.name') ?></td>
</tr>
<tr>
<th>内容</th>
<td><?php echo $bcForm->textarea('BcforumPost.contents') ?></td>
</tr>
</table>
<div class="submit">
<?php echo $bcForm->submit('保存', array('class' => 'button')) ?>
</div>
<?php echo $bcForm->end() ?>

フォームヘルパーで、編集フォームを作成します。データベースから取得した情報を初期値として表示させます。 id は編集できないように、hidden 属性で出力しておきましょう。

アクション admin_add() を作成する

function admin_add() {
// タイトルをセットします
$this->pageTitle = '記事追加';
// 管理画面のサブメニュー
$this->subMenuElements = array('bcforum_posts_index');
if ($this->data) {
// 送信データをDBに保存
$this->BcforumPost->set($this->data);
if ($this->BcforumPost->save()) {
$this->Session->setFlash('保存しました');
$this->redirect('index');
} else {
$this->Session->setFlash('失敗!');
}
}
}

admin_add() を表示するビューを作成する

bcforum/views/bcforum_posts/admin/add.php

<?php echo $bcForm->create('BcforumPost'); ?>
<table class="form-table">
<tr>
<th>タイトル</th>
<td><?php echo $bcForm->text('BcforumPost.name') ?></td>
</tr>
<tr>
<th>内容</th>
<td><?php echo $bcForm->textarea('BcforumPost.contents') ?></td>
</tr>
</table>
<div class="submit">
<?php echo $bcForm->submit('保存', array('class' => 'button')) ?>
</div>
<?php echo $bcForm->end() ?>

edit.php とほぼ同じですね。編集フォームの時に記述した、hidden 属性の id 、これが存在しないだけで、新規レコードに追加してくれます。簡単ですね!

アクション index() を作成する

一般の閲覧者が見ることのできるページを作成します。ログインしなくてもみることができるページですね。 この動きって、実は admin_index() とほぼ同じで大丈夫ですよね。そんな時は、 admin_index() のアクションを再利用しちゃいましょう。

function index() {
$this->setAction('admin_index'); //admin_indexのアクションをそのまま呼び出せる
$this->pageTitle = 'トピックス一覧'; //上書きすることもできる
}

今回は、admin_index() を呼び出したあと、タイトル部分だけは上書きして変えてみました。

index() を表示するビューを作成する

bcforum/views/bcforum_posts/index.php

<table class="row-table-01">
<tr>
<th></th>
<th>ID</th>
<th>タイトル</th>
</tr>
<?php foreach ($datas as $data): ?>
<tr>
<td><?php $bcBaser->link('詳細', array('plugin' => 'bcforum', 'controller' => 'bcforum_posts', 'action' => 'view', $data['BcforumPost']['id'])) ?></td>
<td><?php echo $data['BcforumPost']['id'] ?></td>
<td><?php echo $data['BcforumPost']['name'] ?></td>
</tr>
<?php endforeach ?>
</table>

admin_index() のビューとほとんど同じです。違うのは、編集ボタンが詳細表示ボタンになったところくらいですね。それから、閲覧側のアクションには、プレフィックスである admin がつきませんでした。なので、ビューを作成する場合も、今まで作った管理画面用の admin ディレクトリ内ではないのでご注意ください。

アクション view() を作成する

詳細ボタンがクリックされた時に呼び出されるアクションです。引数である id をもとにして、レコードを呼び出し、データをビューに渡します。

function view($id) {
if ($id) {
$data = $this->BcforumPost->read(null, $id);
$this->set('data', $data);
}
}

view() を表示するビューを作成する

<table class="row-table-01">
<tr>
<th>ID</th>
<td><?php echo $data['BcforumPost']['id'] ?></td>
</tr>
<tr>
<th>タイトル</th>
<td><?php echo $data['BcforumPost']['name'] ?></td>
</tr>
<tr>
<th>内容</th>
<td><?php echo $data['BcforumPost']['contents'] ?></td>
</tr>
</table>

$data に渡したデータを、表示させます。

アクション admin_delete() を作成する

削除処理を作成します。

function admin_delete($id) {
if($this->BcforumPost->delete($id)) {
$this->Session->setFlash('削除しました');
$this->redirect('index');
} else {
$this->Session->setFlash('失敗!');
$this->redirect(’index’);
}
}

削除処理ができたあとは、一覧表示にリダイレクトするので、ここではビュー画面は作成しません。

ナビゲーションメニューを作成する

bcforum/views/elements/admin/submenus/bcforum_posts_index.php

<tr>
<th>ダッシュボードメニュー</th>
<td>
<ul class="cleafix">
<li>
<?php $bcBaser->link('一覧を表示する', array('plugin' => 'bcforum', 'controller' => 'bcforum_posts', 'action' => 'index')) ?>
</li>
<li>
<?php $bcBaser->link('新規に登録する', array('plugin' => 'bcforum', 'controller' => 'bcforum_posts', 'action' => 'add')) ?>
</li>
</ul>
</td>
</tr>

baser の管理画面とデザインを揃えたいなというときは、baser/views/elements/admin/submenus/ の中のファイルを参考に作成するといいですよ。

以上でチュートリアルは終了です。
baserCMSは、CakePHPでできているので、この処理どうやって書くんだっけ?って時なんか、ちょっと検索するとたくさんのtipsが見つかるので、とってもカスタマイズしやすいですね!実は私、そんなにCakePHP詳しくないのですが、CakePHPについての記事を書いて下さっている方々のおかげでいつも助かってます。お世話になってます。ありがとうございます!

≫ 続きを読む

2012/07/11        admin   |    タグ:baserCMS , プラグイン

baserCMSのプラグイン開発でデータベースを使用する場合にやっておくこと

baserCMSのプラグインはできたけど、配布する時のデータベースはどうやって準備したらいいんだろう?って時のための記事です。今回は、myplugin というプラグインを作成した場合、という設定で進めていきます。

1. インストール時の実行ファイル init.php を作成する

用意したスキーマを実行させるためのファイル「インストールスクリプト」を作成します。

myplugin/config/init.php

ディレクトリ構造インストールスクリプト

この init.php ファイルの中に、下記の要領で記述します。

$this->Plugin->initDb('{プラグイン名}');

プラグイン名は、作成しているプラグイン名を入れて下さいね。
今回の場合 myplugin になります。

2. スキーマファイルを用意する

スキーマファイルを作るのってなんだかめんどそう・・・。テーブルなら、プラグイン作成した時に、phpMyAdminで作成済みなのに!って時のために、baserCMSでは、スキーマファイル自動生成機能がついてます。

http://{baserCMS設置URL}/admin/tools/write_schema

上記のURLを入力すると、baserCMSで使用されているデータベースのテーブル一覧が表示されます。上が「コアテーブル」下が「プラグインテーブル」になっています。

スキーマ生成ページ

ちなみに、プラグインテーブルの命名ルールは、「 bc_pg_プラグイン名_ 」で始まること、となっているので、このルールに沿って作成くださいね。作成済みのテーブルは、この一覧に表示されますので、選択して生成ボタンをクリックするだけで、あっという間にスキーマファイルのできあがり!です。schema.zip がダウンロードできるので、解凍してください。

{プレフィックスなしのテーブル名}.php ※bc_pg_なしのテーブル名.php のことです。

というファイルが出来ていれば、OKです。このファイルは、下記ディレクトリに保存します。

myplugin/config/sql/

3. csvファイルを用意する

プラグインをインストールした時に、データベースに初期値を持たせたい時のためのファイルです。マスターテーブルを使うプラグインを作る時などに使用できますね。

csvファイルの作り方

  • 文字コードは、Shift-JIS
  • 各フィールドをカンマで区切る
  • 各フィールドをダブルコーテーション(”)で囲む
  • フィールド内のダブルコーテーションは、ダブルコーテーションでエスケープする
  • 1行目は、フィールド名の定義とする
  • ファイル名は、プラグイン名から始まる

こんな感じになります。

"id", "name","title","created","modified"
"1","test","簡単な""プラグイン""の作り方","",""

保存場所は、スキーマファイルと同じ場所です。

myplugin/config/sql/

ファイル名は、プレフィックスなしのテーブル名.csv になります。
たとえば、テーブル名が、bc_pg_myplugin_table だった場合、

myplugin_table.csv

となります。

スキーマファイルとcsvファイルは用意できましたか?ディレクトリ構造のイメージです。

ディレクトリ構造

以上で、データベースの準備ができました。これでプラグインをインストールする時に、baserCMSのデータベース内にテーブルが構築されます。

≫ 続きを読む

2012/07/10        admin   |    タグ:baserCMS , プラグイン

baserCMSで初めてプラグインを作ってみる時の基本知識

いつもお世話になっているbaserCMS。
ある程度baserCMSで、テーマのカスタマイズも経験し、プラグイン開発に挑戦してみようかな、と思っている人向けの記事です。

baserアイキャッチ

テーマの作成はある程度慣れてきたのだけど、まだまだ発展途上のbaserCMS。この機能があったらいいな、ということが多々あると思います。そんな時baserCMSは、CakePHPを利用して作られているので、普段からCakePHPを使っている方や、PHPのフレームワークに慣れている方は、簡単にカスタマイズしているという人もいらっしゃると思います。そこで、baesrCMSのプラグインとして作っておけば、別のプロジェクトで再利用することができますし、他のユーザーさんへ配布することも可能です。

1. プラグインとして認識させる

baserCMSには、本体インストールと同時に3つのプラグインが最初からインストールされています。管理画面のプラグイン一覧を表示すると分かりますね。

プラグイン一覧画面

それでは、baser/app/plugins/ の中に、myplugin というディレクトリを作ってみましょう。

baserディレクトリツリー構造

myplugin ディレクトリを作ったら、プラグイン一覧をリロードしてみます。

プラグイン認識画面

プラグインとして認識され、プラグイン一覧に表示されました。

インストールボタンインストールボタンをクリックして登録すると、myplugin プラグインのインストール完了です。
空っぽのプラグインなので、インストールしても何も変化はありませんが、立派にプラグインとして、baserCMSのデータベースに登録されます。これでプラグインを開発するスペースを確保することができました。

2. バージョンファイルを作成する

プラグインのアップデートに重要なバージョン管理。VERSION.txt を作成し、バージョン番号を入力します。

myplugin/VERSION.txt

versionファイルversionファイル構造

バージョン番号は、VERSION.txt ファイルの1行目に記述します。baserCMSでは、3区切りまでのバージョン番号を認識します。

(メジャーバージョン).(マイナーバージョン).(パッチ)

の順番で記述します。プラグイン一覧をリロードしてみましょう。前回インストール時のバージョンと違っていると、baserCMSが自動で判断して、アップデートボタンアップデートボタンを表示してくれます。

baserプラグインアップデート表示画面

アップデートすると、プラグイン一覧の myplugin に、バージョンが表示されましたね!

baserプラグインバージョン表示画面

3. configファイルを作成する

インストール画面で利用する設定ファイル config.php を作成します。

myplugin/config/config.php

versionファイルversionファイル構造

設定ファイルには、以下の設定を記述することができます。

$title = '{プラグイン名(日本語可)}';
$description = '{プラグインの説明文}';
$adminLink = '{管理画面用初期ページへのリンク}';
$installMessage = '{インストール画面に表示するメッセージ}';
$author = '{プラグインの作成者名}';
$url = '{プラグイン作成者のホームページURL}';

baserプラグイン設定表示画面

プラグイン一覧を確認してみると、「プラグイン名」「説明」「開発者&リンク」の情報が設定ファイルから反映されていることが分かります。

$adminLink = '{管理画面用初期ページへのリンク}';

これを記述しておくだけで、プラグイン一覧に、管理画面へのリンクボタン管理画面へのリンクボタンを表示してくれます。管理画面を操作するプラグインを作るときは、記述しておくと便利ですね!

≫ 続きを読む

2012/07/09        admin   |    タグ:baserCMS , プラグイン