De 2.x à 3.0

Contenu

PHP 7.0 est désormais requis

5.6 atteint sa fin de vie. PHP 7.0 est maintenant nécessaire pour installer et exécuter Elgg.

$CONFIG est supprimé !

Pas exactement, cependant vous devez auditer cet usage et devriez le remplacer par elgg_get_config() et elgg_set_config(), comme recommandé depuis Elgg 1.9.

La variable globale $CONFIG est maintenant un proxy pour le conteneur de configuration de Elgg, et les modifications échoueront si vous essayez de modifier directement les propriétés du tableau. Par exemple, $CONFIG->cool_fruit[] = 'Poire';. Le bon côté est que ces échecs émettront des NOTICEs.

Vues supprimées

  • forms/account/settings : l’extension de usersettings peut désormais étendre la vue forms/usersettings/save

  • forms/admin/site/advanced/system

  • resources/file/download

  • output/checkboxes : utilisez output/tags si vous voulez le même comportement

  • input/write_access : mod/pages utilise désormais le hook de plugin access:collections:write.

  • invitefriends/form

  • page/layouts/content : utilisez page/layouts/default

  • page/layouts/one_column : utilisez page/layouts/default

  • page/layouts/one_sidebar : utilisez page/layouts/default

  • page/layouts/two_sidebar : utilisez page/layouts/default

  • page/layouts/walled_garden : utilisez page/layouts/default

  • page/layouts/walled_garden/cancel_button

  • page/layouts/two_column_left_sidebar

  • page/layouts/widgets/add_panel

  • page/elements/topbar_wrapper : mettez à jour votre utilisation de page/elements/topbar pour inclure une vérification si l’utilisateur est connecté

  • pages/icon

  • groups/group_sort_menu : utilisez le hook plugin register, filter:menu:groups/all

  • groups/my_status

  • groups/profile/stats

  • subscriptions/form/additions : étendez plutôt notifications/parameters/other

  • likes/count : des modifications peuvent désormais être apportées à l’élément de menu likes_count

  • likes/css : les likes utilisent désormais 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 : utilisez elgg_view_river_item() pour afficher des éléments de la rivière

  • river/user/default/profileupdate

  • admin.js

  • aalborg_theme/homepage.png

  • aalborg_theme/css

  • resources/avatar/view: Utilisez l’API des icônes d’entités

  • 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: utilisez graphics/ajax_loader_bw.gif

  • elgg_logo.png : utilisez graphics/elgg_logo.png

  • favicon-128.png : utilisez graphics/favicon-128.png

  • favicon-16.png : utilisez graphics/favicon-16.png

  • favicon-32.png : utilisez graphics/favicon-32.png

  • favicon-64.png : utilisez graphics/favicon-64.png

  • favicon.ico : utilisez graphics/favicon.ico

  • favicon.svg : utilisez graphics/favicon.svg

  • friendspicker.png : utilisez graphics/friendspicker.png

  • walled_garden.jpg : utilisez 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 : utilise désormais navigation/menu/default et un hook de préparation - prepare

  • navigation/menu/site : utilise désormais la vue par défaut

  • page/elements/by_line: Utilisez object/elements/imprint

  • forms/admin/site/advanced/security : l’information du secret du site a été déplacé vers forms/admin/security/settings

  • river/object/file/create : regardez Rivière - Flux d’activité

  • river/object/page/create : regardez Rivière - Flux d’activité

  • river/object/page_top/create : regardez Rivière - Flux d’activité

  • river/relationship/member : regardez Rivière - Flux d’activité

  • object/page_top : utilisez object/page

  • ajax/discussion/reply/edit : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion/replies : Voyez Les réponses aux discussions ont été converties en commentaires

  • object/discussion_reply : Voyez Les réponses aux discussions ont été converties en commentaires

  • resources/discussion/reply/edit : Voyez Les réponses aux discussions ont été converties en commentaires

  • resources/elements/discussion_replies : Voyez Les réponses aux discussions ont été converties en commentaires

  • river/elements/discussion_replies : Voyez Les réponses aux discussions ont été converties en commentaires

  • river/object/discussion/create

  • river/object/discussion_reply/create : Voyez Les réponses aux discussions ont été converties en commentaires

  • search/object/discussion_reply/entity : Voyez Les réponses aux discussions ont été converties en commentaires

  • rss/discussion/replies : Voyez Les réponses aux discussions ont été converties en commentaires

  • search/header

  • search/layout dans les deux types de vues default et rss

  • search/no_results

  • search/object/comment/entity

  • search/css: Déplacé vers 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: utilisez forms/friends/invite

  • resources/invitefriends/invite: utilisez resources/friends/invite

  • resources/reportedcontent/add

  • resources/reportedcontent/add_form

  • resources/site_notifications/view: Utilisez resources/site_notifications/owner

  • resources/site_notifications/everyone : Utilisez resources/site_notifications/all

Fonctions/méthodes supprimées

