Автор: LevT
Дата сообщения: 16.07.2003 22:09
CCS и программирование, основанное на шаблонах (Template-driven coding)
CodeCharge Studio отделяет логику вашего приложения от его внешнего вида. Это и есть основное предназначение «шаблонов».
Теорминимум: Каждая страница CodeCharge Studio page состоит из файлов трех типов.
• Файл-«исходник» – тот, который оканчивается на “.ccp”.
• Файл программы, соответствующий типу открытого проекта (.asp, .aspx, .php, и т. Д.).
• Файл шаблона – файл “.html”.
Файл ccp содержит данные, которые определяют, как обрабатываются программа и шаблон html для того, чтобы вышла работающая веб-страница.
Весь исполняемый на серверной стороне код содержится в файлах программы. Файл программы создается каждый раз в среде разработки (IDE) при переходе закладку Code или на закладку Live Page, а также при публикации (Publish) страницы. Всегда создается именно одна страница кода. Если вы определяете события, создается еще одна для процедур их обработки. Еще несколько – библиотеки CCS – содержат определения общих классов и функций.
Файл html создается только один раз, тогда, когда вы создаете новую страницу в IDE. Вы можете отредактировать этот файл так, как считаете нужным, если сохраните блоки BEGIN-END – те структуры, на которые опирается CCS для корректного разбора шаблонов.
Основы шаблонов (Template Basics)
Файл html – это "шаблон", который содержит все визуальные аспекты вашей страницы. В этом html в виде теговых блоков содержится также вся логика клиентских (исполняемых броузером) скриптов. Но о размещении там серверных скриптов следует раз и навсегда забыть. Ваша программа содержится в других, не-html, файлах и чаще всего представляет собой процедуры обработки “событий”, которые размещены в файле, названном примерно так: “something_events.xxx” (xxx отражает язык серверных скриптов, избранный для вашего проекта). Размещение серверного кода внутри html создает дополнительную нагрузку на парсера шаблонов. А главное - попытка это сделать пойдет вразрез с идеологией CCS: код программы в одном месте, визуальный дизайн – в другом.
Когда вы обращаетесь к странице в «живом» режиме (“live” mode), означающем, что ваш веб-сервер действительно исполняет ее, первое, что происходит – чтение и разбор файлом программы файла шаблона. Разобранный html помещается в объект Template. Теги html (то, что содержится в парах фигурных скобок “{}”) помещаются в этот объект. Текст внутри этих ограничителей определяет имя тега. Вы можете ссылаться на эти имена из вашей программы во время ее исполнения.
Теги могут быть организованы в блоки html. Эти блоки всегда выделяются с помощью html-комментариев. Один тег представляет начало блока, а другой – его конец. В html они представлены как ” and " и называются «шаблонными блоками». Для каждой страницы существует один Template объект, содержащий весь html-код страницы и, в разобранном виде, все присутствующие там теги шаблонов. При посылке страницы клиенту вызывается метод "parse and print" объекта Template.
Страницы кода CCS
CCS поддерживает информацию о тегах и правилах их обработки, сохраняя ее в файле .ccp. Нельзя просто добавить в html “{mynewtag}” и рассчитывать получить какой-то эффект, когда законченная страница будет исполняться на сервере. Так обстоит дело до тех пор, пока не добавлен и соответствующий тегу (умеющий его интерпретировать и исполнять) программный код. Должно быть ясным, что связь между тегами в коде html и кодом в файле программы очень тесная, как и связь между файлами ccp и html. При публикации страницы шаблон html подвергается разбору и на основе содержимого файлов html и ccp генерируется соответствующая страница программного кода.
CCS реализует “события” – программные секции, которые при желании могут быть также созданы; эти события «выбрасываются» в определенных обстоятельствах во время выполнения программы. События предоставляют хорошо известный и «безопасный» способ расширения функциональности базовой страницы CCS.
Интересно, что главная страница кода может быть стерта без всякой потери информации (если, конечно, вы ее не редактировали). Каждый раз, когда CCS публикует страницу, код главного файла программы полностью пересоздается на основе информации, содержащейся в фалах ccp и html. Хотя вы имеете возможность редактировать код программы, CCS реализует определенный механизм безопасности: автоматически сгенерированные блоки кода мониторятся на предмет вносимой в них ручной правки. В случае изменения такого блока, цвет фона блока изменяется, что означает передачу управления от CCS к вам. С этого момента вы сами ответственны за все изменения этого блока программы, а CCS забывает о нем.
Старайтесь избегать редактирования блоков кода, находящихся под контролем CCS. Код в них часто требует автоматической реорганизации при изменении контента страницы html. Захватывая управления блоками без твердого понимания того, что вы делаете, вы очень легко можете испортить страницу.
Области же, которые НЕ находятся под управлением CCS, вы можете редактировать произвольно и без каких-либо ограничений. Так что если вы хотите добавить ваш собственный код (отличный от обработчика события), вы можете сделать это где угодно в файле программы. Вероятно, «лучшая практика» - это размещение вашего кода в отдельных файлах и включение их в код CCS с помощью директив "#INCLUDE". Таким образом вам будет проще использовать ваш код на других страницах и в других проектах.
Волшебство шаблонов
Блоки шаблонов и теги имеют интересную особенность. Поскольку они обрабатываются во время исполнения, вы можете во время исполнения же изменять их визуальные характеристики. Чаще всего приходится управлять видимостью, скрывая некоторые элементы, отображаемые на странице, и переопределять куски кода HTML, связанного с тем или иным элементом: вы можете, например, преобразовать Label в Textbox. Обычно это делается в событии BeforeShow элемента. Обратите внимание: изменение элемента в событии BeforeShow страницы может не привести к желаемому эффекту. Некоторые куски программы выполняются после завершения обработки события BeforeShow страницы и перед началом обработки события BeforeShow отдельных ее элементов.
Элементы Label – простые экземпляры шаблонных блоков. В HTML они даже не выделяются ограничителями BEGIN/END, хотя на странице Design они появляются в сопровождении визуальных ограничителей. Сконфигурировав надпись для отображения "html"-контента (вместо заданного по умолчанию "text") вы можете записать в эту надпись во время исполнения любой допустимый текст с разметкой html, и она будет правильно отображена на странице, наряду с кодом, заданным на этапе проектирования страницы. Благодаря этому вам доступны такие интересные приемы, как показ текстбокса при вставке новых записей, оборачивающегося надписью при их редактировании. Некоторые вещи (вроде первичных ключей) не должны изменяться вовсе. Изменяемость иных элементов зависят от разрешений, выданных системой безопасности. Иногда нужно достичь неизменяемости некоторых полей (например, первичных ключей) после того, как они были определены единожды. В других случаях возможность изменения поля может зависеть от принадлежности текущего пользователя группе обладателей соответствующих полномочий. Эту потребность удовлетворяет создание – во время выполнения страницы - надписи (label) вместо текстбокса.
Элементы включения (Include) находятся на противоположном конце спектра. Они представлены в HTML как теги вида "{}", но они включают содержимое отдельного файла в главную страницы в момент ее публикации, путем чего достигается эффект «инлайновых вставок». Элементы включения могут содержать HTML и код (как код событий, так и обычный) и, таким образом, предоставлять весьма сложные функциональные цепочки, даже целые классы и библиотеки.
Запуск двигателя
Когда элемент помещается на страницу, он получает имя, подобное "myControl". Это имя отображается на вкладке свойств (Property page) в интегрированной среде разработки. Реально в HTML вставляется тег, выглядящий примерно так: {myControl_Name}. С элементом обычно ассоциировано его значение, и это значение есть {myControl}. Эта схема именования распространяется шаблонами CCS на все виды элементов, благодаря чему упрощается разбор шаблонов и избегаются двусмысленные ситуации. Умный набор функций предоставляет оболочку над всем этим «хозяйством» в шаблонах, делая манипулирование содержащейся в них информацией довольно простым занятием. Все элементы суть объекты. Потому myControl.Value = "xyz" означает присваивание значения "xyz" свойству Value объекта. Некоторые элементы имеют свойства и методы (подобные методу Open в объекте источника данных (datasource).
Поскольку ваш код имеет дело со свойствами и методами объектов, он, в свою очередь, влияет на разобранные теги шаблона, доступные через объект Template данной страницы до тех пор, пока страница находится в процессе разработки (до того, как она отдается клиенту). Именно благодаря этому возможна реализация модели событий. Обрабатывая события, вы взаимодействуете объектом шаблона (Template), перемещая туда и оттуда данные до тех пор, пока не будет достигнуто - в разобранном виде - описание желаемой страницы. Последним действием является вызов метода template.pprint, который собирает из шаблона и его переменных тот поток HTML, который надлежит отдать броузеру. До сих пор весь код исполнялся на сервере. С этого момента будет выполняться клиентский код, если он имеется в получившемся HTML и броузер клиента умеет его обрабатывать. Это еще одна иллюстрация для понимания того, что НЕ следует включать в HTML серверный код: потому что все, что выполняется – выполняется ДО того, как из шаблонов будет сформирован «настоящий» HTML вместе с размещенным там «серверным» кодом. В результате, этот код, скорее всего, будет просто не выполнен и уйдет в броузер клиента в первозданном виде. В большинстве случаев вы вряд ли стремитесь к такому именно результату.
Мы вчерне разобрали лежащие на поверхности особенности CCS, коснулись шаблонов и программирования страниц. Поскольку CCS не скрывает от вас никакой логики, лучше всего теперь ознакомиться с содержимым общих ("Common") файлов. Именно в них содержится основная «магия», и она полностью открыта вам, вплоть до множества не документированных в справочной системе функций. Так что это серьезная причина для того, чтобы проявить к общим файлам CCS интерес.
(переведено с английского, авторский URL не помню, но при большом желании - которого у меня сейчас нет и не предвидится - можно, наверное, его восстановить. Больше там на тему CCS, по-моему, ничего нет)