如何在MVC中组织国家/州/城市浏览

时间:2011-12-30 19:43:54

标签: php ajax codeigniter codeigniter-routing

我正在创建一个基于ajax的网站,其中包含一个国家/州/城市浏览界面。出于搜索引擎优化的目的,我想在URL中包含国家/州/州的名称。例如,url可能包含其他变量,如下所示:

 http://www.website.com/browse#!USA/NY/Albany
 http://www.website.com/browse#!USA/NY/Albany?Category=sports

我需要通过AJAX将此功能融入MVC框架(特别是CodeIgniter)。我不确定如何组织主要组件,特别是Controller,AJAX处理程序和可能的Library类。是否有标准或最佳实践方法?

1 个答案:

答案 0 :(得分:1)

是的,谷歌在这个主题上写了一些好东西,特别是用片段标识符维护ajax应用程序状态: http://code.google.com/web/ajaxcrawling/docs/specification.html

这是我在index.php文件中放入的一些代码来处理这个问题:

// Special handler for ajax partials ("AHAH" paradigm)
if (isset($_GET['_escaped_fragment']))
{
    // Grab just the fragment
    $fragment = $_GET['_escaped_fragment'];

    // See if we have GET parameters to extract from the fragment
    if (FALSE !== ($p = strpos($fragment, '?')))
    {
        // Make sure to save additional GET parameters
        $additional_params = array_diff_key($_GET, array('_escaped_fragment' => 1));

        // Parse the querty string
        parse_str(substr($fragment, $p+1), $_GET);

        // Add the originals back in
        $_GET = array_merge($_GET, $additional_params);

        // The beginning part of the fragment is the base URI
        $fragment = substr($fragment, 0, $p);
    }

    // Otherwise, clear the $_GET array
    else
    {
        $_GET = array();
    }

    $_SERVER['PATH_INFO']   = $fragment;
    $_SERVER['REQUEST_URI'] = $fragment;

    // Add a constant for use throughout the app
    define('IS_FRAGMENT', 1);
}
defined('IS_FRAGMENT') OR define('IS_FRAGMENT', 0);

方法是:

1)如果是ajax请求且IS_FRAGMENT == 1,则只显示填充前端更改所需的部分结果

2)否则,假设它是搜索引擎或直接页面加载。显示完整构建的页面。

您不一定只为ajax请求创建单独的端点。扩展Output类以提供请求格式的响应可能更好。这种方式更加RESTful。

将HTML5历史记录API用于可以处理它的浏览器,并回归其他人的onhashchange事件也是一种好习惯。

更多指示:

使用“#!”表示ajax触发的内容更改,而不仅仅是“#”。您可能在某些时候想要使用片段提供的默认锚功能(但感叹号是“安全的”,因为您可能没有以该特定字符开头的元素ID)。

我还建议使用绝对URI(即#!/ USA / NY / Albany),因为在ajax部分加载机制中更容易保持一致。

此外,如果有人在URL中重新加载带有ajaxed-fragment的页面,如果你不只是执行window.location.href ='...'来加载页面,那么它会变得相当混乱。在那时你会遇到各种各样的问题。