Toutes les fonctions dans engine/lib/deprecated-1.9.php ont été supprimées. Voir https://github.com/Elgg/Elgg/blob/2.0/engine/lib/deprecated-1.9.php pour ces fonctions. Chaque déclaration @deprecated comprend des instructions sur ce qu’il faut utiliser à la place. Toutes les fonctions de engine/lib/deprecated-1.10.php ont été supprimées. Voir https://github.com/Elgg/Elgg/blob/2.0/engine/lib/deprecated-1.10.php pour ces fonctions. Chaque déclaration @deprecated comprend des instructions sur ce qu’il faut utiliser à la place.

  • elgg_register_library : exigez - require - vos bibliothèques afin qu’elles soient disponibles globalement pour d’autres plugins

  • elgg_load_library

  • activity_profile_menu

  • can_write_to_container : Utilisez 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: Utilisez 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 : Utilisez elgg()->group_tools->all()

  • groups_join_group : Utilisez ElggGroup::join

  • groups_prepare_profile_buttons : Utilisez le hook register, menu:title

  • groups_register_profile_buttons : Utilisez le hook register, menu:title

  • groups_setup_sidebar_menus

  • groups_set_icon_url

  • groups_setup_sidebar_menus

  • messages_notification_msg

  • set_default_filestore

  • generate_user_password : Utilisez ElggUser::setPassword

  • row_to_elggrelationship

  • run_function_once : Utilisez l’interface Elgg\Upgrade\Batch

  • system_messages

  • notifications_plugin_pagesetup

  • elgg_format_url : Utilisez elgg_format_element() ou la vue « output/text » pour échapper le HTML.

  • get_site_by_url

  • elgg_override_permissions : N’est plus utilisé comme gestionnaire pour les hooks permissions_check et container_permissions_check

  • elgg_check_access_overrides

  • AttributeLoader est devenu obsolète et a été supprimé

  • Application::loadSettings

  • ElggEntity::addToSite

  • ElggEntity::disableMetadata

  • ElggEntity::enableMetadata

  • ElggEntity::getSites

  • ElggEntity::removeFromSite

  • ElggEntity::isFullyLoaded

  • ElggEntity::clearAllFiles

  • ElggPlugin::getFriendlyName : Utilisez ElggPlugin::getDisplayName()

  • ElggPlugin::setID

  • ElggPlugin::unsetAllUsersSettings

  • ElggFile::setFilestore : les objets ElggFile ne peuvent plus utiliser de répertoire de fichiers personnalisé.

  • ElggFile::size : Utilisez getSize

  • ElggDiskFilestore::makeFileMatrix : Utilisez Elgg\EntityDirLocator

  • ElggData::get : Peut habituellement être remplacé par la lecture de la propriété

  • ElggData::getClassName : Utilisez get_class()

  • ElggData::set : Peut habituellement être remplacé par l’écriture de propriété

  • ElggEntity::setURL : Voyez getURL pour plus de détails sur le hook plugin

  • ElggMenuBuilder::compareByWeight : Utilisez compareByPriority

  • ElggMenuItem::getWeight : Utilisez getPriority

  • ElggMenuItem::getContent : Utilisez elgg_view_menu_item()

  • ElggMenuItem::setWeight : Utilisez setPriority

  • ElggRiverItem::getPostedTime : Utilisez getTimePosted

  • ElggSession a supprimé toutes les méthodes dépréciées

  • ElggSite::addEntity

  • ElggSite::addObject

  • ElggSite::addUser

  • ElggSite::getEntities : Utilisez elgg_get_entities()

  • ElggSite::getExportableValues : Utilisez toObject

  • ElggSite::getMembers : Utilisez elgg_get_entities()

  • ElggSite::getObjects : Utilisez elgg_get_entities()

  • ElggSite::listMembers : Utilisez elgg_list_entities()

  • ElggSite::removeEntity

  • ElggSite::removeObject

  • ElggSite::removeUser

  • ElggSite::isPublicPage : Logique déplacée vers le routeur et qui ne devrait pas être consultée directement

  • ElggSite::checkWalledGarden : Logique déplacée vers le routeur et qui ne devrait pas être accédée directement

  • ElggUser::countObjects : Utilisez elgg_get_entities()

  • Logger::getClassName : Utilisez get_class()

  • Elgg\Application\Database::getTablePrefix : Lisez la propriété prefix

  • elgg_view_access_collections()

  • ElggSession::get_ignore_access : Utilisez getIgnoreAccess

  • ElggSession::set_ignore_access : Utilisez setIgnoreAccess

  • profile_pagesetup

  • pages_can_delete_page : Utilisez $entity->canDelete()

  • pages_search_pages

  • pages_is_page : utilisez $entity instanceof ElggPage

  • discussion_comment_override : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_can_edit_reply : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_reply_menu_setup : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_reply_container_logic_override : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_reply_container_permissions_override : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_update_reply_access_ids : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_search_discussion : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_add_to_river_menu : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_prepare_reply_notification : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_redirect_to_reply : Voyez Les réponses aux discussions ont été converties en commentaires

  • discussion_ecml_views_hook : Voyez Les réponses aux discussions ont été converties en commentaires

  • 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

Toutes les fonctions liées à la table des sous-types d’entités :
  • add_subtype : Utilisez elgg_set_entity_class lors de l’exécution

  • update_subtype : Utilisez elgg_set_entity_class lors de l’exécution

  • remove_subtype

  • get_subtype_id

  • get_subtype_from_id

  • get_subtype_class : Utilisez elgg_get_entity_class

  • get_subtype_class_from_id

Tous les caches ont été consolidés en une seule couche d’API. Les fonctions et méthodes suivantes ont été supprimées :
  • is_memcache_available

  • _elgg_get_memcache

  • _elgg_invalidate_memcache_for_entity

  • ElggMemcache

  • ElggFileCache

  • ElggStaticVariableCache

  • ElggSharedMemoryCache

  • L’interface Elgg\Cache\Pool et toutes les classes d’extension

À la suite des modifications apportées au journal du système - system log :
  • system_log_default_logger : déplacé dans le plugin system_log

  • system_log_listener : déplacé dans le plugin system_log

  • system_log : déplacé dans le plugin system_log

  • get_system_log : renommé system_log_get_log et déplacé dans le plugin system_log

  • get_log_entry : renommé system_log_get_log_entry et déplacé dans le plugin system_log

  • get_object_from_log_entry : renommé system_log_get_object_from_log_entry et déplacé dans le plugin system_log

  • archive_log : renommé system_log_archive_log et déplacé dans le plugin system_log

  • logbrowser_user_hover_menu : renommé system_log_user_hover_menu et déplacé dans le plugin system_log

  • logrotate_archive_cron : renommé system_log_archive_cron et déplacé dans le plugin system_log

  • logrotate_delete_cron : renommé system_log_delete_cron et déplacé dans le plugin system_log

  • logrotate_get_seconds_in_period : renommé system_log_get_seconds_in_period et déplacé dans le plugin system_log

  • log_browser_delete_log : renommé system_log_browser_delete_log et déplacé dans le plugin system_log

APIs dépréciées

  • ban_user : Utilisez ElggUser->ban()

  • create_metadata : Utilisez la définition avec ElggEntity ou ElggEntity->setMetadata()

  • update_metadata : Utilisez ElggMetadata->save()

  • get_metadata_url

  • create_annotation : Utilisez ElggEntity->annotate()

  • update_metadata : Utilisez ElggAnnotation->save()

  • elgg_get_user_validation_status : Utilisez ElggUser->isValidated()

  • make_user_admin : Utilisez ElggUser->makeAdmin()

  • remove_user_admin : Utilisez ElggUser->removeAdmin()

  • unban_user : Utilisez ElggUser->unban()

  • elgg_get_entities_from_attributes : Utilisez elgg_get_entities()

  • elgg_get_entities_from_metadata : Utilisez elgg_get_entities()

  • elgg_get_entities_from_relationship : Utilisez elgg_get_entities()

  • elgg_get_entities_from_private_settings : Utilisez elgg_get_entities()

  • elgg_get_entities_from_access_id : Utilisez elgg_get_entities()

  • elgg_list_entities_from_metadata : Utilisez elgg_list_entities()

  • elgg_list_entities_from_relationship : Utilisez elgg_list_entities()

  • elgg_list_entities_from_private_settings : Utilisez elgg_list_entities()

  • elgg_list_entities_from_access_id : Utilisez elgg_list_entities()

  • elgg_list_registered_entities : Utilisez elgg_list_entities()

  • elgg_batch_delete_callback

  • \Elgg\Project\Paths::sanitize : Utilisez \Elgg\Project\Paths::sanitize()

  • elgg_group_gatekeeper : Utilisez elgg_entity_gatekeeper()

  • get_entity_dates : Utilisez elgg_get_entity_dates()

  • messages_set_url : Utilisez ElggEntity::getURL()

Variables globales supprimées

  • $CURRENT_SYSTEM_VIEWTYPE

  • $DEFAULT_FILE_STORE

  • $ENTITY_CACHE

  • $SESSION: Utilisez l’API fournie par elgg_get_session()

  • $CONFIG->site_id : Utilisez 1

  • $CONFIG->search_info

  • $CONFIG->input : Utilisez set_input et get_input

