Есть ли способ с помощью инфраструктуры Coldbox перехватить вызов renderView и выполнить другой шаблон?

Я пытаюсь изучить Coldbox, чтобы, возможно, заменить текущий фреймворк, который я использую. Одна из функций, которые я использую в настоящее время, — это возможность переопределить любое включение шаблона по соглашению.

По сути, скажем, у меня есть представление "views/home.cfm"

<h1>I am the default theme</h1>

и это все хорошо и хорошо. Но скажем, у меня другое представление, "themes/[theme-name]/views/home.cfm"

<h1>I am the user chosen theme</h1>

которые я хочу включить условно (скажем, есть файл cookie, чтобы определить, какая тема используется). Кроме того, если файл не существует, следует отобразить представление по умолчанию/резервный вариант.

Есть ли способ сделать это, переопределяя системные функции?

Я посмотрел на перехватчики, и перехватчики preViewRender и postViewRender кажутся местом, где можно сделать что-то подобное, но, похоже, нет никакого способа манипулировать фактическим рабочим процессом. Если кажется, что это в основном предварительная/постобработка контента. Например, похоже, что нет способа «вернуть false», чтобы сообщить методу renderView, что представление фактически не отображается. Или каким-либо образом повлиять на местоположение, в котором должно быть найдено представление.

Любые идеи?


person Tyler Clendenin    schedule 06.08.2011    source источник


Ответы (2)


Тайлер,

ColdBox Framework достаточно гибок. Можно делать то, что вы хотите, но я не думаю, что изменение renderView() - лучший способ решить эту проблему, хотя вы определенно можете это сделать.

Я рекомендую вам создать определяемую пользователем функцию в файле /includes/helpers/ApplicationHelper.cfm, содержащую требуемую логику. Функции, добавленные в этот вспомогательный файл, доступны из любой точки фреймворка. Это позволит вам создать функцию с именем «renderSkin()», содержащую необходимую вам логику. RenderSkin() в конечном итоге вызовет «renderView()», когда вы, наконец, выясните, какой шаблон вы хотите отобразить для этого пользователя.

С уважением,

Аарон Гринли

person Aaron Greenlee    schedule 06.08.2011
comment
Это, вероятно, лучший / единственный ответ, но я собираюсь дать ему еще несколько дней, чтобы посмотреть, получу ли я какие-либо другие ответы, прежде чем принять. Возможно, мне следует отправить запрос функции, чтобы расширить события для ViewRender. Дело в том, что я хочу максимально придерживаться фреймворка, поэтому использование моего собственного метода кажется мне большим отклонением. - person Tyler Clendenin; 07.08.2011
comment
Метод RenderView() предназначен именно для этого. Это всего лишь структура — вам все равно нужно решать проблемы, которые уникальны для вас. Вы также можете опубликовать сообщение в группе ColdBox Google. Возможно, кто-то из других членов команды ColdBox даст другой совет. - person Aaron Greenlee; 08.08.2011

Я бы посоветовал вам использовать маршрут перехватчика, но изменить макет вместо представления.

Из перехватчика postEvent можно получить ключ processedEvent из interceptData для изменения раскладки.

В противном случае вы могли бы просто сделать чек частью страницы макета. Макет может быть оператором switch (или более объектно-ориентированным подходом), включая файлы тематического макета по мере необходимости. Это имеет то преимущество, что дает вам возможность создавать собственные точки перехвата и иметь общую функциональность (css, js).

person Paul Perigny    schedule 08.08.2011
comment
Речь идет не только о макете сайта, но и о том, что тема также может изменять представления. Например, возможность использовать неупорядоченный список вместо таблицы. Предоставление разработчикам темы возможности изменить все. - person Tyler Clendenin; 08.08.2011
comment
Затем используйте перехватчик postEvent и обновите представление, чтобы оно соответствовало вашим. Что-то вроде event.setView( theme + event.getCurrentView ); - person Paul Perigny; 08.08.2011
comment
Есть ли способ установить представление для рендеринга в событии preViewRender? - person Tyler Clendenin; 08.08.2011
comment
Глядя на плагин Render.cfc, событие preViewRender фактически вызывается в функции просмотра рендеринга. Сейчас слишком поздно менять точку зрения. (на самом деле это не очень удачное название). - person Paul Perigny; 08.08.2011