Lastest changes in phpQuery allows us to extend it much more easily. One of the ways to do this is directly same as in jQuery, using phpQuery::extend() method. When you combine this with upcoming closures in PHP 5.3, you will feel like-almost-in-browser. Take a look at this:
$source = dirname(__FILE__).'/table.html';
$rows = array(
array(
'field-1' => 'foo1',
'field-2' => 'foo2',
),
array(
'field-1' => 'bar1',
'field-2' => 'bar2',
),
);
// this will work in PHP 5.3
// this code will evaluate on onLoad event, thus is cache firendly
$onload = function() {
$tableFirstRowClass = function($self, $var, $classname = 'first') {
return $self->addClassPHP("
if ($$var == 0)
print '$classname';
");
};
// here we pass new closure into extend method, just like in jQuery
// compact() creates array for us
phpQuery::extend('phpQueryObject', compact('tableFirstRowClass'));
};
require template('table')->parse($source)
// just bind it
->bind('onload', $onload)
// just fire it up ;)
->trigger('onload')
->find('table > tr, table > * > tr')
->loopOne('rows', 'i', 'row')
->varsToSelector('row', $rows[0])
// now you can use this just-like-this
->tableFirstRowClass('i')
;
But for now to extend phpQuery on-the-fly we have to use create_function or delegate existing one.
We can also use new Scripts plugin feature, which does almost the same. Just like all Scripts’ plugin script files, newly attached function will have all available variables. Example below works in PHP < 5.3:
function onload() {
// in PHP 5.3, this can be done simply like this
// phpQuery::script(...
// but for now we have to use fake phpQuery::$plugins namespace
phpQuery::$plugins->script('tableFirstRowClass', create_function(
'$self, $params, &$return, $config', '
$className = ! $params[1] ? "first" : $params[1];
$self->addClassPHP("
if ($$params[0] == 0) print '$className';
");
'));
};
$onload = 'onload';
One major difference between extending Scripts and phpQuery itself is way of using new functions. With our new script, we have to small change to main code.
// using phpQuery::extend()
//->tableFirstRowClass('i')
// using Scripts extend
->script('tableFirstRowClass', 'i')