Skip to content

Commit

Permalink
Add predefined accessors Fenom::ACCESSOR_PROPERY and Fenom::ACCESSOR_…
Browse files Browse the repository at this point in the history
…METHOD
  • Loading branch information
bzick committed Aug 12, 2015
1 parent bf44511 commit 4fe339b
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 9 deletions.
4 changes: 2 additions & 2 deletions sandbox/fenom.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@

$fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled');
$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_COMPILE);
$fenom->addAccessorSmart('g', 'App::$q->get', Fenom::ACCESSOR_CALL);
var_dump($fenom->compileCode('{$.g("env")}')->getBody());
$fenom->addAccessorSmart('fetch', 'fetch', Fenom::ACCESSOR_METHOD);
var_dump($fenom->compileCode('{$.fetch("template.tpl")}')->getBody());
//var_dump($fenom->compile("bug158/main.tpl", [])->getTemplateCode());
//var_dump($fenom->display("bug158/main.tpl", []));
// $fenom->getTemplate("problem.tpl");
10 changes: 6 additions & 4 deletions src/Fenom.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,11 @@ class Fenom

const MAX_MACRO_RECURSIVE = 32;

const ACCESSOR_CUSTOM = null;
const ACCESSOR_VAR = 'Fenom\Accessor::parserVar';
const ACCESSOR_CALL = 'Fenom\Accessor::parserCall';
const ACCESSOR_CUSTOM = null;
const ACCESSOR_VAR = 'Fenom\Accessor::parserVar';
const ACCESSOR_CALL = 'Fenom\Accessor::parserCall';
const ACCESSOR_PROPERTY = 'Fenom\Accessor::parserProperty';
const ACCESSOR_METHOD = 'Fenom\Accessor::parserMethod';

public static $charset = "UTF-8";

Expand Down Expand Up @@ -815,7 +817,7 @@ public function addAccessor($name, $parser)
/**
* Add global accessor ($.)
* @param string $name
* @param callable|string $accessor
* @param mixed $accessor
* @param string $parser
* @return Fenom
*/
Expand Down
46 changes: 43 additions & 3 deletions src/Fenom/Accessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,53 @@ class Accessor {
'env' => '$_ENV'
);

public static function parserVar($var, Tokenizer $tokens, Template $tpl, &$is_var) {
/**
* @param string $var variable expression on PHP ('App::get("storage")->user')
* @param Tokenizer $tokens
* @param Template $tpl
* @param $is_var
* @return string
*/
public static function parserVar($var, Tokenizer $tokens, Template $tpl, &$is_var)
{
$is_var = true;
return $tpl->parseVariable($tokens, $var);
}


public static function parserCall($call, Tokenizer $tokens, Template $tpl) {
/**
* @param string $call method name expression on PHP ('App::get("storage")->getUser')
* @param Tokenizer $tokens
* @param Template $tpl
* @return string
*/
public static function parserCall($call, Tokenizer $tokens, Template $tpl)
{
return $call.$tpl->parseArgs($tokens);
}

/**
* @param string $prop fenom's property name
* @param Tokenizer $tokens
* @param Template $tpl
* @param $is_var
* @return string
*/
public static function parserProperty($prop, Tokenizer $tokens, Template $tpl, &$is_var)
{
return self::parserVar('$tpl->getStorage()->'.$prop, $tokens, $tpl, $is_var);
}

/**
* @param string $method fenom's method name
* @param Tokenizer $tokens
* @param Template $tpl
* @return string
*/
public static function parserMethod($method, Tokenizer $tokens, Template $tpl)
{
return self::parserCall('$tpl->getStorage()->'.$method, $tokens, $tpl);
}

/**
* Accessor for global variables
* @param Tokenizer $tokens
Expand Down Expand Up @@ -70,6 +107,9 @@ public static function tpl(Tokenizer $tokens)
}
}

/**
* @return string
*/
public static function version()
{
return 'Fenom::VERSION';
Expand Down
29 changes: 29 additions & 0 deletions tests/cases/Fenom/AccessorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,33 @@ public static function providerFetchInvalid()
public function testFetchInvalidTpl($tpl, $exception, $message) {
$this->execError($tpl, $exception, $message);
}

public function getThree() {
return 3;
}

public static function providerSmartAccessor() {
return array(
['acc', '$tpl->getStorage()->test->values', \Fenom::ACCESSOR_VAR, '{$.acc.three}', '3'],
['acc', '$tpl->getStorage()->test->getThree', \Fenom::ACCESSOR_CALL, '{$.acc()}', '3'],
['acc', 'three', \Fenom::ACCESSOR_PROPERTY, '{$.acc}', '3'],
['acc', 'templateExists', \Fenom::ACCESSOR_METHOD, '{$.acc("persist:pipe.tpl")}', '1']
);
}

/**
* @group testSmartAccessor
* @dataProvider providerSmartAccessor
* @param $name
* @param $accessor
* @param $type
* @param $code
* @param $result
*/
public function testSmartAccessor($name, $accessor, $type, $code, $result) {
$this->fenom->test = $this;
$this->fenom->three = 3;
$this->fenom->addAccessorSmart($name, $accessor, $type);
$this->assertRender($code, $result, $this->getVars());
}
}

0 comments on commit 4fe339b

Please sign in to comment.