Project

General

Profile

Actions

{{last_updated_at}} by {{last_updated_by}}

CiviCRM for Drupal 8 installation notes

  • Make sure your composer version is up to date! The one that ships with civicrm-buildkit is quite old.
  • Run the composer command on David Snopek's blog post that fits your scenario (creating a new site vs. adding Civi to an existing D8 site).
    • New site is: composer create-project roundearth/drupal-civicrm-project:8.x-dev some-dir --no-interaction
  • Add the following to civicrm.settings.php (modify the last line for your actual CMS root, and paste this after CIVICRM_UF_BASEURL is defined):
$civicrm_setting['URL Preferences']['userFrameworkResourceURL'] = CIVICRM_UF_BASEURL . '/libraries/civicrm/';                                                                                                     
$civicrm_paths['civicrm.root']['url'] = CIVICRM_UF_BASEURL . '/libraries/civicrm/';
$civicrm_setting['domain']['userFrameworkResourceURL'] = CIVICRM_UF_BASEURL . '/libraries/civicrm/';
$civicrm_paths['cms.root']['path'] = '/home/jon/local/drupal8test/web';

extern directory access

D8 restricts access to PHP files that aren't whitelisted, so you need to whitelist the extern directory files. In <webroot>/.htaccess, find this rule:

# For security reasons, deny access to other PHP files on public sites.
  # Note: The following URI conditions are not anchored at the start (^),
  # because Drupal may be located in a subdirectory. To further improve
  # security, you can replace '!/' with '!^/'.
  # Allow access to PHP files in /core (like authorize.php or install.php):
  RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$
  # Allow access to test-specific PHP files:
  RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?\.php
  # Allow access to Statistics module's custom front controller.
  # Copy and adapt this rule to directly execute PHP files in contributed or
  # custom modules or to run another PHP application in the same directory.
  RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics\.php$
  # Deny access to any other PHP files that do not match the rules above.
  # Specifically, disallow autoload.php from being served directly.
  RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F]

Change it to this:

  # For security reasons, deny access to other PHP files on public sites.
  # Note: The following URI conditions are not anchored at the start (^),
  # because Drupal may be located in a subdirectory. To further improve
  # security, you can replace '!/' with '!^/'.
  # Allow access to PHP files in /core (like authorize.php or install.php):
  RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$
  # Allow access to test-specific PHP files:
  RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?\.php
  # Allow access to Statistics module's custom front controller.
  # Copy and adapt this rule to directly execute PHP files in contributed or
  # custom modules or to run another PHP application in the same directory.
  RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics\.php$
  # Allow access to the CiviCRM "extern" directory.
  RewriteCond %{REQUEST_URI} !/libraries/civicrm/extern/[a-z]+\.php$
  # Deny access to any other PHP files that do not match the rules above.
  # Specifically, disallow autoload.php from being served directly.
  RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F]

KCFinder PHP access

Note: I needed to do this on one site and not another. Anyone who can provide me with insight as to why it's not always necessary, I'd really appreciate it!

As above, but add the following condition as well (place anywhere above the RewriteRule in the block above:

  # Allow access to CKEditor for CiviCRM.
  RewriteCond %{REQUEST_URI} !/libraries/civicrm/packages/kcfinder/[a-z_/]+\.php$

On every install and update:

non-bootstrap scripts

[There's an open MR to handle this]

  • To get bin/csv/import.php loading correctly, create a second settings_location.php in vendor/civicrm/civicrm-core:
<?php

define('CIVICRM_CONFDIR', dirname(dirname(dirname(dirname(__FILE__)))) . '/web/sites');

Using Windows

Check out this gist by demeritcowboy.

Updated by Jon Goldberg over 2 years ago · 24 revisions