Classes/interfaces supprimées

  • FilePluginFile : remplacez par ElggFile (ou chargez avec get_entity())

  • Elgg_Notifications_Notification

  • Elgg\Database\EntityTable\UserFetchResultException.php

  • Elgg\Database\MetastringsTable

  • Elgg\Database\SubtypeTable

  • Exportable et ses méthodes export et getExportableValues : Utilisez toObject

  • ExportException

  • Importable et sa méthode import.

  • ImportException

  • ODD et toutes les classes commençant par ODD*.

  • XmlElement

  • Elgg_Notifications_Event : Utilisez \Elgg\Notifications\Event

  • Elgg\Mail\Address : utilisez Elgg\Email\Address

  • ElggDiscussionReply : utilisez ElggComment voyez Les réponses aux discussions ont été converties en commentaires

Modifications de schéma

Le moteur de stockage des tables de la base de données a été changé de MyISAM à InnoDB. Vous devrez peut-être optimiser les paramètres de votre base de données pour cette modification. La table datalists a été supprimée. Tous les paramètres de la table datalists ont été fusionnés dans la table config.

Les chaînes de métadonnées - metastrings - de la base de données ont été dénormalisées à des fins de performance. Nous avons supprimé la table metastrings et mis toutes les valeurs de chaîne directement dans les tables de métadonnées et d’annotation. Vous devez mettre à jour vos requêtes personnalisées pour refléter ces modifications. Les alias de table msv et msn ne sont plus disponibles. Il est préférable de ne pas s’appuyer sur les alias de table utilisés dans les requêtes du noyau. Si vous avez besoin d’utiliser des clauses personnalisées, vous devriez faire vos propres jointures.

Dans la table users_entity, les colonnes password et hash ont été supprimées.

La table geocode_cache a été supprimée car elle n’était plus utilisée.

La colonne subtype dans la table entities ne contient plus d’ID de sous-type, mais une chaîne avec le sous-type. La table entity_subtypes a été supprimée.

les colonnes type, subtype et access_id de la table river ont été abandonnées. Pour les requêtes sans elgg_get_river() joignez la table entities sur object_guid pour vérifier le type et le sous-type de l’entité. La colonne d’accès n’est plus utilisée depuis un certain temps : les requêtes sont conçues pour garantir l’accès aux trois entités (subject, object et target).

Changements dans les fonctions de récupération elgg_get_entities, elgg_get_metadata et elgg_get_annotations

elgg_get_entities accepte désormais toutes les options qui étaient auparavant réparties entre elgg_get_entities_from_metadata, elgg_get_entities_from_annotations, elgg_get_entities_from_relationship, elgg_get_entities_from_private_settings et elgg_get_entities_from_access_id. Ces dernières ont été dépréciées.

La transmission d’instructions MySQL brutes aux options est obsolète. Il est conseillé d’utiliser des Closures qui reçoivent une instance de \Elgg\Database\QueryBuilder et de préparer l’instruction à l’aide de la couche d’abstraction de la base de données. D’une part, cela permettra de s’assurer que toutes les instructions sont correctement aseptisées à l’aide du pilote de base de données, d’autre part, il nous permettra de passer à une construction de requête orientée objet qui soit testable.

Les instructions wheres ne devraient pas utiliser de chaînes SQL brutes, et plutôt passer une instance de \Elgg\Database\Clauses\WhereClause ou une Closure qui renvoie une instance de \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);
        }
   ]
]);

Les clauses joins, order_by, group_by, selects ne devraient pas utiliser de chaînes SQL brutes. Utilisez les Closures qui reçoivent une instance de \Elgg\Database\QueryBuilder et renvoyez une instruction préparée - prepared statement.

L’option reverse_order_by a été supprimée.

Les plugins ne devraient pas s’appuyer sur des alias de table jointes et sélectionnées. Les Closures transmises au tableau d’options recevront un deuxième argument correspondant à l’alias de table sélectionné. Les plugins doivent effectuer leurs propres jointures et utiliser des alias de jointure en conséquence.

Notez que toute l’API privée autour de la construction de chaînes SQL brutes a également été supprimée. Si vous l’utilisiez dans vos plugins, soyez informé que tout ce qui est marqué comme @access private ou @internal dans le noyau peut être modifié et supprimé à tout moment, et que nous ne garantissons aucune compatibilité arrière pour ces fonctions. NE LES UTILISEZ PAS. Si vous avez besoin de les utiliser, ouvrez un ticket sur Github et nous envisagerons d’ajouter un équivalent public.

Propriétés de l’entité booléenne

Le stockage des métadonnées, des annotations et des valeurs de paramètres privés a été aligné.

Les valeurs booléennes sont transformées en entiers lorsqu’elles sont enregistrées : false est stocké comme 0 et true est stocké comme 1. Cela a des implications de rupture pour les paramètres privés, qui étaient précédemment stockés comme des chaînes vides pour les valeurs false. Les plugins doivent écrire leurs propres scripts de migration pour modifier les valeurs de la BD des chaînes vides à 0 (pour les paramètres privés qui sont censés stocker des valeurs booléennes) afin de s’assurer que elgg_get_entities() peut récupérer ces valeurs avec private_setting_name_value_pairs contenant des valeurs false. Cela s’applique aux paramètres de plugin, ainsi qu’à tous les paramètres privés ajoutés aux entités.

Modifications des métadonnées

Les métadonnées ne sont plus contrôlées par accès. Si votre plugin a créé des métadonnées avec un accès restreint, ces restrictions ne seront pas respectées. Vous devez utiliser des annotations ou des entités à la place, qui fournissent un contrôle d’accès.

Ne lisez pas ou n’écrivez pas la propriété access_id sur les objets ElggMetadata.

Les métadonnées ne sont plus activées ou désactivées. Vous ne pouvez plus effectuer les appels API enable et disable sur les métadonnées.

Les métadonnées n’ont plus de owner_guid. Il n’est plus possible d’interroger les métadonnées sur la base de leur owner_guids. Par conséquence, ElggMetadata::canEdit() renvoie toujours true indépendamment de l’utilisateur connecté, à moins que cela soit explicitement remplacé par un hook de plugin.

Permissions et droits d’accès

Le service des capacités de l’utilisateur ne déclenche plus les hooks de vérification des autorisations lorsque :

  • les autorisations sont vérifiées pour un utilisateur administrateur

  • les autorisations sont vérifiées lorsque l’accès est ignoré avec elgg_set_ignore_access()

Cela signifie que les plugins ne peuvent plus modifier les autorisations dans les cas mentionnés ci-dessus.

elgg_check_access_overrides() a été supprimé, car les plugins n’auront plus besoin de valider les remplacements d’accès.

Les traductions pour les niveaux d’accès de Elgg par défaut ont de nouvelles clefs de traduction.

Modifications Multisite

Avant la version 3.0, Elgg disposait d’une certaine prise en charge (partielle) pour avoir plusieurs sites dans la même base de données. Ce concept multisite a été complètement supprimé dans la version 3.0. Les entités n’ont plus l’attribut site_guid. Cela signifie qu’il n’y a plus la possibilité d’avoir des entités sur différents sites. Si vous avez actuellement plusieurs sites dans votre base de données, la mise à niveau de Elgg vers Elgg 3.0 échouera. Vous devez séparer les différents sites en bases de données/tables distinctes.

En lien avecla suppression du concept multisite de Elgg, il n’est plus nécessaire que les entités aient une relation “member_of_site” avec l’entité du site. Toutes les fonctions liées à l’ajout/suppression de cette relation ont été supprimées. Toutes les relations existantes seront supprimées dans le cadre de cette mise à niveau.

