Home > PHP

PHP Archive

CakePHP 携帯用ビューを表示する

この記事の所要時間: 245

サイトにPC用と携帯用がある場合、PC用とは別に携帯用の表示を行う方法です。この方法なら同じコントローラ・アクションで、レイアウトとビューファイルを変更することができます。なお携帯版のURLは[/m/]で始まるようにします。

1.URLルーティングを設定する。

[app/config/routes.php]で[/m/]からURLが始まる場合にwebservicesとして扱うように設定します。

[app/config/routes.php]

<?php
(snip)
$Route->connect('/m/:controller/:action/*', array('webservices' => 'Mobile'));
?>

2.WEBSERVICESを有効にする。

webservicesがフレームワーク内でサポートされるように設定を変更します。

[app/config/core.php:123行目付近]

/**
 *  The define below is used to turn cake built webservices
 *  on or off. Default setting is off.
 */
define('WEBSERVICES', 'on'); // off から on にします。

3.携帯用コンポーネント、ヘルパーを設置する。

携帯用コンポーネント、ヘルパーを設置します。これは単に表示を変えるだけなら不要なのですが、1.でwebservicesとして動作するように設定しているので必須となります。(クラス内はとりあえず空で良いです)

[app/controller/components/mobile.php]

<?php
class MobileComponent extends Object
{
}
?>

[app/views/helpers/mobile.php]

<?php
class MobileHelper extends Object
{
}
?>

4.携帯用レイアウト、ビューファイルを設置する。

携帯用レイアウト、ビューファイルを[app/views/layouts/mobile][app/views/%controller_name%/mobile]に設置します。双方ともmobile/ディレクトリ以下に設置するのがミソです。

これで[/post/index]にアクセスすればPC版のレイアウト・ビューファイルが、[/m/post/index]にアクセスすれば携帯版のレイアウト・ビューファイルが表示されるようになります。

>>

なぜwebservicesとして扱うか?

CakePHPには一つのコントローラ、アクションでrssやxmlといった多種の出力形式をサポートする機能があります。これがWEBSERVICESです。前出のrssやxmlはフレームワークで定義されているのですが、携帯用と思われるものはありませんでした。そこでroutes.phpのルーティング情報に携帯用を定義する方法を取っています。

この方法の良いところは、レイアウト・ビューファイルの切り替えはフレームワーク側でやってくれるのでコントローラ側では何も意識する必要が無い点です。悪い点はURLが[/m/~]になってしまう点でしょうか。
URLが[/m/]ではじまるのが気になる場合は、mod_rewriteで携帯からのアクセスの場合は自動的に[/m/]へ飛ばす設定にしておく、という方法もありです。

CakePHP 管理者用アクション

この記事の所要時間: 424

CakePHPでは一つのコントローラの中に通常のアクションと管理者用アクションとを定義できます。例えばコントローラ名がpostの場合、URLは以下のようになります。

・通常
 http://www.example.com/post
・管理者用
 http://www.example.com/admin/post

この機能を使う手順は以下になります。

1.CAKE_ADMINを有効にする

app/config/core.phpのCAKE_ADMIN定義を有効にします。(デフォルトはコメントアウトされている)

/**
 * Uncomment the define below to use cake built in admin routes.
 * You can set this value to anything you want.
 * All methods related to the admin route should be prefixed with the
 * name you set CAKE_ADMIN to.
 * For example: admin_index, admin_edit
 */
define('CAKE_ADMIN', 'admin'); // 有効にする

この’admin’という値を見て、勘の良い人ならばお気づきだと思います。実はURLやアクション名のadminはこの値を参照しています。もしadminから他のワードに変更すればURL、管理者アクション名・ビューファイル名を変更できます。(ex. maintenanceなら、URLが/maintenance/posts、アクション・ビューファイル名がmaintenance_indexになります。)

2.管理者アクションをコントローラに記述する

管理者アクションをコントローラに記述します。アクション名は[admin_ + %アクション名%]になります。

[app/post_controller.php]

class PostController extends AppController {
  function index()
  {
    // 通常のアクション
  }

  function admin_index()
  {
    // 管理者用アクション
  }
}

3.管理者アクションビューを設置する

2.で記述した管理者アクションに関連づけられるビューファイルを設置します。ビューファイル名はアクションと同じく[admin_ + %アクション名%.thtml]となります。

[app/views/post/admin_index.thtml]

<h2>管理者用アクション</h2>

以上で管理者アクションが動作するようになります。

>>

管理者用画面はたいてい通常画面とは異なるレイアウトになるので、レイアウトも管理者用画面に変更します。

4.管理者用レイアウトを設置する

管理者用レイアウトファイルを作成し、app/views/layoutsにadmin.thtmlのファイル名で設置します。

5.管理者用レイアウトを呼び出す

