С 2.x на 3.0

Содержание

Теперь требуется PHP 7.0

Версия 5.6 достигает конца срока поддержки. Для установки и запуска Elgg теперь требуется PHP 7.0.

$CONFIG удалён!

Не совсем, однако вы должны проанализировать его использование и следует заменить его на elgg_get_config() и elgg_set_config(), как рекомендуется с Elgg 1.9.

Глобальная переменная $CONFIG теперь является прокси для контейнера конфигурации Elgg, и изменения завершатся ошибкой, если вы попытаетесь напрямую изменить свойства массива. Например, $CONFIG->cool_fruit[] = 'Pear';. Положительная сторона в том, что ошибки будут генерировать уведомления NOTICE.

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

  • forms/account/settings: расширение usersettings теперь может расширять представление forms/usersettings/save

  • forms/admin/site/advanced/system

  • resources/file/download

  • output/checkboxes: используйте output/tags, если хотите такое же поведение

  • input/write_access: mod/pages теперь использует хук плагина access:collections:write.

  • invitefriends/form

  • page/layouts/content: используйте page/layouts/default

  • page/layouts/one_column: используйте page/layouts/default

  • page/layouts/one_sidebar: используйте page/layouts/default

  • page/layouts/two_sidebar: используйте page/layouts/default

  • page/layouts/walled_garden: используйте page/layouts/default

  • page/layouts/walled_garden/cancel_button

  • page/layouts/two_column_left_sidebar

  • page/layouts/widgets/add_panel

  • page/elements/topbar_wrapper: обновите использование page/elements/topbar, добавив проверку на авторизованного пользователя

  • pages/icon

  • groups/group_sort_menu: используйте хук плагина register, filter:menu:groups/all

  • groups/my_status

  • groups/profile/stats

  • subscriptions/form/additions: вместо этого расширяйте notifications/settings/other

  • likes/count: изменения теперь можно вносить в элемент меню likes_count

  • likes/css: likes теперь использует elgg/likes.css

  • resources/members/index

  • messageboard/css

  • notifications/subscriptions/personal

  • notifications/subscriptions/collections

  • notifications/subscriptions/form

  • notifications/subscriptions/jsfuncs

  • notifications/subscriptions/forminternals

  • notifications/css

  • pages/input/parent

  • river/item: используйте elgg_view_river_item() для отображения элементов ленты

  • river/user/default/profileupdate

  • admin.js

  • aalborg_theme/homepage.png

  • aalborg_theme/css

  • resources/avatar/view: Используйте API иконок сущностей

  • ajax_loader.gif

  • button_background.gif

  • button_graduation.png

  • elgg_toolbar_logo.gif

  • header_shadow.png

  • powered_by_elgg_badge_drk_bckgnd.gif

  • powered_by_elgg_badge_light_bckgnd.gif

  • sidebar_background.gif

  • spacer.gif

  • toptoolbar_background.gif

  • two_sidebar_background.gif

  • ajax_loader_bw.gif: используйте graphics/ajax_loader_bw.gif

  • elgg_logo.png: используйте graphics/elgg_logo.png

  • favicon-128.png: используйте graphics/favicon-128.png

  • favicon-16.png: используйте graphics/favicon-16.png

  • favicon-32.png: используйте graphics/favicon-32.png

  • favicon-64.png: используйте graphics/favicon-64.png

  • favicon.ico: используйте graphics/favicon.ico

  • favicon.svg: используйте graphics/favicon.svg

  • friendspicker.png: используйте graphics/friendspicker.png

  • walled_garden.jpg: используйте graphics/walled_garden.jpg

  • core/friends/collection

  • core/friends/collections

  • core/friends/collectiontabs

  • core/friends/tablelist

  • core/friends/talbelistcountupdate

  • lightbox/elgg-colorbox-theme/colorbox-images/*`

  • navigation/menu/page: теперь использует navigation/menu/default и хук prepare

  • navigation/menu/site: теперь использует стандартное представление

  • page/elements/by_line: Используйте object/elements/imprint

  • forms/admin/site/advanced/security: информация о секретном ключе сайта перемещена в forms/admin/security/settings

  • river/object/file/create: см. Лента

  • river/object/page/create: см. Лента

  • river/object/page_top/create: см. Лента

  • river/relationship/member: см. Лента

  • object/page_top: используйте object/page

  • ajax/discussion/reply/edit: См. Ответы в обсуждениях перенесены в комментарии

  • discussion/replies: См. Ответы в обсуждениях перенесены в комментарии

  • object/discussion_reply: См. Ответы в обсуждениях перенесены в комментарии

  • resources/discussion/reply/edit: См. Ответы в обсуждениях перенесены в комментарии

  • resources/elements/discussion_replies: См. Ответы в обсуждениях перенесены в комментарии

  • river/elements/discussion_replies: См. Ответы в обсуждениях перенесены в комментарии

  • river/object/discussion/create

  • river/object/discussion_reply/create: См. Ответы в обсуждениях перенесены в комментарии

  • search/object/discussion_reply/entity: См. Ответы в обсуждениях перенесены в комментарии

  • rss/discussion/replies: См. Ответы в обсуждениях перенесены в комментарии

  • search/header

  • search/layout в обоих типах представлений default и rss

  • search/no_results

  • search/object/comment/entity

  • search/css: Перемещено в search/search.css

  • search/startblurb

  • bookmarks/bookmarklet.gif

  • blog_get_page_content_list

  • blog_get_page_content_archive

  • blog_get_page_content_edit

  • forms/invitefriends/invite: используйте forms/friends/invite

  • resources/invitefriends/invite: используйте resources/friends/invite

  • resources/reportedcontent/add

  • resources/reportedcontent/add_form

  • resources/site_notifications/view: Используйте resources/site_notifications/owner

  • resources/site_notifications/everyone: Используйте resources/site_notifications/all

Удалённые функции/методы

Все функции из engine/lib/deprecated-1.9.php были удалены. См. https://github.com/Elgg/Elgg/blob/2.0/engine/lib/deprecated-1.9.php для этих функций. Каждая директива @deprecated содержит инструкции по замене. Все функции из engine/lib/deprecated-1.10.php были удалены. См. https://github.com/Elgg/Elgg/blob/2.0/engine/lib/deprecated-1.10.php для этих функций. Каждая директива @deprecated содержит инструкции по замене.

  • elgg_register_library: подключайте файлы библиотек через require, чтобы они были доступны глобально для других плагинов

  • elgg_load_library

  • activity_profile_menu

  • can_write_to_container: Используйте ElggEntity->canWriteToContainer()

  • create_metadata_from_array

  • metadata_array_to_values

  • datalist_get

  • datalist_set

  • detect_extender_valuetype

  • developers_setup_menu

  • elgg_disable_metadata

  • elgg_enable_metadata

  • elgg_get_class_loader

  • elgg_get_metastring_id

  • elgg_get_metastring_map

  • elgg_register_class

  • elgg_register_classes

  • elgg_register_viewtype

  • elgg_is_registered_viewtype

  • file_delete: Используйте ElggFile->deleteIcon()

  • file_get_type_cloud

  • file_type_cloud_get_url

  • get_default_filestore

  • get_site_entity_as_row

  • get_group_entity_as_row

  • get_missing_language_keys

  • get_object_entity_as_row

  • get_user_entity_as_row

  • update_river_access_by_object

  • garbagecollector_orphaned_metastrings

  • groups_access_collection_override

  • groups_get_group_tool_options: Используйте elgg()->group_tools->all()

  • groups_join_group: Используйте ElggGroup::join

  • groups_prepare_profile_buttons: Используйте хук register, menu:title

  • groups_register_profile_buttons: Используйте хук register, menu:title

  • groups_setup_sidebar_menus

  • groups_set_icon_url

  • groups_setup_sidebar_menus

  • messages_notification_msg

  • set_default_filestore

  • generate_user_password: Используйте ElggUser::setPassword

  • row_to_elggrelationship

  • run_function_once: Используйте интерфейс Elgg\Upgrade\Batch

  • system_messages

  • notifications_plugin_pagesetup

  • elgg_format_url: Используйте elgg_format_element() или представление «output/text» для экранирования HTML.

  • get_site_by_url

  • elgg_override_permissions: Больше не используется как обработчик для хуков permissions_check и container_permissions_check

  • elgg_check_access_overrides

  • AttributeLoader устарел и был удалён

  • Application::loadSettings

  • ElggEntity::addToSite

  • ElggEntity::disableMetadata

  • ElggEntity::enableMetadata

  • ElggEntity::getSites

  • ElggEntity::removeFromSite

  • ElggEntity::isFullyLoaded

  • ElggEntity::clearAllFiles

  • ElggPlugin::getFriendlyName: Используйте ElggPlugin::getDisplayName()

  • ElggPlugin::setID

  • ElggPlugin::unsetAllUsersSettings

  • ElggFile::setFilestore: объекты ElggFile больше не могут использовать пользовательские хранилища файлов.

  • ElggFile::size: используйте getSize

  • ElggDiskFilestore::makeFileMatrix: используйте Elgg\EntityDirLocator

  • ElggData::get: обычно может быть заменено чтением свойства

  • ElggData::getClassName: используйте get_class()

  • ElggData::set: обычно может быть заменено записью в свойство

  • ElggEntity::setURL: см. getURL для получения информации о хуке плагина

  • ElggMenuBuilder::compareByWeight: используйте compareByPriority

  • ElggMenuItem::getWeight: используйте getPriority

  • ElggMenuItem::getContent: используйте elgg_view_menu_item()

  • ElggMenuItem::setWeight: используйте setPriority

  • ElggRiverItem::getPostedTime: используйте getTimePosted

  • ElggSession удалены все устаревшие методы

  • ElggSite::addEntity

  • ElggSite::addObject

  • ElggSite::addUser

  • ElggSite::getEntities: используйте elgg_get_entities()

  • ElggSite::getExportableValues: используйте toObject

  • ElggSite::getMembers: используйте elgg_get_entities()

  • ElggSite::getObjects: используйте elgg_get_entities()

  • ElggSite::listMembers: используйте elgg_list_entities()

  • ElggSite::removeEntity

  • ElggSite::removeObject

  • ElggSite::removeUser

  • ElggSite::isPublicPage: логика перенесена в маршрутизатор и не должна вызываться напрямую

  • ElggSite::checkWalledGarden: логика перенесена в маршрутизатор и не должна вызываться напрямую

  • ElggUser::countObjects: используйте elgg_get_entities()

  • Logger::getClassName: используйте get_class()

  • Elgg\Application\Database::getTablePrefix: читайте свойство prefix

  • elgg_view_access_collections()

  • ElggSession::get_ignore_access: используйте getIgnoreAccess

  • ElggSession::set_ignore_access: используйте setIgnoreAccess

  • profile_pagesetup

  • pages_can_delete_page: используйте $entity->canDelete()

  • pages_search_pages

  • pages_is_page: используйте $entity instanceof ElggPage

  • discussion_comment_override: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_can_edit_reply: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_reply_menu_setup: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_reply_container_logic_override: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_reply_container_permissions_override: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_update_reply_access_ids: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_search_discussion: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_add_to_river_menu: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_prepare_reply_notification: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_redirect_to_reply: см. Ответы в обсуждениях перенесены в комментарии

  • discussion_ecml_views_hook: см. Ответы в обсуждениях перенесены в комментарии

  • search_get_where_sql

  • search_get_ft_min_max

  • search_get_order_by_sql

  • search_consolidate_substrings

  • search_remove_ignored_words

  • search_get_highlighted_relevant_substrings

  • search_highlight_words

  • search_get_search_view

  • search_custom_types_tags_hook

  • search_tags_hook

  • search_users_hook

  • search_groups_hook

  • search_objects_hook

  • members_list_popular

  • members_list_newest

  • members_list_online

  • members_list_alpha

  • members_nav_popular

  • members_nav_newest

  • members_nav_online

  • members_nav_alpha

  • uservalidationbyemail_generate_code

Все функции, связанные с таблицей подтипов сущностей:
  • add_subtype: используйте elgg_set_entity_class во время выполнения

  • update_subtype: используйте elgg_set_entity_class во время выполнения

  • remove_subtype

  • get_subtype_id

  • get_subtype_from_id

  • get_subtype_class: используйте elgg_get_entity_class

  • get_subtype_class_from_id

Все кэши объединены в единый слой API. Следующие функции и методы были удалены:
  • is_memcache_available

  • _elgg_get_memcache

  • _elgg_invalidate_memcache_for_entity

  • ElggMemcache

  • ElggFileCache

  • ElggStaticVariableCache

  • ElggSharedMemoryCache

  • интерфейс Elgg\Cache\Pool и все расширяющие его классы

В результате изменений системного журнала:
  • system_log_default_logger: перенесено в плагин system_log

  • system_log_listener: перенесено в плагин system_log

  • system_log: перенесено в плагин system_log

  • get_system_log: переименовано в system_log_get_log и перенесено в плагин system_log

  • get_log_entry: переименовано в system_log_get_log_entry и перенесено в плагин system_log

  • get_object_from_log_entry: переименовано в system_log_get_object_from_log_entry и перенесено в плагин system_log

  • archive_log: переименовано в system_log_archive_log и перенесено в плагин system_log

  • logbrowser_user_hover_menu: переименовано в system_log_user_hover_menu и перенесено в плагин system_log

  • logrotate_archive_cron: переименовано в system_log_archive_cron и перенесено в плагин system_log

  • logrotate_delete_cron: переименовано в system_log_delete_cron и перенесено в плагин system_log

  • logrotate_get_seconds_in_period: переименовано в system_log_get_seconds_in_period и перенесено в плагин system_log

  • log_browser_delete_log: переименовано в system_log_browser_delete_log и перенесено в плагин system_log

Устаревшие API

  • ban_user: используйте ElggUser->ban()

  • create_metadata: используйте сеттер ElggEntity или ElggEntity->setMetadata()

  • update_metadata: используйте ElggMetadata->save()

  • get_metadata_url

  • create_annotation: используйте ElggEntity->annotate()

  • update_metadata: используйте ElggAnnotation->save()

  • elgg_get_user_validation_status: используйте ElggUser->isValidated()

  • make_user_admin: используйте ElggUser->makeAdmin()

  • remove_user_admin: используйте ElggUser->removeAdmin()

  • unban_user: используйте ElggUser->unban()

  • elgg_get_entities_from_attributes: используйте elgg_get_entities()

  • elgg_get_entities_from_metadata: используйте elgg_get_entities()

  • elgg_get_entities_from_relationship: используйте elgg_get_entities()

  • elgg_get_entities_from_private_settings: используйте elgg_get_entities()

  • elgg_get_entities_from_access_id: используйте elgg_get_entities()

  • elgg_list_entities_from_metadata: используйте elgg_list_entities()

  • elgg_list_entities_from_relationship: используйте elgg_list_entities()

  • elgg_list_entities_from_private_settings: используйте elgg_list_entities()

  • elgg_list_entities_from_access_id: используйте elgg_list_entities()

  • elgg_list_registered_entities: используйте elgg_list_entities()

  • elgg_batch_delete_callback

  • \Elgg\Project\Paths::sanitize: используйте \Elgg\Project\Paths::sanitize()

  • elgg_group_gatekeeper: используйте elgg_entity_gatekeeper()

  • get_entity_dates: используйте elgg_get_entity_dates()

  • messages_set_url: используйте ElggEntity::getURL()

Удалённые глобальные переменные

  • $CURRENT_SYSTEM_VIEWTYPE

  • $DEFAULT_FILE_STORE

  • $ENTITY_CACHE

  • $SESSION: используйте API, предоставляемый elgg_get_session()

  • $CONFIG->site_id: используйте 1

  • $CONFIG->search_info

  • $CONFIG->input: используйте set_input и get_input

Удалённые классы/интерфейсы

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

  • Elgg_Notifications_Notification

  • Elgg\Database\EntityTable\UserFetchResultException.php

  • Elgg\Database\MetastringsTable

  • Elgg\Database\SubtypeTable

  • Exportable и его методы export и getExportableValues: используйте toObject

  • ExportException

  • Importable и его метод import.

  • ImportException

  • ODD и все классы, начинающиеся с ODD*.

  • XmlElement

  • Elgg_Notifications_Event: используйте \Elgg\Notifications\Event

  • Elgg\Mail\Address: используйте Elgg\Email\Address

  • ElggDiscussionReply: используйте ElggComment, см. Ответы в обсуждениях перенесены в комментарии

Изменения схемы

Движок хранения для таблиц базы данных изменён с MyISAM на InnoDB. Возможно, вам потребуется оптимизировать настройки базы данных для этого изменения. Таблица datalists удалена. Все настройки из таблицы datalists были объединены в таблицу config.

Метастроки в базе данных были денормализованы для повышения производительности. Мы удалили таблицу metastrings и поместили все строковые значения непосредственно в таблицы метаданных и аннотаций. Вам необходимо обновить ваши пользовательские запросы с учётом этих изменений. Также псевдонимы таблиц msv и msn больше недоступны. Рекомендуется не полагаться на псевдонимы таблиц, используемые в запросах ядра. Если вам нужно использовать пользовательские условия, выполняйте свои собственные соединения.

Из таблицы «users_entity» удалены столбцы password и hash.

Таблица geocode_cache удалена, так как больше не использовалась.

Столбец subtype в таблице entities больше не содержит ID подтипа, а содержит строку подтипа. Таблица entity_subtypes удалена.

Столбцы type, subtype и access_id в таблице river удалены. Для запросов без использования elgg_get_river() соединяйте таблицу entities по object_guid для проверки типа и подтипа сущности. Столбец доступа не использовался уже некоторое время: запросы построены так, чтобы обеспечивать доступ ко всем трём сущностям (субъект, объект и цель).

Изменения в функциях-геттерах elgg_get_entities, elgg_get_metadata и elgg_get_annotations

elgg_get_entities теперь принимает все опции, которые ранее были распределены между elgg_get_entities_from_metadata, elgg_get_entities_from_annotations, elgg_get_entities_from_relationship, elgg_get_entities_from_private_settings и elgg_get_entities_from_access_id. Последние были объявлены устаревшими.

Передача сырых MySQL-запросов в опции объявлена устаревшей. Плагинам рекомендуется использовать замыкания, которые получают экземпляр \Elgg\Database\QueryBuilder и подготавливают запрос с использованием слоя абстракции базы данных. С одной стороны, это обеспечит правильную санитизацию всех запросов с использованием драйвера базы данных, с другой — позволит перейти к тестируемому объектно-ориентированному построению запросов.

Условия wheres не должны использовать сырые SQL-строки, вместо этого передавайте экземпляр \Elgg\Database\Clauses\WhereClause или замыкание, возвращающее экземпляр \Doctrine\DBAL\Query\Expression\CompositeExpression:

elgg_get_entities([
   'wheres' => [
        function(\Elgg\Database\QueryBuilder $qb, $alias) {
           $joined_alias = $qb->joinMetadataTable($alias, 'guid', 'status');
           return $qb->compare("$joined_alias.name", 'in', ['draft', 'unsaved_draft'], ELGG_VALUE_STRING);
        }
   ]
]);

Условия joins, order_by, group_by, selects не должны использовать сырые SQL-строки. Используйте замыкания, которые получают экземпляр \Elgg\Database\QueryBuilder и возвращают подготовленный запрос.

Опция reverse_order_by удалена.

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

Обратите внимание, что весь приватный API, связанный с построением сырых SQL-строк, также был удалён. Если вы полагались на них в своих плагинах, имейте в виду, что всё, что помечено как @access private или @internal в ядре, может быть изменено или удалено в любое время, и мы не гарантируем обратной совместимости для этих функций. НЕ ИСПОЛЬЗУЙТЕ ИХ. Если вы обнаружите, что вам необходимо их использовать, откройте задачу на Github, и мы рассмотрим возможность добавления публичного эквивалента.

Булевы свойства сущностей

Хранение значений метаданных, аннотаций и приватных настроек приведено к единому формату.

Булевы значения приводятся к целым числам при сохранении: false сохраняется как 0, а true сохраняется как 1. Это имеет критические последствия для приватных настроек, которые ранее сохранялись как пустые строки для значений false. Плагинам следует написать собственные скрипты миграции для изменения значений в БД с пустых строк на 0 (для приватных настроек, которые предположительно хранят булевы значения), чтобы elgg_get_entities() мог извлекать эти значения с private_setting_name_value_pairs, содержащими значения false. Это относится как к настройкам плагинов, так и к любым приватным настройкам, добавленным к сущностям.

Изменения метаданных

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

Не читайте и не записывайте в свойство access_id объектов ElggMetadata.

Метаданные больше не могут быть включены или отключены. Вы больше не можете выполнять вызовы API enable и disable для метаданных.

Метаданные больше не имеют owner_guid. Больше невозможно выполнять запросы метаданных на основе owner_guids. Соответственно, ElggMetadata::canEdit() всегда будет возвращать true независимо от вошедшего пользователя, если это не переопределено явно хуком плагина.

Права доступа и доступ

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

  • права проверяются для пользователя-администратора

  • права проверяются при игнорировании доступа с помощью elgg_set_ignore_access()

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

elgg_check_access_overrides() удалена, так как плагинам больше не нужно проверять переопределения доступа.

Переводы для уровней доступа Elgg по умолчанию имеют новые ключи перевода.

Изменения, связанные с множественными сайтами

В Elgg до версии 3.0 была частичная поддержка наличия нескольких сайтов в одной базе данных. Концепция множественных сайтов полностью удалена в версии 3.0. Сущности больше не имеют атрибута site_guid. Это означает, что больше нет возможности иметь сущности на разных сайтах. Если в вашей базе данных в настоящее время есть несколько сайтов, обновление Elgg до версии 3.0 завершится ошибкой. Вам необходимо разделить разные сайты на отдельные базы данных/таблицы.

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

Установка ElggSite::$url не имеет эффекта. Чтение URL сайта всегда выполняется из $CONFIG->wwwroot, установленного в settings.php, или вычисляется через Symfony Request.

ElggSite::save() завершится ошибкой, если это не основной сайт.

Изменения подтаблиц сущностей

Подтаблица sites_entity для ElggSite больше не существует. Все атрибуты перенесены в метаданные. Подтаблица groups_entity для ElggGroup больше не существует. Все атрибуты перенесены в метаданные. Подтаблица objects_entity для ElggObject больше не существует. Все атрибуты перенесены в метаданные. Подтаблица users_entity для ElggUser больше не существует. Все атрибуты перенесены в метаданные.

Если у вас есть пользовательские запросы, ссылающиеся на эту таблицу, вам необходимо их обновить. Если у вас есть функции, которые полагаются на Entity->getOriginalAttributes(), имейте в виду, что теперь это будет возвращать только базовые атрибуты ElggEntity и больше не будет содержать вторичные атрибуты.

Друзья и коллекции доступа групп

Таблица коллекций доступа теперь имеет столбец подтипа. Эти дополнительные данные помогают определить назначение коллекции доступа. Коллекции доступа, принадлежащие пользователям, предполагаются используемыми как коллекции друзей и теперь имеют подтип „friends_collection“. Информация о коллекциях доступа групп ранее хранилась в метаданных group_acl. С введением подтипа коллекции доступа эта информация перенесена в атрибут подтипа коллекции доступа.

access_id ACCESS_FRIENDS был мигрирован в фактическую коллекцию доступа (с подтипом friends). Все сущности и аннотации обновлены для использования нового ID коллекции доступа. Коллекция доступа создаётся при создании пользователя. При создании отношения типа friends соответствующий guid также будет добавлен в коллекцию доступа. Вы больше не можете сохранять или обновлять сущности с access_id ACCESS_FRIENDS.

Подтипы больше не имеют ID

Подтипы сущностей денормализованы. Таблица entity_subtypes удалена, а столбец subtype в таблице сущностей просто содержит строковое представление подтипа.

Соответственно, весь API, связанный с добавлением/обновлением подтипов и классов сущностей, удалён.

Плагины теперь могут использовать elgg_set_entity_class() и elgg_get_entity_class() для регистрации пользовательского класса сущности во время выполнения (например, в обработчике инициализации системы).

Все сущности теперь ОБЯЗАНЫ иметь подтип. По умолчанию добавлены и зарезервированы следующие подтипы:

  • user для пользователей

  • group для групп

  • site для сайтов

Загрузка пользовательских классов

Elgg больше не предоставляет функции API для регистрации пользовательских классов. Если вам нужны пользовательские классы, вы можете использовать классы PSR-0 в папке /classes вашего плагина или использовать composer для автозагрузки дополнительных классов.

Следующие функции, связанные с регистрацией классов, удалены:

  • elgg_get_class_loader

  • elgg_register_class

  • elgg_register_classes

Контейнер внедрения зависимостей

Плагины теперь могут определять свои сервисы и прикреплять их к публичному контейнеру внедрения зависимостей (DI) Elgg, предоставляя определения в файле elgg-services.php в корне директории плагина.

elgg() больше не возвращает экземпляр приложения Elgg, а возвращает экземпляр контейнера внедрения зависимостей.

Изменения поиска

Мы добавили сервис поиска в ядро, в результате чего плагин search теперь предоставляет только пользовательский интерфейс для отображения форм и списков результатов поиска. Многие представления в плагине поиска затронуты этим изменением.

Индексы FULLTEXT удалены из различных таблиц. Плагин поиска теперь всегда будет использовать LIKE-запрос при выполнении поиска.

См. документацию Search Service и Search hooks для получения подробной информации о новых возможностях поиска.

Изменения меню сущностей и ленты

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

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

elgg_register_library и elgg_load_library удалены. Эти функции мало влияли на производительность (особенно при включённом OPCache) и затрудняли работу других плагинов с API, содержащимися в библиотеках. Кроме того, разработчикам было сложно узнать, что API содержатся в библиотеке, при автодополнении в IDE.

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

Удалённые обработчики страниц

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

Изменения наследования

  • ElggData (и, следовательно, большинство доменных объектов Elgg) больше не реализует Exportable

  • ElggEntity больше не реализует Importable

  • ElggGroup больше не реализует Friendable

  • ElggRelationship больше не реализует Importable

  • ElggSession больше не реализует ArrayAccess

  • Elgg\Application\Database больше не наследует Elgg\Database

Удалённые JavaScript API

  • admin.js

  • elgg.widgets: Используйте модуль elgg/widgets. Макеты «widgets» подключают этот модуль автоматически

  • lightbox.js: Используйте модуль elgg/lightbox при необходимости

  • lightbox/settings.js: Используйте хук JS getOptions, ui.lightbox или атрибут data-colorbox-opts

  • elgg.ui.popupClose: Используйте модуль elgg/popup

  • elgg.ui.popupOpen: Используйте модуль elgg/popup

  • elgg.ui.initAccessInputs

  • elgg.ui.river

  • elgg.ui.initDatePicker: Используйте модуль input/date

  • elgg.ui.likesPopupHandler

  • elgg.embed: Используйте модуль elgg/embed

  • elgg.discussion: Используйте модуль elgg/discussion

  • embed/custom_insert_js: Используйте хук JS embed, editor

  • elgg/ckeditor.js: заменён на elgg-ckeditor.js

  • elgg/ckeditor/set-basepath.js

  • elgg/ckeditor/insert.js

  • jQuery.cookie: Используйте elgg.session.cookie

  • jquery.jeditable

  • likes.js: Модуль elgg/likes загружается автоматически

  • messageboard.js

  • elgg.autocomplete больше не определён.

  • elgg.messageboard больше не определён.

  • jQuery.fn.friendsPicker

  • elgg.ui.toggleMenu больше не определён

  • elgg.ui.toggleMenuItems: Используйте атрибут data-toggle при регистрации переключаемых элементов меню

  • uservalidationbyemail/js.php: Используйте модуль elgg/uservalidationbyemail

  • discussion.js: См. Ответы в обсуждениях перенесены в комментарии

Удалённые хуки/события

  • Событие login, user: Используйте login:before или login:after. Обратите внимание, что пользователь не авторизован во время события login:before

  • Событие delete, annotations: Используйте delete, annotation

  • Событие pagesetup, system: Вместо этого используйте хуки меню или оболочки страницы

  • Событие upgrade, upgrade: Вместо этого используйте upgrade, system

  • Хук index, system: Переопределите представление resources/index

  • Хук object:notifications, <type>: Используйте хук send:before, notifications

  • Хук output:before, layout: Используйте view_vars, page/layout/<layout_name>

  • Хук output:after, layout: Используйте view, page/layout/<layout_name>

  • Хук email, system: Используйте более детальные хуки <hook>, system:email

  • Хук email:message, system: Используйте хук zend:message, system:email

  • Хук members:list, <page>: Используйте собственный обработчик страниц или хук маршрута

  • Хук members:config, <page>: Используйте register, menu:filter:members

  • Хук profile_buttons, group: Используйте register, menu:title

Удалённые формы/действия

  • Форма и действие notificationsettings/save

  • Форма и действие notificationsettings/groupsave

  • Форма и действие discussion/reply/save

API, которые теперь принимают только массив $options

  • ElggEntity::getAnnotations

  • ElggEntity::getEntitiesFromRelationship

  • ElggGroup::getMembers

  • ElggUser::getGroups

  • ElggUser::getFriends (как часть Friendable)

  • ElggUser::getFriendsOf (как часть Friendable)

  • ElggUser::getFriendsObjects (как часть Friendable)

  • ElggUser::getObjects (как часть Friendable)

  • find_active_users

  • elgg_get_admin_notices

Функции плагинов, которые теперь требуют явного указания $plugin_id

  • elgg_get_all_plugin_user_settings

  • elgg_set_plugin_user_setting

  • elgg_unset_plugin_user_setting

  • elgg_get_plugin_user_setting

  • elgg_set_plugin_setting

  • elgg_get_plugin_setting

  • elgg_unset_plugin_setting

  • elgg_unset_all_plugin_settings

Конструкторы классов, которые теперь принимают только объект stdClass или null

  • ElggAnnotation: Больше не принимает ID аннотации

  • ElggGroup: Больше не принимает GUID

  • ElggMetadata: Больше не принимает ID метаданных

  • ElggObject: Больше не принимает GUID

  • ElggRelationship: Больше не принимает ID связи или null

  • ElggSite: Больше не принимает GUID или URL

  • ElggUser: Больше не принимает GUID или имя пользователя

  • ElggPlugin: Больше не принимает GUID или путь. Используйте ElggPlugin::fromId для создания плагина по его пути

Различные изменения API

  • ElggBatch: Доступны только публичные свойства

  • ElggEntity: Свойства tables_split и tables_loaded удалены

  • ElggEntity: Пустые URL больше не будут нормализованы. Это означает, что сущности без URL больше не будут возвращать URL сайта

  • ElggGroup::removeObjectFromGroup требует передачи ElggObject (больше не принимает GUID)

  • ElggUser::$salt больше не существует как атрибут и не используется для аутентификации

  • ElggUser::$password больше не существует как атрибут и не используется для аутентификации

  • elgg_get_widget_types больше не поддерживает $exact в качестве второго аргумента

  • elgg_instanceof больше не поддерживает четвёртый аргумент class

  • elgg_view: 3-й и 4-й (неиспользуемые) аргументы удалены. Если вы используете аргумент $viewtype, необходимо обновить его использование.

  • elgg_view_icon больше не поддерживает true в качестве второго аргумента

  • elgg_list_entities больше не поддерживает опцию view_type_toggle

  • elgg_list_registered_entities больше не поддерживает опцию view_type_toggle

  • elgg_log больше не принимает уровень "DEBUG"

  • elgg_dump больше не принимает аргумент $to_screen.

  • elgg_gatekeeper и elgg_admin_gatekeeper больше не возвращают login или admin в качестве причины переадресации, а 403

  • Application::getDb() больше не возвращает экземпляр Elgg\Database, а возвращает Elgg\Application\Database

  • $CONFIG больше не доступен как локальная переменная внутри файлов start.php плагинов.

  • elgg_get_config('siteemail') больше не доступен. Используйте elgg_get_site_entity()->email.

  • ElggEntity::saveIconFromUploadedFile сохраняет только размер master, остальные размеры создаются при запросе через ElggEntity::getIcon() на основе размера master

  • ElggEntity::saveIconFromLocalFile сохраняет только размер master, остальные размеры создаются при запросе через ElggEntity::getIcon() на основе размера master

  • ElggEntity::saveIconFromElggFile сохраняет только размер master, остальные размеры создаются при запросе через ElggEntity::getIcon() на основе размера master

  • Сущности групп больше не имеют магического атрибута username.

  • Обработчик страниц больше не будет обнаруживать group:<guid> в URL

  • Интервал CRON reboot удалён.

  • Конечные точки URL js/ и css/ больше не поддерживаются. Используйте elgg_get_simplecache_url().

  • Общее действие сохранения комментария больше не отправляет уведомление напрямую, это переложено на систему уведомлений.

  • Скрипт engine/start.php удалён.

  • Функции set_config, unset_config и get_config объявлены устаревшими и заменены на elgg_set_config, elgg_remove_config и elgg_get_config.

  • Значения конфигурации path, wwwroot и dataroot больше не читаются из базы данных. Всегда используются значения из файла settings.php.

  • Функции конфигурации, такие как elgg_get_config, больше не обрезают ключи.

  • Если вы переопределяете представление navigation/menu/user_hover/placeholder, необходимо изменить ключ конфигурации lazy_hover:menus на elgg_lazy_hover_menus.

  • Значение конфигурации entity_types больше не присутствует и не используется.

  • Загруженные изображения автоматически поворачиваются на основе метаданных ориентации.

  • Представление object/widget/edit/num_display теперь использует поле input/number вместо input/select; возможно, потребуется обновить представления редактирования виджетов соответствующим образом.

  • Имена аннотаций больше не обрезаются при сохранении

Изменено поведение расширения представлений

Расширенное представление теперь получает все обычные хуки (например, хук view_vars). Теперь также можно расширять расширения представлений. Благодаря этому изменению поведения все представления будут рендериться одинаково. Больше не имеет значения, использовалось ли оно как расширение или нет.

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

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

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

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

Маршрутизация

Обработка страниц с использованием elgg_register_page_handler() объявлена устаревшей.

Добавлен новый API маршрутизации с использованием elgg_register_route(), который позволяет плагинам определять именованные маршруты, а затем использовать имена маршрутов для генерации URL через elgg_generate_url().

Подробности см. в документации routing.

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

Добавлен elgg_generate_entity_url() как удобный способ генерации URL из именованных маршрутов, зависящих от типа и подтипа сущности.

Использование параметра handler в меню сущностей объявлено устаревшим в пользу именованных маршрутов сущностей.

Функции-стражи рефакторены для работы в качестве промежуточного ПО в процессе маршрутизации, и поэтому они больше не возвращают значения. Эти функции выбрасывают HTTP-исключения, которые затем перенаправляются на страницы ошибок и могут быть перенаправлены на другие страницы через хуки.

Маркировка

Соглашения по маркировке сущностей и коллекций изменены в соответствии с новыми шаблонами маршрутизации:

return [
   'item:object:blog' => 'Blog',
   'collection:object:blog' => 'Blogs',
   'collection:object:blog:all' => 'All site blogs',
   'collection:object:blog:owner' => '%s\'s blogs',
   'collection:object:blog:group' => 'Group blogs',
   'collection:object:blog:friends' => 'Friends\' blogs',
   'add:object:blog' => 'Add blog post',
   'edit:object:blog' => 'Edit blog post',
];

Эти соглашения используются во всей системе маршрутизации и навигации, поэтому плагинам рекомендуется их соблюдать.

Фильтрация значений запроса

set_input() и get_input() больше не обрезают значения.

Ответы действий

Все действия ядра и плагинов ядра теперь используют новые функции HTTP-ответов, такие как elgg_ok_response и elgg_error_response, вместо forward(). В результате этого изменения в большинстве случаев хук „forward“, „system“ больше не вызывается. Если вы хотите влиять на ответы, теперь можно использовать хук „response“, „action:<name/of/action>“. Это даёт больше контроля над ответом и позволяет легко нацеливаться на конкретное действие.

HtmLawed больше не является плагином

  • Не вызывайте elgg_load_library('htmlawed').

  • В параметрах хука для 'config', 'htmlawed' изменено имя функции hook_tag.

Новый подход к макетам страниц

Макеты one_column, one_sidebar, two_sidebar и content удалены — вместо этого рендеринг макетов централизован в default. Обновлённый макет default предоставляет полный контроль над элементами макета через $vars. Для максимальной обратной совместимости вызовы elgg_view_layout() с этими именами макетов по-прежнему будут давать ожидаемый результат, но плагинам следует начать использовать макет default с обновлённым набором параметров.

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

В результате этих изменений:

  • все макеты единообразны в обработке меню заголовка и фильтров, навигационных цепочек и подпредставлений макета

  • все макеты теперь можно легко расширять для поддержки нескольких вкладок. Плагины могут передавать параметр filter_id, который позволит другим плагинам подключаться к хуку register, menu:filter:<filter_id> и добавлять новые вкладки. Если filter_id не указан, можно использовать хук по умолчанию register, menu:filter.

  • представления и подпредставления макетов теперь получают identifier и segments отображаемой страницы

  • параметры макета доступны хукам меню заголовка и фильтров, что позволяет ресурсам предоставлять дополнительную контекстную информацию, например, $entity в случае ресурса профиля

Плагинам и темам следует:

  • Обновить вызовы elgg_view_layout() для использования макета default

  • Обновить: заменить параметр nav в представлениях макетов на параметр breadcrumbs

  • Обновить использование параметра filter в представлениях макетов: либо предоставить набор вкладок фильтра по умолчанию, либо установить параметр filter_id и использовать хуки

  • Удалить представление page/layouts/one_column

  • Удалить представление page/layouts/one_sidebar

  • Удалить представление page/layouts/two_sidebar

  • Удалить представление page/layouts/content

  • Обновить использование page/layouts/default

  • Обновить использование page/layouts/error

  • Обновить использование page/layouts/elements/filter

  • Обновить использование page/layouts/elements/header

  • Обновить использование page/layouts/elements/footer

  • Обновить использование page/elements/title

  • Обновить использование navigation/breadcrumbs для передачи $vars['breadcrumbs'] в elgg_get_breadcrumbs()

  • Обновить регистрацию хуков для output:before, layout на view_vars, page/layout/<layout_name>

  • Обновить регистрацию хуков для output:after, layout на view, page/layout/<layout_name>

Плагин Likes

Likes больше не использует API переключения Elgg, поэтому используется только один элемент меню likes. Действия добавления/удаления больше не возвращают значения Ajax напрямую, так как данные о статусе лайков теперь возвращаются с каждым запросом Ajax, отправляющим «guid». Когда количество лайков равно нулю, элемент меню likes_count теперь скрывается путём добавления .hidden к элементу LI вместо якоря. Также элемент меню likes_count является обычной ссылкой и больше не создаётся представлением likes/count.

Плагин Notifications

Плагин Notifications переписан с удалением многих представлений и действий. Целью переписывания была реализация более эффективного, расширяемого и масштабируемого интерфейса для управления предпочтениями уведомлений. Реализована гораздо более простая разметка и удалены избыточные стили и JavaScript, необходимые для работы старого интерфейса.

Если ваш плагин расширяет какие-либо представления или полагается на какие-либо действия в плагине notifications, его необходимо обновить.

Плагин Pages

Подтип page_top мигрирован в подтип page. Подтип page имеет собственный класс, а именно ElggPage. Для проверки того, является ли ElggPage верхней страницей, добавлена функция класса ElggPage->isTopPage().

Все страницы имеют значение метаданных для parent_guid, для верхних страниц оно содержит 0.

Плагин Profile

Вся функциональность, связанная с профилями, перенесена из ядра в этот плагин. Наиболее заметны утилита администрирования полей профиля и хук для настройки данных конфигурации полей профиля.

Плагин Data Views

Плагин Data Views больше не входит в комплект поставки.

Плагин Twitter API

Плагин twitter_api удалён из ядра Elgg. Плагин по-прежнему доступен как пакет Composer elgg/twitter_api, для его установки добавьте следующее в секцию require вашего composer.json:

{
        "require": {
                "elgg/twitter_api": "~1.9"
        }
}

Плагин Legacy URLs

Плагин legacy_urls удалён из ядра Elgg. Плагин по-прежнему доступен как пакет Composer elgg/legacy_urls, для его установки добавьте следующее в секцию require вашего composer.json:

{
        "require": {
                "elgg/legacy_urls": "~2.3"
        }
}

Плагин User validation by email

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

Доставка электронной почты

Для обеспечения более детальной обработки и доставки электронной почты хук email, system удалён. Новая служба электронной почты предоставляет несколько других заменяющих хуков, которые позволяют плагинам управлять содержимым, форматом и транспортом доставки электронной почты.

elgg_set_email_transport() теперь можно использовать для замены транспорта Sendmail по умолчанию на другой экземпляр \Zend\Mail\Transport\TransportInterface, например, SMTP, in-memory или file transport. Обратите внимание, что эту функцию необходимо вызывать на раннем этапе загрузки. Также учтите, что если вы вызываете эту функцию при каждом запросе, использование настроек плагина для определения конфигурации транспорта может быть не очень эффективным — храните эти настройки как значения datalist или конфигурации сайта, чтобы они загружались из кэша загрузки.

Изменения темы и стилей

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

Заметные изменения в плагинах:

  • Верхняя панель, навигационная панель и заголовок объединены в единый адаптивный компонент верхней панели

  • Ширина внутренней области по умолчанию теперь 1280px (80rem * 16px/1rem)

  • Предпочтительной единицей измерения теперь является rem, а не px

  • Тема использует 8-точечную сетку <https://builttoadapt.io/intro-to-the-8-point-grid-system-d2573cde8632>

  • Меню, элементы макета и другие компоненты теперь используют flexbox

  • Сброс стилей выполняется с использованием 8-точечной сетки <https://necolas.github.io/normalize.css/>

  • Медиа-запросы переписаны для подхода mobile-first

  • Элементы форм (текстовые поля, кнопки и списки) теперь имеют одинаковую высоту 2.5rem

  • Заголовок макета теперь расположен вне колонок макета, которые обёрнуты в elgg-layout-columns

  • Свойства z-index пересмотрены и упорядочены с помощью простой итерации вместо 9999999 <https://hackernoon.com/my-approach-to-using-z-index-eca67feb079c>.

  • Цветовая схема изменена для выделения интерактивных элементов и уменьшения обилия оттенков серого

  • плагин search больше не расширяет page/elements/header, вместо этого page/elements/topbar отображает представление search/search_box

  • .elgg-icon больше не имеет глобальных font-size, line-height или color: эти значения будут наследоваться от родительских элементов

  • Поддержка .elgg-icon-hover удалена

  • Пользовательские иконки «hover» больше не покрываются иконкой «caret»

Подробнее см. Принципы тем

Также учтите, что представления CSS, обслуживаемые через URL /cache, предварительно обрабатываются с помощью CSS Crush <http://the-echoplex.net/csscrush/>. Если вы ссылаетесь на переменные CSS или другие элементы, определение должно находиться в том же выводе представления. Например, переменная, определённая в elgg.css, не может быть использована в отдельном файле CSS, таком как colorbox.css.

Комментарии

Отправка комментариев теперь выполняется через AJAX. После успешной отправки список комментариев обновляется автоматически.

В уведомления о комментариях внесены следующие изменения.

  • Языковые ключи, связанные с уведомлениями о комментариях, изменены. Проверьте языковые ключи generic_comment:notification:owner:

  • Действие для создания комментария (action/comment/save) изменено. Если ваш плагин переопределял это действие, следует проверить его, чтобы избежать дублирования уведомлений

Представления списков объектов

  • object/elements/full/body теперь оборачивает полное тело списка в обёртку .elgg-listing-full-body

  • object/elements/full теперь поддерживает attachments и responses, которые отображаются после тела списка

  • В плагинах ядра представления ресурсов больше не отображают комментарии/ответы — вместо этого они передают флаг show_responses в представление сущности, которое отображает ответы и передаёт их в представление полного списка. Сторонним плагинам потребуется обновить использование представлений object/<subtype> и resources/<handler>/view.

  • Полное представление обсуждения теперь отображается с использованием представления object/elements/full

  • object/file теперь передаёт представление изображения (specialcontent) как attachment в представление полного списка

Иконки сущностей

Файлы изображений иконок по умолчанию были перемещены и переназначены следующим образом:

  • Иконки по умолчанию: views/default/icon/default/$size.png

  • Иконки пользователей: views/default/icon/user/default/$size.gif

  • Иконки групп: views/default/icon/group/default/$size.gif в плагине groups

Файлы иконок групп были перемещены из groups/<guid><size>.jpg относительно директории владельца группы в хранилище файлов в место, определяемое сервисом иконок сущностей. Плагинам следует прекратить прямой доступ к файлам в хранилище и использовать API иконок сущностей. Скрипт обновления доступен через админ-интерфейс.

Процесс генерации иконок сущностей был изменён. Теперь при вызове одной из функций иконок сущностей (ElggEntity::saveIconFromUploadedFile, ElggEntity::saveIconFromLocalFile или ElggEntity::saveIconFromElggFile) генерируется только размер master. Остальные настроенные размеры будут генерироваться при запросе этого размера на основе иконки master.

Глифы иконок

FontAwesome был обновлён до версии 5.0+. Произошли определённые изменения в способе отображения глифов FontAwesome. Ядро позаботится о большинстве изменений (например, сопоставление старых имён иконок с новыми и использование правильного префикса для брендовых и сплошных иконок).

Автодополнение (выбор пользователей и друзей)

Поле ввода Friends Picker теперь отображается с помощью input/userpicker.

Плагинам следует:

  • Обновить переопределённый input/userpicker для поддержки нового параметра only_friends

  • Удалить CSS friends picker из своих таблиц стилей

Коллекции друзей

Интерфейс коллекций друзей был перемещён в отдельный плагин - friends_collections.

Макет элементов .elgg-body

В версии 3.0 эти элементы по умолчанию больше не растягиваются для заполнения доступного пространства в блочном контексте. Они по-прежнему очищают обтекание и позволяют переносить слова для переноса текста.

Основные модули и макеты, которые полагались на заполнение пространства, были переработаны для Flexbox, и мы рекомендуем разработчикам сделать то же самое, вместо использования проблематичного overflow: hidden.

Удаление элементов ленты

Функция elgg_delete_river(), которая была устаревшей в версии 2.3, была восстановлена. Заметные изменения во внутренней реализации этой функции:

  • Она принимает все $options из elgg_get_river(), но требует установки хотя бы одного из следующих параметров: id(s), annotation_id(s), subject_guid(s), object_guid(s), target_guid(s) или view(s)

  • Поскольку elgg_get_river по умолчанию имеет ограничение на количество получаемых элементов ленты, если вы хотите удалить все элементы ленты, вам нужно установить limit в false

  • При удалении элементов ленты контроль доступа игнорируется

  • События срабатывают непосредственно до и после удаления элемента ленты

Ответы в обсуждениях перенесены в комментарии

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

Примечание

Комментарии к обсуждениям теперь будут отображаться в разделе «Комментарии» поиска, а не в разделе «Обсуждения».

Очистка переводов

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

Системный лог

API системного лога было вынесено из ядра в плагин system_log. Плагины logbrowser и logrotate были объединены в плагин system_log.

Логирование ошибок

Отправка сообщений elgg_log() и ошибок PHP в вывод страницы теперь возможна только через настройку «Вывод в экран» плагина developers. См. файл settings.example.php для получения дополнительной информации об использовании $CONFIG->debug в вашем файле settings.php. Отладку обычно следует выполнять через расширение xdebug или команду tail -f /path/to/error.log на вашем сервере.

Плагин Composer asset больше не требуется

Ресурсы теперь загружаются с https://asset-packagist.org. Плагин FXP composer asset больше не требуется при установке Elgg или обновлении зависимостей composer.

Логи Cron

Логи cron больше не хранятся в базе данных, а в файловой системе (в dataroot). Это позволит хранить более длинный вывод. Был добавлен скрипт миграции для переноса старых настроек базы данных в новое место и удаления старых значений из базы данных.

Удалённые / изменённые языковые ключи

  • Языковые ключи, связанные с уведомлениями о комментариях, изменены. Проверьте языковые ключи generic_comment:notification:owner:

Новые функции схемы MySQL не применяются

Новые установки версии 3.0 требуют MySQL 5.5.3 (или выше) и используют набор символов utf8mb4 и столбцы содержимого LONGTEXT (что, в частности, позволяет хранить более длинный контент и расширенные символы, такие как эмодзи).

Различные изменения

Настройки «Разрешить посетителям регистрироваться» и «Ограничить страницы для авторизованных пользователей» теперь отображаются на странице администрирования «Основные настройки».

Плагин Twitter API

Плагин twitter_api больше не поставляется в комплекте с Elgg.

Модульное и интеграционное тестирование

Загрузчик PHPUnit в Elgg теперь может обрабатывать как модульные, так и интеграционные тесты. Обратите внимание, что не следует запускать тесты на рабочем сайте, так как это может нарушить целостность данных. Чтобы предотвратить потерю данных, необходимо указать настройки базы данных через переменные окружения. Это можно сделать через загрузчик phpunit.xml.

Плагины теперь могут реализовывать собственные тесты PHPUnit, расширяя классы \Elgg\UnitTestCase и \Elgg\IntegrationTestCase. Набор тестов plugins будет автоматически автозагружать тесты PHPUnit из mod/<plugin_id>/tests/phpunit/unit и mod/<plugin_id>/tests/phpunit/integration.

Перед запуском интеграционных тестов необходимо включить плагины, которые вы хотите протестировать вместе с основным API.

\Elgg\IntegrationTestCase использует трейт \Elgg\Seeding, который можно использовать для удобного создания новых сущностей и записи их в базу данных.

\Elgg\UnitTestCase не использует базу данных, но предоставляет интерфейс мокирования базы данных, который позволяет тестам определять спецификации запросов с предопределёнными возвратами.

По умолчанию как модульные, так и интеграционные тесты будут запускаться при каждом вызове phpunit. Вы можете использовать флаг --testsuite для запуска только определённого набора: phpunit --testsuite unit или phpunit --testsuite integration или phpunit --testsuite plugins.

Для правильной работы интеграционного тестирования плагинам рекомендуется не помещать какую-либо логику в корень start.php, а вместо этого возвращать Closure. Это позволяет набору тестов создавать новый экземпляр Application без потери логики инициализации плагина.

Плагины с simpletests будут продолжать работать как прежде. Однако сигнатуры методов в абстрактном классе ElggCoreUnitTest изменились, и вам потребуется соответствующим образом обновить ваши тесты. В частности, не рекомендуется использовать методы __construct и __destruct. setUp и tearDown были помечены как приватные и используются для согласованной загрузки тестов и утверждения предварительных и последующих условий; ваш тестовый кейс должен вместо этого использовать методы up и down.

Simpletests больше нельзя запускать из админ-интерфейса плагина developers. Используйте команду Elgg cli: elgg-cli simpletest