Je suis développeur et mainteneur du projet CiviCRM. Nous avons essayé de créer une version Drupal 8 CiviCRM, et nous avons parcouru un long chemin. Nous nous battons la tête contre nos claviers collectifs en essayant de trouver un bloqueur majeur pour le projet.
CiviCRM utilise Symfony depuis un certain temps, et la version incluse est différente de celle fournie avec Drupal.
Nous pouvons installer CiviCRM avec Drupal 8, mais après l'avoir installé, nous ne pouvons installer aucun autre module Drupal.
Je crois que cela se résume à une situation où la version CiviCRM de Symfony se charge d'une manière ou d'une autre avant la version Drupal, et cela pose des problèmes.
Quelqu'un connaît-il un module Drupal 8 qui inclut une version différente de Symfony que celle livrée avec Drupal?
Récemment, j'ai rencontré le projet Ludwig. Ce module permet l'enregistrement des espaces de noms dans une classe qui s'étendServiceProviderBase
.
Serait-il possible pour la version Drupal 8 du module CiviCRM d'inclure un fichier CivicrmServiceProvider.php, qui définit une CivicrmServiceProvider
classe et unregister()
méthode qui ajoute un espace de noms de conteneur pour permettre à cela de fonctionner?
De nombreux fichiers CiviCRM ont des use
instructions comme Drupal commençant par Symfony, comme ici .
Nous avons en fait mis CiviCRM Core dans le dossier Drupal doc_root / bibliothèques, et utilisons le module de bibliothèques.
Ceci est le repo pour la version 8.x du module CiviCRM Drupal , si quelqu'un veut regarder ce que nous avons obtenu jusqu'à présent. Si quelqu'un a l'élixir magique pour cela, je peux vous dire qu'il y aurait beaucoup de gens heureux dans notre communauté. Donc, si vous savez comment nous aider, n'hésitez pas.
CiviCRM s'installe et les pages CiviCRM fonctionnent. Ce qui ne fonctionne pas, c'est qu'après l'installation de CiviCRM, nous ne pouvons pas installer d'autres modules via la page admin / modules. Pour autant que je sache, c'est la seule chose qui est cassée. L'installation de modules avec Drush, après l'installation de CiviCRM, fonctionne également.
Essayer d'installer un autre module après l'installation de CiviCRM provoque l'erreur suivante:
Erreur fatale PHP: appel à la méthode non définie Symfony \ Component \ DependencyInjection \ Definition :: setFactory () dans /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php sur la ligne 206
C'est dans Drupal 8.3.5. Essayer d'installer CiviCRM pour Drupal 8 dans une instance propre de Drupal 8.4-dev provoque l'erreur suivante:
Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: l'indicateur réservé "@" ne peut pas démarrer un scalaire simple; vous devez citer le scalaire à la ligne 8 (près de "arguments: [@string_translation, @ civicrm.page_state]"). dans Drupal \ Component \ Serialization \ YamlSymfony :: decode () (ligne 40 de /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).
Réponses:
Donc, je pense que si CiviCRM était installé dans Drupal 8 via le composeur (c'est-à-dire
composer require civicrm/civicrm-core
dans la racine Drupal) et que CiviCRM utilisait Symfony était compatible avec Symfony 2.8 ou 3.x (c'est-à-dire sans utiliser de fonctionnalité obsolète), cela pourrait fonctionner.Cela aurait tout installé dans le répertoire des fournisseurs de Drupal, plutôt que d'en avoir deux, et cela signifierait que CiviCRM utiliserait la version Symfony dans Drupal 8. Mais si CiviCRM était compatible avec les versions ultérieures de Symfony (même s'il regroupait une ancienne version pour Drupal 6 & 7 et autres CMS) ça devrait aller.
Je pense?MISE À JOUR: Oui, cela fonctionne - je l'ai essayé. :-) J'ai initialement publié ce qui suit dans la file d'attente des problèmes de CiviCRM ( CRM-17652 ), mais je le republie ici pour être complet.
La grande idée:
Étant donné que le compositeur est assez nouveau pour beaucoup de gens, je vais essayer d'aller pas à pas, de certains trucs de compositeur de haut niveau jusqu'à une façon de le faire dans CiviCRM:
^2.4.3
qui dit un minimum de 2.4.3 et jusqu'à (mais pas y compris) 3.0.0)^2.5
dans son composer.json, ce qui signifie qu'il est compatible avec les versions 2.5.0 jusqu'à (mais sans inclure) 3.0.0composer require civicrm/civicrm-core
pour exiger la bibliothèque CiviCRM et toutes ses dépendances. Si CiviCRM est compatible avec Symfony 2.8 (comme utilisé dans Drupal 8.3.x), tout s'installera et fonctionnera correctement, en utilisant le seul Symfony 2.8 de Drupal. Toutes les dépendances finissent dans le répertoire des fournisseurs de Drupal.La proposition:
Pour les CMS basés sur des compositeurs, je pense vraiment que c'est la bonne façon. Bien que ce problème affecte actuellement Symfony et Drupal, alors que la communauté PHP commence à utiliser de plus en plus de bibliothèques tierces via Composer, cela pourrait très bien affecter d'autres CMS avec d'autres conflits de version.
Un code de travail à tester:
Donc, comme promis, je l'ai fait fonctionner à un degré limité :-) J'y arrive totalement du point de vue Drupal / Composer / Symfony - je n'ai pas une tonne d'expérience CiviCRM, donc il y a probablement de meilleures façons de faire mon processus ci-dessous. Je me réjouis de tout conseil!
git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
/admin/modules
) et installez le module CiviCRMdrush cr
)Après tout cela, CiviCRM utilise Symfony 2.8 de Drupal et les dépendances dans le répertoire des fournisseurs de Drupal, et ne charge rien à partir de son propre répertoire de fournisseurs. Huzzah!
J'ai testé l'activation du module "Téléphone" qui a échoué avant ces changements (voir mes étapes pour reproduire ), mais fonctionne très bien avec eux. :-)
la source
Je ne pense pas que ce soit possible.
Drupal 8.4 est en fait déjà passé à Symfony 3 bien qu'il y ait encore des discussions similaires liées à drush, qui a le même problème. voir Drush 8.x n'installe pas Drupal 8.4.x et Drush master n'installe pas Drupal 8.3.x et les composants Symfony sont mis à jour vers 3.2.6
Il n'est pas possible de charger deux versions symfony différentes, soit vous interrompez votre intégration, soit vous interrompez Drupal. Peut-être que symfony3 ne sera pas encore en 8.4, mais le support de sécurité pour symfony2 prendra fin avant le support de sécurité Drupal8, donc à un moment donné, nous devrons changer.
la source
Théoriquement, les seuls problèmes ici sont l'emplacement du fichier et l'espace de noms de classe. Malheureusement, les seuls outils que je connaisse dans composer pour le faire ne vous permettent pas de spécifier par VERSION, juste par nom de package.
Avez-vous essayé de le configurer en tant que chargeur automatique complètement séparé?
la source