diff --git a/docs/view_renderers.md b/docs/view_renderers.md index a953c45..1d88d21 100644 --- a/docs/view_renderers.md +++ b/docs/view_renderers.md @@ -18,6 +18,7 @@ array( ), 'twig' => array( 'class' => 'yii\renderers\TwigViewRenderer', + 'twigPath' => '@app/vendors/Twig', ), // ... ), @@ -38,6 +39,21 @@ or `$this->renderPartial()` from your controller: echo $this->render('renderer.twig', array('username' => 'Alex')); ``` +### Additional functions + +Additionally to regular Twig syntax the following is available in Yii: + +```php +{{ post.title }} +``` + +path function calls `Html::url()` internally. + +### Additional variables + +- `app` = `\Yii::$app` +- `this` = current `View` object + Smarty ------ @@ -49,3 +65,18 @@ or `$this->renderPartial()` from your controller: ```php echo $this->render('renderer.tpl', array('username' => 'Alex')); ``` + +### Additional functions + +Additionally to regular Smarty syntax the following is available in Yii: + +```php +{$post.title} +``` + +path function calls `Html::url()` internally. + +### Additional variables + +- `$app` = `\Yii::$app` +- `$this` = current `View` object \ No newline at end of file diff --git a/framework/renderers/SmartyViewRenderer.php b/framework/renderers/SmartyViewRenderer.php index ab9125a..920f3c6 100644 --- a/framework/renderers/SmartyViewRenderer.php +++ b/framework/renderers/SmartyViewRenderer.php @@ -13,6 +13,7 @@ use Yii; use Smarty; use yii\base\View; use yii\base\ViewRenderer; +use yii\helpers\Html; /** * SmartyViewRenderer allows you to use Smarty templates in views. @@ -48,6 +49,34 @@ class SmartyViewRenderer extends ViewRenderer $this->smarty = new Smarty(); $this->smarty->setCompileDir(Yii::getAlias($this->compilePath)); $this->smarty->setCacheDir(Yii::getAlias($this->cachePath)); + + $this->smarty->registerPlugin('function', 'path', array($this, 'smarty_function_path')); + } + + /** + * Smarty template function to get a path for using in links + * + * Usage is the following: + * + * {path route='blog/view' alias=$post.alias user=$user.id} + * + * where route is Yii route and the rest of parameters are passed as is. + * + * @param $params + * @param \Smarty_Internal_Template $template + * + * @return string + */ + public function smarty_function_path($params, \Smarty_Internal_Template $template) + { + if(!isset($params['route'])) { + trigger_error("path: missing 'route' parameter"); + } + + array_unshift($params, $params['route']) ; + unset($params['route']); + + return Html::url($params); } /** @@ -67,6 +96,10 @@ class SmartyViewRenderer extends ViewRenderer $ext = pathinfo($file, PATHINFO_EXTENSION); /** @var \Smarty_Internal_Template $template */ $template = $this->smarty->createTemplate($file, null, null, $params, true); + + $template->assign('app', \Yii::$app); + $template->assign('this', $view); + return $template->fetch(); } } \ No newline at end of file diff --git a/framework/renderers/TwigViewRenderer.php b/framework/renderers/TwigViewRenderer.php index b92998d..79faa9f 100644 --- a/framework/renderers/TwigViewRenderer.php +++ b/framework/renderers/TwigViewRenderer.php @@ -12,6 +12,7 @@ namespace yii\renderers; use Yii; use yii\base\View; use yii\base\ViewRenderer; +use yii\helpers\Html; /** * TwigViewRenderer allows you to use Twig templates in views. @@ -53,6 +54,12 @@ class TwigViewRenderer extends ViewRenderer $this->twig = new \Twig_Environment($loader, array_merge(array( 'cache' => Yii::getAlias($this->cachePath), ), $this->options)); + + $this->twig->addFunction('path', new \Twig_Function_Function(function($path, $args = array()){ + return Html::url(array_merge(array($path), $args)); + })); + + $this->twig->addGlobal('app', \Yii::$app); } /** @@ -69,6 +76,7 @@ class TwigViewRenderer extends ViewRenderer */ public function render($view, $file, $params) { + $this->twig->addGlobal('this', $view); return $this->twig->render(file_get_contents($file), $params); } }