1

例如,给定一个在以下位置检索到的页面:

http://myapp.dev/path/subfolder?param=abc

每当出现名为param的附加 GET 参数时,它应该自动添加到我在 .volt 模板中构建的导航中的所有后续链接。例如:

<a href="{{ url('path/subfolder2') }}">Go to subfolder 2</a>

即基于这个 .volt 链接,目标是生成:

<a href="http://myapp.dev/path/subfolder2?param=abc">Go to subfolder 2</a>
4

1 回答 1

0

如果您只想为给定链接附加查询字符串参数,您可以使用 Luke 的解决方案。但是我认为你想要实现一些不同的东西,它涉及自定义逻辑。为此,我们应该创建一个自定义 Volt 函数。

自定义函数定义:

public static function urlFor($params, $queryStringParams = [])
{
    $di = \Phalcon\DI::getDefault();
    if ($di->getRequest()->has('param')) {
        $queryStringParams['param'] = $di->getRequest()->get('param');
    }
    return $di->getUrl()->get($params, $queryStringParams);
}

url()上述函数的作用与Phalcon中的函数相同,只是允许我们在将参数传递给url(). 在您的情况下,我们检查 URL 是否包含所需的查询参数,并将其添加到当前请求生成的每个 URL 中。就我而言,上述函数位于 Helper 文件中,因此我可以在需要的任何地方使用它。

这是我们的 View 服务定义:

$di->set('view', function() use ($di) {
    $view = new \Phalcon\Mvc\View();
    ...
    $view->registerEngines([
        '.phtml' => function($view, $di) {
            $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
            $options = [
                'compiledPath' => $di->getConfig()->site->path->cache . 'volt/frontend/',
                'compiledExtension' => '.php',
                'compileAlways' => $di->getConfig()->debug,
            ];
            $volt->setOptions($options);

            ...
            
            // IMPORTANT PART: Overwriting default url() function in Volt
            $compiler = $volt->getCompiler();
            $compiler->addFunction('url', function($resolvedArgs, $exprArgs){
                return 'Helpers\Common::urlFor(' . $resolvedArgs . ')';
            });
            return $volt;
        }
    ]);
    return $view;
});

请注意上述代码块中的重要部分注释。

让我们以示例结束:

用户在这个地址: http ://myapp.dev/path/subfolder?param=abc

但是在您的代码中的某个地方,您想生成一个指向新闻页面的链接:

<a href="{{ url('news/list') }}">News</a>

我们的代码将捕获paramURL 中的 并生成以下地址:

http://myapp.dev/news/list?param=abc

于 2016-09-09T08:49:02.147 回答