レイアウトはcontrollerの$layoutで設定されているで、管理者用レイアウトを表示するにはこの値を変更します。管理者用アクション内で設定しても良いのですが、各コントローラのアクション毎に記述するのは非効率です。そこで親クラスのAppControllerに記述しておきます。以下のようにbeforeRender内に書いておけば、アクション内には特別な記述は不要です。(なおbeforeRenderは画面生成前に呼ばれます)

[app/app_controller.php]

class AppController extends Controller {
  function beforeRender() {
    if(defined('CAKE_ADMIN') && !empty($this->params['admin'])){
      $this->layout = 'admin';
    }
  }
}

これで通常のアクセスではdefault.thtmlが、管理者用アクセスではadmin.thtmlがレイアウトになります。

管理者サイトを/admin/以下にまとめておけば、あとはhttpd(Apache等)側でBasic認証をかけるなり、IPアドレスでのアクセス制御など対応が取りやすくなるので便利ですね。(これは中々面白い機能だと思います。)

※追記(2006/09/06)
Apache側でのBasic認証やIP制限をかける際はLocationMatchディレクティブでadminがURLのどの位置に来てもマッチするようにしておくか、修正パッチを適用する必要があります。詳しくはCakePHP URLマッピング修正パッチをご覧下さい。

CakePHPでZendFrameworkを使う

この記事の所要時間: 128

CakePHPにはメールを送信するコンポーネントがありません。そこでZendFramework(以下、ZF)のZend_Mailを組み合わせてみました。

1.ZendFremeworkを設置

ZFをダウンロード・解凍し、library/以下を[app/vendors]に設置します。設置すると以下のような構成になります。

[app]
  + [vendors]
        + [Zend]
        + Zend.php

2.ZendFremework読み込み準備

ZFではクラスファイルを読み込む際にinclude_pathが通っている事を前提としています。このまま使用するとクラスファイルが読み込めずにエラーが発生するので、include_pathを設定するスクリプトを設置しておきます。

[app/vendors/zend_init.php]

<?php
ini_set('include_path', ini_get('include_path')
                                . PATH_SEPARATOR . dirname(__FILE__));
?>

3.controllerで使用する

まず2.で設置したスクリプトをvendor(zend_init)で読み込みます。あとは使用する各ファイルをvendor()で読めばOKです。

[app/controller/mail_controller.php]

<?php
vendor('zend_init'); // ZFを読む前に実行
vendor('Zend/Mail/Transport/Smtp');
vendor('Zend/Mail');

class MailController extends Controller {
  var $name = 'Mail';

  function send() {
    $encodeTo = 'ISO-2022-JP';
    $encodeFrom = 'UTF-8';

    mb_language('ja');
    $subject = 'テストメール';
    $subject = mb_convert_encoding($subject, $encodeTo, $encodeFrom);
    $subject = mb_encode_mimeheader($subject);
    $body = 'こんにちは。テストメールです。';
    $body = mb_convert_encoding($body, $encodeTo, $encodeFrom);

    $mail = new Zend_Mail($encodeTo);
    $mail->addHeader('Mime-Version', '1.0');
    $mail->setFrom('hoge@example.com', 'Admin');
    $mail->addTo('foo@example.com');
    $mail->setSubject($subject);
    $mail->setBodyText($body);

    // SMTP
    $mail->send(new Zend_Mail_Transport_Smtp('mail.example.com'));
  }
}
?>

>>

すべてがフレームワークでまかなえればそれに越したことはないのですが、足りない部分は他のライブラリなりを使って解決していけば良いと思います。CakePHPはそれを見越したような作りになっているのでわりときれいに取り込めますね。

# ちなみにZFを使うにはPHP5が必要です。ただPHP4でもPEARを使えば同じような事ができます。

CakePHP ViewHelperの使い方

この記事の所要時間: 256

ViewHelperはHTML表示や数値表現、日付判定などviewで役立つコンポーネントです。controllerで使用するHelperを指定しておくとフレームワークにてインスタンス化され、view内で使用できるようになります。ViewHelperには以下のようなものがあります。

    [cake/libs/view/helpers]

  • AjaxHelper [ajax.php]
  • CacheHelper [cache.php]
  • FormHelper [form.php]
  • HtmlHelper [html.php]
  • JavascriptHelper [javascript.php]
  • NumberHelper [number.php]
  • SessionHelper [session.php]
  • NumberHelper [number.php]
  • TextHelper [text.php]
  • TimeHelper [time.php]

デフォルトではHtmlHelperが有効になっています。

ViewHelperを指定する

controllerの$helpersに使用するHelper名を配列で渡します。Helper名はクラス名をそのまま指定するのではなく、HogeHelperのHogeの部分を小文字にして指定します。(HogeHelperならhoge)ちなみにこの指定方法はHelper以外でもCompenent、Modelなどでも使うで覚えておくとおいしいケーキが焼けます。:)

