Мы строим сайты

Наша студия профессионально занимается разработкой веб сайтов, поддержкой, и поисковым продвижением. Мы оказываем комплексные услуги по написанию специфических веб-приложений, дизайну,
3D-моделированию, изготовлению CD-визиток

Для реализации проектов мы используем новейшие достижения в области технологий разработки программного обеспечения и мультимедиа. Портфолио компании имеет ряд успешно выполненных работ

Студиявеб-дизайнаPrime
 
 

Глава 5. Общие сведения о шаблонах Plone

Вверх на один уровень

Автор перевода Филоненко Игорь

Чтобы создать страницу Plone сайта используется три технологии. На стороне сервера скрипты python и шаблоны страницы создают код HTML, который отсылается браузеру. Там, каскадные стилевые таблицы (CSS) придают окончательный вид странице. Именно две первых технологии, скрипты python и шаблоны страницы, и будут главными темами обсуждения в этой и шестой главе.

Чтобы понимать, как создавать и затем редактировать Plone шаблоны, Вы должны сначала изучить некоторые ключевые принципы и понятия. Некоторые из этих принципов являются уникальными, и хотя они обеспечивают большие преимущества, требуется некоторое время, чтобы привыкнуть к ним.

 

Начнем объяснение с публикации объекта. Выясним, как обращаться к объектам Plone. Затем разберемся с построением выражений python. Когда Вы разберетесь с этим, то фактически поймете как собираются Plone страницы. Изучив материал главы, Вы создадите новую страницу внутри вашего Plone сайта, воспользовавшись изученными методами.

Знакомство с python значительно облегчило бы изучение этой главы. Однако, на каждом этапе я буду объяснять смысл кода, так что, даже если Вы не понимаете python, то все равно все прекрасно поймете. Остальная часть книги связана с языком разметки шаблонов страниц (TALES), и сценариями python, так что Вам необходимо потратить время, чтобы познакомиться с ними в этой главе. Начало знакомству уже положено, я уже представил TALES в предыдущей главе, где он использовался для создания portlets и actions.

Понимание основных механизмов шаблонов

Прямое объяснение механизмов работы шаблонов, скорее всего только запутало бы Вас, поэтому я начну с обзора основных механизмов шаблонов. Практика показывает, что этот момент является первой сложностью при изучении Plone.

 

Уникальность Plone в том, что все в нем - объекты. Если вы незнакомы с понятием объекта, то достаточно знать, что объект - это некая сущность, которая отличается от других особыми свойствами, поведением. Каждый объект имеет методы, с помощью которых Вы можете обращаться к объекту. Например - " мышка " компьютера. " Мышка " компьютера может иметь такие методы как движение, щелчок и щелчок правой кнопкой.

В Plone, документ - объект определенного типа. Это означает то, что документ не только статический набор бит текста, напротив, он нечто немного более сложное и полезное. К примеру, документ в Plone имеет метод комментария (description), использование которого позволит получить комментарий, добавленный пользователем. Используя систему шаблонов, Вы увидите более отчетливо, что все в Plone - объект.

Начнем рассмотрение с основных принципов публикации объекта.

Общие сведения о публикации объектов

Большинство объектов Plone сайта хранится в базе данных Zope. Поэтому механизм публикации объектов Plone основан на Zope системе. Принцип более сложный в сравнении со стандартным Common Gateway Interface (CGI), где обрабатываются ряд переменных запроса и выполняется сценарий. В Plone все - объекты, все в Zope - объекты, и все в Питоне - объекты. До сих пор мы пытались избегать использовать слово объект, взамен использовались слова шаблон, сценарий и т.д., но на самом деле - все это объекты с различным поведением.

Когда Вы вводите адрес URL Plone сайта, то, по сути, вызываете объект. К примеру, если набираемый URL - /Plone/login_form, то Plone превращает URL в путь и просматривает каждый из этих объектов в базе данных. Это происходит так: сначала отыскивается объект Plone и затем объект login_form внутри объекта Plone. Поиск этого пути назван прохождение (traversal); по существу, Zope проходит по цепочке объектов и затем вызывает последний в пути.

Когда Zope вызывает объект login_form, объект выполняется в контексте. Термин контекст будет часто встречаться в Plone. Можно сказать, что контекст - это текущее окружение выполняемого объекта. В данном случае, контекстом объекта login_form является /Plone. При навигации по Plone сайту контекст постоянно изменяется. Если бы Вы ввели адрес URL /Plone/Members/login_form, то контекст будет /Plone/Members.

Доступ к объектам Plone на основе URL очень напоминает доступ к информации в файловой системе. Доступ к файлу My Portrait.jpg можно получить через папку Мои документы или можно зайти в каталог вроде c:\Documents and Setting\sandym\My Documents\My Portrait.jpg. Аналогично Вы доберетесь до объекта в Plone, войдя в Members/andy/My Portrait.jpg. Само собой, для этого Вы должны иметь на сайте ряд папок и объектов, расположенных в таком порядке:

Members
  |_ andy
     |_  My Portrait.jpg

В случае файловой системы, Вы просматриваете содержимое жесткого диска папка за папкой. В Plone тот же самый принцип; различие только в том, что и папка Members и папка andy являются объектами.

 

Следует учитывать, что имена объектов Zope и Plone чувствительны к регистру. В Windows Вы можете набрать My Portrait.jpg или my portrait.jpg. Это не происходит в Plone. Для вызова объекта, вы должны использовать точное наименование, совпадающее с идентификатором объекта (ID). По этой причине рекомендуется использовать только нижний регистр, тогда у ваших пользователей будет меньше шансов допустить ошибку.

