De 1.x à 2.0

Contenu

Elgg peut maintenant être installé en tant que dépendance composer au lieu d’être situé à la racine

Cela signifie qu’un site Elgg peut ressembler à ceci :

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

elgg_get_root_path et $CONFIG->path vont renvoyer le chemin vers le répertoire racine de l’application, qui n’est pas nécessairement le même que le répertoire racine du noyau de Elgg (qui dans ce cas est vendor/elgg/elgg/).

N’essayez pas d’accéder directement au noyau de Elgg depuis votre plugin, car vous ne pouvez pas compter sur son emplacement dans le système de fichiers.

En particulier, n’essayez pas de charger engine/start.php.

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

Pour démarrer Elgg manuellement, vous pouvez utiliser la classe Elgg\Application.

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

Cependant, utilisez cette approche avec parcimonie. Préférez le routage Routage dans la mesure du possible, car cela permet de découpler vos URLs publiques et votre structure de système de fichiers.

En outre, n’essayez pas d’accéder directement aux fichiers _graphics.

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

Utilisez Vues à la place :

echo elgg_view('elgg_sprites.png');

Les vues pouvant être mises en cache doivent avoir une extension de fichier dans leur nom

Cette exigence nous permet de servir des actifs directement à partir du disque pour des raisons de performance, au lieu de les servir via PHP.

Il est également beaucoup plus facile d’explorer les ressources disponibles dans le cache en allant dans dataroot/views_simplecache et en naviguant à partir de là.

  • Mauvais : my/cool/template

  • Bon : my/cool/template.html

Nous mettons maintenant en cache des ressources par $viewtype/$view, et plus md5('$viewtype|$view'), qui entraînait des conflits entre les vues susceptibles d’être mises en cache qui n’avaient pas d’extension de fichier pour les distinguer des répertoires.

Abandon de jquery-migrate et mise à niveau de jquery vers ^2.1.4

l’API jQuery 2.x est compatible avec 1.x, mais abandonne la prise en charge de IE8-, que Elgg ne prenait déjà plus en charge depuis un certain temps de toutes façons.

Lisez http://jquery.com/upgrade-guide/1.9/ pour savoir comment se passer de jquery-migrate.

Si vous préférez le conserver, vous pouvez utiliser ce code dans l’initialisation de votre plugin :

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

Définissez également une vue jquery-migrate.js contenant le contenu du script.

JS et CSS ont été déplacés hors des répertoires js/ et css/

Ils ont également reçu des extensions .js et .css respectivement s’ils ne les avaient pas déjà :

Ancienne vue

Nouvelle vue

js/view

view.js

js/other.js

other.js

css/view

view.css

css/other.css

other.css

js/img.png

img.png

Le principal avantage que cela apporte est d’être en mesure de co-localiser les actifs connexes. Ainsi un modèle (view.php) peut avoir ses dépendances CSS/JS juste à côté (view.css, view.js).

Un grand soin a été pris pour rendre cette modification aussi rétro-compatible que possible, de sorte que vous ne devriez pas avoir besoin de mettre à jour les références des vues immédiatement. Cependant, vous êtes certainement encouragés à déplacer vos vues JS et CSS vers leurs nouveaux emplacements canoniques.

En pratique, ceci introduit quelques pièges :

Les hooks view_vars, $view_name et view, $view_name fonctionneront sur le nom canonique de la vue :

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

L’utilisation du hook view, all et la vérification des vues individuelles peuvent ne pas fonctionner comme prévu :

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

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

Merci de nous faire part de tous les autres problèmes de rétro-compatibilité que ce changement provoque. Nous aimerions en résoudre le plus grand nombre possible pour faciliter la transition.

fxp/composer-asset-plugin est maintenant nécessaire pour installer Elgg à partir de la source

