Pull to refresh

Введение в eZ Publish на примере создания сайта

Reading time10 min
Views5K
Хотел бы привести небольшой пример создания простого сайта на системе управления контентом с открытым кодом eZ Publish. Походу дело попытаюсь рассказать достоинства, недостатки и, конечно, зачем оно такое нужно.

Введение


eZ Publish – позиционируется как Enterprise Open Source CMS. Разрабатывается компанией eZ Systems, под лицензией GNU General Public License.
Написан на PHP.
Основная фишка eZ Publish заключается в открытости, высокой масштабируемости и гибкости использования, что в данном случае обычно привлекает корпоративных клиентов и отпугивает всех остальных.

Достоинства системы

  • Открытый исходный код по свободной лицензии
  • Стабильная и безопастная система. Проблемы безопастности достаточно редки (обусловленно низкой популярностью системы?), и открытый код не только позволяет самостоятельно решать их, но и при большом желании находить новые.
  • Постоянно развивается, дополняется функциональностью, быстро решаются баги в безопастности. Есть небольшое сообщество, приемущественно консалтенговых студий, которые заинтересованы в стабильности.
  • Гибкая и неплохо масштабируемая. Что позволяет дополнять самостоятельно любой функционалностью без вреда при переходе на новую версию.
    Например, возможность установки сколько угодно большого количества сайтов на одной инсталляции. Или возможность настроить дизайн редактирования контента как только больному мозгу взбредет. т. е. совсем не обязательно пользовать стандартную админовскую панель, а можно написать свою или редактировать/добавлять контент прямо на фронтенде.
  • Удобная работа в кластере. Быстрая настройка.
  • Поддержка MySQL, PostgreSQL, Oracle.
  • Весьма функциональная система. Базовая комплектация содержит все инструменты для организации достаточно сложного сайта. Кроме встроенных фич, существуют отдельные расширения от вендора, например
    eZ Find — гибкий поисковый движок
    eZ JS Core — работа с ajax, jQuery, Yahoo! User Interface
    eZ ODF — интеграция с OpenOffice
    eZ OE — визуальный редактор WYSIWYG
    eZ Oracle — движок для СУБД Oracle
    eZ Flow — редактирование и организация дизайна фронтенда через web интерфейс.
    eZ IE — визуальный редактор картинок
    и многое другое.
  • Существует много готовых решений от сообщества также с открытым кодом и по GPL.
  • Платная поддержка со стороны вендора, который гарантирует работоспособность. Включая автоматическое обновление.
  • Простота использования. При знании системы простые сайты организовать можно достаточно быстро. Так что свое название она иногда оправдывает.

Недостатки

  • Основная проблема системы — это поиск решения проблем. Из-за иногда необоснованной сложности бывает очень трудно определить причину неполадок. Для решения даже самых простых трудностей часто требуется уйму усилий и особой квалификации, хотя и решение нередко бывает очень простым. Случалось новички бились в истерике, проклиная и саму систему и всех ее разработчиков, т. к. были не способны понять, что происходит, неговоря о том, как это починить. Даже опытные разработчики часто входят в ступор, и требуется изучение исходных кодов, чтобы определить почему оно не работает.
    Следует подчеркнуть, проблемы возникают не с самим Изи паблишем, а с его использованием. Гибкость настройки позволяет запутать даже авторов данной системы.
  • При неумелом и неаккуратном обращении с настройками рано или поздно настанет момент, когда потребуется помощь специалиста, в том числе и психиатора. Где любое незначительное действие будет приводить к весьма «странной» работе сайта.
  • Скорость работы системы оставляет желать лучшего. Ее нельзя назвать быстрой. Великое множество кошмарных запросов, чудовищная путаница в иерархии классов и взаимосвязей. При разработке сайта нужно всегда думать про производительность. Для этого опять требуется специальная квалификация и знание системы.
  • Очень требовательна к ресурсам и сложна в настройке. По этой причине так мало инсталляций на shared хостингах. Чаще всего Изи паблиш ставят на выделенных или виртуальных серверах, с возможностью самостоятельно настраивать систему, включая веб сервер, промежуточное кеширование и тд.
    Например, при неумелой организации ключей для кеша в шаблонах, размер кеша может превышать размер базы данных вомногократ. Клиенты будут сильно удивлены как они смогли за неделю набрать в кеше 100 Gb и заполнить все дисковое пространство.
  • Не существует вменяемых средств перехода на новую версию. Каждый раз апграйд нужно проводить вручную и под надзором квалифицированного разработчика. Потому что часто просто недостаточно проапграйдить базу данных и подменить код.
  • Если редактору иногда просто делать изменения в содержании сайта, то дизайнеру или верстальщику будет не совсем сладко. Шаблонный язык, спомощью которого представляются данные, больше похож на отдельный язык программирования. И требует определенного знания или навыка работы с подобными языками, что делает верстку достаточно трудоемкой задачей.

