Jestem programistą i opiekunem projektu CiviCRM. Próbowaliśmy stworzyć CiviCRM w wersji Drupal 8 i przeszliśmy długą drogę. Uderzamy głowami w klawisze kolektywne, próbując znaleźć główny bloker dla tego projektu.
CiviCRM od jakiegoś czasu używa Symfony, a dołączona wersja jest inna niż ta, która jest dostarczana z Drupalem.
Możemy zainstalować CiviCRM z Drupal 8, ale po jego zainstalowaniu nie możemy zainstalować żadnego innego modułu Drupal.
Wierzę, że sprowadza się to do sytuacji, w której wersja Symfony CiviCRM ładuje się przed wersją Drupala, co powoduje problemy.
Czy ktoś wie o module Drupal 8, który zawiera inną wersję Symfony niż ten dostarczany z Drupalem?
Ostatnio natknąłem się na projekt Ludwig. Ten moduł umożliwia rejestrację przestrzeni nazw w rozszerzonej klasieServiceProviderBase
.
Czy byłoby możliwe, aby wersja CiviCRM w wersji Drupal 8 zawierała plik CivicrmServiceProvider.php, który definiuje CivicrmServiceProvider
klasę, oraz register()
metodę, która dodaje przestrzeń nazw kontenera, aby to działało?
Wiele plików CiviCRM ma use
takie instrukcje, jak Drupal zaczynające się od Symfony, jak tutaj .
W rzeczywistości umieszczamy CiviCRM Core w folderze Drupal doc_root / libraries i używamy modułu bibliotek.
To jest repozytorium dla wersji CiviCRM Drupal w wersji 8.x. , jeśli ktoś chce spojrzeć na to, co do tej pory mamy. Jeśli ktoś ma do tego magiczny eliksir, mogę powiedzieć, że w naszej społeczności byłoby wielu szczęśliwych ludzi. Jeśli więc wiesz, jak nam pomóc, zrób to.
CiviCRM się instaluje, a strony CiviCRM działają. Nie działa to, że po zainstalowaniu CiviCRM nie możemy instalować innych modułów za pośrednictwem strony admin / moduły. O ile wiem, to jedyna zepsuta rzecz. Działa także instalacja modułów z Drush, po zainstalowaniu CiviCRM.
Próba zainstalowania innego modułu po zainstalowaniu CiviCRM powoduje następujący błąd:
Błąd krytyczny PHP: Wywołanie niezdefiniowanej metody Symfony \ Component \ DependencyInjection \ Definition :: setFactory () w /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php w linii 206
To jest w Drupal 8.3.5. Próba zainstalowania CiviCRM dla Drupala 8 w czystej instancji Drupala 8.4-dev powoduje następujący błąd:
Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: Zarezerwowany wskaźnik „@” nie może uruchomić zwykłego skalara; musisz zacytować skalar w linii 8 (w pobliżu „argumentów: [@string_translation, @ civicrm.page_state]”). w Drupal \ Component \ Serialization \ YamlSymfony :: decode () (wiersz 40 /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).
Odpowiedzi:
Tak więc myślę, że gdyby CiviCRM został zainstalowany w Drupal 8 za pośrednictwem kompozytora (tj.
composer require civicrm/civicrm-core
W katalogu głównym Drupal), a użycie Symfony przez CiviCRM było kompatybilne z Symfony 2.8 lub 3.x (tj. Nieużywanie przestarzałej funkcjonalności), mogłoby to działać.Spowodowałoby to zainstalowanie wszystkiego w katalogu producenta Drupala, zamiast posiadania dwóch, i oznaczałoby, że CiviCRM używałby wersji Symfony w Drupal 8. Ale gdyby CiviCRM był kompatybilny z późniejszymi wersjami Symfony (nawet gdyby zawierał starszą wersję dla Drupal 6 i 7 oraz inne CMS-y) powinno być w porządku.
Myślę?ZAKTUALIZOWANO: Tak, działa - próbowałem. :-) Pierwotnie zamieściłem poniżej w kolejce problemów CiviCRM ( CRM-17652 ), ale ponownie opublikowałem tutaj, aby uzyskać kompletność.
Wielki pomysł:
Ponieważ kompozytor jest całkiem nowy dla wielu osób, spróbuję przejść krok po kroku, od niektórych rzeczy kompozytora na wysokim poziomie, aż do jednego sposobu, w jaki można to zrobić w CiviCRM:
^2.4.3
co najmniej 2.4.3 i do (ale nie w tym) 3.0.0)^2.5
w pliku composer.json, co oznacza, że jest kompatybilny z wersjami od 2.5.0 do (ale nie włącznie) 3.0.0composer require civicrm/civicrm-core
z biblioteki CiviCRM i wszystkich jej zależności. Jeśli CiviCRM jest kompatybilny z Symfony 2.8 (podobnie jak w Drupal 8.3.x) wszystko zainstaluje się i będzie działać poprawnie, używając pojedynczego Symfony 2.8 z Drupal. Wszystkie zależności kończą się w katalogu dostawców Drupala.Propozycja:
W przypadku CMS-ów opartych na kompozytorach naprawdę uważam, że jest to właściwy sposób. Chociaż ten problem dotyczy obecnie Symfony i Drupal, ponieważ społeczność PHP zaczyna korzystać z coraz większej liczby bibliotek stron trzecich za pośrednictwem kompozytora, może to bardzo dobrze wpłynąć na inne CMS z innymi konfliktami wersji.
Niektóre działające kody do testowania:
Tak więc, jak obiecałem, faktycznie udało mi się to zrobić w ograniczonym stopniu :-) Całkowicie podchodzę do tego z perspektywy Drupala / Kompozytora / Symfony - nie mam ogromnego doświadczenia w CiviCRM, więc prawdopodobnie jest trochę lepsze sposoby na wykonanie mojego procesu poniżej. Cieszę się z każdej porady!
git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
/admin/modules
) i zainstaluj moduł CiviCRMdrush cr
)Po tym wszystkim CiviCRM używa Symfony 2.8 z Drupala i zależności w katalogu dostawców Drupala i nie ładuje niczego z własnego katalogu dostawców. Huzzah!
Testowałem włączenie modułu „Telefon”, który zawiódł przed wprowadzeniem tych zmian (zobacz moje kroki do odtworzenia ), ale działa z nimi dobrze. :-)
źródło
Nie sądzę, żeby to było możliwe.
Drupal 8.4 faktycznie przeszedł już na Symfony 3, chociaż wciąż istnieją podobne dyskusje dotyczące drusha, który ma ten sam problem. zobacz Drush 8.x nie instaluje Drupal 8.4.x i Drush master nie instaluje Drupal 8.3.x, a komponenty Symfony są aktualizowane do 3.2.6
Nie można załadować dwóch różnych wersji symfony, albo przerwiesz integrację, albo złamiesz Drupala. Być może symfony3 nie będzie jeszcze w wersji 8.4, ale obsługa bezpieczeństwa symfony2 zakończy się przed obsługą bezpieczeństwa Drupal8, więc w pewnym momencie będziemy musieli się przełączyć.
źródło
Teoretycznie jedynymi problemami są tutaj lokalizacja pliku i przestrzeń nazw klas. Niestety, jedyne narzędzia, które znam w kompozytorze do robienia tego, nie pozwalają na określenie dla WERSJI, tylko dla nazwy pakietu.
Czy próbowałeś skonfigurować go jako całkowicie oddzielny moduł ładujący automatycznie?
źródło