2011-12-30 1 views
1

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

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

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

ответ

1

Да, Google написал некоторые хорошие вещи на эту тему, в частности, поддержание АЯКС состояния приложения с идентификаторами фрагментов: 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.

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

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

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

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

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