Home > アーカイブ > 2006-09

2006-09

php.iniの書き方

  • 2006-09-06 (水)
  • PHP
この記事の所要時間: 350

PHPの設定は記述する箇所に応じて書き方が異なります。わりと忘れがちなのでまとめてみました。

php.iniでの記述

; 引用符をつけないセミコロン(;)の後のテキストは、すべて無視されます
; セクションマーカ (角括弧の中のテキスト) は無視されます
; 論理値は、次のいずれかで指定します
; true, on, yes
; または false, off, no, none
register_globals = off
magic_quotes_gpc = yes

; 文字列を二重引用符で括ることも可能です
include_path = “.:/usr/local/lib/php”

; バックスラッシュは他の文字と同様に処理されます
include_path = “.;c:\php\lib”

from: PHPマニュアル-実行時設定

論理値のtrue(false),on(off),yes(no)は大文字・小文字を区別していないようなので、TrueやYesでも認識されます。

httpd.conf / .htaccessでの記述

php_value name value

指定した設定オプションに値を設定します。変更の可否が、 PHP_INI_ALL もしくは PHP_INI_PERDIR である設定オプションに対し利用できます。 セット済みの値をクリアしたい場合は、none を 値として使用してください。

注意: 論理値を設定する場合には php_value を使用しないでください。代わりに、php_flag (下記参照)を使用する必要があります。

php_flag name on|off

設定オプションに論理値を設定するために使用します。変更の可否が、 PHP_INI_ALL もしくは PHP_INI_PERDIR である設定オプションで利用できます。

php_admin_value name value

指定した設定オプションに値を設定します。このディレクティブは、.htaccess ファイルでは利用できません。また、 php_admin_value で設定された設定オプションの値は、.htaccess や VirtualHost ディレクティブ内から上書きできません。 セット済みの値をクリアしたい場合は、none を 値として使用してください。

php_admin_flag name on|off

設定オプションに論理値を設定するために使用します。 このディレクティブは、.htaccess ファイルでは利用できません。 php_admin_value で設定された設定オプションの値は、.htaccess や VirtualHost ディレクティブ内から上書きできません。

from: PHPマニュアル-設定を変更するには

httpd.conf / .htaccess内ではPHPの定数(error_reportingのE_ALL等)は使用できません。

設定変更可能な箇所

各設定項目は記述できる箇所が決まっています。項目ごとの詳細はPHPマニュアルに記載されているのですが、記述できる箇所(PHPマニュアルでは「変更の可否」)がPHP定数で書かれおり、いざ使う時に定数の意味を忘れてしまいがちです。(PHP_INI_SYSTEM / PHP_INI_PERDIRは良く「?」になります。。。)そこでPHP定数の定義をメモしておきます。

PHP_INI_USER	ユーザスクリプトまたはWindowsレジストリ  で設定可能なエントリ
PHP_INI_PERDIR	php.ini, .htaccess または httpd.confで設定可能なエントリ
PHP_INI_SYSTEM	php.ini または httpd.confで設定可能なエントリ
PHP_INI_ALL	どこでも設定可能なエントリ

from: PHPマニュアル-php.ini ディレクティブ

>>

あらためて見るとhttpd.confあたりは適当に書いていたなーという印象です。論理型の設定でもphp_valueを使っていましたし(値を[0 or 1]にすれば動作します)、php_admin~は使っていませんでした。(専用サーバでの運用がほとんどなので第三者に設定を上書きされる心配が無かったので。。。)ただ設定の意味合いをはっきりさせるためにもきっちり書いておいた方が良いですね。

CakePHPでDBアクセスなしのModelを作る

この記事の所要時間: 139

CakePHPのmodelはDBのテーブルと1対1になる事が想定されています。ただシステムを構築する際はこのような単純なmodelだけでは使い勝手が悪い場合があります。そこでDBアクセス無しのmodelの作成方法を模索してみました。

フレームワークのソースを見たところmodelの$useTableにfalseをいれておけば良いようです。

[app/models/no_db.php]

<?php
class NoDb extends AppModel
{
  $useTable = false;
}
?>

では、modelなしのcontrollerはというと・・・フレームワークを見る限りでは方法は無さそうですね。ただcontrollerの$nameでmodel名を指定する事ができるので、これにダミーのmodelを指定すれば、modelを新たに作らずにcontroller・ビューファイルを追加する事が可能です。

[app/controllers/no_my_model_controller.php]

<?php
class NoMyModelController extends AppController
{
  var $name = 'NoDb';

  function index() {
    $this->viewPath = 'no_my_model'; // ビューファイルディレクトリを指定
  }
}
?>

index()内のviewPathの設定を行わないと$nameの値でビューファイルディレクトリ名が決定されてしまうので注意が必要です。(ビューファイルもmodel同様に共通で良ければこの行は必要ありません。)

修正:2006/09/15
modelなしのcontrollerも作れますね。controllerの$usesをarray()かnullにすれば良いようです。

class MyController extends AppController
{
    // var $uses = null; works too
    var $uses = array();

    function index()
    {
    }
}

from: cakebaker » A controller without a model

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マッピング修正パッチをご覧下さい。

Home > アーカイブ > 2006-09

検索
フィード
メタ情報

Return to page top