hack のためのネタ帳, etc,,,

Zend 謹製の PHP 用フレームワーク

ライセンス

0.1.4 からは New BSD License.
0.1.3 までは Zend Framework License.
FAQ の License も参照。

Tips 1.6 系

mod_rewrite を使わない場合

/~user/somewhere/module/controller/action というリンクが出来ないので
/~user/somewhere/index.php/module/controller/action というリンクにする必要がある。
dispatch 前に BaseUrl に $_SERVER["SCRIPT_NAME"] を食わせておくと良い。
$frontController = Zend_Controller_Front::getInstance();
$frontController->setRouter(new Zend_Controller_Router_Rewrite())->setBaseUrl($_SERVER["SCRIPT_NAME"]);
unset($frontController);

Zend_Controller_Action

$this->_helper->url() は Zend_Controller_Action_Helper_Url::direct()
$this->_helper->url->url() は Zend_Controller_Action_Helper_Url::url()
前者を使うと document root へ飛ばされてしまう。
/~user/somewhere/ 以下への配置も考えれば後者を使うべき。
引数が異なるので注意。
# 1.7 系では修正されたようなので $this->_helper->url() で OK

Dojo の locale

view script で
$this->dojo()->setDjConfigOption("locale", call_user_func(array(new Zend_Locale(), "toString")));
のようにしとくと、ブラウザに合わせてくれるので吉。
日本語に固定したいなら "ja-jp" を決め打ちしておく。
$this->dojo()->setDjConfigOption("locale", "ja-jp");

Dojo でマルチロケール

例えばカレンダーなら
dojo.requireLocalization("dojo.cldr", "gregorian", "en-us");
のようにすれば en-us のリソースが追加で読み込まれる。
function でくくって Dojo view helper の addOnLoad() 辺りに食わせとくのも手。
$this->dojo()->addOnLoad('function(){dojo.requireLocalization("dojo.cldr", "gregorian", "en-us");}');

UNICODE

BOM 付きは要注意。
内部コーディングが UNICODE じゃないのに、BOM 付き UNICODE でソース書いてたりすると、レスポンスヘッダいじくろうとした時に意味不明に headers already sent とか、まるで何かの呪いかと orz

Tips 1.11系

ContextSwitch

公式マニュアルの「独自のコンテキスト作成」には余り詳しく書いてないので、
ZendFramework/library/Zend/Controller/Action/Helper/ContextSwitch.php#__construct()
を参照し json と xml を addContext() してる部分を参考にすると良い。

簡単にやるには Zend_Controller_Action のサブクラスで init() する時に addContext() しておけば良いのだが、Zend_View_Helper_Action などで、view の中に別の action を埋め込んだりする事がある場合、登録済みのコンテキストを再度 addContext() してしまうので例外が発生してしまい具合が悪い。

例えば CSV コンテキストの追加を BootStrap.php でやらせるには次のようにすれば良い。
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
  protected function _initCsvContext() {
    Zend_Controller_Action_HelperBroker::getStaticHelper('ContextSwitch')
      ->addContext("csv", array(
                                "suffix" => "csv",
                                "headers" => array("Content-Type" => "text/csv"),
                                ));
  }
}
コンテキストスイッチを有効にするには Zend_Controller_Action のサブクラスの初期化時に以下のようにする。
class FooController extends Zend_Controller_Action {
  public $contexts = array(
                           "bar" => array("csv"),
                           );
  
  public function init() {
    $this->_helper->contextSwitch()->initContext();
  }
  public function barAction() {
    $this->view->hoge = array(/* view にデータを渡す */);
  }
}  
あとは format パラメータにコンテキスト名(今の場合 csv)を与えて action をコールすればビューとして application/views/scripts/foo/bar.csv.phtml が呼ばれるので適当にレンダリングすれば良い。

参考:

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます