self memo

タグ:PHP ( 2 ) タグの人気記事

CakePHPでのサービス開発

今日からCakePHP(1.2)を使って、新しいサービスを作り始めてみた。

今日やった事のメモ。

Net_UserAgent_MobileをcakePHP1.2RC2で使う
[cakePHP1.2]モバイルサイトとPCの切り分け その2
CakePHP 1.2で携帯用ビューを表示する
CakePHP 携帯専用サイトを作成する
上記の記事を参考にして、以下のコンポーネントを作成。
app/controllers/components/mobile.php

App::import('Vendor', 'pear_ini');
App::import('Vendor', 'Net/UserAgent/Mobile',
array('file' => 'Net' . DS . 'UserAgent' . DS . 'Mobile.php'));

class MobileComponent extends Object {
function startup(&$controller) {
$this->controller = $controller;
$mobile = &Net_UserAgent_Mobile::factory();
// 非モバイル
if ($mobile->isNonMobile()) {
// PCからモバイル用のURLにアクセスがあった場合は、PCのURLにリダイレクト
if(preg_match("/^m\//", $this->controller->params['url']['url'])){
$url = '/'.preg_replace("/^m\//", "", $this->controller->params['url']['url']);
$this->controller->redirect($url);
}
// モバイル
}else{
// モバイルからPC用のURLにアクセスがあった場合は、モバイルのURLにリダイレクト
if(!preg_match("/^m\//", $this->controller->params['url']['url'])){
$url = '/m/'.$this->controller->params['url']['url'];
$this->controller->redirect($url);
}
// Docomoでguid=ONが付いていなかったら付ける
if ($mobile->isDoCoMo()) {
if(!isset($this->controller->params['url']['guid']) or
$this->controller->params['url']['guid'] != 'ON'){
$url = '/'.$this->controller->params['url']['url'].'?guid=ON';
$this->controller->redirect($url);
}
// 全てのリンクに、guid=ONを付ける処理
output_add_rewrite_var('guid', 'ON');
}
// UID取得
$this->controller->uid = $mobile->getUID();
// SoftBankは下15桁を使う
if ($mobile->isSoftBank()) {
$this->controller->uid = substr($this->controller->uid, 1, 15);
}
}
}
}
?>

このコンポーネントを、app/app_controller.phpで読み込むようにした。
app/app_controller.php
class AppController extends Controller {
// 共通コンポーネント
var $components = array('Mobile');

// 共通ヘルパー
var $helpers = array('Html', 'Xml');

// UID
var $uid;

function beforeFilter() {
}
function beforeRender() {
if (isset($this->params['prefix']) or isset($this->uid)){
// モバイル用レイアウト設定
$this->layout = 'mobile';
// モバイル用ヘルパー設定
array_push($this->helpers, 'Mobile');
}else{
// PC用レイアウト設定
$this->layout = 'pc';
}
}
}
?>

prefixの設定は、以下の通り。
app/config/routes.php
    Router::connect('/m/', array('controller' => 'pages', 
'action' => 'index', 'prefix' => 'mobile'));
Router::connect('/m/:controller', array('prefix' => 'mobile'));
Router::connect('/m/:controller/:action', array('prefix' => 'mobile'));
Router::connect('/', array('controller' => 'pages', 'action' => 'index'));

※本来は下2行だけで良いはずなのだが、それだとモバイルのTOP(/m/)にアクセスすると、うまく動かなかったため、暫定的に上2行も記述。こちらは引き続き調査する。

後は、各コントローラーにPC用のアクション(index)とモバイル用のアクション(mobile_index)を実装し、各ビューも、PC用のビュー(index.ctp)とモバイル用のビュー(mobile_index.ctp)を作成。

ここまでで、PC、モバイルのアクション、ビューの切り分け、モバイルの場合はUID取得まで出来るようになった。

一番はまったのは、エラー(404とか)用ビューの切り分け。
上記prefixの設定で、PCでの404はapp/views/errors/error404.ctp、モバイルでの404はapp/views/errors/mobile_error404.ctpが呼び出される事を期待したが、うまくいかず…。
携帯サイトの404ページの作成方法
こちらを参考にしてみても、
$this->viewVars['code']
には何もセットされない…。
[php][CakePHP]viewVarsって使っていいの?
これとか見ると、そもそもviewVarsは参照しちゃダメっぽかったので、結局はエラー用のビューを以下のようにして、PCとモバイルを切り分けた。
app/views/errors/error404.ctp

if(isset($this->params['prefix'])){
echo $this->renderElement("mobile_header");
}else{
echo $this->renderElement("header");
}
?>
ページが見つかりません
if(isset($this->params['prefix'])){
echo $this->renderElement("mobile_footer");
}else{
echo $this->renderElement("footer");
}
?>


今までCakePHPはチュートリアル見てサンプル程度しか書いた事無かったけど、いざ使い始めてみるとかなり楽しい!

明日からも没頭して、今週中にサービスを立ち上げたいと思う。
[PR]
by aratafuji | 2008-12-09 02:38 | レポート

PHPで文字列に絵文字が含まれているかを判別する方法

PHPで、変数内の文字列に絵文字が含まれているか否かをシンプルに判別する方法が無いかなーと、PHP×携帯サイト デベロッパーズバイブルを読んでいたら、以下の記述が目に止まった。
○PHPで絵文字を使う
絵文字を扱うためには、そのすべてにおいてCP932を利用できる環境を用意する必要があります。PHPでこのCP932を利用するには、Shift_JISの代わりに「SJIS-win」を使うことで利用することができるようになります。
[P.140]


てことは、こんな感じで判別出来ちゃうのかなーと、試しに以下のコードを書いてみた。
// $sourceに絵文字が含まれているか否かを判別
// 文字エンコードはSJIS
if(mb_convert_encoding($source, 'SJIS-win', 'SJIS') == $source){
print "絵文字なし";
}else{
print "絵文字あり";
}

意図したとおりに動いてる…。

うーん、こんなんで良いのか?
何か大きな事を見落としているような気がしてならない。

誰かツッコミを入れてもらえると、とてもありがたいっす。
[PR]
by aratafuji | 2008-10-16 00:25 | つぶやき