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());