[app/controller/sample_controller.php]

< ?php
class SampleController extends Controller {
  // HtmlHelper,TimeHelper 
  var $helpers = array('html', 'time');
}
?>

ViewHelperを使用する

viewでは$hogeでHogeHelperインスタンスが使用できます。(HtmlHelperなら$html、TimeHelperなら$time)

[app/view/sample/index.thtml]

<!-- 日付判定:更新時間が1週間以内ならNew!!を表示 -->
<?php if (!$time->wasWithinLast("1 weeks", $sample['modified'])) { ?>
<strong>New!!</strong>
<?php } ?>

<!-- フォームタグ -->
<?php echo $html->formTag() ?>
<p>< ?php echo $html->submit('投 稿') ?></p>

>>

ViewHelperは自作する事もできます。

ViewHelperを作成する

自作ViewHelperは以下を満たすように作成します。

  • クラス名を[%Helper名% + Helper]にする
  • Helperクラスを継承する
  • ファイル名を[%helper名% + .php]にし、[app/views/helpers]に配置する。
    %helper名%はクラス名の%Helper名%を小文字に変換し、単語の区切りを[_]でつなげます。(FooBarHelperならfoo_bar)

[app/views/helpers/hello.php]

<?php
class HelloHelper extends Helper {
  function hello($name) {
    return $this->output(sprintf("Hello, %s", $name));
  }
}
?>

あとはcontrollerの$helpersに’hello’を加えれば、viewで$hello->hello()が使用できます。

>>

■参考サイト
http://manual.cakephp.org/chapter/helpers

PHP 5 Power Programming

  • 2006-08-29 (火)
  • PHP
この記事の所要時間: 045

PHP 5 Power Programming (Bruce Perens Open Source)

