С версий 1.x на 2.0

Содержание

Теперь Elgg можно устанавливать как зависимость Composer вместо размещения в корневом каталоге документа

Это означает, что сайт на Elgg может выглядеть примерно так:

settings.php
vendor/
  elgg/
    elgg/
      engine/
        start.php
      _graphics/
        elgg_sprites.png
mod/
  blog
  bookmarks
  ...

elgg_get_root_path и $CONFIG->path будут возвращать путь к корневому каталогу приложения, который не обязательно совпадает с корневым каталогом ядра Elgg (в данном случае это vendor/elgg/elgg/).

Не пытайтесь обращаться к ядру Elgg из вашего плагина напрямую, поскольку вы не можете полагаться на его расположение в файловой системе.

В частности, не пытайтесь загружать engine/start.php.

// Don't do this!
dirname(__DIR__) . "/engine/start.php";

Для ручной загрузки Elgg можно использовать класс Elgg\Application.

// boot Elgg in mod/myplugin/foo.php
require_once dirname(dirname(__DIR__)) . '/vendor/autoload.php';
\Elgg\Application::start();

Однако используйте этот подход с осторожностью. По возможности предпочитайте Маршрутизация, так как это позволяет разделить публичные URL и структуру файловой системы.

Также не пытайтесь обращаться к файлам _graphics напрямую.

readfile(elgg_get_root_path() . "_graphics/elgg_sprites.png");

Вместо этого используйте Представления:

echo elgg_view('elgg_sprites.png');

Кэшируемые представления должны иметь расширение файла в своих именах

Это требование позволяет нам обслуживать ресурсы напрямую с диска для повышения производительности, вместо их обработки через PHP.

Это также значительно упрощает изучение доступных кэшированных ресурсов путём перехода в dataroot/views_simplecache и просмотра содержимого.

  • Неправильно: my/cool/template

  • Правильно: my/cool/template.html

Теперь мы кэшируем ресурсы по "$viewtype/$view", а не по md5("$viewtype|$view"), что может привести к конфликтам между кэшируемыми представлениями, не имеющими расширений файлов для различения файлов и каталогов.

Удалён jquery-migrate и обновлён jquery до ^2.1.4

jQuery 2.x совместим с API версии 1.x, но прекращает поддержку IE8 и ниже, которые Elgg уже давно не поддерживает.

См. http://jquery.com/upgrade-guide/1.9/ для получения информации о том, как отказаться от jquery-migrate.

Если вы предпочитаете просто добавить его обратно, вы можете использовать этот код в инициализации вашего плагина:

elgg_register_js('jquery-migrate', elgg_get_simplecache_url('jquery-migrate.js'), 'head');
elgg_load_js('jquery-migrate');

Также определите представление jquery-migrate.js, содержащее содержимое скрипта.

Представления JS и CSS были перемещены из каталогов js/ и css/

Им также были добавлены расширения .js и .css соответственно, если их ещё не было:

Старое представление

Новое представление

js/view

view.js

js/other.js

other.js

css/view

view.css

css/other.css

other.css

js/img.png

img.png

Основное преимущество этого изменения — возможность размещать связанные ресурсы вместе. Таким образом, шаблон (view.php) может иметь свои зависимости CSS/JS прямо рядом с ним (view.css, view.js).

Были приняты меры, чтобы сделать это изменение максимально обратно совместимым, поэтому вам не потребуется немедленно обновлять ссылки на представления. Тем не менее, настоятельно рекомендуется переместить ваши представления JS и CSS в их новые канонические расположения.

С практической точки зрения, это имеет несколько подводных камней:

Хуки view_vars, $view_name и view, $view_name будут работать с каноническим именем представления:

elgg_register_plugin_hook_handler('view', 'css/elgg', function($hook, $view_name) {
  assert($view_name == 'elgg.css') // not "css/elgg"
});

Использование хука view, all и проверка отдельных представлений может работать не так, как ожидалось:

elgg_register_plugin_hook_handler('view', 'all', function($hook, $view_name) {
  // Won't work because "css/elgg" was aliased to "elgg.css"
  if ($view_name == 'css/elgg') {
    // Never executed...
  }

  // Won't work because no canonical views start with css/* anymore
  if (strpos($view_name, 'css/') === 0) {
    // Never executed...
  }
});

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

