Как организовать просмотр страны / штата / города в MVC - PullRequest
1 голос
/ 30 декабря 2011

Я создаю веб-сайт на основе ajax, который включает интерфейс просмотра страны / штата / города. В целях SEO я хочу включить название страны / штата / города в URL. Например, URL может содержать дополнительные переменные и будет выглядеть примерно так:

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

Мне нужно встроить эту функциональность в инфраструктуру MVC (в частности, CodeIgniter) через AJAX. Я не уверен, как организовать основные компоненты, в частности, Controller, AJAX Handlers и возможный класс Library. Существует ли стандартный или передовой подход?

1 Ответ

1 голос
/ 31 декабря 2011

Да, Google написал несколько хороших материалов на эту тему, в частности, поддерживая состояние приложения 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 для предоставления ответа в запрошенном формате. Это намного приятнее.

Также рекомендуется использовать API истории HTML5 для браузеров, которые могут его обрабатывать, и использовать другие события onhashchange.

Еще несколько указателей:

Используйте "#!" чтобы указать изменения содержимого, вызванные ajax, а не просто "#". Возможно, в какой-то момент вы захотите использовать функцию привязки по умолчанию, которую обеспечивает фрагмент (но восклицательный знак «безопасен», поскольку у вас, вероятно, не будет идентификаторов элементов, начинающихся с этого конкретного символа).

Я бы также рекомендовал использовать абсолютный URI (т. Е. #! / USA / NY / Albany), так как будет проще оставаться согласованным в вашем механизме частичной загрузки ajax.

Кроме того, если кто-то перезагрузит страницу с ajaxed-фрагментом в URL, это может стать довольно грязным, если вы просто не сделаете window.location.href = '...', чтобы загрузить страницу свежо. В этот момент вы столкнетесь с множеством проблем с возвратом вперед / назад.

...