Как отобразить страницы с расширениями «file», такими как xml, json, csv и т. Д. В CFWheels с типом файла в URL? - PullRequest
3 голосов
/ 02 февраля 2012

Кажется, я не могу понять, как создавать страницы в CFWheels с чистыми URL-адресами, которые имеют расширения "file".

Я бы хотел сделать следующее:

Применительно к этому:

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

Допустим, у меня есть контроллер (/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.

1 Ответ

4 голосов
/ 02 февраля 2012

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

UPDATE

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

<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 и т. Д.

...