CakePHP2.xとPHP5.4でStrict Errorが出た場合の対処法

PHPでは、error_reportingの設定により出力するメッセージを変更可能ですが、PHP5.4からE_ALLにE_STRICTが含まれるようになりました。
通常、E_ALLからE_STRICTを除いてエラーを出力したい場合、php.iniで

error_reporting = E_ALL & ~E_STRICT

とすることで制御可能になります。
エラーレベルについては、マニュアル参照
http://www.php.net/manual/ja/errorfunc.constants.php

但し、CakePHPでは、フレームワーク中でerror_reportingを定義している為、php.iniの設定が反映されません。

その設定が、
cakephp/lib/Cake/bootstrap.php

error_reporting(E_ALL & ~E_DEPRECATED);

で設定されています。

但し、これはフレームワーク本体のプログラムですので、ここを修正すべきではありません。

Cake 2.x では Error コンフィギュレーションが設定ファイルで定義出来るようになりましたので、これを利用します。
cakephp/app/Config/core.php

Configure::write('Error', array(
   'handler' => 'ErrorHandler::handleError',
   'level' => E_ALL & ~E_DEPRECATED,
   'trace' => true
 ));

のlevel部分に~E_STRICTを追加します。

Configure::write('Error', array(
   'handler' => 'ErrorHandler::handleError',
   'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
   'trace' => true
 ));

これで、E_Strictのエラーが表示されなくなります。

尚、error_reportingは、PHP5以降で下記の様に変わっています。

バージョン 説明
5.4.0 E_STRICT が E_ALL に含まれるようになりました。
5.3.0 E_DEPRECATED と E_USER_DEPRECATED が追加されました。
5.2.0 E_RECOVERABLE_ERROR が追加されました。
5.0.0 E_STRICT が追加されました (これは E_ALL には含まれません)。

エラー処理なんて、そんなに変わる所でもないと思うのですが。。。メジャーバージョンアップ毎に変わっていくのがPHPらしいですね。

MacにSass、Compass、CodeKitを導入する

codekit_logo

Sassは知っていたけれど、
いちいちコンパイルするほど大規模サイトやらないし、と思って使っていませんでしたが。
そんなついつい黒い画面を避けちゃうあなたに朗報、
CodeKitの存在を知って早速(っていうか今頃)導入してみました。

導入の流れをおさらいします。

0. そもそも何それ?

SassはCSSの入力を構造的にし、変数などを使ってより書きやすくしてくれるツールです。
Rubyで出来ていますが、Rubyを知らなくても使えます。
CompassはSassを拡張し、より便利にしてくれるツールです。

というわけでWebのフロントをやる人にはとてもステキなツールなのですが、
いかんせんコマンドラインベースなので

Sassのファイルを書く→保存する→コンパイルする→ブラウザで見る

という流れが

CSSを修正→Codaで即確認

という流れよりもどうしても助長に感じてしまう
小規模サイト開発者(私)のような人にはあんまり踏み込む意義を見いだせずにおりました。
書いたらすぐ確認したくなっちゃう人なんです、私。

が、CodeKitのお陰で、
コンパイルする、という作業が必要なくなったのです、わーいわーい!
その他、CodeKitの凄さについてはこちらの記事が秀逸です。

