Readyscript контролери

Зміст

Контролерами в ReadyScript називаються об'єкти спадкоємців класу RS :: Controller :: AbstractController. При запуску контролер виконує дію, що зазвичай має на увазі створення відповідних моделей і відображення необхідних уявлень. Дії - це методи класу контролера, назва яких починається на action. Дія, що виконується за замовчуванням у контролера називається Index. воно виконується якщо не вказано інше дію в запиті.

У ReadyScript є 2 поняття контролерів:

  • Фронт контролери. це ті, що отримують управління від маршруту відразу при відкритті певного URL. Фронт контролери відпрацьовують і формують так зване "головне вміст сторінки", яке потім зазвичай відображається в центральній зоні сторінки. Фронт контролер може вирішити, чи продовжувати рендеринг сторінки або повернути, наприклад помилку 404, або повернути потік даних, що не обертаючи їх HTML-кодом.
  • Блок контролери. запускаються в процесі рендеринга певного шаблону або сторінки, в тому порядку в якому вони розташовані в шаблоні або в Конструкторі блоків. Блок контролери відпрацьовуючи, формують якусь ділянку HTML коду сторінки. HTML код блок контролерів завжди буде лише частиною сторінки, тому що до них інші модулі, можливо вже сформували висновок і вони не можуть скасувати його.

Існують базові класи фронт і блок контролерів для клієнтської частини (frontend) і адміністраторській (backend).

Базові класи контролерів клієнтської частини розташовуються в просторі імен RS :: Controller.

При запуску контролера виконується метод exec. який перевіряє права на запуск даного контролера, і якщо прав досить, то відбувається запуск дії контролера.

Контролер перевіряє права до модуля, якому належить контролер. Права повинні бути більше або дорівнюють значенню, зазначеному у властивості $ access_right об'єкта контролера. За замовчуванням це значення дорівнює 1, тобто для запуску фронт-контролера у групи користувачів, від якої відбувається запуск, повинні бути мінімальні права доступу до відповідного модулю.

Фронт-контролери

Фронт-контролери з точки зору коду - це нащадки класу RS :: Controller :: Front. Клієнтські фронт-контролери повинні знаходитися в просторі імен ModuleName \ Controller \ Front. Мінімальний фронт-контролер виглядає наступним чином:

Рекомендується, щоб у блок-контролера можна було налаштовувати шаблон, в якому буде відображений результат. Це дозволить на одній сторінці розміщувати один і той же блок з різним відображенням. Для зручності розробників в ReadyScript предумсотрен базовий клас RS :: Controller: StandartBlock, в якому поставлено параметр indexTemplate. Більшість блок-контролерів модулів, що йдуть в комплекті з системою, є нащадками RS :: Controller: StandartBlock.

$ Controller_title = 'Свіжі новини',

$ Controller_description = 'Показує список нещодавно доданих новин';

Базові класи контролерів адміністративної частини розташовуються в просторі імен RS :: Controller :: Admin. Для адміністративної панелі також існують фронт і блок контролери. Для адміністративної частини є кілька базових класів різного призначення:

Блок-контролери в адміністративній частині також присутні. Наприклад в системі є блок модуля Фотографії. який присутній в формах різних об'єктів: Товари, Статті.

Віджет-контролери - використовуються для відображення віджетів на головній сторінці адміністративної панелі. Система автоматично розпізнає всі віджет-контролери в просторах імен: імя_модуля \ Controller \ Admin \ Widget, і дозволяє їх вивести на сторінку.

Фронт-контролери обробляють запити при відкритті розділів адміністративної частини з пунктів меню.

CRUD-контролери містять реалізацію стандартних CRUD (Create-Read-Update-Delete) дій. Більшість контролерів адміністративної частини є нащадками RS :: Controller :: Admin :: Crud.

Окремо варто сказати про CRUD контролер. Він вимагає мінімальних відомостей для ініціалізації і здатний повністю організувати адміністрування ORM об'єктів. Такий контролер має не стандартний хід виконання дії (action) на відміну від інших контролерів. Як тільки такий контролер запускається з дією, наприклад Index, він шукає метод з назва helper. тобто helperIndex. У методі повинен инициализироваться візуальний helper, який далі буде використаний для побудови елементів сторінки. Результат виконання методу helperIndex зберігається у властивості класу і доступний в подальшому за допомогою методу getHelper. Далі виконується метод actionIndex, в якому відбувається дія (завантаження даних з моделі або збереження елементів) і до результату видається шаблон, отриманий від helper'а.

Даний підхід необхідний для надання можливості іншим модулям змінювати склад візуальних елементів на сторінці. Після формування helper'a в системі і перед викликом методу з дією, викликається подія controller.exec.СОКРАЩЕННОЕ_ІМЯ_КОНТРОЛЛЕРА.ІМЯ_ДЕЙСТВІЯ. якому в якості параметра передається helper. Дана подія може бути оброблено будь-яким передплатником. Будь-обробник, наприклад, може додати свою кнопку в панелі інструментів або додати додаткову колонку в таблицю, і т.д.

Приклад простого CRUD-контролера:

У контролері також доступні наступні властивості:

Очікується, що дія контролера поверне або рядок з HTML даними, яка буде відправлена ​​в браузер, або об'єкт, що імплементують інтерфейс RS :: Controller :: Result :: IResult або RS :: Controller :: Result :: ITemplateResult.

У разі повернення об'єкта, система буде мати у своєму розпорядженні більш структурованими даними про результат виконання дії контролера. Кінцеві дані, що відправляються в браузер витягуються з об'єкта викликом методу getOutput ().

Інтерфейс IResult передбачає, що з результату можна витягти і встановити HTML частина результат за допомогою методу getHtml і setHtml. Інтерфейс ITemplateResult розширює IResult і додає можливість встановити і отримати шаблон для рендеринга за допомогою методів setTemplate і getTemplate, а також отримати змінні, які повинні бути передані в шаблон за допомогою методу getTemplateVars.

Для стандартизації частих відповідей контролера, в ReadyScript був розроблений базовий клас RS :: Controller :: Result :: Standart. Він імплементує інтерфейс ITemplateResult.

Ідея стандартизації відповідей в основному актуальна для Ajax запитів до сервера. Для масштабованості важливо, щоб сервер у відповідь на ajax запит повертатися не HTML, а JSON дані, в які можна було б дописувати необхідні секції в разі потреби в розширенні. Для одних і тих же за змістом відповідей контролера, логічно в JSON мати однакові структури даних і назви секцій. Саме це завдання вирішує клас стандартного відповіді RS :: Controller :: Result :: Standart.

Відповіді сервера, які формує стандартизовано об'єкт RS :: Controller :: Result :: Standart:

Якщо йде ajax запит, то:

  • возращается JSON, в якому HTML код результату буде повернений в секції html.

Якщо йде звичайний запит: