Soy desarrollador y mantenedor del proyecto CiviCRM. Hemos estado tratando de hacer una versión de Drupal 8 CiviCRM, y hemos recorrido un largo camino. Estamos golpeando nuestras cabezas contra nuestros teclados colectivos tratando de encontrar un bloqueador importante para el proyecto.
CiviCRM ha usado Symfony por un tiempo, y la versión que se incluye es diferente a la que se incluye con Drupal.
Podemos instalar CiviCRM con Drupal 8, pero después de instalarlo, no podemos instalar ningún otro módulo de Drupal.
Creo que se reduce a una situación en la que de alguna manera la versión CiviCRM de Symfony se carga antes que la versión Drupal, y esto causa problemas.
¿Alguien sabe de un módulo Drupal 8 que incluya una versión diferente de Symfony que la que se entrega con Drupal?
Recientemente me encontré con el proyecto Ludwig. Este módulo permite el registro de espacios de nombres en una clase que se extiendeServiceProviderBase
.
¿Sería posible que la versión Drupal 8 del módulo CiviCRM incluya un archivo CivicrmServiceProvider.php, que define una CivicrmServiceProvider
clase y un register()
método que agrega un espacio de nombres de contenedor para permitir que esto funcione?
Muchos archivos CiviCRM tienen use
declaraciones como Drupal que comienzan con Symfony, como aquí .
De hecho, colocamos CiviCRM Core en la carpeta Drupal doc_root / collections, y usamos el módulo de bibliotecas.
Este es el repositorio para la versión 8.x del módulo CiviCRM Drupal , si alguien quiere ver lo que tenemos hasta ahora. Si alguien tiene el elixir mágico para esto, puedo decirte que habría mucha gente feliz en nuestra comunidad. Entonces, si sabe cómo ayudarnos, hágalo.
CiviCRM se instala y las páginas de CiviCRM funcionan. Lo que no funciona es que después de instalar CiviCRM, no podemos instalar otros módulos a través de la página admin / modules. Que yo sepa, eso es lo único que está roto. También instalar módulos con Drush, después de instalar CiviCRM, funciona.
Intentar instalar otro módulo después de instalar CiviCRM provoca el siguiente error:
Error fatal de PHP: Llame al método indefinido Symfony \ Component \ DependencyInjection \ Definition :: setFactory () en /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php en la línea 206
Eso está en Drupal 8.3.5. Intentar instalar CiviCRM para Drupal 8 en una instancia limpia de Drupal 8.4-dev causa el siguiente error:
Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: el indicador reservado "@" no puede iniciar un escalar simple; debe citar el escalar en la línea 8 (cerca de "argumentos: [@string_translation, @ civicrm.page_state]"). en Drupal \ Component \ Serialization \ YamlSymfony :: decode () (línea 40 de /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).
Respuestas:
Por lo tanto, creo que si CiviCRM se instalara en Drupal 8 a través del compositor (es decir,
composer require civicrm/civicrm-core
en la raíz de Drupal) y el uso de Symfony por parte de CiviCRM fuera compatible con Symfony 2.8 o 3.x (es decir, sin usar una funcionalidad obsoleta), esto podría funcionar.Esto instalaría todo en el directorio de proveedores de Drupal, en lugar de tener dos, y significaría que CiviCRM usaría la versión de Symfony en Drupal 8. Pero si CiviCRM fuera compatible con versiones posteriores de Symfony (incluso si incluye una versión anterior para Drupal). 6 y 7 y otros CMS) debería estar bien.
¿Yo creo que?ACTUALIZADO: Sí, funciona, lo probé. :-) Originalmente publiqué lo siguiente en la cola de problemas de CiviCRM ( CRM-17652 ), pero volví a publicar aquí para completar.
La gran idea:
Dado que el compositor es bastante nuevo para mucha gente, voy a intentar ir paso a paso, desde algunas cosas de compositores de alto nivel hasta una forma en que se podría hacer en CiviCRM:
^2.4.3
que dice un mínimo de 2.4.3 y hasta (pero no incluido) 3.0.0)^2.5
en su composer.json, lo que significa que es compatible con las versiones 2.5.0 hasta (pero sin incluir) 3.0.0composer require civicrm/civicrm-core
para requerir la biblioteca CiviCRM y todas sus dependencias. Si CiviCRM es compatible con Symfony 2.8 (como se usa en Drupal 8.3.x), todo se instalará y funcionará bien, utilizando el único Symfony 2.8 de Drupal. Todas las dependencias terminan en el directorio de proveedores de Drupal.La propuesta:
Para los CMS basados en compositores, realmente creo que esta es la forma correcta. Si bien este problema afecta actualmente a Symfony y Drupal, a medida que la comunidad PHP comienza a usar más y más bibliotecas de terceros a través del compositor, esto podría afectar a otros CMS con otros conflictos de versiones.
Algún código de trabajo para probar:
Entonces, como prometí, en realidad conseguí que esto funcionara en un grado limitado :-) Estoy llegando a esto desde una perspectiva de Drupal / Compositor / Symfony: no tengo mucha experiencia en CiviCRM, así que probablemente haya algo de mejores formas de hacer mi proceso a continuación. Agradezco cualquier consejo!
git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
/admin/modules
) e instale el módulo CiviCRMdrush cr
)Después de todo esto, CiviCRM está utilizando Symfony 2.8 de Drupal y las dependencias en el directorio de proveedores de Drupal, y no está cargando nada de su propio directorio de proveedores. Huzzah!
Probé habilitar el módulo "Teléfono" que falló antes de estos cambios (vea mis pasos para reproducir ), pero funciona bien con ellos. :-)
fuente
No creo que esto sea posible.
Drupal 8.4 en realidad ya cambió a Symfony 3, aunque todavía hay discusiones similares relacionadas con drush, que tiene el mismo problema. ver Drush 8.x no se instala Drupal 8.4.x y Drush maestro no instalar Drupal 8.3.x y componentes de Symfony se actualiza a 3.2.6
No es posible cargar dos versiones diferentes de Symfony, ya sea que rompas tu integración o rompas Drupal. Quizás symfony3 aún no esté en 8.4, pero el soporte de seguridad para symfony2 finalizará antes del soporte de seguridad de Drupal8, por lo que en algún momento, tendremos que cambiar.
fuente
Teóricamente, los únicos problemas aquí son la ubicación del archivo y el espacio de nombres de clase. Desafortunadamente, las únicas herramientas que conozco en Composer para hacer eso no te permiten especificar por VERSIÓN, solo por nombre de paquete.
¿Has intentado configurarlo como un autocargador completamente separado?
fuente