La définition de ElggSite::$url n’a aucun effet. La lecture de l’URL du site est toujours faite depuis la valeur définie par $CONFIG->wwwroot dans settings.php, ou calculée par Symphony Request.

ElggSite::save() échouera si ce n’est pas le site principal.

Modifications de la sous-table des entités

La sous-table sites_entity pour ElggSite n’existe plus. Tous les attributs ont été déplacés vers les métadonnées. La sous-table groups_entity pour ElggGroup n’existe plus. Tous les attributs ont été déplacés vers les métadonnées. La sous-table objects_entity pour ElggObject n’existe plus. Tous les attributs ont été déplacés vers les métadonnées. La sous-table users_entity pour ElggUser n’existe plus. Tous les attributs ont été déplacés vers les métadonnées.

Si vous avez des requêtes personnalisées faisant référence à cette table, vous devez les mettre à jour. Si vous avez une fonction qui s’appuie sur Entity->getOriginalAttributes(), sachez que cela ne renvoie que les attributs de base d’une ElggEntity et ne contient plus les attributs secondaires.

Collection d’accès des Contacts et des Groupes

La table des collections d’accès dispose maintenant d’une colonne de sous-type. Ces données supplémentaires permettent d’identifier le but de l’ACL. Les collections d’accès appartenant à l’utilisateur sont supposées être utilisées comme collections de contacts - Friends Collections - et ont le sous-type “friends_collection”. L’information de collection d’accès des groupes était auparavant conservée dans la métadonnée group_acl. Avec l’introduction du sous-type ACL, cette information a été déplacée vers l’attribut de sous-type ACL.

L’access_id ACCESS_FRIENDS a été migré vers une collection d’accès réelle (avec le sous-type friends). Toutes les entités et annotations ont été mises à jour pour utiliser le nouvel id de collection d’accès. La collection d’accès est créée lors de la création d’un utilisateur. Lorsqu’une relation du type friends est créée, le guid associé sera également ajouté à la collection d’accès. Vous ne pouvez plus enregistrer ou mettre à jour les entités avec l’id d’accès ACCESS_FRIENDS.

Les sous-types n’ont plus d’ID

Les sous-types d’entités ont été dénormalisés. La table entity_subtypes a été supprimée et la colonne subtype dans la table entités contient simplement la représentation sous forme de chaîne du sous-type.

Par conséquent, toutes les API relatives à l’ajout et la mise à jour des sous-types et des classes d’entités ont été supprimées.

Les plugins peuvent désormais utiliser elgg_set_entity_class() et elgg_get_entity_class() pour enregistrer une classe d’entité personnalisée au moment de l’exécution (par exemple dans le gestionnaire d’initialisation du système).

Toutes les entités DOIVENT maintenant avoir un sous-type. Par défaut, les sous-types suivants sont ajoutés et réservés :

  • user pour les utilisateurs

  • group pour les groupes

  • site pour les sites

Chargement de classe personnalisée

Elgg ne fournit plus de fonctions API pour enregistrer des classes personnalisées. Si vous avez besoin de classes personnalisées, vous pouvez utiliser des classes PSR-0 dans le dossier /classes de votre plugin ou utiliser composer pour charger automatiquement des classes supplémentaires.

Les fonctions suivantes liées à l’enregistrement des classes ont été supprimées :

  • elgg_get_class_loader

  • elgg_register_class

  • elgg_register_classes

Conteneur d’injection de dépendance - DI = Dependency Injection

Les plugins peuvent maintenant définir leurs services et les attacher au conteneur public DI de Elgg en fournissant des définitions dans elgg-services.php dans la racine du répertoire de plugin.

elgg() ne renvoie plus une instance d’application Elgg, mais une instance de conteneur DI.

Modifications de la recherche

Nous avons ajouté un service de recherche dans le noyau, par conséquent, le plugin search fournit désormais uniquement une interface utilisateur pour afficher les formulaires et afficher les résultats de recherche. Beaucoup des vues du plugin search ont été affectées par ce changement.

Les indices FULLTEXT ont été supprimés sur différentes tables. Le plugin de recherche utilise désormais toujours une requête LIKE lors de l’exécution d’une recherche.

Voir la documentation Search Service et Search hooks pour des informations détaillées sur les nouvelles fonctionnalités de recherche.

Modifications du menu des entités et de la rivière

Le menu Entity et le menu River affichent désormais tous les éléments d’une liste déroulante. Les actions sociales comme aimer ou commenter sont déplacées vers un menu alternatif appelé le menu social, qui est destiné aux actions sociales.

Bibliothèques supprimées

elgg_register_library et elgg_load_library ont été supprimées. Ces fonctions ont eu peu d’impact sur les performances (en particulier avec OPCache activé), et il a été difficile pour d’autres plugins de travailler avec les APIs contenues dans les bibliothèques. En outre, il était difficile pour les développeurs de savoir que les APIs étaient contenues dans une bibliothèque alors qu’il y a une autocomplétion par l’IDE.

Si vous êtes concerné par les performances, déplacez la logique vers les classes et laissez PHP les charger automatiquement au besoin, sinon utilisez require_once et exigez vos bibliothèques.

Gestionnaires de pages supprimés

Actions supprimées

Modifications de l’héritage

  • ElggData (et donc la plupart des objets du domaine Elgg) n’implémente plus Exportable

  • ElggEntity n’implémente plus Importable

  • ElggGroup n’implémente plus Friendable

  • ElggRelationship n’implémente plus Importable

  • ElggSession n’implémente plus ArrayAccess

  • Elgg\Application\Database n’étend plus Elgg\Database

APIs JavaScript supprimées

  • admin.js

  • elgg.widgets : Utilisez le module elgg/widgets. Les dispositions « widgets » chargent ce module automatiquement

  • lightbox.js : Utilisez le module elgg/lightbox au besoin

  • lightbox/settings.js : Utilisez le hook JS getOptions, ui.lightbox ou l’attribut data-colorbox-opts

  • elgg.ui.popupClose : Utilisez le module elgg/popup

  • elgg.ui.popupOpen : Utilisez le module elgg/popup

  • elgg.ui.initAccessInputs

  • elgg.ui.river

  • elgg.ui.initDatePicker : Utilisez le module input/date

  • elgg.ui.likesPopupHandler

  • elgg.embed : Utilisez le module elgg/embed

  • elgg.discussion : Utilisez le module elgg/discussion

  • embed/custom_insert_js : Utilisez le hook JS embed, editor

  • elgg/ckeditor.js : remplacé par elgg-ckeditor.js

  • elgg/ckeditor/set-basepath.js

  • elgg/ckeditor/insert.js

  • jQuery.cookie : Utilisez elgg.session.cookie

  • jquery.jeditable

  • likes.js : Le module elgg/likes est chargé automatiquement

  • messageboard.js

  • elgg.autocomplete n’est plus défini.

  • elgg.messageboard n’est plus défini.

  • jQuery.fn.friendsPicker

  • elgg.ui.toggleMenu n’est plus défini

  • elgg.ui.toggleMenuItems : Utilisez l’attribut data-toggle lorsque vous enregistrez des éléments de menu basculables

  • uservalidationbyemail/js.php : Utilisez le module elgg/uservalidationbyemail

  • discussion.js : Voyez Les réponses aux discussions ont été converties en commentaires

