Краткое описание пакета ng.content.article
==========================================

Пакет **ng.content.article** это базовый пакет контент-типов, моделирующих
"коллекцию статей" (откуда, собственно, и название). Контент-типы базового
пакета могут быть расширены установкой дополнительных пакетов контент-типов
(например, [name:ng.content.remotearticle], либо установкой пакета
[name:ng.content.annotation], позволяющего модифицировать контент-объекты,
динамически связывая их с аннотациями (что, упрощенно говоря, приводит к
появлению новых полей описания контента и дополнительных элементов
отображения на странице).

В базовый набор контент-типов входят
------------------------------------

    maincontainer
        Головной контейнер сайта, может быть сайт-менеджером
        и содержит ряд свойств, позволяющих разместить
        общий контент сайта (например, меню ссылок);
        
    division
        Раздел сайта, используется как контейнер с материалами,
        с которыми рекомендовано связывать статистику, rss и аналогичные
        сервисы;
        
    article 
        Собственно статья, содержащая основной (текстовый) контент,
        как и раздел, может быть использована в качестве
        контейнера с материалами (обычно вложенные статьи, приложения
        и рисунки).
                
Интерфейсы контент-типов
------------------------            

    IDocShort
        Интерфейс, содержащий краткое описание контента, используемое
        преимущественно при выводе в поиске и списке содержимого. Реализуется
        контент-типами division, maincontainer.
        
        Содержит поля:
        
        title : TextLine
            Название статьи.
            
        created : DateTime
            Дата создания.
            
        author : TextLine
            Автор статьи.
            
        isdivision : Bool
            Объект используется как раздел (при отображении
            вложенных материалов в виде одной страницы, эта 
            статья не войдет в общую страницу, а останется
            вложенным материалом).
        
        ishidden : Bool
            Объект скрывается из общего списка вложенных материалов.


    IDocShortLogo
        Содержит все поля интерфейса IDocShort и, дополнительно к ним,
        поле лого. Реализуется контент-типом article.
        
        logo : SmartImage
            Логотип, управляемый посредством продукта SmartImageCache, 
            который позволяет настроить размер логотипа в зависимости
            от места его отображения в пользовательском интерфейсе.
    
    IDocBody
        Содержит поля, позволяющие разместить основное содержимое статьи.
        Реализуется контент-типом article.
        
        body : Text
            Текстовое содержимое, обычно содержит текст в различных
            форматах, преобразование которого производится адаптерами
            продукта [name:ng.app.converter] или аналогичными.
            
        iscontent : Bool 
            Собирать содержание страницы статьи из вложенных объектов.
            В этом случае объекты не показываются в списке вложенных.
            
        interface : Interface
            Интерфейс-маркер, обуславливающий выбор адаптера для
            форматирования содержимого атрибутов статьи (в частности,
            атрибута body), адаптер предоставляется продуктом
            [name:ng.app.converter] или аналогичным.

    IMainPage
        Содержит поля, используемые главной страницей сайта:
        
        title, abstract, created, author 
            Аналогично интерфейсу IDocShort (от составных частей
            которого он их и наследует)
            
        mainiface 
            Интерфейс-маркер для выбора вида главной страницы;
            
        logo 
            Логотип, используемый на главной странце (используется
            тиражируемыми скинами);
            
    IUrlPage
        Список ссылок, отображаемых обычно в одном из главных меню
        страницы. Каждый элемент списка имеет поля:
        
        URL : URI
            Ссылка
            
        title : TextLine
            Текст под ссылкой
            
        alternative : Text
            Комментарий к ссылке
            
    IArticle 
        Специальный интерфейс контент-типа статья.
        
    IDivision
        Специальный интерфейс контент-типа раздел.

    IMainContainer
        Специальный интерфейс контент-типа "корневая папка сайта".
        
Интерфейсы, используемые для настройки продукта
-----------------------------------------------

Для настройки продукта используется концепция "интерфейсов-настройки", в
которой любой класс может быть объявлен директивой ZCML, реализующей
интерфейс настройки, после чего класс получает свойства этого интерфейса.
Пример такого объявления::

  <!- Для класса раздел -->
  <class class="ng.content.article.division.division.Division">
    <!-- разрешить вхождение в статью -->
    <implements interface="ng.content.article.article.interfaces.IArticleContent"/>
    <!-- разрешить вхождение в раздел -->
    <implements interface="ng.content.article.division.interfaces.IDivisionContent"/>
    <!-- раздел будет появляться в списке содержимого раздела -->
    <implements interface="ng.content.article.interfaces.IContentShowable"/>
    <!-- разрешить вхождение в корневой контейнер -->
    <implements interface="ng.content.article.maincontainer.interfaces.IMainContent" />
  </class>


Такое объявление должно быть размещено либо в специально созданном
продукте-сайте, как описано в статье [name:Структура Zope3 сайта.txt], или в
настройках инсталляции экземпляра Zope3: решение зависит от способа поставки
вашего продукта. Приведем список настроечных интерфейсов:
    
    IMainContent
        Компонент с таким интерфейсом может быть
        содержимым корневой папки сайта;

    IDivisionContent
        Компонент с таким интерфейсом может быть содержимым раздела;

    IArticleContent
        Компонент с таким интерфейсом может быть содержимым статьи;
        
    IContentShowable
        Компонент с таким интерфейсом будет отображаться в списке
        содержимого статьи или раздела, интерфейс имеет два дочерних
        интерфейса, IAbstractShowable и IIconShowable, позволяющих
        провести тонкую настройку способа отображения: некоторые
        реализации скинов содержат два списка содержимого, список
        аннотаций и список превью, которые используются для разных
        объектов.

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

    IContentShowable
        Компонент с таким интерфейсом будет отображаться в списке аннотаций 
        вложенных объектов, обычно его использование характерно для
        текстовых контент-объектов.

    ICommonContainer
        Во избежание появления наших контент-компонентов вне настроенной
        иерархии типов контента, заведен этот интерфейс: наши компоненты,
        как правило, могут быть вложены только в контейнер с таким
        интерфейсом. Реализованность этого интерфейса должна быть
        задекларирована для класса, который будет использоваться вместо
        MainContainer (например, Folder).

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

    IShowContainer
        Адаптер позволяет получить списко всех отображаемых
        вложенных объектов (т.е. тех объектов, которые имеют
        интерфейс IContentShowable или производный от него и для
        которых не установлен атрибут hidden).

    IPageContainer
        Адаптер позволяет получить список всех объектов, отдаваемых
        IShowContainer, за исключением объектов, у которых установлен
        атрибут isdivide, используется при одностраничном отображении
        содержимого контейнера.
    
    IContentContainer
        Адаптер позволяет получить список всех объектов, отдаваемых
        IShowContainer. В случае одностраничного отображения в список
        войдут только объекты, у которых установлен атрибут isdivide.

    IIconContainer
        Адаптер позволяет получить список всех объектов, отдаваемых
        IContentContainer, снабженных интефейсом IIconShowable. Этот
        адаптер используется для построения строки превью вложенных
        объектов.

    IAbstractContainer
        Адаптер позволяет получить список всех объектов, отдаваемых
        IContentContainer, снабженных интефейсом IAbstratShowable. Этот
        адаптер используется для построения списка аннотаций вложенных
        объектов.

Все адаптеры подготовлены для использования вместе с пейджером 
[name:ng.adapter:ng.adapter.pager]

Специальные адаптеры
--------------------

Статью можно зарегистрировать как именованную утилиту *IArticle*, в этом
случае, доступ к ней можно получить при помощи специального адаптера
*article*::

  <a href="" 
    tal:attributes="context/@@article/name/@@absolute_url"
    >Article Name</a>

Такой подход позволяет ссылатся в скине на статью расположенную в любом
месте иерархии объектов.

Заключение
----------

Использовании контент-классов ng.content.article особенно полезно в
комбинации с ng.content.abstract (позволяющим неограниченно расширять
функциональность классов) и рядом других продуктов, но и их индивидуальное
использование также обладает определенной ценностью.


### [name:литредактор]
