Как добавить динамический 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" в папке "views", затем добавить файл "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>

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

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`.

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

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

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

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

/views/sitemap/list.cfm

и, необязательно, контроллер здесь:

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

редактировать

Поскольку вышеприведенное работает не совсем правильно, я взглянул на правила перезаписи запаса, которые идут с 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, так как вы знаете, что оно работает.

Другие вопросы по тегам