Одним из основных в системе публикации Plone и Zope является понятие наследования. Объекты расположены внутри других объектов, которые называются контейнерами. Воспользуемся предыдущим примером, объект andy - контейнер внутри контейнера Members, внутри контейнера сайта Plonе (который в свою очередь находится внутри контейнера приложения Zope).

В стандартной объектно-ориентированной среде, объект наследует поведение от родителя. В Plone и Zope, объект также наследует поведение от контейнера. Объект просматривает иерархию контейнеров, чтобы выяснить, как получить это поведение.

Возьмем в качестве примера доступ к изображению Members/andy/My Portrait.jpg. Что, если объект My Portrait.jpg не находится в папке andy, но взамен находится выше в иерархии? Механизмы наследования Plone позволяют найти этот файл. Рассмотрим следующую иерархию:

Members
   |_ andy
   |_ My Portrait.jpg

В этом случае, если Вы ввели адрес URL Members/andy/My Portrait.jpg, Plone будет переходить к папке andy, и попытается найти My Portrait.jpg. Т.к. My Portrait.jpg отсутствует, то Plone начнет просмотр в вышележащем контейнере, которым является папка Members, найдет и отобразит My Portrait.jpg. В результате пользователь будет видеть изображение, точно так же как если бы оно было в папке andy.

Примечание переводчика: если изображение реально находится по адресу Members/andy/My Portrait.jpg, а Вы ввели адрес Members/My Portrait.jpg, то изображение найдено не будет, аналогично при введении адреса Members/igor/My Portrait.jpg, т.к. прохождение распространяется только вверх по иерархии объектов. Если какое-либо изображение должно часто отображаться на страницах сайта, достаточно поместить его в корень сайта. В этом случае изображение может быть вызвано из любого места сайта.

Если Вы сравните этот пример с более ранним, где изображение содержалось в папке andy, то сможете спросить:

  • С одной стороны, контекст - тот же самый, даже если объект находится в различном месте. Контекст основан на расположении из того, где объект назван.
  • • С другой стороны, изображение в другом месте, и контейнер My Portrait.jpg теперь другой. Это - Members, не andy.

So, what's the point of all this? Well, you can now put an object in the root of a Plone site, and any object can get to it because it's looked up through acquisition.

Так как же это работает? Контекст берется из места вызова, а наследование позволяет добраться до объекта, даже если он расположен в корне сайта. В некоторых случаях, наследование может быть усложнено, особенно при просматривании контекстной иерархии (и такая встречается). Если Вам необходимо узнать подробнее о наследовании, то Вы можете прочитать превосходное обсуждение Джима Фултона по адресу http://www.zope.org/Members/jim/Info/IPC8/AcquisitionAlgebra/index.html.

Общие сведения о выражениях в шаблонах (TALES)

Перед изучением систему шаблонов страниц Zope, Вы должны понять Template Attribute Language Expression Syntax (TALES). Часто в приложении Вы должны писать выражения, которые должны быть оценены динамически. Это не сценарии, это - простые выражения, которые могут делать что-нибудь простое и полезное в одной строке.

Выражение допускает использование ряда местных переменных. Эти переменные определены тем, что вызывает выражение. Workflow передает набор одних переменных, Zope Page Templates передает другой. Во время дальнейшего объяснения я буду использовать примеры, которые нужно рассматривать в определенном контексте. Напоминаю, что контекст определяется окружением, в котором объект был запрошен.

В предыдущих главах мы уже встречали некоторые выражения TALES, например string:$ {portal_url} / Software. Это, однако, только одно из многочисленных видов выражений. Основная область применения TALES в Zope Page Templates, которая генерирует HTML код для страниц Plone. Кроме того, выражения находят применения не только в шаблонах. Множество инструментальных средств в Plone типа actions, workflow и security используют этот синтаксис, чтобы оформить простые выражения. Существуют различные виды выражений, будем рассматривать их один за другим.

Using Path Expressions

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

context/message
context/folderA/title
context/Members/andy/My Portrait.jpg

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

Если найденный объект словарь Python, то будет возвращено соответствующее значение словаря. Если объект существует, но его невозможно вызвать, то будет возвращено некоторое текстовое значение. Если в процессе поиска происходит ошибка (например, если атрибут не существует), то начнется анализ дополнительного выражения. Дополнительное выражение необходимо отделять символом (|).

Например:

context/folderA/title|context/folderB/title

В результате будет возвращен заголовок folderA, если папка существует или заголовок folderB, если первой не существует. Процесс повторится для каждого выражения, пока они не закончатся или пока одно из них будет вычислено успешно.

Использование выражения Not

Выражение используется с префиксом not: в начале строки. Заменяет на противоположное значение выражения TALES, которое следует за префиксом. Его использование связано с отсутствием в Zope Page Templates system условного оператора. Вы можете использовать это выражение для проверки на противоположность предыдущему условию.

Например:

not: context/message|nothing

Использование выражения Nocall

По умолчанию, вызывается последний объект в пути. Чтобы предотвратить вызов используется выражение Nocall. Nocall выражение редко используется в Plone, но иногда оно необходимо. Например, Вы можете использовать его, чтобы сослаться на другой объект, но не вызывать его. Например:

nocall: context/someImage

Использование выражения String

Строковые выражения допускают одновременное присутствие текста и переменных. Все строковые выражения начинаются с префикса string: . Это полезная функция, и вы увидите, что ее использование очень удобно. Текст может содержать что-нибудь, допустимое правилами внутри атрибута, включает символы и цифры. Содержанием текста могут быть переменные со значком доллара. Примеры:

string: This is some long string
string: This is the $title

Переменная $title в последнем примере будет вычислена. Фактически, переменной может быть любое выражение пути. Если переменная содержит /, то для указания начала и конца выражения, она должна быть заключена в фигурные скобки {}.