Теперь для установки Elgg из исходного кода требуется fxp/composer-asset-plugin

Мы используем fxp/composer-asset-plugin для управления браузерными ресурсами (js, css, html) через Composer, но он должен быть установлен глобально перед установкой Elgg, чтобы пакеты bower-asset/* были распознаны. Для его установки выполните:

composer global require fxp/composer-asset-plugin

Если вы не сделаете это перед запуском composer install или composer create-project, вы получите сообщение об ошибке:

[InvalidArgumentException]
Package fxp/composer-asset-plugin not found

Список устаревших представлений и аргументов представлений, которые были удалены

Мы прекратили поддержку и/или удалили следующие представления:

  • canvas/layouts/*

  • categories

  • categories/view

  • core/settings/tools

  • embed/addcontentjs

  • footer/analytics (вместо этого используйте page/elements/foot)

  • groups/left_column

  • groups/right_column

  • groups/search/finishblurb

  • groups/search/startblurb

  • input/calendar (вместо этого используйте input/date)

  • input/datepicker (вместо этого используйте input/date)

  • input/pulldown (вместо этого используйте input/select)

  • invitefriends/formitems

  • js/admin (используйте AMD и elgg_require_js вместо расширения представлений JS)

  • js/initialise_elgg (используйте AMD и elgg_require_js вместо расширения представлений JS)

  • members/nav

  • metatags (вместо этого используйте хук плагина „head“, „page“)

  • navigation/topbar_tools

  • navigation/viewtype

  • notifications/subscriptions/groupsform

  • object/groupforumtopic

  • output/calendar (вместо этого используйте output/date)

  • output/confirmlink (вместо этого используйте output/url)

  • page_elements/contentwrapper

  • page/elements/shortcut_icon (вместо этого используйте хук плагина „head“, „page“)

  • page/elements/wrapper

  • profile/icon (используйте elgg_get_entity_icon)

  • river/object/groupforumtopic/create

  • settings/{plugin}/edit (вместо этого используйте plugins/{plugin}/settings)

  • user/search/finishblurb

  • user/search/startblurb

  • usersettings/{plugin}/edit (вместо этого используйте plugins/{plugin}/usersettings)

  • widgets/{handler}/view (вместо этого используйте widgets/{handler}/content)

Мы также удалили следующие аргументы представлений:

  • «value» в output/iframe (вместо этого используйте «src»)

  • «area2» и «area3» в page/elements/sidebar (вместо этого используйте «sidebar» или расширение представления)

  • «js» в представлениях иконок (например, icon/user/default)

  • «options» для input/radio и input/checkboxes, которые не являются парами ключ-значение, больше не будут приниматься.

Все скрипты перемещены в конец страницы

Вам следует тестировать ваш плагин с видимой консолью ошибок JavaScript. По соображениям производительности Elgg больше не поддерживает элементы script в элементе head или в представлениях HTML. elgg_register_js теперь будет загружать все скрипты в конце элемента body.

Вы должны преобразовать встроенные скрипты в AMD или во внешние скрипты, загружаемые с помощью elgg_load_js.

В начале страницы Elgg предоставляет заглушку функции RequireJS require(), которая просто ставит код в очередь до определения модулей AMD elgg и jQuery. Это обеспечивает простой способ преобразования многих встроенных скриптов для использования require().

Встроенный код, который завершится с ошибкой, потому что стек ещё не загружен:

<script>
$(function () {
    // code using $ and elgg
});
</script>

Это должно работать в Elgg 2.0:

<script>
require(['elgg', 'jquery'], function (elgg, $) {
    $(function () {
        // code using $ and elgg
    });
});
</script>

Форматировщик атрибутов удаляет ключи с подчёркиваниями

elgg_format_attributes() (и все API, которые его используют) теперь отфильтровывают атрибуты, имя которых содержит подчёркивание. Однако, если атрибут начинается с data-, он не будет удалён.

Обратные вызовы в запросах

Убедитесь, что для аргумента/опции «callback» в API используются только допустимые вызываемые значения.

Функции запросов теперь будут выбрасывать RuntimeException, если is_callable() возвращает false для переданного значения обратного вызова. Это включает такие функции, как elgg_get_entities(), get_data() и многие другие.

Хук плагина комментариев

Теперь плагины могут возвращать пустую строку из хука 'comments',$entity_type, чтобы переопределить представление компонента комментариев по умолчанию. Чтобы принудительно использовать компонент комментариев по умолчанию, ваш плагин должен возвращать false. Если вы использовали пустые строки для принудительного использования представления комментариев по умолчанию, вам необходимо обновить обработчики хуков, чтобы они возвращали false.

Хук разрешений контейнера

Поведение хука container_permissions_check изменилось при создании сущности: до версии 2.0 хук вызывался дважды, если контейнер сущности не был её владельцем. При первом вызове владелец сущности передавался как $params['container'], что могло запутать обработчики.

В версии 2.0, когда сущность создаётся в контейнере, таком как группа, если владелец совпадает с вошедшим пользователем (что почти всегда так), эта первая проверка обходится. Таким образом, хук container_permissions_check почти всегда будет вызываться один раз, причём $params['container'] будет правильным контейнером сущности.

Создание или удаление связи вызывает только одно событие

События отношений «create» и «delete» теперь вызываются только один раз, с "relationship" в качестве типа объекта.

Например, прослушивание событий "create", "member" или "delete", "member" больше не будет перехватывать добавление/удаление членства в группах. Используйте события "create", "relationship" или "delete", "relationship".

Функция обсуждений была выделена из групп в отдельный плагин

Подтип object, groupforumtopic заменён на подтип object, discussion. Если ваш плагин использует или изменяет старую функцию обсуждений, вам следует обновить его для использования нового подтипа.

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

Удалена функция входа через HTTPS

Для максимальной безопасности и производительности обслуживайте все страницы через HTTPS, переключив схему в wwwroot вашего сайта на https по адресу http://yoursite.tld/admin/settings/advanced

Elgg перешёл с ext/mysql на PDO MySQL

Теперь Elgg использует соединение PDO_MYSQL и больше не использует функции ext/mysql. Если вы используете функции mysql_*, неявно полагаясь на открытое соединение, они не будут работать.

Если ваш код использует одну из следующих функций, читайте ниже.

  • execute_delayed_write_query()

  • execute_delayed_read_query()

Если вы предоставляете вызываемый $handler для вызова с результатами, ваш обработчик теперь будет получать объект \Doctrine\DBAL\Driver\Statement. Ранее это был ресурс result ext/mysql.

Порядок вызова событий/хуков может измениться

При регистрации событий/хуков ключевое слово all для подстановочных сопоставлений больше не влияет на порядок вызова обработчиков. Чтобы гарантировать, что ваш обработчик будет вызван последним, вы должны назначить ему наивысший приоритет среди всех совпадающих обработчиков, или чтобы гарантировать, что ваш обработчик будет вызван первым, вы должны назначить ему наименьший приоритет среди всех совпадающих обработчиков.

Если обработчики были зарегистрированы с одинаковым приоритетом, они вызываются в порядке регистрации.

Для эмуляции прежнего поведения обработчики ядра Elgg, зарегистрированные с ключевым словом all, были повышены в приоритете. Некоторые из этих обработчиков, скорее всего, будут вызываться в другом порядке.

URL-адреса export/ больше недоступны

Elgg больше не предоставляет эту конечную точку для публикации данных ресурсов.

Иконки перенесены на Font Awesome

Спрайты Elgg и большинство классов CSS, начинающихся с elgg-icon-, были удалены.

Использование elgg_view_icon() обратно совместимо, но статический HTML, использующий классы elgg-icon, должен быть обновлён до новой разметки.

Увеличение значения z-index в классе elgg-menu-site

Значение z-index в классе elgg-menu-site было увеличено с 1 до 50, чтобы элементы страницы в области контента могли использовать свойство z-index без того, чтобы выпадающее меню сайта «More» отображалось позади этих элементов. Если ваш плагин/тема переопределяет класс elgg-menu-site или views/default/elements/navigation.css, пожалуйста, соответствующим образом скорректируйте значение z-index в вашем изменённом файле CSS.

Представление input/autocomplete

Плагины, переопределяющие представление input/autocomplete, должны будут включать исходный URL в атрибут data-source элемента ввода, требовать новый модуль AMD elgg/autocomplete и вызывать его метод init. Библиотека JavaScript 1.x elgg.autocomplete больше не используется.

Внедрена сторонняя библиотека для отправки электронной почты

Мы используем отличную библиотеку Zend\Mail для отправки электронной почты в Elgg 2.0. Вероятно, есть граничные случаи, которые библиотека обрабатывает иначе, чем Elgg 1.x. При обновлении до версии 2.0 тщательно протестируйте уведомления по электронной почте.

Элементы меток

Следующие представления получили элементы label вокруг некоторых полей ввода. Если ваш плагин/тема переопределяет эти представления, пожалуйста, проверьте наличие нового содержимого.

  • views/default/core/river/filter.php

  • views/default/forms/admin/plugins/filter.php

  • views/default/forms/admin/plugins/sort.php

  • views/default/forms/login.php

Плагин темы Aalborg

Представление page/elements/navbar теперь использует иконку Font Awesome для переключателя мобильного меню вместо изображения. Изображение bars.png и поддерживающий его CSS для рендеринга 1.12 были удалены, поэтому обновите свою тему соответствующим образом.

Плагин Likes

Объекты больше не поддерживают лайки по умолчанию. Чтобы поддержать лайки, вы можете зарегистрировать обработчик для разрешения аннотации или, что проще, зарегистрироваться на хук ["likes:is_likable", "<type>:<subtype>"] и возвращать true. Например:

elgg_register_plugin_hook_handler('likes:is_likable', 'object:mysubtype', 'Elgg\Values::getTrue');

Как и прежде, хук permissions_check:annotate по-прежнему вызывается и может использоваться для переопределения поведения по умолчанию.

Плагин сообщений

Если вы удалили или заменили функцию обработчика messages_notifier для скрытия/изменения значка входящих сообщений, вам вместо этого нужно будет сделать то же самое для обработчика меню верхней панели messages_register_topbar. messages_notifier больше не используется для добавления ссылки меню.

Сообщения больше не будут получать метаданные „msg“ для вновь созданных сообщений. Это означает, что вы не можете полагаться на существование этих метаданных.

Плагин блога

Страницы блога, отображающие списки „Мои“ или „Друзья“, были изменены для отображения всех блогов, принадлежащих пользователям (включая созданные в группах).

Плагин закладок

Страницы закладок, отображающие списки „Мои“ или „Друзья“, были изменены для отображения всех закладок, принадлежащих пользователям (включая созданные в группах).

Плагин файлов

Страницы файлов, отображающие списки „Мои“ или „Друзья“, были изменены для отображения всех файлов, принадлежащих пользователям (включая созданные в группах).

Удалённые классы

  • ElggInspector

  • Notable

  • FilePluginFile: заменить на ElggFile (или загрузить через get_entity())

Удалённые ключи, доступные через elgg_get_config()

  • allowed_ajax_views

  • dataroot_in_settings

  • externals

  • externals_map

  • i18n_loaded_from_cache

  • language_paths

  • pagesetupdone

  • registered_tag_metadata_names

  • simplecache_enabled_in_settings

  • translations

  • viewpath

  • views

  • view_path

  • viewtype

  • wordblacklist

Также обратите внимание, что плагины не должны обращаться к глобальной переменной $CONFIG, за исключением файла settings.php.

Удалённые функции

  • blog_get_page_content_friends

  • blog_get_page_content_read

  • count_unread_messages()

  • delete_entities()

  • delete_object_entity()

  • delete_user_entity()

  • elgg_get_view_location()

  • elgg_validate_action_url()

  • execute_delayed_query()

  • extend_view()

  • get_db_error()

  • get_db_link()

  • get_entities()

  • get_entities_from_access_id()

  • get_entities_from_access_collection()

  • get_entities_from_annotations()

  • get_entities_from_metadata()

  • get_entities_from_metadata_multi()

  • get_entities_from_relationship()

  • get_filetype_cloud()

  • get_library_files()

  • get_views()

  • is_ip_in_array()

  • list_entities()

  • list_entities_from_annotations()

  • list_group_search()

  • list_registered_entities()

  • list_user_search()

  • load_plugins()

  • menu_item()

  • make_register_object()

  • mysql_*(): Elgg больше не использует ext/mysql

  • remove_blacklist()

  • search_for_group()

  • search_for_object()

  • search_for_site()

  • search_for_user()

  • search_list_objects_by_name()

  • search_list_groups_by_name()

  • search_list_users_by_name()

  • set_template_handler()

  • test_ip()

Удалённые методы

  • ElggCache::set_variable()

  • ElggCache::get_variable()

  • ElggData::initialise_attributes()

  • ElggData::getObjectOwnerGUID()

  • ElggDiskFilestore::make_directory_root()

  • ElggDiskFilestore::make_file_matrix()

  • ElggDiskFilestore::user_file_matrix()

  • ElggDiskFilestore::mb_str_split()

  • ElggEntity::clearMetadata()

  • ElggEntity::clearRelationships()

  • ElggEntity::clearAnnotations()

  • ElggEntity::getOwner()

  • ElggEntity::setContainer()

  • ElggEntity::getContainer()

  • ElggEntity::getIcon()

  • ElggEntity::setIcon()

  • ElggExtender::getOwner()

  • ElggFileCache::create_file()

  • ElggObject::addToSite(): родительская функция в ElggEntity всё ещё доступна

  • ElggObject::getSites(): родительская функция в ElggEntity всё ещё доступна

  • ElggSite::getCollections()

  • ElggUser::addToSite(): родительская функция в ElggEntity всё ещё доступна

  • ElggUser::getCollections()

  • ElggUser::getOwner()

  • ElggUser::getSites(): родительская функция в ElggEntity всё ещё доступна

  • ElggUser::listFriends()

  • ElggUser::listGroups()

  • ElggUser::removeFromSite(): родительская функция в ElggEntity всё ещё доступна

Следующие аргументы также были удалены:

  • ElggSite::getMembers() - 2: $offset

  • elgg_view_entity_list() - 3: $offset - 4: $limit - 5: $full_view - 6: $list_type_toggle - 7: $pagination

Удалённые хуки плагинов

Удалённые действия

  • widgets/upgrade

Удалённые представления

  • forms/admin/plugins/change_state

Удалённые переменные представлений

Во время рендеринга система представлений больше не внедряет эти переменные в область видимости:

  • $vars['url']: замените на elgg_get_site_url()

  • $vars['user']: замените на elgg_get_logged_in_user_entity()

  • $vars['config']: используйте elgg_get_config() и elgg_set_config()

  • $CONFIG: используйте elgg_get_config() и elgg_set_config()

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

  • Устанавливайте $vars['full_view'] вместо $vars['full'].

  • Устанавливайте $vars['name'] вместо $vars['internalname'].

  • Устанавливайте $vars['id'] вместо $vars['internalid'].

Удалённые библиотеки

  • elgg:markdown: Elgg больше не предоставляет реализацию markdown. Вы должны предоставить свою собственную.

Указание представления через свойства

Метаданные $entity->view больше не указывают представление, используемое для рендеринга в elgg_view_entity().

Аналогично, свойство $annotation->view больше не оказывает влияния внутри elgg_view_annotation().

Viewtype является статичным после первоначального вызова elgg_get_viewtype()

elgg_set_viewtype() должен использоваться для установки viewtype во время выполнения. Хотя Elgg по-прежнему проверяет входной параметр view и $CONFIG->view изначально, это делается только один раз за запрос.

Устаревшие функции

Чтение или запись метаданных с ключами, начинающимися с filestore::, в объектах ElggFile объявлено устаревшим. В Elgg 3.0 эти метаданные будут удалены, если они указывают на текущий путь к корню данных, поэтому немногие файловые объекты будут их иметь. Плагины должны использовать ElggFile::setFilestore только если файлы необходимо хранить в пользовательском местоположении.

Примечание

Это не единственное устаревание в Elgg 2.0. Разработчикам плагинов следует следить за логами ошибок своего сайта.