PHP 5 Power Programming」という書籍のPDF版が100万ダウンロードを突破したそうです。この本の出版社では他にも数冊がPDFで配布されています。(Bruce Perens’ Open Source Series

私は気に入った本ならPDF版が配布されていても書籍として購入したいタイプなのですが、やはり検索や持ち運びを考えるとPDF版もあると便利です。PDF版は無料で配布せずとも、書籍に添付したり、書籍購入者のみダウンロードできるといった仕組みを作るなりすれば良いと思うのですがいかがでしょうか。

ちなみに記事によるとPHP使用者は450万人(!)もいるそうです。

via Andi Gutmans’ Weblog: PHP 5 Power Programming passes 1 Million downloads!

まるごとPerl vol.1

この記事の所要時間: 123

まるごとPerlが出てますね。普段はPHPを主に扱っていて、Perlは以前少し触った程度なのですが、ノウハウは転用できるものが多いのでたまに参考にしています。はてなブックマーク、livedoor Readerの内部が紹介されているようなので購入してみました。

ざっと読んでみた感想は、はてなのnaoyaさんが書かれておられるように「濃い」です。確実にPerlをこれから始めようという人は眼中にありません(笑)。逆に他言語でWeb開発をしている人にはPerlを知らなくても大いに参考になります。特にこれからWeb2.0系サービスを構築したい人には必読の書と言っても良いかもしれません。

まるごとPHPもそれなりに濃かったですが、ここまでの濃さではなかったですね。本の作り方(ターゲット?)が異なるので違うのは当然なのですが、やはり事例にもとずいた情報がもっと欲しいかな、と思います。国内でPHPを使った中規模以上のシステムの構築事例をあまり見ないので、フレームワークなどの記事もやや説得力に欠ける印象があります。(Web2.0系だとGREE(Ethna)くらいでしょうか。)PHPでもフレームワークが盛り上がっていますので、これからもっとPHPを使った事例が見られるようになると嬉しいですね。

次はまるごとRubyでしょうか。。。

まるごとPerl! Vol.1
まるごとPerl! Vol.1

posted with amazlet on 06.08.28
小飼 弾 宮川 達彦 伊藤 直也 川合 孝典 水野 貴明
インプレスコミュニケーションズ (2006/08/24)

lighttpd+PHPでファイルダウンロード

  • 2006-08-26 (土)
  • PHP
この記事の所要時間: 318

ThinkPHPでlighttpd+PHPを使ったファイルダウンロードが紹介されていました。PHP側で特定のヘッダを付けておけば、lighttpdがファイルを出力してくれる、という内容です。

ファイルが大きい、サーバ( or クライアント)の帯域が細い等でダウンロードに時間がかかるとその間FastCGI-PHPが占有されることになります。この方法であればPHPはヘッダだけを出力すればスクリプト実行を終了できるので、ダウンロード完了を待たずに他のリクエストを処理できます。PHPは必要な箇所だけ処理して、あとはlighttpdに任せるというわけですね。
# 餅は餅屋の発想ですな。

方法は以下になります。

  1. lighttpdの設定ファイルにallow-x-send-fileを記述
  2. PHPでX-LIGHTTPD-send-fileヘッダを出力

1.lighttpdの設定ファイルにallow-x-send-fileを記述

fastcgi.server = ( ".php" =>
                        ( "localhost" =>
                          ( "socket" => "/tmp/php-fastcgi.socket",
                            "bin-path" => "/home/shin/php5/bin/php-fcgi",
                            "broken-scriptfilename" => "enable",
                            "allow-x-send-file" => "enable"
                          )
                        )
                      )

2.PHPでX-LIGHTTPD-send-fileヘッダを出力

PHPではX-LIGHTTPD-send-fileヘッダ(lighttpd1.5まではX-Sendfileヘッダ)で出力するファイルパスを出力します。この時にContent-LengthやContent-Dispositionヘッダなど他のヘッダを出力しても問題無いです。

<?php
$path = "/path/to/file";
header("X-LIGHTTPD-send-file: " . $path);
header("Content-Disposition: attachment; filename=\"" . basename($path) . '"' );
header("Content-Length: " . filesize($path));
?>

ちなみに上記方法とPHPでファイルを出力させる方法を試してみたところ明らかに前者の方がPHPの負荷が小さかったです。(前者はヘッダを出力するだけなので当たり前ですが)

ただlighttpdはディスク上のファイルを出力するだけなので、ダウンロードデータをPHPで動的に生成する場合はデータを一度ディスクに書き込む必要がありますね。

これはPHPじゃなくてもfastcgi経由で起動するものならPerlでもRubyでもPtyhonでもいけるでしょう。

>>

■参考サイト
ThinkPHP
X-Sendfile fro lighty’s life
HowToFightDeepLinking – lighttpd – Trac

>>

テスト用にlighttpdをインストールした時につまった箇所をメモ。(CentOS4.2)

  • pcre-develをインストールしておく
  • fastcgi+PHPを使う時は–enable-fastcgiでfastcgi対応のphpをインストールしておく。(php -v で(cgi-fcgi)が出ればOK)
  • /usr/local/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.confで動作確認

PHP5.1.6リリース

  • 2006-08-25 (金)
  • PHP
この記事の所要時間: 018

先日リリースされたPHP5.1.5に一部適用されていなかった修正分(64bitシステムでのmemory_limit修正)があったようで、そちらを含んだものがリリースされています。

http://www.php.net/

# まあありがちなミスかと。

PHPは最近なんだか慌ただしいですね。

Simple PHP BlogをWordPressにインポート

  • 2006-08-25 (金)
  • PHP
この記事の所要時間: 040

Simple PHP BlogをWordPressにインポートする方法です。

と言っても前エントリの方法で、Simple PHP BlogのデータをMT形式に変換し、それをWordPressの管理画面でインポートするだけです。

「インポート」で「Movable Type」を選択します。

MT形式に変換したSimple PHP Blogデータをアップロードします。

登録するユーザを選択します。新たにユーザを追加したくなければコンボボックスで登録済みのユーザ選択すれば良いです。(↓ならadminユーザで登録しようとしています。)

カテゴリ・記事・コメントがインポートされます。

これでインポートは完了です。

Simple PHP BlogをMT形式に変換

  • 2006-08-23 (水)
  • PHP
この記事の所要時間: 133

Simple PHP BlogのデータをMT(MovableType)形式へ変換するスクリプトを作ってみました。このスクリプトで変換できるのは以下のデータです。

  • カテゴリ
  • 記事
  • コメント

このスクリプトには2通りの実行方法があります。

Webで実行

sphpblog2mt.phpをSimplePHPBlogを設置しているディレクトリ(たいていsphpblog/)にアップロードします。

次にブラウザからアップロードしたsphpblog2mt.phpにアクセスすればMT形式のデータファイルがダウンロードできます。(SimplePHPBlogがhttp://example.com/sphpblog/ならhttp://example.com/sphpblog/sphpblog2mt.phpにアクセスします。)

コマンドラインで実行

sphpblog2mt.phpを SimplePHPBlogを設置しているサーバにアップロードします。(逆にサーバからSimplePHPBlogをダウンロードしてローカルで実行しても構いません。)

次に以下のようにsphpblog2mt.phpを実行するとmt.txtというファイル名でMT形式のデータファイルが生成されます。

$ php -f sphpblog2mt.php %SimplePHPBlogを設置しているディレクトリ%

>>

あとはこのファイルをMTなり、MT形式ファイルを取り込めるblogなりにインポートすればデータの移行ができます。(MT形式はわりとあちこちで採用されているようなのであとはどうにでもなるかと。)

>>

参考サイト
Movable Type 3.2 マニュアル – Movable Typeの読み込みフォーマット

ホーム > PHP

検索
フィード
メタ情報

Return to page top