Например:

string: This is the ${context/someImage/title}.

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

Например:

string: In $$US it costs ${context/myThing/cost}.

Использование выражений Python

Выражения Python позволяют вычислить значение строки кода Python. Все выражения Python начинаются с префикса python: и содержат одну строку.

Например:

python: 1 + 2

Код Python вычисляется с использованием той же самой модели безопасности, что и скрипты (Python), как изложено в Главе 6. По этим причинам, следует использовать простой код ограниченный функциональными возможностями отображения, вроде формирования строк и чисел или исполнения простых условий.

Почти все другие упомянутые выражения TALES могут быть вычислены с помощью выражений Python. Далее выражения:

  • path(string): вычисляет выражение пути
  • string(string): вычисляет строковое выражение
  • exists(string): вычисляет строковое выражение
  • nocall(string): вычисляет nocall выражение

Например, следующий код:

python: path('context/Members')

То же самое что и:

context/Members

Несколько функций были добавлены для удобства тестирования. Функция test использует три параметра: утверждение для вычисления, истинное и ложное условия. Утверждение вычисляется, и возвращается соответствующее значение. Например:

python: test(1 - 1, 0, 1)

Функция same_type берет две переменные и сравнивает, если они - тот же самый. Например:

python: same_type(something, '')

Иногда не советуют использовать python внутри системы шаблонов страниц Zope, потому что это означает прибавлять логику в шаблонах. Решение остается за вами. Просто спросите себя, не стала бы эта часть шаблона лучше, если вынести код python отдельно.

Book Web Site : Модификация действий

В Главе 4, Вы прибавляли действие для обращения к части программного обеспечения сайта, в результате чего появлялась новая ссылка на панели навигации. Для этого Вы добавляли в текстовое поле выражение string: ${portal_url}/Software. Эта строка станет намного понятнее теперь, когда я объясню переменную portal_url. Это – адрес URL к вашему порталу. В зависимости использования виртуального хостинга адрес может изменится. Эта строка позволяет получить текущее значение portal_url и вставляет полученное значение в строку. В результате вы всегда будете иметь абсолютную ссылку к папке Software.

Gotcha: Смешивание выражений Python и выражений шаблонов

Некоторые начинающие разработчики путают Python и скрипты. Все выражения различны. Другими словами, Вы не можете размещать пути-подобные выражения внутри выражения Python. Например, выражение python: here/Members + "/danae" не имеет смысла. В целом выражение интерпретируется как Python, так что Plone пробует делить here на Members, и вы получите ошибку. Это - идеальный случай для использования строкового выражения (который допускает использование подстановки переменной), так что переменная содержит выражение пути. Так, Вы могли использовать выражение string: ${here/Members}/danae.

Использование системы шаблонов страниц Zope (ZPT)

Теперь, когда Вы понимаете механизм публикации объекта и выражения, можно вникнуть в суть Zope Page Templates system (ZPT). ZPT – это система, которую Plone использует для генерирования HTML.

Существует множество систем генерирующих HTML, самые известные из них - JavaServer Pages, Active Server Pages и PHP. Пользователям других систем Zope Page Templates на первый взгляд кажется неудобной, но вы быстро увидите, что это - чрезвычайно мощная система.

Самый простой пример шаблона:

<p tal:content="here/message">The title</p>

Если значение message - Привет, Мир!, то такой шаблон создаст строку:

<p>Hello, World!</p>

Разберем подробно этот пример. В шаблоне строка была написана в HTML, однако содержание абзаца не текст, показанный в тегах. К открывающему тегу абзаца, был добавлен атрибут tal:content , со значением here/message. Таким образом, содержание абзаца было определено как значение переменной message (в данном случае, Привет, Мир!).

Tal – это один из элементов Template Attribute Language, который обладает диапазоном команд, включая использованную в разобранном примере команду content. Вы познакомитесь со всеми этими командами позже. Используя их, Вы можете делать почти все, что необходимо с тегами HTML. Вы можете создавать циклы, изменять теги, изменять атрибуты, удалять теги, и так далее. До запуска шаблона, он отображается как расширенный HTML (XHTML) и виден в редакторе как абзац с текстом.

Все шаблоны страницы написаны в стандарте XHTML. Это - стандарт HTML имеет характерные особенностиExtensible Markup Language (XML). Это означает, что Вы должны следовать некоторым правилам:

  • Все теги должны быть в нижнем регистре.
  • " Атрибуты должны быть всегда указаны (например, <input type="checkbox" checked="1" />).
  • " Пустые элементы должны быть закрыты (например, <br />, а не <br>).

Чтобы определять страницу как XHTML, Вы должны вставить декларацию DOCTYPE и использовать XML namespace набор в теге html. Plone использует следующую декларацию наверху каждой страницы:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

Для подробной информации относительно XHTML спецификации, посетите http://www.w3.org/TR/xhtml1/#xhtml.

Другие системы генерации HTML?

В первые несколько лет существования Web, программисты создавали код HTML вручную, что значительно увеличивало объем черновой работы. Очень быстро появились системы для генерирования HTML программно, так что программисты могли заняться более важной работой. С инструментальными средствами типа CGI модулей Perl, программисты могли писать сложный код, выполняющийся на стороне сервера и обрабатывающий содержание.

Развитие Web повлекло необходимость в упрощении процесса. Это привело к появлению массы новых языков. Эти языки использовали специальный вид разметки HTML, которая обрабатывалась, чтобы сгенерировать код. Как упомянуто выше, некоторые из наиболее популярных - Active Server Pages, JavaServer Pages, и другие языки, основанные на этой концепции, например PHP. Zope реализовал эту тенденцию используя Document Template Markup Language (DTML).