Web制作者の覚醒剤CodeKitでマンモスうれぴー(はぁと | WP-D

Sassだけじゃなくて、これはもう次世代のWEBフロントエンド開発に不可欠になりそうな感じ。
というわけで、

1. インストール

macにはrubyが入っているので、ターミナルなどで

sudo gem install sass

sudo gem install compass

をしてそれぞれをインストール。

CodeKitは公式サイトから入手してタブルクリックする(そしてApplicationフォルダに移す)。

簡単ですねー。

2. 動かしてみる

CodeKitをたちあげて、監視してもらいたいプロジェクトフォルダをドラック&ドロップ。
Sassを使うだけなら、これだけでOK。

Compassを使うには、使いたいプロジェクトのポップアップメニューからCompassを選んで
Use Compass for this projectを選択。

コマンドラインから何もしてなければ、No Configuration File っていうポップアップ画面が出るので、
Install Compass をクリック。すると、
Install Compass In Project という設定画面が出るので、
それぞれのフォルダ名や書き出し方法を設定して、Add Compass To Projectをクリックする。

(Compassの使い方がまだ良くわかっていなくて、ieやらprintやらscreenやらとCSSを分けて出力されちゃうのを何とかしたいところ)

そうすると、フォルダ直下にconfig.rbという設定ファイルが出来るのでそれを直接編集することもできます。

3. CSSを書きだしてみよう

Coda2はLessもSassも対応しているのですぐ書けます。
デフォルトではsassというフォルダにSass(拡張子は.scss)ファイルが入っているので、
それを開いて編集(書き方は以下参照)し、保存するとすぐにCSSファイルが生成されます。

Growlを入れていたら、コンパイルに成功したよ(もしくは失敗したよ)とお知らせまで出ます。

エラーログを吐いてくれるのが何ともステキです。惚れます。

Compassについては、

An introduction to Compass from Lorin Tackett on Vimeo.

これを参照に書き始めてみましょう。

日本語ですとココがわかり易かったです。

CSS書くならCompass使った方がいいよ。SASS使ってる人なら特に。 | howtohp

その前にSassの書き方っていう人はこちらなどを。

【Sassを覚えよう!Vol.4】Sassの基本的な記述方法 – CSS HappyLife

というわけで、私のCSSライフがかんなり快適になりました。
Macさいこー。って気分になりますね。

YouTubeをJavaScriptで制御する(iframe 埋め込み式)

自作のスライダーに入れ込んだYouTube動画がクリックされたときに自動スライドを止めたい、ということがあったのでメモ。
まあ、最初から仕様が決まっていれば動画対応のスライダーを使うところですが。

がっつりYoutubeプレイヤーをJavascriptで作りたいんじゃなくて、
ちょっと止めたいだけだったんだけれど、公式読んでもすぐに分からなくて困ったのでメモ。

//youtube player
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
  player = new YT.Player('player', {
    height: '表示したい高さ',
    width: '幅',
    videoId: '表示したい動画のID',
    playerVars: {
        rel: "0"
    },
    events: {
      'onStateChange': onPlayerStateChange
    }
  });
}
var slide_stop = false;
function onPlayerStateChange(event) {
  if (event.data == YT.PlayerState.PLAYING) {
    slide_stop = true;
  }
}

として、slide_stopをフラグにしてスライダーの動きを制御しました。

参照:
YouTube Player API Reference for iframe Embeds – YouTube — Google Developers
https://developers.google.com/youtube/iframe_api_reference?hl=ja

Google Japan Developer Relations Blog: iframe 埋め込み式 YouTube Player 向け JavaScript Player API のご紹介
http://googledevjp.blogspot.com/2011/01/iframe-youtube-player-javascript-player.html

WORDPRESSのDBをローカルに落とした時に変更する箇所

wordpressのDBを本番サーバーからコピーしてローカルに突っ込んでテストする、ということがありますが、
そのままだとローカルのwordpressではなく本番サーバーのwordpressにログインしてしまうので
2箇所ほどDBを弄る必要があります。

とっても簡単で、テーブル名「wp_options」の「home」と「siteurl」を本番のURLからローカルのURLへと書き換えるだけ。

なんだけれど、忘れやすいのでメモ。

phpMyadminにファイルが大きすぎてインポートできないよ、って言われた時には

毎回、旦那さんに聞いてしまうのでメモ。

ターミナルにて

$ mysql5 -u ユーザー名 -p データベース名 < インポートするファイル名

で、パスワード聞かれるから入力、ENTER。
しばらくしたら読み込まれてるのでphpMyadminとかで確認する。
インポートするファイルがあるフォルダまで移動して実行したら楽。

WORDPRESSの投稿サムネイルについて

WORDPRESSの2.9から追加された投稿サムネイルの機能を今頃しったのでメモ。

テーマのfunction.phpに

if ( function_exists( 'add_theme_support' ) ) { 
  add_theme_support( 'post-thumbnails' ); 
}

を追加すると投稿画面の右下側に「アイキャッチ画像」という項目が追加される。

表示させるfunctionは
基本はループの中で

the_post_thumbnail

を使う。

ループの外や、変数に読み込みたい時などは

get_the_post_thumbnail

URLだけ欲しい時は

$medium_image_url = wp_get_attachment_image_src( get_post_thumbnail_id(get_the_ID()), 'medium');
$main_image = $medium_image_url[0];

とかしてattachment関連の関数を使う。

参照ページ:

“WORDPRESSの投稿サムネイルについて” の続きを読む

連想配列をCakePHPからjQueryに渡して展開

配列 $arr をCakePHPからjQuery に渡すには
Controllerにて

$this->set('arr', $arr);

Viewにて(※ ViewはHTMLでlayoutしているとして)

$arr = json_encode($arr);
$this->addScript($html->scriptBlock('
var arr = '.$arr.';
$.each(arr,function(k,v){
  //お好きに
});

で良いらしい。json_encode()を思い出せなかったのでメモ。

あ、それか

Controllerにて

$this->set('arr', json_encode($arr));

でも。
“連想配列をCakePHPからjQueryに渡して展開” の続きを読む