Контроллеры типов контента (перехватчики страниц и компонентов)
Общая информация
Типы контента в DC CMS (страницы и компоненты) могут иметь свои собственные скрипты контроллера. Эти скрипты выполняются перед рендерингом соответствующей страницы или компонента и вносят свой вклад в модель шаблона. Помимо общих переменных, эти скрипты имеют доступ к templateModel
и contentModel
.
Переменная, связанная с моделью | Описание |
---|---|
contentModel |
Содержимое XML-дескриптора. Это экземпляр класса SiteItem. |
templateModel |
Фактическая модель карты шаблона. Это экземпляр класса AllHttpScopesAndAppContextHashModel. |
templateModel
представляет собой модель карты шаблона, позволяя переменным, помещенным в нее, быть непосредственно доступными в шаблоне. Например, если скрипт содержит строку templateModel.var = 5
, то шаблон может вывести значение var
с использованием ${var}
. contentModel
, с другой стороны, представляет собой XML-описание контента типа SiteItem. Этим скриптам не обязательно возвращать результаты; их цель - заполнять templateModel
.
Существует два способа "привязать" скрипт к странице или компоненту:
-
Разместите скрипт по пути
scripts
>pages
илиscripts
>components
, назвав его именем типа контента страницы или компонента. -
При создании типа контента для страницы или компонента добавьте элемент управления “Селектор элементов” и в поле "Имя/Имя переменной" укажите "scripts". Позднее, при создании страницы или компонента этого типа, вы можете выбрать несколько скриптов, которые будут связаны с ним.
Ниже расположен пример скрипта компонента. Тип контента компонента - /component/upcoming-events
. Скрипт может находиться по пути scripts
> components
> upcoming-events.groovy
, обеспечивая его выполнение для всех компонентов этого типа.
ru.dc.cms.engine.service.context.SiteContext
import utils.DateUtils
import org.elasticsearch.client.elasticsearch.core.SearchRequest
import ru.dc.cms.search.elasticsearch.client.ElasticSearchClientWrapper
import org.elasticsearch.client.elasticsearch._types.SortOrder
def now = DateUtils.formatDateAsIso(new Date())
def q = "dcSite:\"${siteContext.siteName}\" AND content-type:\"/component/event\" AND disabled:\"false\" AND date_dt:[${now} TO *]"
def start = 0
def rows = 1000
def events = []
// Execute the query
def result = searchClient.search(r -> r
.query(q -> q
.queryString(s -> s
.query(q as String)
)
)
.source(s -> s
.filter(f -> f
.includes('localId')
)
)
.from(start)
.size(rows)
.sort(s -> s
.field(f -> f
.field(date_dt)
.order(SortOrder.Asc)
)
)
, Map)
result.hits().hits().each {
def event = [:]
def item = siteItemService.getSiteItem(it.source())
event.image = item.image.text
event.title = item.title_s.text
event.date = DateUtils.parseModelValue(item.date_dt.text)
event.summary = item.summary_html.text
events.add(event)
}
templateModel.events = events
Вы можете заметить, что мы импортируем класс utils.DateUtils
, который специфичен для проекта и не является частью DC CMS. Чтобы использовать этот класс, поместите его по пути scripts
> classes
и назовите DateUtils.groovy
. Рекомендуется следовать соглашению о том, что все после каталога groovy является частью пакета класса для всех классов Groovy.
package utils
import java.text.SimpleDateFormat
class DateUtils {
static def parseModelValue(value){
def dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"))
return dateFormat.parse(value)
}
static def formatDateAsIso(date) {
def dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"))
return dateFormat.format(date)
}
}
Получить подробную информацию о FreeMarker API (создание шаблонов), можно здесь.
Для получения информации о Groovy API перейдите по этой ссылке.
Безопасность скриптов и шаблонов
DC CMS ограничивает доступ к сервисам во время разработки шаблонов или скриптов и автоматически изолирует скрипты в целях обеспечения безопасности. При создании шаблонов или скриптов разрешен только предопределенный набор сервисов. Некоторым веб-сайтам может потребоваться доступ к дополнительным сервисам, кроме предоставленных по умолчанию. Для разрешения доступа к другим сервисам обратитесь к статье "Настройка пользовательских сервисов".
Скрипты выполняются в изолированной среде (sandbox), оборудованной чёрным списком небезопасных выражений для предотвращения потенциально вредоносного кода, который может подвергнуть систему опасности. Тем не менее, конкретным сайтам может потребоваться доступ к одному или нескольким выражениям из чёрного списка.
Чтобы переопределить конфигурацию изолированной среды скрипта по умолчанию, изучите статью "Конфигурация Groovy Sandox".