Эти системы берут HTML и разнообразят его пользовательскими тегами типа <% .. %> или <dtml-... />. Такой подход был популярен, потому что был понятен, и пользователи в общих чертах знакомые с HTML могли успешно создавать страницы. Проектировщики могли игнорировать содержание этих тегов и разрешать программистам пользоваться ими. Программисты могли изменять некоторые части кода без потери содержания.

Вместе с тем, эти системы имеют следующие проблемы:

  • " HTML шаблоны могут усложниться до масштабов, когда все добавляется к сценарию. Страницы быстро становятся огромными и сложными в управлении.
  • " Нет четкой границы между логикой и содержанием. Они могут отделяться в некоторых из этих систем, однако возможность разнообразить любой HTML частью кода программирования слишком соблазнительно проста. Часто содержание, представление, и логика образует хаос.
  • " Страницы не могут быть легко отредактированы. Встречаются страницы для изменения которых нельзя использовать редакторы, т.к. нарушается код. Визуальные редакторы могут быть настроены, чтобы не изменять некоторые теги, но они могут легко испортить другие. В больших организациях, пользователи с различными ролями все должны редактировать ту же самую страницу.
  • " В некоторых случаях сложно увидеть результат по умолчанию. Возьмем, например, запрос базы данных, который показывает результат в таблице. Как проектировщик может видеть, как бы это смотрелось без фактического управления кодом?

По этим причинам и была создана Zope Page Templates (ZPT). Шаблоны страницы используют оригинальный подход, вместо того, чтобы обеспечивать другой метод кодирования, код добавляется к существующим атрибутам тега. ZPT является свободно распространяемым открытым ресурсом. В настоящее время, версии ZPT реализовано в Python, Perl, и Java.

Основные сведения о шаблонах страниц и контента

Вы уже знаете, что Plone - система управления контентом, где пользователи прибавляют содержание к сайту с использованием Web. Внутри Plone запасены разнообразные объекты контента, которые отображаются с использованием шаблонов страницы.

Вернемся к ранее разобранному примеру доступа к изображению по адресу /Members/andy/My Portrait.jpg. Теперь будем обсуждать то, что фактически случается с содержанием в Plone. Сперва Plone находит и вызывает объект My Portrait.jpg и определяет тип объекта, потому что не указан никакой определенный метод посещаемого объекта. Когда тип контента определен, находится и вызывается определенный шаблон. Контекст для этого шаблона будет изображение, которое мы вызываем.

Если указано определенное действие, например /Members/andy/My Portrait/image_edit, то для объекта будет вызвано действие image_edit, и будет возвращен соответствующий шаблон. Более подробно это обсуждено в главе 11.

Во всех шаблонах в Plone, вы увидите here или context. Это - контекст используемого контента. В шаблоне, Вы можете теперь использовать context/something, и это будет обращение относительно вызываемого объекта, а не шаблона. Теперь Вы создадите ваш первый шаблон в Plone.

Создание Вашего первого шаблона страницы

Стандартный способ создавать шаблон страницы - через Zope интерфейс управления (ZMI). К сожалению, это означает необходимость редактировать шаблон в текстовом поле в окне браузера, ZMI также довольно неудобен, чтобы использовать его для разработки. Текстовая область обеспечивает ограниченные функциональные возможности по сравнению с большинством редакторов. Это отсутствие указания номеров строк, выделения цветом синтаксиса, и так далее. В Главе 9, я покажу Вам, как использовать внешний редактор, чтобы редактировать содержание. Возможно редактирование содержание Web контента в локальных редакторах вроде Macromedia Dreamweaver или Emacs. В Главе 6, я покажу Вам, как подготовить шаблоны страницы Plone на винчестере как архив, и аналогично Вы сможете подготовить любой контент

Чтобы создать шаблон, перейдите к ZMI, щелкните на строчке portal_skins, щелкните на строчке custom, и затем выберите Page Template в раскрывающемся списке (см. Рисунок 5-1).

3294f0501.png

Рисунок 5-1. Выбор шаблона страницы

Щелкните Add, и вы увидите страницу, показанную на рисунке 5-2.

3294f0502.png

Рисунок 5-2. Добвавление шаблона страницы

Введите test как идентификатор шаблона страницы. Затем нажмите кнопку Add and Edit , которая приведет Вас к форме редактирования (см. Рисунок 5-3). Вы можете затем редактировать этот шаблон через Web, используя текстовую область. Щелкните на кнопке Save Changes для сохранения изменений.

3294f0503.png

Рисунок 5-3. Редактирование шаблона страницы

Внимание, до Plone 2, все шаблоны страницы пропускали переменную here, которая эквивалентна context. Если Вы видите here в любом код в шаблоне страницы, это означает context. Новая переменная context была добавлена, чтобы быть средством для проверки и приведения шаблонов страницы в соответствие с объектами Script (Python).

После щелчка на Save Changes шаблон страницы будет компилироваться. Если вы допустили ошибки в шаблоне, то увидите их высвеченный наверху страницы. Рисунок 5-4 демонстрирует ошибку с не закрытым h1 тегом. (Как предварительно упомянуто, шаблоны страницы оформляются по правилам XHTML.)

3294f0504.png

Рисунок 5-4. Ошибка на шаблоне страницы

Если шаблон страницы сохранен успешно, то становится доступна вкладка Test, для отображения шаблона. На рисунке 5-5, вы увидите, что заголовок был заменен на ID шаблона, и главный абзац теперь включает ID шаблона.

3294f0505.png

Рисунок 5-5. Сгенерированная страница

Экран управления для шаблона страницы имеет также следующие важные элементы:

Title: - необязательное заглавие шаблона. Если Вы измените его, как в предыдущем примере, то после щелчка Test вы заметите изменение HTML и отображения страницы.

Content-Type: - контент тип этого шаблона, обычно text/html.

Browse HTML source: отображает необработанный шаблон как HTML. Показывает вид шаблона при загрузке в HTML редактор.

Test: обработает и отобразит шаблон.

Expand macros when editing: попытка раскрывать макросы. Я рекомендую оставить без изменений. Макрокоманды - продвинутый элемент и обсуждены в Главе 6.

Теперь, когда вы создали шаблон страницы, попробуем его изменить. Одновременно это позволит лучше понять примеры, рассмотренные в этой главе. Например, Вы в шаблоне страницы хотите добиться отображения результата сложения 1 + 2. Добавьте к шаблону строчку:

<p>1+2 = <em tal:content="python: 1+2" /></p>

Затем щелкните на вкладке Test, чтобы увидеть результат. Вы должны увидеть следующее:

1+2 = 3

Чтобы видеть пример прохождения пути, добавим логотип вашего Plone сайта. Прибавьте следующую строку к вашему шаблону страницы:

<p tal:replace="structure context/logo.jpg" />

Это создаст соответствующий HTML код для изображения и отобразит его на странице.

Основной синтаксис шаблонов страницы

Теперь, когда вы увидели, как делать шаблон страницы, я объясню основной синтаксис. Вы можете нарушать синтаксис шаблонов страницы в несколько различных компонентов, которые я освещать в следующих разделах.

Общие сведения о предопределенных переменных (Built-in Variables)

Вы видели синтаксис выражения, теперь вы познакомитесь с переменными допустимыми для использования в шаблонах. Все следующее поясняется в контексте доступа к изображению Some Image.jpg в папке Members/andy , вызванного по URL /Members/andy/Some Image.jpg

container: : контейнер, в котором расположен шаблон. В Plone это обычно папка portal_skins. Вы должны избегать использовать контейнер, потому что portal_skins может делать непредвиденные изменения значения контейнера (например, ссылка на папку andy).

context: контекст, в котором выполняется шаблон. В Plone это рассматриваемый объект, если вы отображаете портальный объект (например, ссылка на объект Some Image.jpg).

default: Некоторые атрибуты имеют значение по-умолчанию. Эта переменная является указанием на значение по-умолчанию.

here: эквивалентно context.

loop: эквивалентно to repeat.

modules: контейнер для импортированных модулей. Например, modules/string/atoi - функция atoi модуля string Python. Это включает все модули, которые безопасно импортировать в систему шаблонов страниц Zope. Для более подробной информации, см. Главу 6.

nothing: эквивалент Python None.

options: опции к шаблону, который вызван из сценария или другого метода, не через Web.

repeat: : повторенный элемент; см. tal:repeat элемент в раздел "Введение в синтаксис TAL" в этой главе.

request: запрос поступающий от клиента (все значения из поступающего запроса - используются в следующем тестовом контекстном сценарии). Все GET и POST параметры, располагаются в словаре для упрощения доступа.

*production:* следующий код - часть листинга

request/HTTP_USER_AGENT # the users browser
request/REMOTE_ADDRR # the users browser
request/someMessage   # the value of some message, in the query string

**root**: Корень Zope объекта. Например, *root/Control_Panel* дает Вам контрольную панель для Zope.

**template**: Этот вызываемый шаблон. Например, *template/id* - ID отображаемого шаблона.

**traverse_subpath**: Содержит список элементов все еще, чтобы быть пересеченным. Это - продвинутая переменная, и рекомендую понять прохождение и наследование перед использованием этого.

**user**: Текущий объект пользователь. Например, *user/getUserName* - username текущего пользователя.

**CONTEXTS**: Список большинства этих значений.

Внимание! За исключением *CONTEXTS *, любая из этих переменных может быть переопределена в *tal:define* утверждении, если есть необходимость. Однако, это затрудняет чтение кода и не рекомендуется.

Шаблон страницы test_context показывает все значения этих переменных, плюс расположение некоторых из объектов(см. Листинг 5-1). Это может быть полезно для отладки и объяснения переменных. Добавьте код в шаблон страницы, с ID test_context, и затем щелкните Test, чтобы увидеть результаты.

Листинг 5-1. test_context

<html>
  <head />
  <body>
    <h1>Debug information</h1>
  <h2>CONTEXTS</h2>
  <ul>
    <tal:block
        tal:repeat="item CONTEXTS">
    <li
        tal:condition="python: item != 'request'"
        tal:define="context CONTEXTS;">
            <b tal:content="item" />
            <span tal:replace="python: context[item]" />
    </li>
    </tal:block>
  </ul>
  <h2>REQUEST</h2>
  <p tal:replace="structure request" />
  </body>
</html>

Вы увидите следующее

3294f0506.png

Рисунок 5-6. Пример работы скрипта выдающего значение предопределеных переменных

Общие сведения о синтаксисе TAL

Template Attribute Language (TAL) обеспечивает все базовые конструктивные блоки для динамического представления. TAL определяет восемь утверждений: attributes, condition, content, define, omit-tag, on-error, repeat, and replace.

Так как шаблоны страницы оформляются по правилам XML, все TAL атрибуты должен быть в нижнем регистре. Далее, в каждом элементе может быть только одно утверждение одного и того же типа. В следующих примерах, я вставил новый, выверяет положение станка элементы чтобы увеличить удобочитаемость; это оформлено как код и совершенно общий в Plone источнике. Однако, это необязательно и не требуется.

tal:attributes: изменение значения атрибутов