Все еще интересно? Тогда вперед к описанию. Но эксремалам новичкам рекомендую переходить сразу к практическому заданию.

Очень краткое описание


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

Контентная модель

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

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

Объекты, как и классы, могут иметь переводы на разные языки.

Шаблонизатор

Для представления любых данных используется самописный шаблонный движок eZ Template.
Шаблоны используются почти всегда, когда требуется показать какие-то данные пользователю. Например в каком виде посылать письма рассылки или как будет выглядеть редактирование атрибутов класса.

eZ Template больше язык кодирования чем просто средство представления данных. Имеет свой не сильно простой синтаксис, который похож на Smarty или Smarty похож на него (т. к. eZ Template разрабатывался еще с прошлого века).
Язык шаблонов имеет свои управляющие структуры, операторы или функции, возможность комментирования, работа с переменными и тд. Большинство этой функциональности можно расширить добавляя свои операторы, функции, что значительно упрощает работу над сайтом.

Переопределения шаблонов

Если данные не имеют своего шаблона, то соответственно данные не будут показаны.
В базовой поставке eZ Publish имеет все необходимые шаблоны, чтобы любые данные были отображены.
Для того, чтобы создать свое представление данных и не использовать некрасивый стандартный шаблон, потребуется переопределить (override) его своим.
Так как для любых данных используются шаблоны, то это позволяет создавать дизайн всего и вся на свой вкус при этом не редактируя базовые файлы инсталляции.

Кеширование

Для такого плотного использования шаблонов крайне необходимо иметь средства кеширования иначе сайт попросту будет сильно тормозить.
Существует нескольно видов кеширования:
  • Каждый шаблон компилируется в PHP (template cache)
  • Результат работы шаблона так же может быть закеширован (content view cache)
  • Кешируются специальные блоки в шаблонах (template-block cache)
  • Статическое кеширование, которое позволяет сохранять сразу всю страницу целиком (static cache)
  • Все данные, которые могут быть закешированы, тоже сохраняются в кеше, например переводы строк интерфейса, идентификаторы классов и тд.

Работа с кешами построена так, чтобы вручную чистить кеш требовалось как можно реже. Но все равно частенько требуется почистить его вручную.

Сайтаксессы

Система позволяет на одной инсталляции хостить сразу несколько сайтов.
Для этого были выдуманы сайтаксессы (siteaccess).
В сайтаксессе указываются настройки для конкретного сайта, такие как
  • Какую базу данных использовать
  • Какой дизайн для сайта выбрать
  • На каком языке
  • и тд

Настройки

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

В общем виде можно выделить несколько уровней для настроек:
  • Глобальные настройки (которые находятся в папке settings)
  • Переопределения для всего и всех сайтов (которые находятся в папке settings/override)
  • Переопределения для сайтаксессов, т.е. конкретно для сайтов (которые находятся в папке settings/siteaccess)

Расширения

В расширениях (extensions) можно как и переопределять существующий функционал, так и добавлять собственный. Именно в расширениях нужно хранить код для вашего сайта.
eZ Publish также использует ряд стандартных полезных расширений.

Модули и «хорошие»* урлы

Стоит еще упомянуть про модули и (*) nice urls.
Каждая нода имеет свой уникальный урл. Он бывает двух типов
1. nice url, который формируется исходя из имени и положения ноды в контентном дереве. Нарпимер если под объектом Folder будет объект Article, то найс урл будет /Folder/Article
2. Базовый модуль для доступа к объектам — /content/view/full/[NodeId]
Где
  • content — это модуль, фактически это просто папка
  • view — это php файл в папке модуля, в данном случае служит для отображения объекта
  • full — это параметр передающийся во view, в данном случае указывающий, что нужно отобразить шаблон для полного просмотра содержания объекта


Практическое задание


