Контроллеры типов контента (перехватчики страниц и компонентов)

В этой статье описываются скрипты контроллеров, которые используются для страниц и компонентов в DC CMS, а также способы их "привязки" к соответствующему типу контента.

Общая информация Copy-icon

Типы контента в DC CMS (страницы и компоненты) могут иметь свои собственные скрипты контроллера. Эти скрипты выполняются перед рендерингом соответствующей страницы или компонента и вносят свой вклад в модель шаблона. Помимо общих переменных, эти скрипты имеют доступ к templateModel и contentModel.

Переменная, связанная с моделью Описание
contentModel Содержимое XML-дескриптора. Это экземпляр класса SiteItem.
templateModel Фактическая модель карты шаблона. Это экземпляр класса AllHttpScopesAndAppContextHashModel.

templateModel представляет собой модель карты шаблона, позволяя переменным, помещенным в нее, быть непосредственно доступными в шаблоне. Например, если скрипт содержит строку templateModel.var = 5, то шаблон может вывести значение var с использованием ${var}contentModel, с другой стороны, представляет собой XML-описание контента типа SiteItem. Этим скриптам не обязательно возвращать результаты; их цель - заполнять templateModel.

Существует два способа "привязать" скрипт к странице или компоненту:

  1. Разместите скрипт по пути scripts > pages или scripts > components, назвав его именем типа контента страницы или компонента.

  2. При создании типа контента для страницы или компонента добавьте элемент управления “Селектор элементов” и в поле "Имя/Имя переменной" укажите "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

Copy-icon

Вы можете заметить, что мы импортируем класс 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)
  }
}

Copy-icon

Получить подробную информацию о FreeMarker API (создание шаблонов), можно здесь.

Для получения информации о Groovy API перейдите по этой ссылке.

Безопасность скриптов и шаблонов

DC CMS ограничивает доступ к сервисам во время разработки шаблонов или скриптов и автоматически изолирует скрипты в целях обеспечения безопасности. При создании шаблонов или скриптов разрешен только предопределенный набор сервисов. Некоторым веб-сайтам может потребоваться доступ к дополнительным сервисам, кроме предоставленных по умолчанию. Для разрешения доступа к другим сервисам обратитесь к статье "Настройка пользовательских сервисов".

Скрипты выполняются в изолированной среде (sandbox), оборудованной чёрным списком небезопасных выражений для предотвращения потенциально вредоносного кода, который может подвергнуть систему опасности. Тем не менее, конкретным сайтам может потребоваться доступ к одному или нескольким выражениям из чёрного списка.

Чтобы переопределить конфигурацию изолированной среды скрипта по умолчанию, изучите статью "Конфигурация Groovy Sandox".