Tal:attributes допускает, чтобы Вы заменили один или большее количество атрибута элемента. Утверждение содержит атрибут, который будет изменен, отделяться местом из утверждения. Например:

<a href="#"
   tal:attributes="href context/absolute_url">
   Link to here
</a>

Это изменит href атрибут связи к результату context/absolute_url. Href атрибут уже был определен на этом элементе, так, если дизайнер открывает эту страницу, то увидит имеющий силу элемент (хотя связь не может иметь смысл, пока страница не обрабатывается). В результате будет сгенерирован следующий HTML:

<a href="http://plone.org/Members/andy/book">Link to here</a>

Так как каждый элемент может иметь множество атрибутов, tal:attributes допускает, чтобы Вы изменили один или большее количество атрибутов одновременно при наличии многократных утверждений. Для изменения многих атрибутов сразу, отделяют утверждения точкой с запятой (;). Например, чтобы изменить и href и title элемента, делайте следующее:

<a href="#"
   tal:attributes="href context/absolute_url;
      title context/title_or_id">Link</a>

Результат будет такой:

<a href="http://plone.org/Members/andy/book" title="Plone Book">Link</a>

Tal:attributes и tal:replace теги взаимно исключающие, так как замена устраняет элемент. Если Zope Page Templates обнаруживает это, то появляется предупреждение, и тег tal:attributes игнорируется. Значение принимается по уполчанию. Например:

<a href="#"
    tal:attributes="href
        python:request.get('message', default)">
    Link</a>

В этом примере, вызванная функция применяется к объекту запроса. Если поступающий запрос к странице имеет переменную message, то сначала используется значение переменной, которая является message. Если переменная message не представлена, то будет использоваться значение по умолчанию. Следовательно, только при пропуске параметра сообщения будут происходить изменения.

tal:condition: проверка условия

Tal:condition утверждение допускает, чтобы условие было проверено перед отображением элемента. Например:

<p tal:condition="request/message">
    There's a message
</p>
<p tal:condition="not: request/message">
    No message
</p>

Таким образом, абзац с текстом для сообщения будет отображаться, если переменная request имеет атрибут, и результат проверки истина. Невозможно проверить условие, если нельзя проверить противоположное условие. Префикс not: инвертирует утверждение, так not: request/message равно истине, если message переменной request равно лжи.

Таким образом в TAL вычисляет как лож

  • " Число нуль
  • " Любое число с плавающей запятой или комплексное число, которое вычислено, чтобы установить на нуль (for example, 0.0)
  • " Строки нулевого характера (например, "")
  • " Пустой список
  • " Пустой словарь
  • " Python's None значение
  • " TALES нулевого значения

Следовательно, вычисляется как истина:

  • Значение по умолчанию
  • Любое число отличное от нуля
  • Строки, которые не пусты
  • "Строки с пробелами (например, " ")
  • " И так далее

Tal:content: добавление текста

Tal:content утверждение - вероятно наиболее часто используемое утверждение в шаблоне страницы. Это утверждение - одно из самых простых, производит замену содержание элемента с указанным значением. Например:

<i tal:content="context/title_or_id">Some title</i>

В результате получаем:

<i>The title</i>

Происходит замена текста Some title на значение выражения context/title_or_id. Если текст, который нужно разместить, содержит HTML элементы, эти элементы будут опущены. По умолчанию, текст, который будет заменен - HTML, опущен; префикс структуры будет допускать, чтобы HTML был введен без элементов, которые опущены. Например:

<i tal:content="structure here/title_or_id">Do not escape HTML</i>

Если элемент с tal:content атрибутами содержит другие элементы, то все те элементы будут заменены. Tal:content и tal:replace взаимно исключающие утверждения; они не могут оба размещаться на том же самом элементе, и будет отображаться ошибка, если это предпринято. Если значение - по-умолчанию, содержание не изменится.

Tal:define: определение переменных

Tal:define утверждение допускает, чтобы переменные были созданы и многократно использовались внутри шаблона. Например:

<p tal:define="title here/title_or_id">
    ... <i tal:content="title">The title</i> ...
</p>

В этом примере, переменная title создана и назначено ее значение here/title_or_id; позже переменная title используется в tal:content утверждении. По умолчанию переменная существует только локально внутри области действия текущего элемента. Так, в предыдущем примере, только элементы внутри ярлыка абзаца могут использовать переменную title. Вы можете переопределять переменную где-нибудь внутри утверждения или повторно использовать это в других элементах так часто как необходимо.

Чтобы создать глобальную переменную, Вы можете использовать префикс global. . Это откроет доступ к переменной где-нибудь внутри шаблона, не только внутри элемента определения. Например:

<p tal:define="global title string:Foo bar">
    ... <i tal:content="title">The title</i> ...
</p>
<i tal:content="title">We still have a title</i>

Кроме того, Plone определяет большое количество предопределенных глобальных переменных, чтобы пользователи могли легко использовать их в своих сценариях. Как любые такие переменные, они - подвержены изменениям, так что Вы должны использовать их осторожно. Например, чтобы получить заглавие вашего Plone участка, Вам достаточно вставить строку:

<p tal:content="portal_title" />

Вы можете находить, что они определяют в ZMI, щелкая на portal_skins, щелкая на plone_templates, и затем щелкая global_defines. Вы можете находить полный список и объяснение в Приложении A.

Tal:omit-tag: удаление тега

Tal:omit-tag довольно необычен. Он допускает удаление тега. Т.к. Zope Page Templates требует использования HTML тегов, сложные страницы могут часто нуждаться в большом количестве элементов и могут приводить к дополнительным добавляемым тегам. Это утверждения удаляет тег, оставляя только содержание тега. Например:

<p tal:omit-tag="">This is some text</p>

Результат следующий:

This is some text