Задача: Продемонстрировать работу с Изи Паблишем на примере создания сильно упрощенной главной страницы habrahabr.ru.
А именно вывод постов на главную, которые имеют положительный рейтинг.

Так как мы люди не простые, не будем пользоваться стандартным установщиком, а попытаемся сделать все вручную, чтобы получше почувствовать всю тяжесть радость Изи Паблиша.

  1. Тут можно ознакомиться с требованием системы ez.no/eZPublish/Requirements. В общем виде это >= PHP 5.2, Apache 2, MySQL 5.
  2. Качаем eZ Publish 4.4.0
    $ wget share.ez.no/content/download/103518/477729/version/1/file/ezpublishcommunity-4.4.0-with_ezc-gpl.tar.gz
  3. Распаковываем файл
    $ tar xfz ezpublishcommunity-4.4.0-with_ezc-gpl.tar.gz
  4. Создаем новую базу данных
    mysql> create database habr default character set utf8;
  5. Инициализируем базу
    $ cd ezpublishcommunity-4.4.0-with_ezc-gpl
    mysql -uroot habr < kernel/sql/mysql/kernel_schema.sql
    mysql -uroot habr < kernel/sql/common/cleandata.sql
  6. Качаем расширение narod.ru/disk/5898167001/habr-example-ezpublish.tar.gz.html
    в корневую папку Изи Паблиша, потом устанавливаем
    $ tar xfz habr-example-ezpublish.tar.gz
  7. Инициализируем VirtualHost
    <VirtualHost habr:80>
        ServerName habr:80
        ServerAdmin root@localhost
        DocumentRoot PATH
        <Directory PATH>
           Options FollowSymLinks Indexes ExecCGI
           AllowOverride None
           Order allow,deny
           Allow from all
        </Directory>
        RewriteEngine On
        RewriteRule ^/var/[^/]+/cache/public/.* - [L]
        # For all known data directories we let Apache serve it directly
        RewriteRule ^/var/storage/.* - [L]
        RewriteRule ^/var/[^/]+/storage/.* - [L]
        RewriteRule ^/var/cache/texttoimage/.* - [L]
        RewriteRule ^/var/[^/]+/cache/texttoimage/.* - [L]
        RewriteRule ^/design/[^/]+/(stylesheets|images|javascript)/.* - [L]
        RewriteRule ^/share/icons/.* - [L]
        RewriteRule ^/extension/.* - [L]
        RewriteRule .* /index.php
    </VirtualHost>

  8. Входим в админку и добавляем русский язык
    Заходим в habr/habr_admin/content/translations и добавляем.
    User: admin
    Password: publish
  9. Создаем классы
    Мы собираемся создать на главной список постов, которые имеют рейтинг выше нуля.
    Для удобства создаем группу классов Habr.
    Добавляем тут habr/habr_admin/class/grouplist
    • Нужно создать класс Frontpage с идентификатором frontpage и с одним текстовым полем.
      - Name [Строка текста]
      Объект этого класса будет доступен по главной странице habr
      В этом объекте будут выбираться нужные нам посты.
      Для этого заходим в созданную группу Habr и нажимаем «Новый класс».
      Добавляем атрибут.
    • Также нужно хранить где-то список блогов, для этого создаем класс Blogs с идентификатором blogs, с полями:
      - Name [Строка текста]
      - Description [Текст с оформлением]
      - Ставим галку [Содержит дочерние объекты]
    • Создаем класс Blog (id: blog) соответственно для блогов с теми же полями плюс
      - Index [Вещ. Число] — будет отображать индекс блога
      - Ставим галку [Содержит дочерние объекты]
    • Каждый блог будет иметь посты, для этого создаем класс Post (id: post)
      с полями
      - Name [Строка текста]
      - Content [Текст с оформлением]
      - Tags [Ключевые слова]
      - Raiting [Целое число]
    Должен получится такой список классов:


    Все классы готовы, теперь можно приступать к организации дерева контента.
  10. Создаем главный объект
    • Заходим в «Структуру сайта» habr/habr_admin/content/view/full/2
      И создаем объект класса Frontpage
    • Выбираем язык Russian.
    • Далее запонляем поле Name текстом «Посты» и публикуем.
  11. Настройка
    Чтобы на главной странице показывался только что созданный объект, а не который по умолчанию (node 2)
    нужно отредактировать файл extension/habr/settings/siteaccess/rus/site.ini.append.php
    [SiteSettings]
    IndexPage=/content/view/full/62
    DefaultPage=/content/view/full/62
    Где 62 это нода (код узла) этого объекта.
    Убедитесь что этот йади совпадает с вашим созданным объектом.
  12. Создаем хранилище для блогов
    Соответственно на этой же странице также создаем объект класса Blogs.
  13. Создаем блоги
    Переходим в Блоги, и создаем объекты типа Blog
  14. Создаем тестовые посты
    В этих блогах создаем объекты типа Post.
    Заполняем контентом на ваше усмотрение.
    Но часть постов должно иметь рейтинг отрицательный, часть положительный, чтобы на главной по ним фильтровать.
  15. Теперь при переходе на главную страниц habr можно увидеть следующее:


