如何在 Crafter 3.0 中进行 URL 映射
How to do URL mapping in Crafter 3.0
我想知道 crafter (3.0) 是否有能力进行 url 映射。
例如,要在给定路径(如 /site/website/foobar/mycontent/index.xml
中包含内容,并且其 url 为 /news/2017/11/17/my-content
(请注意添加的 /
不能在 file-name
字段中使用,因为它们会在工作室中自动转换为 -
)。
谢谢,
尼古拉斯
内置路由器在我们的路线图上 (https://github.com/craftercms/craftercms/issues/1622),但现在,您可以轻松地将其添加到您的蓝图中:
- 创建一个包含 "routing table" 的组件。这个组件
有一个重复的 table,其中每个条目都是入站 URL 并且
出站 URL。
创建一个 Groovy 过滤器脚本来拦截所有调用和
检查 URL 是否与入站 URL 之一匹配。如果是这样,它
将请求转发到相应的出站 URL。下面是
这种过滤器的可能代码:
def routingTableItem = siteItemService.getSiteItem("/site/components/system/routing-table.xml")
def routingTable = routingTableItem.urlRoutingTable.item
def currentURL = request.requestURI
def matchedEntry = routingTable.find { entry ->
return currentURL == entry.inboundURL.text
}
if (matchedEntry) {
def inboundURL = matchedEntry.inboundURL.text
def outboundURL = matchedEntry.outboundURL.text
logger.info("Forwarding URL ${inboundURL} to ${outboundURL}")
request.getRequestDispatcher(outboundURL).forward(request, response)
} else {
filterChain.doFilter(request, response)
}
我想知道 crafter (3.0) 是否有能力进行 url 映射。
例如,要在给定路径(如 /site/website/foobar/mycontent/index.xml
中包含内容,并且其 url 为 /news/2017/11/17/my-content
(请注意添加的 /
不能在 file-name
字段中使用,因为它们会在工作室中自动转换为 -
)。
谢谢,
尼古拉斯
内置路由器在我们的路线图上 (https://github.com/craftercms/craftercms/issues/1622),但现在,您可以轻松地将其添加到您的蓝图中:
- 创建一个包含 "routing table" 的组件。这个组件 有一个重复的 table,其中每个条目都是入站 URL 并且 出站 URL。
创建一个 Groovy 过滤器脚本来拦截所有调用和 检查 URL 是否与入站 URL 之一匹配。如果是这样,它 将请求转发到相应的出站 URL。下面是 这种过滤器的可能代码:
def routingTableItem = siteItemService.getSiteItem("/site/components/system/routing-table.xml") def routingTable = routingTableItem.urlRoutingTable.item def currentURL = request.requestURI def matchedEntry = routingTable.find { entry -> return currentURL == entry.inboundURL.text } if (matchedEntry) { def inboundURL = matchedEntry.inboundURL.text def outboundURL = matchedEntry.outboundURL.text logger.info("Forwarding URL ${inboundURL} to ${outboundURL}") request.getRequestDispatcher(outboundURL).forward(request, response) } else { filterChain.doFilter(request, response) }