В этом примере текст This is some text отображается, вместе с тем тег исчезнет. При желании, tal:omit-tag утверждение может использовать выражение как аргумент. Если значение выражение равно ложь, то tal:omit-tag не выполняет действия. Например, эта строка не делает ничего:

<p tal:omit-tag="nothing">This is some text</p>

Существующая альтернатива к использованию tal:omit-tag использование tal namespace, как обсуждено в Главе 6.

Tal:on-error: обработка ошибок

Tal:on-error утверждение обеспечивает метод обработки ошибок. Это действует подобно tal:content, потому что изменяет содержание тега, но вызывается только, когда встречается ошибка.

Пример:

<p  tal:content="request/message"
    tal:on-error="string: No message">Message</p>

Если выражение request/message будет вычислено с ошибкой, то атрибут on-error будет активизирован. Это изменяет содержание тега на текст No message.

К сожалению, утверждение on-error довольно ограничено. Тег не может различать различные ошибки и допускает только, чтобы одно выражение было оценено и использовалось. Это ограничение запланированно, чтобы тег не был многократно использован. Обработка ошибок должна быть заложена в логике вашего приложения.

Лучше всего, все выражения снабдить альтернативой в утверждении, на случай если первая часть утверждения получит результат отличающийся от истинного. Каждая альтернатива отделяется знаком (|), и многократные альтернативы могут появляться в утверждении. Если вы полагаетесь на переменные из поступающего запроса, то прибавте |nothing к концу, чтобы гарантировать, что ошибка атрибута не будет активизирована.

Например:

<p
  tal:content="request/message"
  tal:condition="request/message|nothing">
    There's a message
</p>
<p tal:condition="not: request/message|nothing">
    No message
</p>

Второй пример более подробный, но желателен по двум причинам:

  • " Разработчик увидит положительное и отрицательное условие.
  • " Вы можете заложить более сложное отображение ошибки чем печать строки.

Tal:repeat: исполняемый цикл

Tal:repeat допускает делать цикл через объекты и является одним из более сложных утверждений. Утверждение содержит значение, которое будет назначено для каждой итерации результатов, отделяться местом из результатов, являющихся повторным через.

Примет исполняемого цикла:

<table>
  <tr tal:repeat="row context/portal_catalog">
    <td tal:content="row/Title">Title</td>
  </tr>
</table>

В этом примере, выражение context/portal_catalog возвращает список результатов. Поскольку цикл начался в теге строки таблицы, то для каждой строки в списке результатов будет создана новая строка в таблице. Довольно похож tal:define, каждая итерация результатов назначена местной переменной (в этом случае, строка). Этот пример покажет одну строку на каждый пункт в списке результатов.

Вы можете получить некоторые полезные переменные из утверждения цикла, например номер текущей итерации. Вы можете получить их через переменную повторения, которая нужно добавить к namespace. Например, для получения текущего номера, Вы используете следующее:

<table>
  <tr tal:repeat="row context/portal_catalog">
    <td tal:content="repeat/row/number">1</td>
    <td tal:content="row/Title">Title</td>
  </tr>
</table>

Полный список переменных, доступных в цикле repeat

  • index*:* итеративный номер, начинающийся из нуля.
    • *number*:* итеративный номер, начинающийся с единицы.
    • *even*:* истина для четных пунктов списка (например, 0, 2, 4, ...).
    • *odd*:* истина для нечетных пунктов списка (например, 1, 3, 5, ...).
  • start*:* истина для первой итерации.
  • end*:* истина для последней итерации.
    • *length*:* общее число итераций
  • letter*:* итеративный номер как буквы нижнего регистра (например, ** z, aa ** az, ba ** bz, ..., za ** zz, aaa ** aaz, и так далее), начинающийся от одного.
    • *Letter*: верхнего регистра версия буквы
    • *roman*: номер как нижний регистр римского символа (*i, второе, iii, iv, v, и так далее), начинающийся из одного.

Два других значения доступны в цикле namespace, который является довольно необычными и редко используется. Эти две переменные допускают, чтобы Вы хранили информацию относительно данных на итерации. Используя значение, Вы испытываете недостаток хранить в выражении, Булева значение будет возвращена. Для первой переменной, истина указывает, что это первое время значение произошло на итерации. Аналогично, для второй переменной, истина указывает, что это - последний раз, значение произошла на итерации. Пример:

Пример:

<ul>
  <li tal:repeat="val context/objectValues">
    First: <i tal:content="repeat/val/first/meta_type" />,
    Last: <i tal:content="repeat/val/last/meta_type" />:
    <b tal:content="val/meta_type" />,
    <b tal:content="val/title_or_id" />
  </li>
</ul>

Tal:replace: добавление текста

Tal:replace утверждение подобно tal:content с одним отличием, устраняется теги.

Например:

<p tal:replace="context/title_or_id">Some title</p>

Это будет отображать результат выражения context/title_or_id, но устранит теги абзаца из результата. Это эквивалентно следующему:

<p
  tal:content="here/title_or_id"
  tal:omit-tag="">Some title</p>

Если элемент с tal:replace утверждением содержит другие элементы, то все те элементы будут заменены. Вы не можете использовать tal:replace утверждение с tal:attributes или tal:content; они взаимно исключающие, и будет отражена ошибка при попытке размещения обоих в тот же самый элемент.

Общие сведения о последовательности выполнения

Последовательность в которой записаны TAL атрибуты, не соответствуют последовательности их выполнения, потому что они - действительно XML элементы (XML не заботится относительно порядка атрибута). Последовательность выполнения следующая:

