[CakePHP]WordPressよりもckeditor/ckfinderを使ってみた

[CakePHP 2.2.3]

1月から、「みんなの英語ひろば」で記事コンテンツを配信し始めました。

http://eigohiroba.jp/t

当初、ベースのシステムはCakePHP、記事コンテンツWordPressと分けていたのですが、この2つのシステムの相性がよろしくないので、記事コンテンツ向けにWordPressはやめて、普通にCakePHPで作ることにしました。

3日程で作ることができたのですが、、今回ご紹介するckeditorとckfinderというツールのおかげでかなり楽でした。こちらはjavascriptでテキストエリアに簡単に機能を付加できる多機能エディタで、本当に、かなりのスグレモノです。

ちなみに、ckeditorが本体で、ckfinderは追加機能で、画像アップロード機能を追加するのに使いました。

2013 01 27 1831

導入方法は簡単

CakePHPの場合、それぞれダウンロードしたファイルを、以下に配置します。

app/webroot/js/ckeditor/

app/webroot/js/ckfinder/

そして、使用したいビューの中で、以下のように呼び出すだけです。

[php]
<?php $this->Html->script(‘ckeditor/ckeditor’, array(‘inline’ => false));?>
<?php $this->Html->script(‘ckfinder/ckfinder’, array(‘inline’ => false));?>

<?=$this->Form->input(‘body’, array(‘class’=>’ckeditor’, ‘id’=>’editor1’))?>
[/php]
[js]
<script type="text/javascript">
if (typeof CKEDITOR != ‘undefined’) {
var editor = CKEDITOR.replace( ‘editor1’ );
CKFinder.setupCKEditor( editor, ‘/js/ckfinder/’ ) ;
}
</script>
[/js]

実装例

2013 01 27 1841

ckeditorを読み込んだ場合、テキストエリアがこのように変わります。

2013 01 27 1842

エディタ上にあるボタンのうち、「イメージ」ボタンをおすとこのようなウインドウが開きます。

2013 01 27 1843

アップロード機能(ckfinderがちゃんと読み込まれていればこのアップロードタブが出てきます)

2013 01 27 1844

さらに、「イメージ」ウインドウから過去にアップロードした画像一覧を見ることもできます。
こちらもckfinderの機能です。

CakePHPとWordPressを一緒に動作させると2つのシステムを管理するのが大変になってしまいます。簡単なブログ機能で良い場合、ckeditorを候補に入れてみるのはいかがでしょうか。

[CakePHP]カスタムRouting利用時にViewでPaginatorのURLを設定する方法

[CakePHP 2.2.3]

カスタムRoutingを使用している時にPaginatorのURLが思ったように出力されなくてかなりハマることは良くありますよね!

この辺は公式マニュアルに書いてなかった気がしますので尚更です。(実は書いてあったらスミマセン)

例えば、以下のようにRoutingが設定されていた場合、

Config/routes.php

[php]
Router::connect(‘/:hoge1/:hoge2’, array(‘controller’ => ‘articles’, ‘action’ => ‘index’),
array(
‘hoge1’ => ‘[a-zA-Z]+’
‘hoge2’ => ‘[0-9]+’,
));
[/php]

ViewのPaginatorでは、以下のように設定します。

View/Articles/index.ctp

[php]
<?=$this->Paginator->numbers(array(
‘url’ => array(‘controller’ => ‘articles’, ‘action’ => ‘index’, ‘hoge1’ => ‘foo’, ‘hoge2’ => 123)
))?>
[/php]

または、Paginationのリンクを出力する前に以下のように設定しておくことも出来ます。

[php]
<?php $this->Paginator->options(array(
‘url’ => array(‘controller’ => ‘articles’, ‘action’ => ‘index’, ‘hoge1’ => ‘foo’, ‘hoge2’ => 123)
))?>
[/php]

ポイントは、しっかりとパラメータを入力してあげることですね。

[CakePHP]SplFileInfo::openFileエラーの対応方法

[CakePHP2.2.3]

CakePHP2.xから、app/tmp/cache/modelsやapp/tmp/cache/persistent内のキャッシュファイルが生成される際に、パーミッションの問題で以下のようなエラーが出ることが多いです。

Warning: SplFileInfo::openFile(/www/app/tmp/cache/persistent/cake_core_cake_console_) [splfileinfo.openfile]: failed to open stream: Permission denied in /www/lib/Cake/Cache/Engine/FileEngine.php on line 292

