Как добавить динамический файл sitemap.xml в приложение CFWheels?

Как настроить CFWheels для отображения следующего XML-кода по адресу http://mydomain.com/sitemap.xml?

<?xml version="1.0" encoding="UTF-8"?>
<urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

      <-- I'll add the <url> tags dynamically here later -->
</urlset>

Я удалил "sitemap.xml" из файла web.config.

После этого я не знаю, что делать с созданием controller и view. Должен ли я создать папку «sitemap.xml» в папке «представления», затем добавить файл «index.cfm», а затем добавить приведенный выше XML?

Должен ли я создать файл «sitemap.xml.cfc» в папке «controllers»? А что должен содержать файл контроллера?

Должно ли это выглядеть примерно так?

<cfcomponent extends="Controller" output="false">
<cfscript>  
  function init(){
    // Let CFWheels know what type of output this controller can 'provide'
    provides("xml");
  }

  function index(){

  }
</cfscript>
</cfcomponent>

Нужно ли мне добавлять запись в route.cfm?


person Micah    schedule 30.01.2012    source источник


Ответы (2)


Настройка контроллера

Метод index() вашего контроллера должен выглядеть примерно так. Он хранится по адресу controllers/Sitemap.cfc.

function init() {
    // Grab data about URLs from model or build an array of structs to pass to the view
    urls = model("page").findAll(); // This line is just an example

    // Call `renderWith()` to instruct Wheels that this requires a special content-type
    renderWith(urls);
}

Настройка просмотра

Затем ваше представление в views/sitemap/index.xml.cfm может сгенерировать необходимый XML:

<cfoutput>

<?xml version="1.0" encoding="UTF-8"?>
<urlset
    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
        http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

    #includePartial(partial="url.xml", query=urls)#
</urlset>

</cfoutput>

Затем вы можете реализовать партиал в views/sitemap/_url.xml.cfm, представляющий один элемент в вашем запросе или массиве. Дайте мне знать, если вы используете что-то другое, кроме запроса, и я могу изменить мой пример выше.

<cfoutput>

<url>
    <loc>#arguments.uri#</loc>
    <loc>#arguments.updatedAt#</loc>
</url>

</cfoutput>

Имейте в виду, что когда вы используете такой партиал, столбцы запроса или ключи структуры помещаются в область arguments, поэтому я ссылаюсь на arguments.uri и arguments.updatedAt в моем вымышленном примере.

Доступ через URL

В зависимости от возможностей перезаписи URL-адресов вашего сервера вам может потребоваться несколько способов, чтобы заставить URL-адрес делать то, что вы хотите.

Вы можете сделать что-то подобное в config/routes.cfm (но я тестировал это только на Apache):

<cfset addRoute(pattern="sitemap.[format]", controller="sitemap", action="index")>
<cfset addRoute(pattern="sitemap", controller="sitemap", action="index")>

Затем вы можете загрузить URL-адрес в http://www.example.com/sitemap.xml

Если это не сработает, попробуйте следующее:

<cfset addRoute(pattern="sitemap.xml", controller="sitemap", action="index")>
<cfset addRoute(pattern="sitemap", controller="sitemap", action="index")>

Опять же, вы можете загрузить URL-адрес по адресу http://www.example.com/sitemap.xml.

Наконец, если это не сработает, удалите лишние строки из config/routes.cfm и загрузите этот URL-адрес (который определенно всегда будет работать независимо):

`http://www.example.com/sitemap?format=xml`.
person Chris Peters    schedule 31.01.2012
comment
Спасибо за подробные примеры. К сожалению, маршруты не работают и для http://www.example.com/sitemap.xml. http://www.example.com/sitemap/ работает, но http://www.example.com/sitemap.xml в конечном итоге запускает onmissingtemplate.cfm и отображает файл не найден! сообщение. - person Micah; 01.02.2012
comment
Вы можете сравнить web.config и .htaccess в репозитории GitHub и посмотреть, сможете ли вы усовершенствовать web.config, чтобы лучше работать с точками в пути. github.com/cfwheels/cfwheels/blob/new-master/web. config github.com/cfwheels/cfwheels/blob/new- мастер/.htaccess - person Chris Peters; 02.02.2012
comment
Вы видите, работает ли этот патч? Похоже, что-то сломалось в CFML в Wheels 1.1.7. github.com/cfwheels/cfwheels/commit/ - person Chris Peters; 05.02.2012
comment
Я вижу, вы приняли мой ответ. Патч из моего комментария выше сработал? - person Chris Peters; 07.02.2012
comment
Да, спасибо! Использование sitemap.[format] с патчем работает. Я должен упомянуть, что есть еще один вариант для тех, кто не хочет применять этот патч, который описан здесь. - person Micah; 07.02.2012

Во-первых, вам необходимо настроить веб-сервер для полной перезаписи URL-адресов, если вы еще этого не сделали. Таким образом, вам не нужно будет указывать index.cfm в URL-адресе (http://mydomain.com/index.cfm/foo/bar становится http://mydomain.com/foo/bar).

Как только это будет сделано, измените файл config/routes.cfm следующим образом:

<cfset addRoute(name="sitemap",
        pattern="/sitemap.xml",
        controller="sitemap",
        action="list") />

Затем вы можете добавить свой XML-код здесь:

/views/карта сайта/list.cfm

и, возможно, контроллер здесь:

/controllers/Sitemap.cfc (со списком функций)

изменить

Поскольку приведенное выше работает не совсем правильно, я взглянул на стандартные правила перезаписи, которые поставляются с CFWheels, и заметил большую проблему:

RewriteCond %{REQUEST_URI} !^.*/(flex2gateway|jrunscripts|cfide|cfformgateway|cffileservlet|railo-context|files|images|javascripts|miscellaneous|stylesheets|robots.txt|sitemap.xml|rewrite.cfm|favicon.ico)($|/.*$) [NC]

Обратите внимание на "sitemap.xml". Удалите это из своего списка, оставив вам это:

RewriteCond %{REQUEST_URI} !^.*/(flex2gateway|jrunscripts|cfide|cfformgateway|cffileservlet|railo-context|files|images|javascripts|miscellaneous|stylesheets|robots.txt|rewrite.cfm|favicon.ico)($|/.*$) [NC]

Возможно, вам придется перезапустить/перезагрузить веб-сервер. Но это должно сделать это.

изменить

И последняя идея: вы можете добавить правило перезаписи на свой веб-сервер, которое перенаправляет запросы для /sitemap.xml в /sitemap, поскольку вы знаете, что оно работает.

person Jake Feasel    schedule 30.01.2012
comment
Это не работает при адресации domain.com/sitemap.xml. Это работает для domain.com/sitemap. Чтобы удалить макет, я добавил renderWith(data="#urls#", layout="false"); в функцию list() в контроллере. - person Micah; 01.02.2012
comment
Удаление sitemap.xml из шаблона перезаписи было первым, что я сделал. В моем случае я удалил его из файла web.config, так как использую модуль перезаписи IIS. Любые другие идеи? - person Micah; 02.02.2012
comment
Спасибо, что помогаешь Джейку. Ваше предложение изменить переписывание действительно работает с некоторыми изменениями, суть которых вы можете получить здесь - person Micah; 07.02.2012