define condition repeat content replace attributes omit-tag Вы не можете использовать утверждения content и replace на одном элементе, потому что они взаимно исключающие. Бессмысленно использовать утверждения attributes на том же самом элементе, что и omit-tag, поскольку omit-tag удаляет атрибуты. Тег on-error в последовательность не вставлен, потому что будет использоваться, когда первая ошибка встречается в любом из предыдущих элементов.

Пример: показ информации пользователя

Для закрепления рассмотренного, вы создадите шаблон страницы, который выполняет простую задачу: показывает информации о текущем пользователе в системе.

В этом примере, компания использует Plone в локальной сети. Каждый служащий зарегистрирован в Plone и может войти в систему; однако, не имеется никакой простой страницы, которая показывает служащих или позволяет войти в контакт с ними. Вы создадите простую страницу информации о пользователе, которая показывает пользовательский адрес электронной почты, домашнюю страницу, изображение во время присутствия в системе.

Первый прототип этой страницы легко выполнен с TAL, TALES, и небольшим использованием Content Management Framework (CMF) инструментальных средств. К сожалению по причине сложности Application Programming Interfaces (APIs) для этих инструментальных средств, часть этого кода - немного больше чем может быть. Пока что не волнуйтесь слишком много относительно API этих инструментальных средств, они будут рассмотрены в Главе 9. Если Вы только берете API для предоставленного в течение момента, Вам нужно сконцентрироваться на TAL.

Сперва создайте шаблон страницы, щелкните portal_skins, щелкните custom, добавьте page template, и дайте ID user_info. Второе, вы редактируете код следующим образом. Для получения полного кода этого шаблона страницы, пожалуйста см. Приложение A. При исследовании полного списка, вы будете видеть, что шаблон начинается с тегами HTML и body.

Для удобства вы поместите главные формирования в тег div:

<div
  tal:omit-tag=""
  tal:define="
    userName request/userName|nothing;
    userObj python: here.portal_membership.getMemberById(userName);
    getPortrait nocall: here/portal_membership/getPersonalPortrait;
    getFolder nocall: here/portal_membership/getHomeFolder
    ">

В этом теге div имеется четыре части: первая получать username пославшего запрос, второй чтобы перевести это username в объект пользователя. Последний два определяет, что Вы имеете имеющую силу ссылку на методы, которые дают Вам изображения пользователя и папки; они снова удобны, потому что они делают позже более простой код. Создание тега div или другого тега типа этого, которое содержит ряд - обычная практика в системе шаблонов страниц Zope. Это просто делает фильтр кода.

Затем, Вы делаете два простых условия, чтобы проверить, что Вы имеете пользователя:

<p tal:condition="not: userName">
    No username selected.
</p>
<p tal:condition="not: userObj">
    That username does not exist.
</p>

Если никакой username не дается в запросе, то выражение request/username|nothing не приведет к userName, это nothing и следовательно недостаточно простого испытания. Далее, если username не имеет силу, userObj не приведет к Ни одному, и сообщения об ошибках будут напечатаны для обоих эти условия. Теперь вы готовы обработать пользователя:

<table tal:condition="userObj">
  <tr>
    <td>
      <img src="/about/dokumentaciya/doc/glava-5-obschie-svedeniya-o-shablonah-plone"
      tal:replace="structure python: getPortrait(userName)" />
    </td>

Так как Вы можете только показывать пользователю, если каждый найден, вы гарантируете, что имеется простое условие на этом таблице, tal:condition = "userObj". Чтобы показывать пользовательское изображение, вы используете getPortrait метод, определенный ранее. Эта функция возвращает полный тег, так что тег структуры гарантирует, что целое изображение отображается правильно. Затем, Вы испытываете необходимость показывать несколько реквизитов вроде имени и email. Добавьте код для получения домашней папки:

<li
    tal:define="home python: getFolder(userName)"
    tal:condition="home">
    <a href="/about/dokumentaciya/doc/glava-5-obschie-svedeniya-o-shablonah-plone"
        tal:attributes="href home/absolute_url"
        >Home folder</a>
</li>

Сперва, Вы используете define, чтобы получить папку и приписывать этой переменный заначение home. В Plone участке, создание домашней папки для пользователя необязательно, так что Вы должны убедиться в существовании домашней папки. Очень хорошо, из-за TAL порядка выполнения, define прибывает перед условием. После этого, Вы показываете связь к папке, используя атрибут папки absolute_url.

Шаблон страницы просматривает еще несколько линий обнаружения другой полезный и возбуждения реквизитов, чтобы показать пользователю. Как с большинством предметов в Plone, ключ находит правильные запросы API и затем производит соответствующий код.

В заключение, необходимо закрыть все открытые теги. Если все идет хорошо, Вы можете вызвать страницу, обращаясь к URL http: // yoursite/user_info?UserName=[someuser], где someuser - username который существует в вашем Plone участке.

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

Закажите веб-сайт

Сегодня веб-сайт - необходимый инструмент любой фирмы. Сайт предоставит информацию о Вашей деятельности всем пользователям всемирной сети.

Предлагаем Вам неограниченные возможности - размещайте в сети Интернет информацию о Ваших услугах, продукцию, взаимодействуйте с вашими клиентами, дилерами и удалёнными сотрудниками при помощи всемирной сети Интернет, приобретайте новых клиентов и партнеров!

Используйте интернет

Наша компания может быть полезна везде, где есть Интернет

  • Помочь Вам понять мир интернет-технологий и необходимость создания веб-представительства в сети Интернет
  • Донести самую важную информацию до Вашего рынка, клиента
  • Вызвать спрос на Ваше предложение
  • Донести Вашу индивидуальность, преимущества, полезность
  • Создать удобное в использовании веб-приложение для Ваших нужд
© 2004-2015. Магнитогорская студия веб-дизайна «Prime»