From 12e7aa96696bbfed6d4a65e135d0aa80dfcb0825 Mon Sep 17 00:00:00 2001 From: Mark Hanna Date: Thu, 19 Jun 2025 13:54:36 -0600 Subject: [PATCH 1/2] composer codebase, discover vendor directory for installation --- includes/civicrm.admin.php | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/includes/civicrm.admin.php b/includes/civicrm.admin.php index e43a1fd..a65b004 100644 --- a/includes/civicrm.admin.php +++ b/includes/civicrm.admin.php @@ -273,6 +273,35 @@ public function run_installer() { } + $vendor_setup_paths = []; + $civicrm_plugin_dir_array = explode(DIRECTORY_SEPARATOR, CIVICRM_PLUGIN_DIR); + foreach ($civicrm_plugin_dir_array as $directory_component) { + $vendor_setup_paths[] = $directory_component; + $civicrm_core_path = implode(DIRECTORY_SEPARATOR, array_merge($vendor_setup_paths, ['vendor', 'civicrm', 'civicrm-core'])); + $civicrm_setup_autoload_path = $civicrm_core_path . DIRECTORY_SEPARATOR . 'setup' . DIRECTORY_SEPARATOR . 'civicrm-setup-autoload.php'; + $civicrm_classloader_path = $civicrm_core_path . DIRECTORY_SEPARATOR . 'CRM' . DIRECTORY_SEPARATOR . 'Core' . DIRECTORY_SEPARATOR . 'ClassLoader.php'; + if (file_exists($civicrm_setup_autoload_path)) { + require_once $civicrm_setup_autoload_path; + require_once $civicrm_classloader_path; + CRM_Core_ClassLoader::singleton()->register(); + \Civi\Setup::assertProtocolCompatibility(1.0); + \Civi\Setup::init([ + 'cms' => 'WordPress', + 'srcPath' => $civicrm_core_path, + ]); + $ctrl = \Civi\Setup::instance()->createController()->getCtrl(); + $ctrl->setUrls([ + 'ctrl' => menu_page_url('civicrm-install', FALSE), + 'res' => CIVICRM_PLUGIN_URL . 'civicrm/core/setup/res/', + 'jquery.js' => CIVICRM_PLUGIN_URL . 'civicrm/core/bower_components/jquery/dist/jquery.min.js', + 'font-awesome.css' => CIVICRM_PLUGIN_URL . 'civicrm/core/bower_components/font-awesome/css/all.min.css', + 'finished' => admin_url('admin.php?page=CiviCRM&q=civicrm&reset=1'), + ]); + \Civi\Setup\BasicRunner::run($ctrl); + return; + } + } + wp_die(__('Installer unavailable. Failed to locate CiviCRM libraries.', 'civicrm')); } From 3fba1b65ec02bc0941b8bfd46e37aa5d26aa22d8 Mon Sep 17 00:00:00 2001 From: Mark Hanna Date: Wed, 15 Oct 2025 20:13:59 -0600 Subject: [PATCH 2/2] improve algorithm for discovering vendor directory for composer based installs --- includes/civicrm.admin.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/includes/civicrm.admin.php b/includes/civicrm.admin.php index a65b004..13c6673 100644 --- a/includes/civicrm.admin.php +++ b/includes/civicrm.admin.php @@ -274,10 +274,17 @@ public function run_installer() { } $vendor_setup_paths = []; - $civicrm_plugin_dir_array = explode(DIRECTORY_SEPARATOR, CIVICRM_PLUGIN_DIR); - foreach ($civicrm_plugin_dir_array as $directory_component) { - $vendor_setup_paths[] = $directory_component; - $civicrm_core_path = implode(DIRECTORY_SEPARATOR, array_merge($vendor_setup_paths, ['vendor', 'civicrm', 'civicrm-core'])); + $filtered_paths = array_values(array_filter(explode(DIRECTORY_SEPARATOR, CIVICRM_PLUGIN_DIR))); + $potential_vendor_paths = []; + $count = count($filtered_paths); + for ($i = 0; $i <= $count; $i++) { + if ($i < $count) { + $slice = array_slice($filtered_paths, 0, $count - $i); + $potential_vendor_paths[] = '/' . implode('/', $slice); + } + } + foreach ($potential_vendor_paths as $potential_path) { + $civicrm_core_path = implode(DIRECTORY_SEPARATOR, array_merge(explode(DIRECTORY_SEPARATOR, $potential_path), ['vendor', 'civicrm', 'civicrm-core'])); $civicrm_setup_autoload_path = $civicrm_core_path . DIRECTORY_SEPARATOR . 'setup' . DIRECTORY_SEPARATOR . 'civicrm-setup-autoload.php'; $civicrm_classloader_path = $civicrm_core_path . DIRECTORY_SEPARATOR . 'CRM' . DIRECTORY_SEPARATOR . 'Core' . DIRECTORY_SEPARATOR . 'ClassLoader.php'; if (file_exists($civicrm_setup_autoload_path)) {