Nous utilisons fxp/composer-asset-plugin pour gérer nos actifs de navigateur (js, css, html) avec Composer, mais il doit être installé globalement avant d’installer Elgg afin que les packages bower-asset/* soient reconnus. Pour l’installer, exécutez :

composer global require fxp/composer-asset-plugin

Si vous ne le faites pas avant d’exécuter composer install ou composer create-project, vous obtiendrez un message d’erreur :

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

Liste des vues dépréciées et des arguments d’une vue qui ont été supprimés

Nous avons abandonné la prise en charge des vues suivantes et/ou les avons supprimées :

  • canvas/layouts/*

  • categories

  • categories/view

  • core/settings/tools

  • embed/addcontentjs

  • footer/analytics (Utilisez page/elements/foot à la place)

  • groups/left_column

  • groups/right_column

  • groups/search/finishblurb

  • groups/search/startblurb

  • input/calendar (Utilisez input/date)

  • input/datepicker (Utilisez input/date à la place)

  • input/pulldown (Utilisez input/select à la place)

  • invitefriends/formitems

  • js/admin (Utilisez AMD et elgg_require_js au lieu d’étendre les vues JS existantes)

  • js/initialise_elgg (Utilisez AMD et elgg_require_js au lieu d’étendre les vues JS)

  • members/nav

  • metatags (Utilisez le hook plugin “head”, “page” à la place)

  • navigation/topbar_tools

  • navigation/viewtype

  • notifications/subscriptions/groupsform

  • object/groupforumtopic

  • output/calendar (Utilisez output/date à la place)

  • output/confirmlink (Utilisez output/url à la place)

  • page_elements/contentwrapper

  • page/elements/shortcut_icon (Utilisez le hook plugin “head”, “page” à la place)

  • page/elements/wrapper

  • profile/icon (Utilisez elgg_get_entity_icon)

  • river/object/groupforumtopic/create

  • settings/{plugin}/edit (Utilisez plugins/{plugin}/settings à la place)

  • user/search/finishblurb

  • user/search/startblurb

  • usersettings/{plugin}/edit (Utilisez plugins/{plugin}/usersettings à la place)

  • widgets/{handler}/view (Utilisez widgets/{handler}/content à la place)

Nous avons également abandonné les arguments suivants des vues :

  • « value » dans output/iframe (Utilisez plutôt « src »)

  • « area2 » et « area3 » dans page/elements/sidebar (utilisez plutôt « sidebar » ou l’extension de vue)

  • « js » dans les vues des icônes (par exemple icon/user/default)

  • Les « options » pour input/radio et input/checkboxes qui ne sont pas des paires de clef-valeur ne seront plus acceptées.

Tous les scripts ont été déplacés vers le bas de la page

Vous devriez tester votre plugin avec la console d’erreur JavaScript affichée. Pour des raisons de performance, Elgg ne prend plus en charge les éléments script dans l’élément head ou dans les vues HTML. elgg_register_js chargera désormais tous les scripts à la fin de l’élément body.

Vous devez convertir les scripts en ligne en modules AMD ou en scripts externes chargés avec elgg_load_js.

Tôt de la page, Elgg fournit un shim de la fonction RequireJS require() qui met simplement le code en file d’attente jusqu’à ce que les modules AMD elgg et jQuery soient définis. Cela fournit un moyen simple de convertir de nombreux scripts en ligne pour utiliser require().

Du code en ligne échouera car la pile n’est pas encore chargée :

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

Ceci devrait fonctionner dans Elgg 2.0 :

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

Le formateur d’attributs supprime les clefs avec des tirets bas

elgg_format_attributes() (et toutes les API qui l’utilisent) filtrent désormais les attributs dont le nom contient un tiret bas - underscore. Toutefois si l’attribut commence par data-, il ne sera pas supprimé.

Fonctions de rappel - Callbacks - dans les Requêtes

Assurez-vous d’utiliser uniquement des valeurs appelables - callable - valides pour l’argument/les options du « callback » dans l’API.

Les fonctions de requêtage lanceront désormais une RuntimeException si is_callable() renvoie false comme valeur pour la fonction de rappel donnée. Cela comprend des fonctions telles que elgg_get_entities(), get_data(), et bien d’autres.

Hook plugin des commentaires

Les plugins peuvent désormais renvoyer une chaîne vide depuis le hook 'comments',$entity_type afin de remplacer la vue du composant de commentaires par défaut. Pour forcer le composant de commentaires par défaut, votre plugin doit renvoyer false. Si vous utilisiez des chaînes vides pour forcer l’affichage des commentaires par défaut, vous devez mettre à jour vos gestionnaires de hooks pour qu’ils renvoient false.

Hook des permissions du conteneur

Le comportement du hook container_permissions_check a changé lorsqu’une entité est créée : avant la version 2.0, le hook était appelé deux fois si le conteneur de l’entité n’était pas le propriétaire. Lors du premier appel, le propriétaire de l’entité était transmis en tant que $params['container'], ce qui pouvait créer des confusion dans les gestionnaires.

Dans la version 2.0, lorsqu’une entité est créée dans un conteneur tel qu’un groupe, si le propriétaire est le même que l’utilisateur connecté (ce qui est presque toujours le cas), cette première vérification est contournée. Ainsi, le hook container_permissions_check sera presque toujours appelé une seule fois avec $params['container'] comme conteneur correct de l’entité.

La création ou la suppression d’une relation déclenche un seul événement

Les événements de relation « create » et « delete » sont désormais déclenchés une seule fois, avec "relationship" comme type d’objet.

Par ex. Écouter l’événement (ou les événements) "create", "member" ou "delete", "member" ne capturera plus les ajouts/suppressions d’appartenance au groupe. Utilisez les événements "create", "relationship" ou "delete", "relationship" events.

La fonction de discussion a été extraite des groupes vers son propre plugin

Le sous-type object, groupforumtopic a été remplacé par le sous-type object, discussion. Si votre plugin utilise ou modifie l’ancienne fonctionnalité de discussion, vous devez le mettre à niveau pour utiliser le nouveau sous-type.

Rien ne change du point de vue du propriétaire du groupe. La fonction de discussion est toujours disponible en tant qu’outil de groupe et toutes les anciennes discussions sont intactes.

Fonctionnalité de connexion via https abandonnée

Pour une meilleure sécurité et de meilleures performances, servez toutes les pages par HTTPS en changeant le protocole dans le wwwroot de votre site pour https dans http://yoursite.tld/admin/settings/advanced

Elgg a migré d’ext/mysql vers PDO MySQL

Elgg utilise désormais une connexion PDO_MYSQL et n’utilise plus de fonctions ext/mysql. Si vous utilisez les fonctions mysql_ *, en vous appuyant implicitement sur une connexion ouverte, celles-ci échoueront.

Si votre code utilise l’une des fonctions suivantes, lisez ce qui suit.

  • execute_delayed_write_query()

  • execute_delayed_read_query()

Si vous fournissez un objet $handler qui doit être appelé avec les résultats, votre gestionnaire recevra désormais un objet \Doctrine\DBAL\Driver\Statement. Auparavant, il s’agissait d’une ressource ext/mysql result.

L’ordre d’appel d’un événement/hook pourrait changer

Lors de l’enregistrement pour des événements/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 basse 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.

Les URLs export/ ne sont plus disponibles

Elgg ne prend plus en charge ce point de terminaison pour exposer les données de ressources.

Icônes migrés vers Font Awesome

Les sprites de Elgg et la plupart des classes CSS commençant par elgg-icon- ont été supprimées.

L’utilisation de elgg_view_icon() est rétro-compatible, mais le HTML statique utilisant les classes elgg-icon devra être mis à jour vers le nouveau balisage.

Augmentation de la valeur de z-index dans la classe elgg-menu-site

La valeur de z-index dans la classe elgg-menu-site est passée de 1 à 50 pour permettre aux éléments de page de la zone de contenu d’utiliser la propriété z-index sans que le menu du site additionnel « More » s’affiche derrière ces éléments. Si votre plugin/thème remplace la classe elgg-menu-site ou les views/default/elements/navigation.css veuillez ajuster en conséquence la valeur de z-index dans votre fichier CSS modifié.

vue input/autocomplete

Les plugins qui remplacent la vue input/autocomplete devront inclure l’URL source dans l’attribut data-source de l’élément d’entrée, exiger le nouveau module AMD elgg/autocomplete et appeler sa méthode init. La bibliothèque javascript 1.x elgg.autocomplete n’est plus utilisée.

Introduction d’une bibliothèque tierce pour l’envoi d’e-mails

Nous utilisons l’excellente bibliothèque Zend\Mail pour envoyer des e-mails dans Elgg 2.0. Il y a probablement des cas particuliers que la bibliothèque gère différemment de Elgg 1.x. Prenez soin de tester attentivement vos notifications par e-mail lors de la mise à niveau vers 2.0.

Éléments d’étiquetage - label

Les vues suivantes ont reçu des éléments label autour de certains des champs d’entrée. Si votre plugin/thème remplace ces vues, veuillez vérifier le nouveau contenu.

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

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

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

  • views/default/forms/login.php

Plugin de thème Aalborg

La vue page/elements/navbar utilise désormais une icône Font Awesome pour le sélecteur de menu mobile au lieu d’une image. L’image bars.png et les CSS correspondantes pour le rendu 1.12 ont été supprimées, aussi mettez à jour votre thème en conséquence.

Plugin Likes

Les objets ne peuvent plus être aimés - « likés » - par défaut. Pour qu’ils puissent être aimés, vous pouvez enregistrer un gestionnaire pour permettre l’annotation, ou plus simplement vous inscrire au hook ["likes:is_likable", "<type>:<subtype>"] et renvoyer true. Par ex.

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

Tout comme auparavant, le hook permissions_check:annotated est toujours appelé et peut être utilisé pour remplacer le comportement par défaut.

Plugin Messages

Si vous avez supprimé ou remplacé la fonction de gestionnaire messages_notifier pour masquer/modifier l’icône de la boîte de réception, vous devrez au lieu de cela faire de même pour le gestionnaire de menu de la barre supérieure - topbar - messages_register_topbar. messages_notifier n’est plus utilisé pour ajouter le lien de menu.

Les messages ne recevront plus les métadonnées “msg” pour les messages nouvellement créés. Cela signifie que vous ne pouvez plus compter sur l’existence de ces métadonnées.

Plugin Blog

Les pages de blog qui affichent les articles “Mine” - Moi - ou “Friends” - Contacts - ont été modifiés pour lister tous les articles de blog appartenant aux utilisateurs (y compris ceux créés dans les groupes).

Plugin des signets - Bookmarks

Les pages des signets qui affichent les listes de signets “Mine” - Moi - ou “Friends” - Contacts - ont été modifiées pour lister tous les signets appartenant aux utilisateurs (y compris ceux créés dans les groupes).

Plugin des fichiers - File

Les pages de fichiers qui affichent les listes de fichiers “Mine” - Moi - ou “Friends” - Contacts - ont été modifiées pour lister tous les fichiers appartenant aux utilisateurs (y compris ceux créés dans les groupes).

Classes supprimées

  • ElggInspector

  • Notable

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

Clefs retirées disponibles via elgg_get_config()

  • allowed_ajax_views

  • dataroot_in_settings

  • externals

  • externals_map

  • i18n_loaded_from_cache

  • language_paths

  • pagesetupdone

  • registered_tag_metadata_names

  • simplecache_enabled_in_settings

  • translations

  • viewpath

  • views

  • view_path

  • viewtype

  • wordblacklist

Notez également que les plugins ne devraient pas accéder à la variable globale $CONFIG à l’exception de settings.php.

Fonctions supprimées

  • blog_get_page_content_friends

  • blog_get_page_content_read

  • count_unread_messages()

  • delete_entities()

  • delete_object_entity()

  • delete_user_entity()

  • elgg_get_view_location()

  • elgg_validate_action_url()

  • execute_delayed_query()

  • extend_view()

  • get_db_error()

  • get_db_link()

  • get_entities()

  • get_entities_from_access_id()

  • get_entities_from_access_collection()

  • get_entities_from_annotations()

  • get_entities_from_metadata()

  • get_entities_from_metadata_multi()

  • get_entities_from_relationship()

  • get_filetype_cloud()

  • get_library_files()

  • get_views()

  • is_ip_in_array()

  • list_entities()

  • list_entities_from_annotations()

  • list_group_search()

  • list_registered_entities()

  • list_user_search()

  • load_plugins()

  • menu_item()

  • make_register_object()

  • mysql_*(): Elgg n’utilise plus ext/mysql

  • remove_blacklist()

  • search_for_group()

  • search_for_object()

  • search_for_site()

  • search_for_user()

  • search_list_objects_by_name()

  • search_list_groups_by_name()

  • search_list_users_by_name()

  • set_template_handler()

  • test_ip()

Méthodes supprimées

  • ElggCache::set_variable()

  • ElggCache::get_variable()

  • ElggData::initialise_attributes()

  • ElggData::getObjectOwnerGUID()

  • ElggDiskFilestore::make_directory_root()

  • ElggDiskFilestore::make_file_matrix()

  • ElggDiskFilestore::user_file_matrix()

  • ElggDiskFilestore::mb_str_split()

  • ElggEntity::clearMetadata()

  • ElggEntity::clearRelationships()

  • ElggEntity::clearAnnotations()

  • ElggEntity::getOwner()

  • ElggEntity::setContainer()

  • ElggEntity::getContainer()

  • ElggEntity::getIcon()

  • ElggEntity::setIcon()

  • ElggExtender::getOwner()

  • ElggFileCache::create_file()

  • ElggObject::addToSite(): la fonction parente dans ElggEntity est toujours disponible

  • ElggObject::getSites(): la fonction parente dans ElggEntity est toujours disponible

  • ElggSite::getCollections()

  • ElggUser::addToSite(): la fonction parente dans ElggEntity est toujours disponible

  • ElggUser::getCollections()

  • ElggUser::getOwner()

  • ElggUser::getSites(): la fonction parente est toujours disponible dans ElggEntity

  • ElggUser::listFriends()

  • ElggUser::listGroups()

  • ElggUser::removeFromSite(): la fonction parente est toujours disponible dans ElggEntity

Les arguments suivants ont également été abandonnés :

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

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

Hooks plugin supprimés

Actions supprimées

  • widgets/upgrade

Vues supprimées

  • forms/admin/plugins/change_state

Variables des Vues supprimées

Pendant le rendu, le système des vues ne les injecte plus dans le champ - scope :

  • $vars['url'] : remplacez par elgg_get_site_url()

  • $vars['user'] : remplacez par elgg_get_logged_in_user_entity()

  • $vars['config'] : utilisez elgg_get_config() et elgg_set_config()

  • $CONFIG: utilisez elgg_get_config() et elgg_set_config()

Plusieurs solutions de contournement pour des vues très anciennes ne sont plus effectuées. Effectuez ces modifications :

  • Définissez $vars['full_view'] au lieu de $vars['full'].

  • Définissez $vars['name'] au lieu de $vars['internalname'].

  • Définissez $vars['id'] au lieu de $vars['internalid'].

Bibliothèques supprimées

  • elgg:markdown : Elgg ne fournit plus d’implémentation de markdown. Vous devez fournir la vôtre.

Spécifier des Vues via les propriétés

La métadonnée $entity->view ne spécifie plus la vue utilisée pour l’affichage dans elgg_view_entity().

De même, la propriété $annotation->view n’a plus d’effet dans elgg_view_annotation().

Le type de vue est statique après l’appel initial elgg_get_viewtype()

elgg_set_viewtype() doit être utilisé pour définir le type de vue au moment de l’exécution. Bien que Elgg vérifie toujours l’entrée view et $CONFIG->view initialement, cela n’est fait qu’une fois par requête.

Dépréciations

Il est déprécié de lire ou d’écrire des clefs de métadonnées commençant par filestore:: sur les objets ElggFile. Dans Elgg 3.0, cette métadonnée sera supprimée si elle pointe vers le chemin d’accès racine actuel des données, aussi peu d’objets de fichiers devraient l’avoir. Les plugins ne doivent utiliser ElggFile::setFilestore que si les fichiers doivent être stockés dans un emplacement personnalisé.

Note

Ce n’est pas la seule dépréciation dans Elgg 2.0. Les développeurs de plugins devraient regarder leurs journaux d’erreurs de site.