この問題はファイル所有者とアクセスユーザーが違うので発生しているのですが、umaskを設定することで解決できます。
実際のコードは、core.phpの最下部にあるキャッシュ設定にmaskオプション追加するだけです。

[php]
//app/Config/core.php
Cache::config(‘_cake_core_’, array(
‘engine’ => $engine,
‘prefix’ => $prefix . ‘cake_core_’,
‘path’ => CACHE . ‘persistent’ . DS,
‘serialize’ => ($engine === ‘File’),
‘duration’ => $duration,
‘mask’ => 0666,
));
Cache::config(‘_cake_model_’, array(
‘engine’ => $engine,
‘prefix’ => $prefix . ‘cake_model_’,
‘path’ => CACHE . ‘models’ . DS,
‘serialize’ => ($engine === ‘File’),
‘duration’ => $duration,
‘mask’ => 0666,
));
[/php]

追記:Cache:write();を使う方は、以下のように別途、defaultの設定も追加しておいた方がいいでしょう。bootstrapに以下を追加しておきましょう。

[php]
//app/Config/bootstrap.php
Cache::config(‘default’, array(
‘mask’ => 0666,
));
[/php]

[CakePHP]scripts_for_layoutへのmeta(noindex等)の渡し方

[CakePHP1.3.11, 2.1.3]

CakePHPはコンテンツ部分をレイアウトに埋め込む、いわゆるレイアウトテンプレート型のビューなので、scripts_for_layout変数などを使って、コンテンツ部分からレイアウト部分にページ特有のcssやjsファイルなどを読み込ませることが出来るわけですが、このコンテンツ部分からレイアウトへの渡し方がバージョンによって異なるのでお気をつけ下さい、というエントリです。

1.2〜1.3の場合

※コンテンツ部分のビューファイルです。contacts/index.ctp等

[php]
<?php $html->meta(null, null, array(‘name’ => ‘robots’, ‘content’ => ‘noindex,follow’, ‘inline’ => false));?>
[/php]

2.x〜の場合

[php]
<?php $this->Html->meta(null, null, array(‘name’ => ‘robots’, ‘content’ => ‘noindex,nofollow’), false);?>
[/php]

もちろん、layoutファイルには、<head>タグ内に以下を入れるのをお忘れなく。

[php]
<?=$scripts_for_layout?>
[/php]

[CakePHP]Authで2種類のユーザー認証を設定する方法

[CakePHP1.3.11]

今回は、Webサービスによくよくあるパターンである、サイト管理者向けページと、ユーザーページ(いわゆるマイページというやつ)2つの専用ページを持つサイトにおける、Auth設定方法を書いておきます。対象は、CakePHP1.3ですが、2.xでもほぼ同様のコードで動作します。

なお、この記事では、サイト管理者ページ名を、admin、マイページをmemberとして進めていきます。認証方法は、admin:Basic認証、member:ログイン画面にてメールアドレスとパスワードの認証とします。

まず、config/core.phpの、prefix設定のところを、以下のようにします。

[php]
Configure::write(‘Routing.prefixes’, array(‘admin’, ‘member’));
[/php]

そして、app_controller.phpで以下のように設定します。

[php]
class AppController extends Controller {

var $components = array(‘Session’, ‘Auth’);

function beforeFilter() {

$this->Auth->allow(‘*’);

//Auth Settings
if (!empty($this->params[‘prefix’]) && in_array($this->params[‘prefix’], Configure::read(‘Routing.prefixes’))) {

$this->layout = $this->params[‘prefix’];

//for Administrator
if ($this->params[‘prefix’] == ‘admin’) {
$this->Security->loginOptions = array(‘type’ => ‘basic’, ‘realm’ => ‘Admin Area’);
$this->Security->loginUsers = array(‘admin’ => ‘Basic認証のパスワード’);
$this->Security->requireLogin();
}

//for Member
if ($this->params[‘prefix’] == ‘member’) {
$this->Auth->loginAction = ‘member/users/login’;
$this->Auth->loginRedirect = ‘member/users/index’;
$this->Auth->fields = array(‘username’ => ’email’, ‘password’ => ‘password’);
$this->Auth->autoRedirect = true;
$this->Auth->loginError = "IDかパスワードが正しくありません";
$this->Auth->authError = "Authentication Error";
}
}

}

}
[/php]

このように、AppController内の、beforeFilter内で現在のprefixesの値で分岐させて、Authの設定を切り替えます。上記が一番のポイントで、その他ログインなどは、CookBookに書いてある様にすれば大抵問題なく動きます。