如何编写在主体中具有锚标签的Zend Framework URL?

时间:2009-01-01 19:20:58

标签: php zend-framework zend-framework-mvc

使用Zend Framework中设置的标准MVC,我希望能够显示具有锚点的页面。现在我只是在.phtml文件中添加一个无意义的参数'#anchor'。

<?= $this->url(array(
    'controller'=>'my.controller',
    'action'=>'my.action',
    'anchor'=>'#myanchor'
));

这会将网址设置为/my.controller/my.action/anchor/#myanchor

有没有更好的方法来实现这一目标?导航到锚点链接后,额外的item参数将在用户的URL中设置,这是我不想发生的事情。

4 个答案:

答案 0 :(得分:13)

其中一种可能性是覆盖url helper,或创建一个新的。

class My_View_Helper_Url extends Zend_View_Helper_Url
{    
    public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
    {
        if (isset($urlOptions['anchor']) && !empty($urlOptions['anchor']))
        {
            $anchor = $urlOptions['anchor'];
            unset($urlOptions['anchor']);
        }
        else
        {
            $anchor = '';
        }

        return parent::url($urlOptions, $name, $reset, $encode).$anchor;
    }
}

这个助手覆盖url helper,问题是,你不能使用名为'anchor'的参数,因为它会在url中改成锚。

您将在您的示例中将其称为

<?= $this->url(array(
    'controller'=>'my.controller',
    'action'=>'my.action',
    'anchor'=>'#myanchor'
));

我希望它有所帮助

答案 1 :(得分:7)

您可以通过多种方式在网址中实施fragment id。以下是一些选项,以及每种选项的优缺点。

直接添加

您只需在"#$fragment_id"来电后添​​加url()即可。不雅,但很简单。如果你不使用页面锚点(即只有一页或两页),这就是你要走的路。

编写自定义url()帮助程序

您可以编写url()的自定义版本,为片段ID附加可选的第5个参数:

class My_View_Helper_Url extends Zend_View_Helper_Url
{    
    public function url(array $urlOptions  = array(), $name   = null, 
                              $reset       = false,   $encode = true, 
                              $fragment_id = null)
    {
        $uri = parent::url($urlOptions, $name, $reset, $encode);

        if(!is_null($fragment_id)) {
            $uri .= "#$fragment_id";
        }

        return $uri;
    }
}

这样,锚(和锚/片段id)信息严格地与视图的领域保持一致。这对于一般用途很有用,但对于默认路由可能会有点笨拙。此外,对于某些用途,这仍然有点太硬编码。

编写自定义Route类(极限)

作为第三个选项,您可以编写Zend_Controller_Router_Route类的自定义版本,特别是assemble($data, $reset, $encode)方法(match($path)方法默认忽略片段ID)。 / p>

使用这种方法可能非常棘手,但非常有用,特别是如果使用仅限于特定路由(此方法可用于将片段id基于任何变量)。

买者

使用片段ID时,必须考虑某些注意事项。例如,查询字符串必须位于uri中的片段id之前,否则,PHP将忽略查询字符串。但是,大多数ZF应用程序倾向于避免使用查询字符串,因此它可能不是问题。

答案 2 :(得分:5)

url视图助手接受第三个选项的“片段”键:

url('[route]',array([params]),array('fragment'=>'anchor'));

这将自动以#anchor结束网址。

- 感谢Exlord

答案 3 :(得分:0)

我认为编写自定义路由类的Extreme方法更好,因为其他帮助程序将具有相同的行为(如重定向器操作助手)。