Saya seorang pengembang dan pemelihara untuk proyek CiviCRM. Kami telah mencoba untuk membuat CiviCRM versi Drupal 8, dan telah berhasil. Kami memukul kepala kami dengan keyboard kolektif kami mencoba mencari penghalang utama untuk proyek ini.
CiviCRM telah menggunakan Symfony untuk sementara waktu, dan versi yang disertakan berbeda dari apa yang dikirimkan dengan Drupal.
Kita dapat menginstal CiviCRM dengan Drupal 8, tetapi setelah Anda menginstalnya, kami tidak dapat menginstal modul Drupal lainnya.
Saya percaya ini bermuara pada situasi di mana entah bagaimana versi CiviCRM dari Symfony dimuat sebelum versi Drupal, dan ini menyebabkan masalah.
Adakah yang tahu tentang modul Drupal 8 yang menyertakan versi Symfony yang berbeda dari modul yang dikirimkan bersama Drupal?
Baru-baru ini saya berlari melintasi proyek Ludwig. Modul ini memungkinkan pendaftaran ruang nama di kelas yang diperluasServiceProviderBase
.
Apakah mungkin untuk versi Drupal 8 dari modul CiviCRM untuk menyertakan file CivicrmServiceProvider.php, yang mendefinisikan CivicrmServiceProvider
kelas, dan register()
metode yang menambahkan namespace wadah untuk memungkinkan ini berfungsi?
Banyak file CiviCRM memiliki use
pernyataan seperti Drupal yang dimulai dengan Symfony, seperti di sini .
Kami benar-benar memasukkan CiviCRM Core ke folder Drupal doc_root / libraries, dan menggunakan modul libraries.
Ini adalah repo untuk modul 8.vi CiviCRM Drupal modul , jika seseorang ingin melihat apa yang kami dapatkan sejauh ini. Jika seseorang memiliki ramuan ajaib untuk ini, saya dapat memberitahu Anda akan ada banyak orang bahagia di komunitas kami. Jadi, jika Anda tahu cara membantu kami, silakan lakukan.
CiviCRM menginstal, dan halaman CiviCRM berfungsi. Yang tidak berfungsi adalah bahwa setelah CiviCRM diinstal, kami tidak dapat menginstal modul lain melalui halaman admin / modul. Sejauh yang saya tahu itulah satu-satunya hal yang rusak. Juga memasang modul dengan Drush, setelah menginstal CiviCRM, tidak berfungsi.
Mencoba menginstal modul lain setelah CiviCRM diinstal menyebabkan kesalahan berikut:
Kesalahan PHP fatal: Panggilan ke metode yang tidak ditentukan Symfony \ Component \ DependencyInjection \ Definition :: setFactory () di /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php pada baris 206
Itu dalam Drupal 8.3.5. Mencoba menginstal CiviCRM untuk Drupal 8 ke dalam instance Drupal 8.4-dev yang bersih menyebabkan kesalahan berikut:
Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: Indikator yang dicadangkan "@" tidak dapat memulai skalar biasa; Anda perlu mengutip skalar di baris 8 (dekat "argumen: [@string_translation, @ civicrm.page_state]"). dalam Drupal \ Component \ Serialization \ YamlSymfony :: decode () (baris 40 dari /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).
Jawaban:
Jadi, saya pikir jika CiviCRM dipasang ke Drupal 8 melalui komposer (mis.
composer require civicrm/civicrm-core
Di root Drupal) dan CiviCRM menggunakan Symfony kompatibel dengan Symfony 2.8 atau 3.x (mis. Tidak menggunakan fungsi yang sudah ketinggalan zaman), ini bisa bekerja.Ini akan mendapatkan semua yang diinstal di direktori vendor Drupal, daripada memiliki dua, dan itu berarti CiviCRM akan menggunakan versi Symfony di Drupal 8. Tetapi jika CiviCRM kompatibel dengan versi Symfony yang lebih baru (bahkan jika itu bundel versi yang lebih lama untuk Drupal 6 & 7 dan CMS lainnya) harus baik-baik saja.
Kupikir?DIPERBARUI: Ya, itu berfungsi - saya mencobanya. :-) Saya awalnya memposting di bawah ini dalam antrian masalah CiviCRM ( CRM-17652 ), tetapi memposting ulang di sini untuk kelengkapan.
Ide besar:
Karena komposer cukup baru bagi banyak orang, saya akan mencoba untuk selangkah demi selangkah, dari beberapa komposer tingkat tinggi sampai ke satu cara yang dapat dilakukan di CiviCRM:
^2.4.3
yang mengatakan minimum 2,4.3 dan lebih tinggi (tetapi tidak termasuk) 3.0.0)^2.5
di composer.json yang berarti itu kompatibel dengan versi 2.5.0 hingga (tetapi tidak termasuk) 3.0.0composer require civicrm/civicrm-core
perpustakaan CiviCRM dan semua dependensinya. Jika CiviCRM kompatibel dengan Symfony 2.8 (seperti yang digunakan dalam Drupal 8.3.x) semuanya akan diinstal dan berfungsi dengan baik, menggunakan single Symfony 2.8 dari Drupal. Semua dependensi berakhir di direktori vendor Drupal.Proposal:
Untuk CMS berbasis komposer, saya benar-benar berpikir ini adalah The Right Way. Sementara masalah ini saat ini mempengaruhi Symfony dan Drupal, karena komunitas PHP mulai menggunakan lebih banyak perpustakaan pihak ketiga melalui komposer, ini bisa sangat mempengaruhi CMS lain dengan konflik versi lainnya.
Beberapa kode kerja yang akan diuji:
Jadi, seperti yang dijanjikan, saya benar-benar membuat ini bekerja pada tingkat yang terbatas :-) Saya benar-benar datang pada ini dari perspektif Drupal / Komposer / Symfony - Saya tidak punya banyak pengalaman CiviCRM, jadi mungkin ada beberapa cara yang lebih baik untuk melakukan proses saya di bawah ini. Saya menyambut setiap saran!
git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
/admin/modules
) dan instal modul CiviCRMdrush cr
)Setelah semua ini, CiviCRM menggunakan Symfony 2.8 dari Drupal dan dependensi dalam direktori vendor Drupal, dan tidak memuat apa pun dari direktori vendor itu sendiri. Sabas!
Saya diuji mengaktifkan modul "Telepon" yang gagal sebelum perubahan ini (lihat langkah saya untuk mereproduksi ), tetapi berfungsi dengan baik dengan mereka. :-)
sumber
Saya rasa ini tidak mungkin.
Drupal 8.4 sebenarnya sudah beralih ke Symfony 3 meskipun masih ada diskusi serupa terkait dengan drush, yang memiliki masalah yang sama. lihat Drush 8.x tidak menginstal Drupal 8.4.x dan Drush master tidak menginstal Drupal 8.3.x dan komponen Symfony diperbarui ke 3.2.6
Tidak mungkin memuat dua versi symfony yang berbeda, baik Anda memutus integrasi Anda atau Anda merusak Drupal. Mungkin symfony3 belum dalam 8,4, tetapi dukungan keamanan untuk symfony2 akan berakhir sebelum dukungan keamanan Drupal8, jadi pada beberapa titik, kita harus beralih.
sumber
Secara teoritis satu-satunya masalah di sini adalah lokasi file dan namespace kelas. Sayangnya satu-satunya alat yang saya tahu di komposer untuk melakukan itu jangan biarkan Anda menentukan per VERSION, cukup per nama paket.
Sudahkah Anda mencoba menyetelnya sebagai autoloader yang benar-benar terpisah?
sumber