С 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_subtypeget_subtype_idget_subtype_from_idget_subtype_class: используйтеelgg_get_entity_classget_subtype_class_from_id
- Все кэши объединены в единый слой API. Следующие функции и методы были удалены:
is_memcache_available_elgg_get_memcache_elgg_invalidate_memcache_for_entityElggMemcacheElggFileCacheElggStaticVariableCacheElggSharedMemoryCacheинтерфейс
Elgg\Cache\Poolи все расширяющие его классы
- В результате изменений системного журнала:
system_log_default_logger: перенесено в плагинsystem_logsystem_log_listener: перенесено в плагинsystem_logsystem_log: перенесено в плагинsystem_logget_system_log: переименовано вsystem_log_get_logи перенесено в плагинsystem_logget_log_entry: переименовано вsystem_log_get_log_entryи перенесено в плагинsystem_logget_object_from_log_entry: переименовано вsystem_log_get_object_from_log_entryи перенесено в плагинsystem_logarchive_log: переименовано вsystem_log_archive_logи перенесено в плагинsystem_loglogbrowser_user_hover_menu: переименовано вsystem_log_user_hover_menuи перенесено в плагинsystem_loglogrotate_archive_cron: переименовано вsystem_log_archive_cronи перенесено в плагинsystem_loglogrotate_delete_cron: переименовано вsystem_log_delete_cronи перенесено в плагинsystem_loglogrotate_get_seconds_in_period: переименовано вsystem_log_get_seconds_in_periodи перенесено в плагинsystem_loglog_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 и подключайте ваши библиотеки.
Удалённые обработчики страниц
file/download
file/search
groupicon
twitterservice
collections/pickercallback
discussion/reply: см. Ответы в обсуждениях перенесены в комментарии
expages
invitefriends: используйтеfriends/{username}/invite
messages/compose: используйтеmessages/add
reportedcontent
Удалённые действия
file/download: используйтеelgg_get_inline_urlилиelgg_get_download_url
file/delete: используйте действиеentity/delete
import/opendd
discussion/reply/save: см. Ответы в обсуждениях перенесены в комментарии
discussion/reply/delete: см. Ответы в обсуждениях перенесены в комментарии
comment/delete: используйте действиеentity/delete
uservalidationbyemail/bulk_action: используйтеadmin/user/bulk/validateилиadmin/user/bulk/delete
uservalidationbyemail/delete: используйтеadmin/user/bulk/delete
uservalidationbyemail/validate: используйтеadmin/user/bulk/validate
invitefriends/invite: используйтеfriends/invite
Изменения наследования
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: Используйте хук JSgetOptions, 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: Используйте хук JSembed, 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.
Представления списков объектов
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
Комментарии
Отправка комментариев теперь выполняется через AJAX. После успешной отправки список комментариев обновляется автоматически.
В уведомления о комментариях внесены следующие изменения.