baserCMSを使用した開発入門

[baserCMS Advent Calendar 2018](https://adventar.org/calendars/3481) 参加記事です。

## 概要
- baserCMSを理解するための情報をまとめています。
- リンク先の中には、情報が古くてそのままのコードだと動かない場合もありますが、その際は考え方だけ掴むといいでしょう。

## 対象
 - PHPの基本的な使い方を理解している方
 - baserCMSの基本的な使い方を理解している方
 - baserCMSを使用したテーマの作成やプラグインの作成を行いたい方

## 1. baserCMSの環境を準備する
- ローカルにbaserCMSの環境がない方は最初に準備しましょう。
- サーバー上にしか環境がない場合よりもスムーズに作業が行なえます。
- Windowsの場合はXAMPP、Macの場合はMAMPを使用すると簡単に開発環境が準備できます。
- [baserCMS 公式サイト](https://basercms.net/)
- [baserCMS はじめてガイド](https://basercms.net/about/guide.html)
- [XAMPP 公式サイト](https://www.apachefriends.org/jp/index.html)
- [MAMP 公式サイト](https://www.mamp.info/en/)

## 2. テーマの作り方
- 最初は既存のテーマに変更を加えてカスタマイズの仕方を覚えましょう。
- baserCMSでテーマをカスタマイズする場合は「どのファイルを変更すればいいのか」を見つけることと、 baserCMSにどのような関数が準備されているのかを知ることが重要です。
- [basersマガジン テーマの作り方](http://magazine.basercms.net/article/archives/category/theme)
- [baserCMS公式ガイド テーマ制作チュートリアル](http://wiki.basercms.net/%E3%83%86%E3%83%BC%E3%83%9E%E5%88%B6%E4%BD%9C%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB)
- [baserマーケット テーマ一覧](https://market.basercms.net/products/list.php?category_id=2)

### 2.1. 変更対象ファイルの見つけ方
- 変更対象のファイルを見つける方法として、私はよく「それっぽい文字列」での全文検索か、ファイル名の検索を行っています。
- 例えば、bc_sampleテーマを使用している場合にトップページに表示されるブログ記事の表示を調整したいとしましょう。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/326577/910e7c25-b562-45cb-660e-7c772690f8eb.png)

- その際は、まず変更したい箇所のソースをチェックします。ブラウザのデベロッパーツールを使うと便利です。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/326577/0b7f6171-b699-3025-a812-c2db59ee41cf.png)

- 「post-list」という文字列を見つけたので、bc_sampleテーマ配下で全文検索を行います。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/326577/5737c0b3-0b6f-cba5-df08-e4f02c3c40b5.png)

- 2件見つかりました。片方のパスには"smartphone"と入っているので、PC版の場合は"Blog/default/posts.php"を変更するとよさそうです。

### 2.2. baserCMSの関数
- 関数は[公式wikiの関数リファレンス](http://wiki.basercms.net/ver4/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)を一通り見ておくといいです。すべてが網羅されているわけではありませんが、最低限の関数の情報は準備されています。

## 3. プラグインの作り方
- プラグインを作れるようになるとbaserCMSに様々な機能を加えることができるようになります。
- baserCMSに標準で準備されているブログ機能やメール機能もプラグインの一種です。
- プラグインを実際に作り始める前にCakePHP2の基本的な知識を身につけることをおすすめします。
- baserCMSは、CakePHP2をベースに作成されているため、プラグインを作成する際もCakePHP2の知識が必要となってくるからです。

### 3-1. CakePHPを学ぶ
- [3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://www.slideshare.net/yandod/3cakephp21-in-php2012)
- [ドットインストール CakePHP2入門](https://dotinstall.com/lessons/basic_cakephp)
- [CakePHP 2.x ブログチュートリアル](https://book.cakephp.org/2.0/ja/tutorials-and-examples/blog/blog.html)
- [CakePHP 2.x ドキュメント](https://book.cakephp.org/2.0/ja/index.html)
- [Amazon はじめてのCakePHP](https://www.amazon.co.jp/dp/4777518477/)
- [Amazon CakePHP2 実践入門](https://www.amazon.co.jp//dp/4774153249/)

### 3-2. プラグインの作り方を学ぶ
- [baserCMS公式ガイド プラグイン作成ガイド](http://wiki.basercms.net/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%BD%9C%E6%88%90%E3%82%AC%E3%82%A4%E3%83%89)
- [basersマガジン プラグイン作成の基礎](http://magazine.basercms.net/article/archives/category/plugin)
- [basersマガジン baserCMSのブログ機能にカスタム項目を追加するプラグインを作成する方法](http://magazine.basercms.net/article/archives/24)
- 私の場合、プラグインの作り方を覚える上で一番役に立ったのは既存プラグインの写経でした。
- baserマーケットやGitHubにあるプラグインで、簡単そうなプラグインをいくつかDLして、写経を行っていると段々とプラグインづくりの雰囲気がつかめてきます。
- [baserマーケット プラグイン一覧](https://market.basercms.net/products/list.php?category_id=1)
- [GitHub baserCMS 検索結果](https://github.com/search?q=baserCMS)

## 4. 困ったときは
- 開発を進めていく上で思うようにコードが動かないケースが出てくると思いますが、その際の対処法を記載します。

### 4-1. エラーログをチェックする
- baserCMSをデバッグモード1以上に設定するとPHPのエラーメッセージが画面上に表示されるようになります。
- 表示されたエラーメッセージで検索すると解決方法が見つかります。
- ajax関連の処理で画面上にエラーメッセージが表示されない場合は、ブラウザの開発者ツールのネットワークタブで通信先のページの情報が見られるので活用しましょう。
- [baserCMS デバッグ方法](http://project.e-catchup.jp/projects/basercms/wiki/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%96%B9%E6%B3%95)

### 4-2. デバッガを使う
- NetBeansやPhpStormなどのIDEを使用すると、PHPの処理を1行ずつ進めながら変数の状態を確認するといったことが簡単に行なえます。
- また、IDEにはコードの補完機能や関数の定義元にジャンプする機能など、便利な機能が揃っているので開発を効率よく進めることができます。

### 4-3. フォーラムで質問する
- [baserCMS公式のユーザーズフォーラム](http://forum.basercms.net/)で質問すると、誰かが回答してくれるかもしれません。

以上となります。
テーマやプラグインを作成したら、ぜひ[baserマーケット](https://market.basercms.net/)に投稿してみましょう。
私がありがたく使わせていただきます^^