是否有一个CakePHP组件/插件为ajax页面执行永久链接?

时间:2011-05-05 13:03:12

标签: javascript cakephp hash permalinks

我正在使用JsHelper编写JS链接以使用ajax加载页面。像这样:

<?= $this->Js->link($item['Series']['title'], array(
    'controller' => 'series',
    'action' => 'view',
    $item['Series']['id']
), array('update' => '#menu-items')); ?>

这工作正常,但现在我想添加它以便您可以链接到这些页面。因此,例如,当您点击该链接时,它会将您重定向到example.com/#!/series/2。然后,您也可以转到此网址,并在#menu-items div。

中加载正确的页面

这是我必须从头开始编写的,还是有可用的CakePHP助手或插件可以帮我吗?我之前有过这样的经历,但从未使用CakePHP,也不确定从哪里开始。

谢谢,

2 个答案:

答案 0 :(得分:1)

我现在已经开始自己处理它了,因为我认为由于没有响应,所以还没有为CakePHP构建这样的东西。

首先,javascript:

var hash = '';
window.setInterval(function() {
    if(hash != location.hash) {
        hash = location.hash;

        if(hash.indexOf('#!/') != -1) {
            var url = hash.substr(2);

            $('#my-div').load(url);
        }
    }
}, 300);

这样做是检查location.hash是否已更改,如果有,则检查它是否以#!/开头。 (即#!/:controller/:action/:id是我正在寻找的哈希值)。然后它只调用jQuery加载函数来加载该控制器和动作。

然后我必须修改我的链接以使用url中的HtmlHelper方法。

<?
$hashUrl = $this->Html->url(array(
    'controller' => 'categories',
    'action' => 'view',
    $category['Category']['id']
));

echo $this->Html->link($category['Category']['title'], '#!' . $hashUrl);
?>

这会为控制器和操作创建一个字符串,然后将其附加到#!方法中的link。这样做可能看起来很长(你可能会写一个自定义帮助器使它成为一行),但它允许你稍后更改config/routes.php中的URL。你最终会得到一个这样的网址:#!/categories/view/2

最后,您需要确保在您的控制器中,在您使用的每种方法的最后都有这个。

$this->render('view', 'ajax');

我并不认为这是一个完美的解决方案,但它目前的工作做得非常好。也欢迎提出改进建议。

答案 1 :(得分:0)

有些开源项目可以帮助您。这是一个很好的起点:https://github.com/browserstate/history.js