11

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

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

这会将 URL 设置为类似于 /my.controller/my.action/anchor/#myanchor

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

4

4 回答 4

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 助手,问题是,你不能使用名为“anchor”的参数,因为它会在 url 中变成锚。

你会在你的例子中调用它

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

我希望它有帮助

于 2009-01-02T12:55:26.260 回答
7

您可以通过多种方式在 URL 中实现片段 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类(Extreme)

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

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

警告

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

于 2009-01-24T02:41:59.133 回答
5

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

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

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

- 感谢 Exlord

于 2014-07-30T15:34:17.830 回答
0

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

于 2009-02-24T19:16:42.567 回答