2008年1月27日日曜日

PHPTAL 1.1.10 リリース

PHPTAL 1.1.10 released

* SPLインターフェイスの ArrayAccess と Countable のサポート
* added support for Countable and ArrayAccess SPL interfaces
tal:repeatでのイテレーターサポート強化、TAL_PATH式でのイテレーターのサポート(配列と同じように利用可能になったっぽい)

* スーパーグローバル変数のサポート
* added support for superglobals in php: TALES expressions,
php:_SERVER['PHP_SELF']のような記述法でテンプレート内でスーパーグローバル変数を利用できる。

* 標準のテンポラリファイルのディレクトリの取得に sys_get_temp_dir() を使うように変更。標準以外で使うためには、今まで通りPHPTAL.phpを読み込む前に定数に設定。
* changed default temp directory to use sys_get_temp_dir() . If this causes trouble, you can override it using define('PHPTAL_PHP_CODE_DESTINATION','/tmp/');

* PHPコードでのエラーが原因となるテンプレートの無効化を防ぐためにコード作成時とマクロ実行時のセーフティチェックを追加。
* added additional safety-checks to code generation and macro execution to prevent invalid templates from triggering PHP errors,

* XMLパーサーのバグ修正
* fixed small bugs in XML parser,

* 一部のエラーメッセージの内容の正確性の向上とエラーファイル・エラー行の報告の追加
* fixed few error messages to be more precise and report proper file/line,

* すべての例外を例外をPHP標準の例外からPHPTAL専用の例外処理に変更
* changed all exceptions thrown by PHPTAL to inherit PHPTAL_Exception.

2008年1月20日日曜日

PHPTALに属性追加

PHPTALのトリガーを使う際に、HTMLの属性もパラメータとして使いたいなぁと思い
phptal:attributeという属性を作ってみた。
実はそんなことしなくても取得できたりして・・・と悩みつつ。

使い方
以下のように属性として phptal:attribute="" を追加するとトリガー(テンプレート内でも)
のローカル変数($attr)の中に連想配列としてhtml属性を設定できる。

<input type="text" name="testName" value="testValue" class="testClass"
phptal:attribute="" phptal:id="TestTrigger" />




<?php
require_once 'PHPTAL/Trigger.php';

class TestTrigger implements PHPTAL_Trigger
{
public function start($phptalid, $tpl)
{
var_dump( $tpl->getContext()->attr);
}

/**
* Invoked after tag execution
* @var PHPTAL $tpl
*/
public function end($phptalid, $tpl)
{
}
}


出力

array
'type' => string 'text' (length=4)
'name' => string 'testName' (length=8)
'value' => string 'testValue' (length=9)
'class' => string 'testClass' (length=9)



コード
PHPTAL/Php/Attribute/PHPTAL/Attribute.php に保存



<?php
require_once 'PHPTAL/Php/Attribute.php';

class PHPTAL_Php_Attribute_PHPTAL_ATTRIBUTE extends PHPTAL_Php_Attribute
{

var $_pushContext = false;

public function start()
{
if(!array_key_exists('tal:define',$this->tag->talAttributes)){
$this->_pushContext = true;
}
$defineVar = 'attr';
$this->tag->generator->doSetVar('$ctx->'.$defineVar, 'array()');

foreach($this->tag->attributes as $key => $item){
if(!$key) continue;
$this->_defineVar = $defineVar.'[\''.$key.'\']';

if ($this->_pushContext && !$this->_pushedContext){
$this->tag->generator->pushContext();
$this->_pushedContext = true;
}
$this->doDefineVarWith("'$item'");
}
}


public function end()
{
if ($this->_pushedContext){
$this->tag->generator->popContext();
}
}

private function doDefineVarWith($code)
{
$this->tag->generator->doSetVar('$ctx->'.$this->_defineVar, $code);
}
}



PHPTAL上で使えるように以下のファイルを編集
PHPTAL/Namespace/PHPTAL.php



<?php

require_once 'PHPTAL/Dom/Defs.php';
require_once 'PHPTAL/Namespace.php';

require_once 'PHPTAL/Php/Attribute/PHPTAL/Tales.php';
require_once 'PHPTAL/Php/Attribute/PHPTAL/Debug.php';
require_once 'PHPTAL/Php/Attribute/PHPTAL/Id.php';
require_once 'PHPTAL/Php/Attribute/PHPTAL/Cache.php';
require_once 'PHPTAL/Php/Attribute/PHPTAL/Attribute.php'; <--追加

/**
* @package phptal.namespace
*/
class PHPTAL_Namespace_PHPTAL extends PHPTAL_BuiltinNamespace
{
public function __construct()
{
parent::__construct('phptal', 'http://xml.zope.org/namespaces/phptal');
$this->addAttribute(new PHPTAL_NamespaceAttributeSurround('tales', -1));
$this->addAttribute(new PHPTAL_NamespaceAttributeSurround('debug', -2));
$this->addAttribute(new PHPTAL_NamespaceAttributeSurround
'attribute', 6));<--追加

$this->addAttribute(new PHPTAL_NamespaceAttributeSurround('id', 7));
$this->addAttribute(new PHPTAL_NamespaceAttributeSurround('cache', -3));
}
}

PHPTAL_Dom_Defs::getInstance()->registerNamespace(new PHPTAL_Namespace_PHPTAL());


2008年1月16日水曜日

Wiki作成

ある程度整理できた!
blogで書くのが難しいことに気づいたのでWikiにしてみた。

http://www.reirou.jp/php/dokuwiki/doku.php?id=start

切り分けは難しいけど、どうにかなるかなー