Пояснения как оно работает

  1. В сеттингах установлен по умолчанию русский сайтаксесс
    settings/override/site.ini.append[SiteSettings]:DefaultAccess=rus
  2. Определили, что для сайтаксаса rus будет использован дизайн habr
    extension/habr/settings/siteaccess/rus/site.ini.append.php[DesignSettings]:SiteDesign=habr
    В папке extension/habr/design находятся папки с дизайном, в данном случае используется дизайн habr.
    Здесь же указываем язык, который будет использован, т.е. rus-RU:
    [RegionalSettings]
    Locale=rus-RU
    ContentObjectLocale=rus-RU
    ShowUntranslatedObjects=disabled
    SiteLanguageList[]=rus-RU
    SiteLanguageList[]=eng-GB
    TextTranslation=enabled
    
  3. Создали самый главный шаблон, который будет запарсен первым:
    extension/habr/design/habr/templates/pagelayout.tpl
  4. Для русской и английской части сайта переопределили шаблоны по-умолчанию для объектов класса frontpage и post.
    extension/habr/settings/siteaccess/rus/override.ini.append.php:
    [full_blog_section]
    Source=node/view/full.tpl
    # Переопределенный шаблон
    MatchFile=full/frontpage.tpl
    Subdir=templates
    # Для класса frontpage
    Match[class_identifier]=frontpage
    
    [full_post]
    Source=node/view/full.tpl
    MatchFile=full/post.tpl
    Subdir=templates
    Match[class_identifier]=post
    
    [line_post]
    Source=node/view/line.tpl
    MatchFile=line/post.tpl
    Subdir=templates
    Match[class_identifier]=post
  5. Дальше в переопределенном шаблоне для frontpage extension/habr/design/habr/override/templates/full/frontpage.tpl можем писать следующее:
    {def $node_array = fetch( content, list, 
                              hash( parent_node_id, 2,
                                    depth, 3, 
                                    offset, $view_parameters.offset,
                                    limit, 10,
                                    sort_by, array( 'published', false() ),
                                    class_filter_type, 'include',
                                    class_filter_array, array( 'post' ),
                                    attribute_filter, 
                                    array( array( 'post/raiting', '>', '0' ) ) )}
    {foreach $node_array as $node_item}
        {node_view_gui view=line content_node=$node_item}
    {/foreach}
    

    $node_array будет содержать 10 первых постов у которых рейтинг выше нуля.
    {node_view_gui view=line content_node=$node_item} — определяет, что нужно отобразить шаблон для ноды вида(view) line.
    В данном случае отобразиться шаблон
    extension/habr/design/habr/override/templates/line/post.tpl
    Для отображения только новых постов можно использовать атрибут фильтер:
    attribute_filter, array( 'and',
                             array( 'published', '>=', sub( currentdate(), 86400 ) ),
                             array( 'post/raiting', '>', '0' ) )

    Зафетчит только новые посты с рейтингом выше нуля.
  6. При переходе по ссылке поста с главной, будет использован шаблон:
    extension/habr/design/habr/override/templates/full/post.tpl

    А выглядеть будет так:


  7. Небольшое дополнение: В шаблонах используется возможность перевода строк
    {"New"|i18n( "habr" )}
    Сами переводы на русский находятся здесь:
    extension/habr/translations/rus-RU/translation.ts
    т. е. при переключении сайта на другой язык, требуется только дописать переводы в файл.


Резюме


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

ez.no — Сайт компании, которая разрабатывает eZ Publish
doc.ez.no — Онлайн документация
issues.ez.no — Баг трекер
projects.ez.no — Готовые решения от сообщества
share.ez.no — Сайт сообщества
Tags:
Hubs:
+3
Comments10

Articles