Hooks/événements retirés

  • Événement login, user : Utilisez login:before ou login:after. Notez que l’utilisateur n’est pas connecté pendant l’événement login:before

  • Événement delete, annotations : Utilisez delete, annotation

  • Événement pagesetup, system : Utilisez plutôt les hook de menu ou de coquille depage

  • Événement upgrade, upgrade : Utilisez upgrade, system à la place

  • Hook index, system : Remplacez la vue resources/index

  • Hook object:notifications, <type> : Utilisez le hook send:before, notifications

  • Hook output:before, layout : Utilisez view_vars, page/layout/<layout_name>

  • Hook output:after, layout : Utilisez view, page/layout/<layout_name>

  • Hook email, system : Utilisez les hooks plus granulaires <hook>, system:email

  • Hook email:message, system : Utilisez le hook zend:message, system:email

  • Hook members:list, <page> : Utilisez le hook de route ou votre propre gestionnaire de page

  • Hook members:config, <page> : Utilisez register, menu:filter:members

  • Hook profile_buttons, group : Utilisez register, menu:title

Formulaires/actions supprimés

  • formulaire et action notificationsettings/save

  • formulaire et action notificationssettings/groupsave

  • formulaire et action discussion/reply/save

APIs qui n’acceptent plus qu’un tableau $options

  • ElggEntity::getAnnotations

  • ElggEntity::getEntitiesFromRelationship

  • ElggEntity::getEntitiesFromRelationship

  • ElggUser::getGroups

  • ElggUser::getFriends (en tant que Friendable)

  • ElggUser::getFriendsOf (dans le cadre de Friendable)

  • ElggUser::getFriendsObjects (dans le cadre de Friendable)

  • ElggUser::getObjects (dans le cadre de Friendable)

  • find_active_users

  • elgg_get_admin_notices

Fonctions plugin qui nécessitent maintenant un $plugin_id explicite

  • 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

Constructeurs de classes qui n’acceptent désormais qu’un objet stdClass ou null

  • ElggAnnotation : N’accepte plus un ID d’annotation

  • ElggGroup : N’accepte plus un GUID

  • ElggMetadata : N’accepte plus un ID de métadonnées

  • ElggObject : N’accepte plus un GUID

  • ElggRelationship : N’accepte plus un ID de relation ni null

  • ElggSite : N’accepte plus un GUID ni une URL

  • ElggUser : N’accepte plus un GUID ni un nom d’utilisateur

  • ElggPlugin : N’accepte plus un GUID ni un chemin. Utilisez ElggPlugin::fromId pour construire un plugin à partir de son chemin

