вторник, 22 октября 2013 г.

Elgg

Недавно мне довелось немного поработать с движком соцсетей Elgg (писал модуль). Поскольку такие проекты мне встречаются не часто, я могу быстро забыть то, с чем мучительно разбирался при первой встрече с движком. Чтоб потом было проще въехать в суть дела, сохраню здесь общую понятую самостоятельно информацию. Всё пишу сплошным потоком (кроме копипаста с Википедии), так что возможно инфа не полная и частично где-то уже есть нечто подобное.

Общая информация


ELGG — это свободное (Open Source) программное обеспечение, доступное под лицензией GPL 2.0, платформа для построения социальных сетей любого уровня и назначения — от небольших интранет-порталов компаний, образовательных учреждений до открытых интернет-сообществ (система управления содержимым, CMS). Написан на PHP, использует JavaScript и Ajax-технологии. Для хранения информации использует в качестве хранилища базу данных MySQL. (Материал из Википедии)

Общая информация и скачать бесплатно - elgg.org. Текущая версия - 1.8.16.

Установка


Для установки следуйте инструкциям из INSTALL.txt.

Узкие места установки: нужно создать папку data/ выше корневого каталога с правами 777. То есть через http к ней попасть нельзя будет и получится примерно так:
|-public_html/
|-------------engine/
|--------------------settings.php
|-data/

Перенос


Перенос на другой сервер (или на локальный) - это задача не из легких, на этом движке - особенно. Кроме того, что ты делаешь обычно, ты должны поправить базу данных:

В таблице elgg_sites_entity поправить столбец url.
В таблице elgg_datalists изменить поля path и dataroot так, чтоб они вели от корневой директории сервера до движка и папки data/ соответственно.

Модули


Под этот движок есть множество модулей и надстроек, но многие из них, увы, платные и даже с закрытым исходным кодом. Как оказалось, некоторые бесплатные модули зависят от других бесплатных, но с закрытым кодом, а последние уже зависят от платных. В общем подбирать модули под задачу - может стать гиблым делом и не оправдать себя.

Модули размещаются в папке mod/.

Структура модуля обычно примерно такая:
|-mod/
|-----mod_name/
|--------------start.php (1)
|--------------activate.php (2)
|--------------deactivate.php (2)
|--------------manifest.xml (3)
|--------------actions/ (4)
|----------------------page_name/
|--------------------------------action_name.php
|--------------classes/ (5)
|----------------------ModName.php
|--------------graphics/ (6)
|--------------languages/ (7)
|------------------------en.php
|--------------lib/ (8)
|--------------pages/ (9)
|--------------------page_name/
|------------------------------action_name.php
|--------------views/ (10)
|--------------------default/
|----------------------------admin/ (11)
|----------------------------------admin_page_name/
|--------------------------------------------action_name.php
|--------------------forms/ (12)
|--------------------mod_name/ (13)
|--------------------object/ (14)
|---------------------------mod_name.php
|--------------------plugins/
|----------------------------mod_name/
|-------------------------------------settings.php (15)

Как видим, всё размазано по каталогу с множественно дублирующимися названиями фалов и даже кодом (что просто ад для NetBeans)…

  1. start.php - это первое, что запускается при запросе к модулю. Здесь регистрируются экшены, вьюхи и т.п.

  2. activate.php - это то, что происходит при установке модуля. deactivate.php - наоборот, при его деактивации.

  3. manifest.xml - инфа о модуле, название, автор и т.п.

  4. actions/ - в файлы этой папки посылаются POST-запросы. После обработки запроса желательно немедленно перенаправить пользователя куда-либо еще.

  5. classes/ - классы объектов

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

  7. languages/ - языки. В них $english - ассоциативный массив, ключи которого используются в elgg_echo().

  8. lib/ - дополнительные библиотеки, если надо. Я туда складывал API SDK и прочее.

  9. pages/ - то, что видит юзер для того чтоб выполнить action или после него.

  10. views/ - темплейты, хотя в них тоже часто есть довольно глубокий php.

  11. admin/ - страницы в админке.

  12. forms/ - формочки, используются в экшенах.

  13. mod_name/ - тут храним css и js файлы. Они должны иметь расширение .php. Подсказка: удобно создавать .js и .css файлы, а в .php использовать только require_once(). Но такой трюк не работает с файлами для админки из-за неотключаемого кеширования.

  14. object/ - файлы из этой папки будут отображаться, если пользователь попадет на страницу объекта (конкретно - с id объекта).

  15. settings.php - в этом файле форма для изменения настроек модуля. (форма и экшен 2 в 1).


Это первое, что необходимо понять. Остальное - смотрим по примерам модулей рядом и реализуем…

elgg_metastrings


elgg_metastrings - самая сложная и большая таблица данных в Elgg. Эта таблица строится по принципу метамодели. В ней хранятся практически все пользовательские данные и данные подключенных модулей, используется всегда уникальные ключ-значение. В таблице elgg_metadata используются ключи из этой таблицы для привязки их к объектам. Все значения уникальны. Если, например, одно и то же имя имеют два пользователя, то в таблице elgg_metastrings этому соответствует лишь одна запись (например, 3:Сергей), а в таблице elgg_metadata - две (122:3, 134:3 - будет означать, что пользователи №122 и 134 имеют имя Сергей).

Дальше должна быть ссылка на какую-то хорошую статью о метамоделях в реляционных базах данных, но увы, в полном и нужном мне для этой статьи объеме я информации не раздобыл. Самому описывать чужое не хочется, а авторы неумело выставляют свои разработки в паблик. Видимо, в команде авторов Elgg были хорошие проектировщики, а затем полнейшие бездари реализовывали код. Больше всего это проявляется как раз в некорректном использовании метамодели в новом функционале движка. Уже не первый год жду публикации статьи по теме метамоделей от одного хорошего человека, но он борется с правообладателями. =) Я говорю о метамодели, похожей на модель Тенцера (можешь погуглить самостоятельно), только модифицированный вариант. Конечно, в Elgg не совсем она, но все же лучшее описание, чем та статья, которую жду я, вряд ли когда-нибудь появится...

1 комментарий:

WpMen комментирует...

Интересно, порыться что ли? Встречал много "бесплатных" CMS систем для социальных сетей. Было бы интересно еще почитать возможности этого движка. Что он вообще умеет ? :)