zc.shortcut 1.0 - Симлинки для Zope3
Юниксоиды очень хорошо знают, что такое симлинк, и очень любят их использовать. Вот и в Zope3 появились симлинки :). В принципе, и раньше никто не мешал делать что-то подобное, но все-таки появление специального продукта - это ощутимый шаг вперед.
Комментарии:
Подробно почитать об этом продукте можно здесь: zc.shortcut, где написано много слов про особенности реализации и применения этого продукта.
Продукт zc.shortcut позволяет создать в Zope3 объект, который при просмотре сайта выглядит точно так же, как некий другой объект, который будем называть "целевой" (target) объект.
Возможности применения:
Использование различного рода ссылок позволяет строить рубрикаторы и подобные им решения, в которых объект появляется более чем в одном месте. Такой подход является разумной альтернативой построению "индексов" или использованию поискового каталога, для реализации аналогичного множественного вложения объектов, но требующих для своего обслуживания специальных страниц просмотра и навигации.
Реализация ссылок, используемая в zc.shortcut - одна из наилучших с точки зрения такого применения: за исключением небольших особенностей, ссылка при навигации действительно практически не отличима от самого объекта и не требует дополнительной разработки специальных страниц.
Способ реализации:
Реализация ссылок основана на перекрытии стандартного траверсера: при траверсе объекта с интерфейсом IShortcut, возвращается специальный прокси вокруг целевого объекта, который позволяет выполнить дальнейший траверс так, как будто это траверс целевого объекта.
Недостатки и способы их решения:
Объекты Zope3 с интерфейсом ILocation содержат атрибут __parent__, указывающий на объект, в который они вложены. Благодаря этому атрибуту выполняются различные операции, связанные с поиском контекста объекта. В случае ссылки, место, куда вложена ссылка, и место, куда вложен целевой объект, будут различаться, поэтому использование обычных инструментов может приводить к странным результатам.
Наиболее заметны некорректности в поведении absoluteURL, breadcrumbs и фабрик объектов. Для их преодоления предлагается использовать атрибуты __traversed_parent__ и __traversed_name__, создаваемые в прокси при траверсе ссылки, и созданные на этой основе аналоги упомянутых инструментов: traversedURL и другие.
На сегодняшний день это означает, что при работе с ссылками в ZMI, наблюдаются некоторые незначительные странности в поведении (к которым можно адаптироваться, если знать, почему они происходят), а разработчики, использующие zc.shortcut в своих проектах, должны реализовывать собственные скины, выполнив вышеуказанную замену инструментов.
Как это попробовать:
Продукт zc.shortcut не содержит форм добавления ссылок, поэтому придется либо написать такую форму, либо перезапустив Zope3 в режиме отладки (debugzope) ввести несколько строк в командной строке:
>>> import transaction >>> txn=transaction.get() >>> from zc.shortcut import Shortcut >>> zc=app.root()['zctest'] >>> zc['LN']['t']=Shortcut(zc['TargetT']) >>> txn.commit()
(Предполагается, что объекты zctest, zctest/LN и zctest/TargetT были созданы через ZMI).
Заключение:
В файле TODO продукта zc.shortcut заявлено о приостановке использования shortcut's до окончания разработке traversedURL и т.п. :), но можно надеяться на светлое будущее этого продукта, который, как уже говорилось выше, является наилучшей известной реализацией ссылок в Zope3.
Знакомство с исходными текстами zc.shortcut рекомендуется всем разработчикам, которые хотят лучше понять идеологию Zope3 и решения, используемые в нем.