Modifications d’API diverses

  • ElggBatch : Vous ne pouvez accéder qu’aux propriétés publiques

  • ElggEntity : Les propriétés tables_split et tables_loaded ont été supprimées

  • ElggEntity : Les URL vides ne seront plus normalisées. Cela signifie que les entités sans URL ne vont plus avoir l’URL du site

  • ElggGroup::removeObjectFromGroup nécessite de passer un ElggObject (n’accepte plus un GUID)

  • ElggUser::$salt n’existe plus en tant qu’attribut, et n’est plus utilisé pour l’authentification

  • ElggUser::$password n’existe plus en tant qu’attribut, et n’est plus utilisé pour l’authentification

  • elgg_get_widget_types ne prend plus en charge $exact comme 2ème argument

  • elgg_instanceof ne prend plus en charge le quatrième argument class

  • elgg_view : Les 3ème et 4ème arguments (inutilisés) ont été supprimés. Si vous utilisiez l’argument $viewtype, vous devez mettre à jour votre utilisation.

  • elgg_view_icon ne prend plus en charge true comme 2e argument

  • elgg_list_entities ne prend plus en charge l’option view_type_toggle

  • elgg_list_registered_entities ne prend plus en charge l’option view_type_toggle

  • elgg_log n’accepte plus le niveau "DEBUG"

  • elgg_dump n’accepte plus d’argument $to_screen.

  • elgg_gatekeeper et elgg_admin_gatekeeper ne signalent plus login ou admin comme motif de redirection, mais 403

  • Application::getDb() ne renvoie plus une instance de Elgg\Database, mais de Elgg\Application\Database

  • $CONFIG n’est plus disponible en tant que variable locale dans les fichiers start.php des plugins.

  • elgg_get_config('siteemail') n’est plus disponible. Utilisez elgg_get_site_entity()->email.

  • ElggEntity::saveIconFromUploadedFile enregistre uniquement la taille master, les autres tailles sont créées sur demande par ElggEntity::getIcon() à partir de la taille master

  • ElggEntity::saveIconFromLocalFile enregistre uniquement la taille master, les autres tailles sont créées sur demande par ElggEntity::getIcon() à partir de la taille master

  • ElggEntity::saveIconFromElggFile enregistre uniquement la taille master`, les autres tailles sont créées sur demande par ElggEntity::getIcon() à partir de la taille master

  • Les entités de groupe n’ont plus l’attribut magique username.

  • Le gestionnaire de page ne détecte plus group:<guid> dans l’URL

  • L’intervalle CRON reboot est supprimé.

  • Les points de terminaison d’URL js/ et css/ ne sont plus pris en charge. Utilisez elgg_get_simplecache_url().

  • L’action générique d’enregistrement de commentaire n’envoie plus la notification directement, cela a été déchargé vers le système de notification.

  • Le script engine/start.php est supprimé.

  • Les fonctions set_config, unset_config et get_config ont été dépréciées et remplacées par elgg_set_config, elgg_remove_config et elgg_get_config.

  • Les valeurs de configuration path, wwwroot et dataroot ne sont pas lues dans la base de données. Les valeurs du fichier settings.php sont toujours utilisées.

  • Les fonctions de configuration telles que elgg_get_config n’émondent plus - trim - les clefs.

  • Si vous remplacez la vue navigation/menu/user_hover/placeholder, vous devez modifier la clef de configuration lazy_hover:menus en elgg_lazy_hover_menus.

  • La valeur de configuration entity_types n’est plus présente ni utilisée.

  • Les images téléchargées sont auto-pivotées en fonction de leurs métadonnées d’orientation.

  • La vue object/widget/edit/num_display utilise désormais un champ input/number au lieu de input/select ; vous pourriez avoir besoin de mettre à jour vos vues de configuration des widgets en conséquence.

  • Les noms d’annotation ne sont plus émondés - trim - lors de l’enregistrement

Le comportement d’extension des vues a été modifié

Une vue étendue recevra désormais tous les hooks classiques (comme le hook view_vars). Il est désormais également possible d’étendre les extensions de vue. Avec ce changement de comportement, tous les rendus de vue se comporteront de la même façon. Cela n’a plus d’importance si une vue est utilisée comme une extension ou non.

L’ordre d’appel des hooks JavaScript pourrait changer

Lors de l’enregistrement pour des hooks, le mot clef all pour la correspondance générique n’a plus aucun effet sur l’ordre dans lequel les gestionnaires sont appelés. Pour vous assurer que votre gestionnaire est appelé en dernier, vous devez lui donner la plus haute priorité de tous les gestionnaires correspondants, ou pour vous assurer que votre gestionnaire est appelé en premier, vous devez lui donner la plus faible priorité de tous les gestionnaires correspondants.

Si les gestionnaires ont été enregistrés avec la même priorité, ceux-ci sont appelés dans l’ordre où ils ont été enregistrés.

Pour émuler le comportement antérieur, les gestionnaires du noyau Elgg enregistrés avec le mot clé all ont été élevés en priorité. Certains de ces gestionnaires seront très probablement appelés dans un ordre différent.

Routage

La gestion des pages à l’aide de elgg_register_page_handler() est devenue obsolète.

Nous avons ajouté une nouvelle API de routage utilisant elgg_register_route(), qui permet aux plugins de définir des routes nommées, en utilisant par la suite des noms de routes pour générer des URLs à l’aide de elgg_generate_url().

Pour plus d’informations, consultez les documentations sur le routage.

À la suite de cette modification, tous les gestionnaires de pages de base ont été supprimés et toute la logique contenue dans ces gestionnaires de pages a été déplacée vers les vues de ressources respectives.

elgg_generate_entity_url() a été ajouté comme raccourci pour générer des URLs à partir de routes nommées qui dépendent du type d’entité et du sous-type.

L’utilisation du paramètre handler dans les menus des entités a été dépréciée au profit des routes d’entités nommées.

Les fonctions Gatekeeper ont été refactorisées pour servir de middleware dans le processus de routage, et en tant que tel, elles ne retournent plus de valeurs. Ces fonctions lancent des exceptions HTTP qui sont ensuite acheminées vers des pages d’erreur et peuvent être redirigées vers d’autres pages via des hooks.

Nommage

Les conventions de nommage des entités et des collections ont changé pour se conformer aux nouveaux schémas de routage :

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',
];

Ces conventions sont utilisées dans les systèmes de routage et de navigation, de sorte que les plugins sont invités à les suivre.

Filtrage des valeurs de la requête

set_input() et get_input() ne suppriment plus les espaces - trim - des valeurs.

Réponses des actions

Toutes les actions du noyau et des plugins du noyau utilisent maintenant toutes les nouvelles fonctions de Http Response comme elgg_ok_response et elgg_error_response au lieu de forward(). L’effet de ce changement est que dans la plupart des cas le hook “forward”, “system” n’est plus déclenché. Si vous souhaitez modifier les réponses, vous pouvez maintenant utiliser le hook “response”,”action:<name/of/action>”. Cela vous donne plus de contrôle sur la réponse et permet de cibler une action spécifique très facilement.

HtmLawed n’est plus un plugin

  • N’appelez pas elgg_load_library('htmlawed').

  • Dans les paramètres du hook pour 'config', 'htmlawed', le nom de la fonction hook_tag a changé.

Nouvelle approche des mises en page - layouts

Les dispositions one_column, one_sidebar, two_sidebar et content ont été supprimées - au lieu de cela, le rendu de la disposition a été centralisé dans default. La mise à jour de la disposition default permet de contrôler pleinement les éléments de mise en page via $vars. Pour obtenir une compatibilité descendante maximale, les appels à elgg_view_layout() avec ces noms de disposition donneront toujours la sortie attendue, mais les plugins doivent commencer à utiliser la disposition default avec un ensemble de paramètres mis à jour.

Les mises en page ont été découpées en éléments plus petits, ce qui devrait faciliter le ciblage d’éléments de mise en page spécifiques par les thèmes sans avoir à remplacer les dispositions en général.

À la suite de ces changements :

  • toutes les dispositions sont cohérentes dans la façon dont elles gèrent les menus de titre et de filtre, le fil d’Ariane et les sous-vues de mise en page

  • toutes les dispositions peuvent maintenant être facilement étendues pour avoir plusieurs onglets. Les plugins peuvent passer le paramètre filter_id qui permettra à d’autres plugins de s’accrocher au hook register, menu:filter:<filter_id> et d’ajouter de nouveaux onglets. Si aucun filter_id n’est fourni, le hook par défaut register, menu:filter peut être utilisé.

  • les vues de mise en page et les sous-vues reçoivent désormais les identifier et segments de la page en cours de rendu

  • les paramètres de mise en page sont disponibles pour les hooks de menu de titre et de filtre, ce qui permet aux ressources de fournir des informations de contexte supplémentaires, par exemple $entity dans cas d’une ressource pour le profil

Les plugins et thèmes devraient :

  • Mettez à jour les appels à elgg_view_layout () pour utiliser la disposition default

  • Mettez à jour et remplacez le paramètre nav dans les vues de disposition par le paramètre breadcrumbs

  • Mettez à jour leur utilisation du paramètre filter dans les vues de disposition - layouts, soit en fournissant un ensemble par défaut d’onglets de filtre, soit en définissant un paramètre filter_id et en utilisant des hooks

  • Supprimez la vue page/layouts/one_column

  • Supprimez la vue page/layouts/one_sidebar

  • Supprimez la vue page/layouts/two_sidebar

  • Supprimez la vue page/layouts/content

  • Mettez à jour leur utilisation de page/layouts/default

  • Mettez à jour leur utilisation de page/layouts/error

  • Mettez à jour leur utilisation de page/layouts/elements/filter

  • Mettez à jour leur utilisation de page/layouts/elements/header

  • Mettez à jour leur utilisation de page/layouts/elements/footer

  • Mettez à jour leur utilisation de page/elements/title

  • Mettez à jour leur utilisation de navigation/breadcrumb pour passer $vars ['breadcrumb'] à elgg_get_breadcrumbs()

  • Mettez à jour les enregistrements du hook output:before, layout vers view_vars, page/layout/<layout_name>

  • Mettez à jour les enregistrements du hook output:after, layout vers view, page/layout/<layout_name>

Plugin Likes

La fonctionnalité Likes n’utilise plus l’API de bascule « toggle » de Elgg, de sorte qu’un seul élément de menu likes est utilisé. Les actions d’ajout/suppression « add » et « remove » ne renvoient plus directement les valeurs Ajax, car les données d’état des mentions J’aime sont maintenant renvoyées avec chaque requête Ajax qui envoie un « guid ». Lorsque le nombre de mentions J’aime est nul, l’élément de menu likes_count est maintenant masqué en ajoutant .hidden à l’élément LI, au lieu de le faire sur l’ancre. De plus, l’élément de menu likes_count est un lien classique, et n’est plus créé par la vue likes/count.

Plugin Notifications

Le plugin Notifications a été réécrit en abandonnant de nombreuses vues et actions. Le but de cette réécriture était de mettre en œuvre une interface plus efficace, extensible et évolutive pour la gestion des préférences de notifications. Nous avons mis en œuvre un balisage beaucoup plus simple, supprimé les styles en excès et le javascript qui était nécessaire pour faire fonctionner l’ancienne interface.

Si votre plugin étend l’une des vues ou s’appuie sur des actions du plugin notifications, il doit être mis à jour.

Plugin Pages

Le sous-type page_top a été migré dans le sous-type page. Le sous-type page dispose de sa propre classe, à savoir ElggPage. Pour vérifier si une ElggPage est une page de premier niveau, la fonction de classe ElggPage->isTopPage() a été ajoutée.

Toutes les pages ont une valeur de métadonnée pour parent_guid, pour les pages de premier niveau celle-ci est 0.

Plugin Profile

Toutes les fonctionnalités liées au profil ont été déplacées hors du noyau dans ce plugin. Les plus remarquables sont l’utilitaire d’administration des champs de profil et le hook pour définir les données de configuration des champs de profil.

Vues de données « Plugin Data Views »

Le plugin Data Views n’est plus distribué avec le noyau.

Plugin de l’API Twitter

Le plugin twitter_api a été retiré du noyau de Elgg. Le plugin est toujours disponible sous forme de package Composer elgg/twitter_api. Pour l’installer, ajoutez ce qui suit à la section require de votre composer.json :

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

Plugin de support des URLs d’origine

Le plugin legacy_urls a été retiré du noyau de Elgg. Le plugin est toujours disponible sous la forme du package Composer elgg/legacy_urls. Pour l’installer, ajoutez ce qui suit à la section require de votre composer.json :

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

Plugin de validation par e-mail de l’utilisateur

La vue qui liste les utilisateurs non validés a été déplacée du plugin vers le noyau de Elgg. Certaines actions génériques (par exemple valider et supprimer) ont également été déplacées vers le noyau de Elgg.

Expédition d’e-mail

Pour prévoir plus de granularité dans la gestion et la livraison des e-mails, le hook email, system a été supprimé. Le nouveau service de messagerie fournit plusieurs autres hooks de remplacement qui permettent aux plugins de contrôler le contenu, le format et l’agent de transport de messagerie utilisés pour la livraison.

elgg_set_email_transport() peut désormais être utilisé pour remplacer l’agent de transport Sendmail par défaut par une autre instance de \Zend\Mail\Transport\TransportInterface, par exemple SMTP, in-memory, ou le transport de fichiers. Notez que cette fonction doit être appelée tôt dans le processus de démarrage. Notez que si vous appelez cette fonction sur chaque requête, l’utilisation des paramètres du plugin pour déterminer la configuration de transport peut ne pas être très efficace - stockez ces paramètres sous forme de liste de données « datalist » ou dans les valeurs de configuration du site, de sorte qu’ils soient chargés à partir du cache de démarrage.

Changements de thème et de style

Le thème Aalborg n’est plus distribué avec Elgg. Le thème du noyau par défaut est maintenant basé sur Aalborg, mais avec des changements majeurs.

Évolutions notables dans les plugins :

  • La barre supérieure -topbar-, la barre de navigation -navbar- et l’entête -header- ont été combinés en un seul composant de barre supérieure responsive - topbar

  • La largeur intérieure par défaut est maintenant 1280px (80rem * 16px/1rem)

  • L’unité de mesure préférée est maintenant rem et non px

  • Le thème utilise un système de grille à 8 points <https://builttoadapt.io/intro-to-the-8-point-grid-system-d2573cde8632>

  • Les menus, éléments de mise en page -layouts- et autres composants utilisent maintenant flexbox

  • La réinitialisation se fait à l’aide d’un système de grille à 8 points <https://necolas.github.io/normalize.css/>

  • Les requêtes multimédias ont été réécrites pour une expérience mobile-first

  • Les éléments de formulaire (entrées de texte, boutons et sélecteurs) ont maintenant tous une hauteur identique de 2.5rem

  • L’entête -header- de la disposition -layout- est maintenant positionné à l’extérieur des colonnes de la disposition, qui ont été enveloppées dans elgg-layout-columns

  • les propriétés z-index ont été examinées et empilées avec une itération simple au lieu de 9999999 <https://hackernoon.com/my-approach-to-using-z-index-eca67feb079c>.

  • Le schéma de couleurs a été modifié pour mettre en évidence les éléments exploitables et réduire l’abondance des nuances de gris

  • le plugin de recherche n’étend plus page/elements/header, et au lieu de cela page/elements/topbar affiche la vue search/search_box

  • .elgg-icon n’a plus de font-size, line-height ou color global : ces valeurs seront héritées des éléments parents

  • Le support de .elgg-icon-hover a été abandonné

  • Les icônes « hover » de l’utilisateur ne sont plus recouvertes par une icône « caret »

Pour en savoir plus au sujet des Principes de création de thèmes

Notez également que les vues CSS servies via les URL /cache sont pré-traitées à l’aide de CSS Crush <http://the-echoplex.net/csscrush/>. Si vous faites des références à des variables CSS ou à d’autres éléments, la définition doit être située dans la même vue d’affichage. Par exemple, une variable définie dans elgg.css ne peut pas être référencée dans un fichier CSS distinct comme colorbox.css.

Commentaires

L’envoi des commentaires est maintenant AJAXifié. Après un envoi réussi, la liste des commentaires sera mise à jour automatiquement.

Les modifications suivantes ont été apportées aux notifications des commentaires.

  • Les clefs de traduction relatives aux notifications des commentaires ont changé. Vérifiez les clefs de traduction generic_comment:notification:owner:

  • L’action de création d’un commentaire (action/comment/save) a été modifiée. Si votre plugin a remplacé cette action, vous devriez jeter un œil dessus afin d’éviter les doubles notifications

Vues de listing d’objets

  • object/elements/full/body enveloppe maintenant l’ensemble du corps du listing dans un emballage -wrapper- .elgg-listing-full-body

  • object/elements/full supporte désormais attachments et responses qui sont affichés après le corps du listing

  • Dans les plugins du noyau, les vues des ressources n’affichent plus comments/replies - au lieu de cela, elles transmettent un indicateur show_responses à la vue de l’entité, ce qui génère les réponses et les transmet à la vue de la liste complète. Les plugins tiers devront mettre à jour leurs utilisations des vues object/<subtype> et ressources/<handler>/view.

  • La vue de la discussion complète est désormais affichée en utilisant la vue object/elements/full

  • object/file passe désormais la vue image (specialcontent) sous la forme d’une pièce jointe attachment à la vue listing complète

Icônes des entités

Les fichiers images des icônes par défaut ont été déplacés et re-mappés comme suit :

  • Icônes par défaut : views/default/icon/default/$size.png

  • Icônes utilisateur : views/default/icon/user/default/$size.gif

  • Icônes de groupe : views/default/icon/group/default/$size.gif dans le plugin groups

Les fichiers d’icônes des groupes ont été déplacés de groups/<guid><size>.jpg relativement au répertoire du propriétaire du groupe dans le répertoire de fichiers, vers un emplacement indiqué par le service d’icône d’entité. Les plugins doivent cesser d’accéder directement aux fichiers du répertoire de fichiers et utiliser l’API de l’icône de l’entité. Le script de mise à niveau est disponible via l’interface d’administration.

La génération d’icônes des entités a été modifiée. Toutes les dimensions configurées ne seront plus générées lors de l’appel de l’une des fonctions de l’icône de l’entité (ElggEntity::saveIconFromUploadedFile, ElggEntity:::saveIconFromLocalFile ou ElggEntity::saveIconFromElggFile), mais seulement la taille master. Les autres dimensions configurées seront générées à partir de l’icône master lorsque cette dimension est demandée.

Glyphes d’icône

FontAwesome a été mis à niveau vers la version 5.0+. Il y a eu certains changements dans la façon dont les glyphes FontAwesome sont rendus. Le noyau s’occupera de la plupart des changements (par ex. mappage des anciens noms d’icônes à de nouveaux, et en utilisant le préfixe correct pour les icônes de marques et les icônes solides).

Auto-complétion / saisie automatique (sélecteurs d’utilisateurs et de contacts)

Le sélecteur de contacts « Friends Picker » est désormais affiché en utilisant input/userpicker.

Les plugins devraient :

  • Mettre à jour le paramètre input/userpicker pour prendre en charge le nouveau paramètre only_friends

  • Supprimer le CSS du sélecteur de contacts - « friends picker » - de leurs feuilles de style

Collections de Contacts

L’UI des collections de contacts a été déplacée vers son propre plugin - friends_collections.

Mise en page des éléments .elgg-body

Dans 3.0, ces éléments par défaut ne s’étirent plus pour remplir l’espace disponible dans un contexte de bloc. Ils continuent de supprimer les floats et permettent la césure des mots pour envelopper le texte.

Les modules du noyau et les mises en page qui reposaient sur le remplissage de l’espace ont été retravaillés pour Flexbox, et nous encourageons les développeurs à faire de même, plutôt que d’utiliser la technique problématique overflow:hidden.

Supprimer des éléments de la rivière

La fonction elgg_delete_river(), qui avait été dépréciée dans la version 2.3, a été rétablie. Des changements notables internes à cette fonction sont ;

  • Elle accepte toutes les $options de elgg_get_river(), mais exige qu’au moins l’un des paramètres suivants soit défini : id(s), annotation_id(s), subject_guid(s), object_guid(s), target_guid(s) ou view(s)

  • Étant donné que elgg_get_river a par défaut une limite sur le nombre d’éléments de la rivière qu’elle récupère, si vous souhaitez supprimer tous les éléments de la rivière, vous devez définir limit à false

  • L’accès est ignoré lors de la suppression d’éléments de la rivière

  • Les événements sont déclenchés juste avant et après qu’un élément de la rivière a été effacé

Les réponses aux discussions ont été converties en commentaires

Dans la mesure où les réponses aux discussion étaient quasiment une copie des commentaires, toutes les réponses aux discussions ont été migrées vers les commentaires. Toutes les actions, hooks, événements et clefs de traduction associés ont été supprimés.

Note

Les commentaires des discussions apparaîtront désormais dans la section Commentaires de la recherche, et plus dans la section Discussion.

Nettoyage des traductions

Tous les plugins ont été scannés pour des clefs de traduction inutilisées. Les clefs inutilisées ont été supprimées. S’il existait une traduction générique disponible pour la clef de traduction personnalisée, celles-ci ont également été mises à jour.

Journal système

L’API du journal système a été déplacée hors du noyau dans un plugin system_log. Les plugins logbrowser et logrotate ont été fusionnés dans le plugin system_log.

Journalisation des erreurs

L’affichage des messages d’erreur de elgg_log() et de PHP n’est plus désormais possible que via le paramètre « Afficher à l’écran » du plugin des développeurs. Consultez le fichier settings.example.php pour plus d’informations sur l’utilisation de $CONFIG->debug dans votre fichier settings.php. Le débogage doit généralement se faire via l’extension xdebug ou via tail -f /chemin/du/fichier/error.log sur votre serveur.

Le plugin des actifs de composer n’est plus requis

Les actifs sont maintenant chargés à partir de https://asset-packagist.org. Le plugin FXP composer n’est plus nécessaire lors de l’installation de Elgg ni lors de la mise à jour des dépendances de composer.

Journaux du Cron

Les journaux du Cron ne sont plus conservés dans la base de données, mais sur le système de fichiers (dans la racine du répertoire des données). Ceci va permettre de conserver des sorties plus longues. Un script de migration a été ajouté pour migrer les anciens paramètres de la base de données vers le nouvel emplacement et supprimer les anciennes valeurs de la base de données.

Clefs de traduction supprimées / modifiées

  • Les clefs de traduction relatives aux notifications des commentaires ont changé. Vérifiez les clefs de traduction generic_comment:notification:owner:

Les nouvelles fonctionnalités du schéma MySQL ne sont pas appliquées

Les nouvelles installations 3.0 nécessitent MySQL 5.5.3 (ou plus) et utilisent le jeu de caractères utf8mb4 et les colonnes de contenu LONGTEXT (ce qui permet notamment le stockage d’un contenu plus long et des caractères étendus comme les emoji).

Changements divers

Les paramètres « Permettre aux visiteurs de s’inscrire » et « Restreindre les pages aux utilisateurs connectés » apparaissent désormais sur la page admin des paramètres de base - « Basic Settings ».

Plugin de l’API Twitter

Le plugin twitter_api n’est plus distribué avec Elgg.

Tests Unitaires et d’Intégration

L’amorçage du PHPUnit de Elgg peut désormais gérer à la fois les tests unitaires et d’intégration. Veuillez noter que vous ne devriez pas exécuter de test sur un site de production, car cela peut endommager l’intégrité des données. Pour éviter les pertes de données, vous devez spécifier les paramètres de la base de données via les variables d’environnement. Vous pouvez faire cela via le fichier d’amorçage phpunit.xml.

Les plugins peuvent désormais implémenter leurs propres tests PHPUnit en étendant les classes \Elgg\UnitTestCase et \Elgg\IntegrationTestCase. La suite de test plugins va automatiquement charger les tests PHPUnit depuis mod/<plugin_id>/tests/phpunit/unit et mod/<plugin_id>/tests/phpunit/integration.

Avant d’exécuter des tests d’intégration, vous devez activer les plugins que vous souhaitez tester en même temps que l’API du noyau.

\Elgg\IntegrationTestCase utilise le trait \Elgg\Seeding, qui peut être utilisé pour construire aisément de nouvelles entités et les enregistrer dans la base de données.

\Elgg\UnitTestCase n’utilise pas la base de données, mais fournit une interface de base de données factice, qui permet aux tests de définir des spécifications de requête avec des retours prédéfinis.

Par défaut, les tests unitaires et d’intégration seront exécutés à chaque fois que phpunit est appelé. Vous pouvez utiliser le drapeau --testsuite pour n’exécuter qu’une suite de tests spécifique : phpunit --testsuite unit ou phpunit --testsuite integration ou phpunit --testsuite plugins.

Pour que les tests d’intégration s’exécutent correctement, il est recommandé que les plugins ne placent aucune logique de fonctionnement dans la racine de start.php, et renvoient plutôt une Closure à la place. Ceci permet à la suite de test de construire une nouvelle instance Application sans perdre la logique d’initialisation du plugin.

Les plugins avec simpletests vont continuer à fonctionner comme précédemment. Cependant, les méthodes de signature dans la classe abstraite ElggCoreUnitTest ont changé et vous allez avoir besoin de mettre à jour vos tests en conséquence. En particulier, il est déconseillé d’utiliser des méthodes __construct et __destruct. setUp et tearDown ont été marquées comme privées et sont utilisées pour amorcer des tests cohérents et pour déclarer des conditions pre et post ; votre cas de test devrait utiliser les méthodes up et down à leur place.

Simpletests ne peut plus être exécuté depuis l’interface admin du plugin developers. Utilisez la commande Elgg cli : elgg-cli simpletest