"Олег Бройтман. Zope - The Object Publishing Environment" - читать интересную книгу автора

и динамический, возникающий во время вызова метода объекта на выполнение.
Откуда именно происходит заимствование - этим управляет программист при
создании или использовании компонента.
Контекст - это стек, в котором происходит поиск атрибута. Например, если
есть контекст [object, sub2, myObject] (на вершине находится myObject), и
myObject запросил значение атрибута color, то поиск будет происходить в
глубину стека. Сначала атрибут с таким именем будет искаться в myObject,
если его там нет - поиск перейдет к sub2, потом к object.
Статический контекст - это путь от корня ZODB (ZODB, не сайта!) к
объекту в иерархии объектов. Динамический контекст - это путь (стек),
возникающий во время обхода иерархии объектов компонентом ZPublisher при
обращении к объекту через URL.
Например, если есть путь /root/object/subobject/myObject, то это и есть
статический контекст (точнее, контекстом является стек объектов
[root, object, subobject, myObject]).
Динамический контекст зависит от URL. Если произошло обращение к адресу
http://www.server/root/object/subobject/myObject, то в этом случае
динамический контекст совпадает со статическим. Но при обращении к
http://www.server/root/english/object/subobject/myObject (где english -
папка в объекте root) контекст будет другой - в стек добавится объект
english. Чтобы понять, на какое именно место englsih добавится, надо
подробно рассмотреть процесс траверса. ZPublisher сам тоже использует
механизм acquisition, так что в целом разбор адреса
http://www.server/root/english/object/subobject/myObject происходит
следующим образом.
Получив (от ZServer'а) путь /root/english/object/subobject/myObject,
ZPublisher начинает обходить отдельные части пути, строя по ходу стек.
Сначала стек пуст, затем к нему добавляется root (поиск начинается от корня
ZODB, и проверяется, что объект с таким именем есть в корне), затем
ZPublisher обнаруживает english и запрашивает его (с учетом заимствования);
объект обнаруживается в /root и попадает в стек, затем идет object, который
заимствуется не из english, а из /root, затем нормальным путем идут
subobject и myObject. В данном случае стек просто совпал с URL. Но если бы
в english был свой object, он бы заимствовался бы оттуда, а не из /root. И
если бы в этом object не было subobject, то subobject опять заимствовался
бы из /root (ели он там есть). В результате мы имели бы контекст (стек)
[/root, /root/english, /root/english/object, /root/subobject, myObject]. И
если бы myObject запросил атрибут language, отсутствующий в
/root/subobject, он получил бы его из /root/english/object, а не из
/root/object!
Таким образом, меняя порядок компонент в URL, программист может
совершенно менять вид и содержание сайта, не дублируя при этом огромные
куски кода или текста. Надо лишь произвести правильную факторизацию -
разбить код и оформление на небольшие объекты, и строить контекст (он еще
называется acquisition path - маршрут заимствования значений атрибутов).
Рассмотрим подробный пример. Два основных объекта Zope - это классы DTML
Document и DTML Method, включенные в дистрибутив Zope. Они предназначены
для разного типа использования. DTML Document хранит содержание, текст; его
путь - заимствование из статического контекста. DTML Method предназначен
для активных действий, он заимствует значения из динамического контекста.