Как отображать страницы с расширениями файлов, такими как xml, json, csv и т. д., в CFWheels с типом файла в URL-адресе?

Я не могу понять, как создавать страницы в CFWheels с чистыми URL-адресами, которые содержат расширения «файл».

Я хотел бы иметь возможность сделать следующее:

В отличие от этого:

Я прочитал эти документы, но до сих пор не понял о фактической реализации.

Допустим, у меня есть контроллер (/controllers/Product.cfc), который выглядит примерно так:

<cfcomponent extends="Controller">

    <cffunction name="init">
        <cfset provides("html,json,xml")>
    </cffunction>

    <cffunction name="index">
        <cfset products = model("product").findAll(order="title")>
        <cfset renderWith(products)>
    </cffunction>

</cfcomponent>

Как реализовать представление? Должно быть views/products/index.xml.cfm?

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product><!-- product data goes here --></product>
</products>

Как реализовать routes.cfm?

Я должен отметить, что я также использую по умолчанию web.config и есть <cfset set(URLRewriting="On")> в config/setting.cfm.


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


Ответы (1)


Предположение о маршрутах верное. Но вы должны убедиться, что переписывание работает правильно, скажем, не частично. Вы можете получить доступ к таким URL-адресам, как /controller/action, верно? Не /rewrite.cfm/controller/action.

Таким образом, определение маршрута может выглядеть так:

<cfset addRoute(name="indexProducts", pattern="products.[format]", controller="product", action="index") />

В методе index у вас будет params.format, заполненное фактическим значением, которое вы хотите проверить (ListFind должно работать).

Шаблон представления для этой страницы должен иметь имя своего действия: /views/product/index.cfm. Ничего особенного здесь не нужно, если только вы не хотите загружать представления условно, например, отдельное представление для каждого формата. В этом случае вы хотите проверить функцию renderPage. Его можно использовать для переопределения представления по умолчанию.

ОБНОВЛЕНИЕ

Хорошо, я протестировал это решение, и оно не сработает. Маршруты не поддерживают ничего, кроме косой черты в качестве разделителя. Таким образом, этот вид маршрута может работать только таким образом:

<cfset addRoute(name="indexProducts", pattern="products/[format]", controller="product", action="index") />

Я предполагаю, что мы не хотим изменять код CFWheels (что в любом случае является плохой идеей без дальнейшего запроса на включение), поэтому я бы рекомендовал использовать переписывание веб-сервера. Например, в Apache это может выглядеть так:

RewriteRule ^products\.(xml|json|html)$ product/index?format=$1 [NS,L]

Вы используете IIS, поэтому он должен выглядеть примерно так (НЕ ПРОВЕРЕНО):

<rule name="Products listing" enabled="true">
    <match url="^products\.(xml|json|html)$" ignoreCase="true" />
    <action type="Rewrite" url="product/index?format={R:1}" />
</rule>

Думаю, это лучший подход, чем пытаться создать контроллеры с именами вроде ProductsXml, ProductsJson и т. д.

person Sergey Galashyn    schedule 02.02.2012
comment
Перезапись работает правильно, но добавление расширения файла, такого как .xml, не работает. Может быть, мне стоит попробовать это на новом чистом сайте CFWheels. - person Micah; 04.02.2012
comment
Спасибо! В понедельник попробую. - person Micah; 05.02.2012
comment
Оказывается, CFWheels 1.1.7 нарушил функциональность форматов, больше не допуская точки! Поэтому я считаю, что ваш первоначальный ответ сработал бы для некоторых версий CFWheels. Кроме того, ваше предложение по переписыванию должно работать довольно хорошо. Еще раз спасибо! - person Micah; 06.02.2012