Как добавить динамический sitemap.xml в приложение CFWheels? - PullRequest
2 голосов
/ 31 января 2012

Как настроить 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>

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

Ответы [ 2 ]

2 голосов
/ 31 января 2012

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

Метод 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`.
1 голос
/ 31 января 2012

Во-первых, вы должны настроить свой веб-сервер на полное перезапись 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)

edit

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

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

edit

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

...