From 7e7237b6a5b62d7022ad34a23803adf0ddb666a7 Mon Sep 17 00:00:00 2001 From: Mikey O'Toole <mikey@mjco.uk> Date: Tue, 28 Jan 2020 12:20:26 +0000 Subject: [PATCH] Refactor, Lint and L10n This commit refactors this page in line with coding standards and linting output and documents the l10n directory. --- docs/framework/filesystem.md | 133 +++++++++++++++++------------------ 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/docs/framework/filesystem.md b/docs/framework/filesystem.md index 786318dc..902e61c4 100644 --- a/docs/framework/filesystem.md +++ b/docs/framework/filesystem.md @@ -19,16 +19,16 @@ the [civicrm-drupal](https://github.com/civicrm/civicrm-drupal/), contain the code connecting CiviCRM to the CMS along with some CMS-specific features. -### Drupal and Backdrop +### Codebase: Drupal and Backdrop The CiviCRM module is typically found in the `sites/all/modules/civicrm` directory. As with any Drupal module, it is possible to put CiviCRM in several alternative folders, such as: - * `sites/example.com/modules/civicrm` - * `sites/default/modules/civicrm` - * `sites/all/modules/civicrm` (most common) - * `modules/civicrm` +* `sites/example.com/modules/civicrm` +* `sites/default/modules/civicrm` +* `sites/all/modules/civicrm` (most common) +* `modules/civicrm` Within the `civicrm` folder, there will be a [`drupal/`](https://github.com/civicrm/civicrm-drupal/) or @@ -36,12 +36,12 @@ Within the `civicrm` folder, there will be a contains the `civicrm.module` along with the role sync modules, blocks, and drush and views integration. -### Joomla +### Codebase: Joomla CiviCRM's codebase exists in *two* places within Joomla: - - A front-end component at `components/com_civicrm` - - A back-end component at `administrator/components/com_civicrm` +* A front-end component at `components/com_civicrm` +* A back-end component at `administrator/components/com_civicrm` The back-end component contains the common CiviCRM code, in `administrator/components/com_civicrm/civicrm`. The @@ -49,30 +49,30 @@ The back-end component contains the common CiviCRM code, in a `site` directory for the front-end files and an `admin` directory for the back-end files. -### WordPress +### Codebase: WordPress The CiviCRM plugin is found in `wp-content/plugins/civicrm`. This corresponds to the [civicrm-wordpress](https://github.com/civicrm/civicrm-wordpress/) repository, containing the plugin file as well as WP-CLI integration. The common CiviCRM codebase is found at `wp-content/plugins/civicrm/civicrm`. -### Tip: Programmatic lookup +### Tip: Programatically using [civicrm.root] If you are writing an extension or integration that needs to reference the codebase of an existing installation, use a command to lookup the correct value. In `bash`, call the [`cv`](https://github.com/civicrm/cv) command-line tool: -``` -$ cv path -d '[civicrm.root]' -$ cv path -d '[civicrm.root]/README.md' -$ cv url -d '[civicrm.root]' -$ cv url -d '[civicrm.root]/README.md' +``` sh +cv path -d '[civicrm.root]' +cv path -d '[civicrm.root]/README.md' +cv url -d '[civicrm.root]' +cv url -d '[civicrm.root]/README.md' ``` Or in PHP, use `Civi::paths()`: -```php +``` php echo Civi::paths()->getPath("[civicrm.root]/."); echo Civi::paths()->getPath("[civicrm.root]/README.md"); echo Civi::paths()->getUrl("[civicrm.root]/."); @@ -84,21 +84,21 @@ echo Civi::paths()->getUrl("[civicrm.root]/README.md"); The CiviCRM codebase includes some third-party libraries. These are pulled into three folders: - * __`vendor`__ is collection of PHP libraries which are automatically downloaded - by [`composer`](http://getcomposer.org/) based on the `composer.json` configuration. - * __`bower_components`__ is a collection of JS/CSS libraries which are automatically - downloaded by [`bower`](https://bower.io/) based on the `bower.json` configuration. - * __`packages`__ is a manually curated collection of library files. - It's maintained in [`civicrm-packages.git`](https://github.com/civicrm/civicrm-packages/). +* `vendor`__ is collection of PHP libraries which are automatically downloaded + by [`composer`](http://getcomposer.org/) based on the `composer.json` configuration. +* `bower_components`__ is a collection of JS/CSS libraries which are automatically + downloaded by [`bower`](https://bower.io/) based on the `bower.json` configuration. +* `packages`__ is a manually curated collection of library files. + It's maintained in [`civicrm-packages.git`](https://github.com/civicrm/civicrm-packages/). !!! note "When adding a new dependency to core, use `composer.json` or `bower.json`." -### Tip: Programmatic lookup +### Tip: Programmatically using Civi::paths() Traditionally, one would use the root folder of `civicrm-core` to determine the path or URL of a library, as in: -```php +``` php global $civicrm_root; echo "$civircm_root/packages/IDS/default_filter.xml"; ``` @@ -110,7 +110,7 @@ future. In CiviCRM v4.7.21+, one should use `Civi::paths()` to lookup the path or URL for a library: -```php +``` php echo Civi::paths()->getPath('[civicrm.vendor]/dompdf/dompdf/README.md'); echo Civi::paths()->getUrl('[civicrm.vendor]/dompdf/dompdf/README.md'); @@ -124,13 +124,13 @@ echo Civi::paths()->getUrl('[civicrm.packages]/IDS/default_filter.xml'); Additionally, to register JS/CSS resources in `Civi::resources()`, you can use a shorthand with the path variables, as in: -```php +``` php echo Civi::resources()->addScriptFile('civicrm.bower', 'jquery/dist/jquery.min.js'); ``` -## Local data files +## Local Data Files -CiviCRM also needs directories for storing volatile data files, such as +CiviCRM also needs directories for storing volatile data files, such as logs, caches, and uploads. These directories are located outside the main codebase, in a location that can be safely preserved during upgrades. @@ -142,18 +142,18 @@ CiviCRM provides two main file storage helpers: The actual path is chosen to align with the conventions of each CMS and typically [civicrm.private] will refer to the same directory as [civicrm.files] while providing the ability to manage paths in a more granular fashion should the need arise. -### Drupal and Backdrop +### Local Data Files: Drupal and Backdrop CiviCRM stores its files in a folder named `civicrm` within the Drupal `files` directory. This is commonly `sites/default/files/civicrm`, though it could be `files/civicrm`, `sites/example.org/files/civicrm`, or another folder determined by the system administrator. -### Joomla +### Local Data Files: Joomla The CiviCRM local files are within the `media/civicrm` directory. -### WordPress +### Local Data Files: WordPress Newly-installed CiviCRM sites on WordPress have their local files at `wp-content/uploads/civicrm`. Many older sites use the previous default: @@ -161,21 +161,20 @@ Newly-installed CiviCRM sites on WordPress have their local files at ### Tip: Sub-directories -The `[civicrm.files]` and `[civicrm.private]` are CiviCRM's base directories for files storage, each will contain several sub-directories. +The `[civicrm.files]` and `[civicrm.private]` are CiviCRM's base directories for files storage, each will contain several sub-directories. These sub-directories will include: - -| Code Name | Typical Path | Recommended Access Level | Comments -| -------------------- | ------------------------------------ | ----------------------------------------------- |----------------------------------------------------------------- -| `configAndLogDir` | `[civicrm.log]` defaults to `[civicrm.private]/ConfigAndLog` | Prohibit all web access | Stores log files. Writes and reads should be infrequent, unless there are errors/warnings. -| `customFileUploadDir` | `[civicrm.files]/custom` | Prohibit all web access | Stores sensitive uploads (such as custom-field attachments). Writes and reads vary widely (depending on use-case/config). -| `extensionsDir` | `[civicrm.files]/ext` | Allow file reads but prohibit directory listing | Stores downloaded extensions. Writes should be infrequent. Reads are very frequent. In hardened systems, this may be readonly or disabled. -| `imageUploadDir` | `[civicrm.files]/persist/contribute` | Allow file reads but prohibit directory listing | Stores uploaded or autogenerated media (images/css/etc). Writes and reads vary widely (depending on use-case/config). -| `templateCompileDir` | `[civicrm.compile]` defaults to `[civicrm.private]/templates_c`| Prohibit all web access | Stores autogenerated PHP files. Writes should be infrequent. Reads are very frequent. -| `uploadDir` | `[civicrm.files]/upload` | Prohibit all web access | Temporary files. Writes and reads vary widely (depending on use-case/config). +| Code Name | Typical Path | Recommended Access Level | Comments | +| --------------------- | -------------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| `configAndLogDir` | `[civicrm.log]` defaults to `[civicrm.private]/ConfigAndLog` | Prohibit all web access | Stores log files. Writes and reads should be infrequent, unless there are errors/warnings. | +| `customFileUploadDir` | `[civicrm.files]/custom` | Prohibit all web access | Stores sensitive uploads (such as custom-field attachments). Writes and reads vary widely (depending on use-case/config). | +| `extensionsDir` | `[civicrm.files]/ext` | Allow file reads but prohibit directory listing | Stores downloaded extensions. Writes should be infrequent. Reads are very frequent. In hardened systems, this may be readonly or disabled. | +| `imageUploadDir` | `[civicrm.files]/persist/contribute` | Allow file reads but prohibit directory listing | Stores uploaded or autogenerated media (images/css/etc). Writes and reads vary widely (depending on use-case/config). | +| `l10nDir` | `[civicrm.l10n]` defaults to `[civicrm.private]/l10n` | Prohibit all web access | Stores CiviCRM's localisation files. Writes should be infrequent (generally on Update or Extension Install). Reads are very frequent. | +| `templateCompileDir` | `[civicrm.compile]` defaults to `[civicrm.private]/templates_c`| Prohibit all web access | Stores autogenerated PHP files. Writes should be infrequent. Reads are very frequent. | +| `uploadDir` | `[civicrm.files]/upload` | Prohibit all web access | Temporary files. Writes and reads vary widely (depending on use-case/config). | !!! tip "Advanced filesystem and web server configurations" - Each folder has different requirements (with respect to permissions, read-write frequency, etc). Most Apache-based web servers respect the `.htaccess` and `index.html` files, and these are configured automatically. @@ -186,28 +185,29 @@ These sub-directories will include: For the time being,`CIVICRM_TEMPLATE_COMPILEDIR` can be set in `civicrm.settings.php` and file paths will work as before. Alternatively, one may remove `CIVICRM_TEMPLATE_COMPILEDIR` and instead, set all paths using `$civicrm_paths`. With the following examples, the reasons for this setup should be more intuitive. -#### Example 1: Minimalist: all public and private data go to the same folder, sites/default/files/civicrm. +#### Example 1: Minimalist: all public and private data go to the same folder, sites/default/files/civicrm -``` +``` php $civicrm_paths['civicrm.files']['path'] = '/srv/example.com/htdocs/sites/default/files/civicrm'; $civicrm_paths['civicrm.private']['path'] = '/srv/example.com/htdocs/sites/default/files/civicrm'; ``` -The constant `CIVICRM_TEMPLATE_COMPILEDIR` is never consulted. Updating `civicrm.files` changes only public data folders. Updating `civicrm.private` changes only private data folders (e.g. `templateCompileDir` and `ConfigAndLogDir`). +The constant `CIVICRM_TEMPLATE_COMPILEDIR` is never consulted. Updating `civicrm.files` changes only public data folders. Updating `civicrm.private` changes only private data folders (e.g. `templateCompileDir` and `ConfigAndLogDir`). -#### Example 2: The public and private data are stored in separate places, akin to Drupal's public and private folders. +#### Example 2: The public and private data are stored in separate places, akin to Drupal's public and private folders -``` +``` php $civicrm_paths['civicrm.files']['path'] = '/srv/example.com/htdocs/sites/default/files/civicrm'); $civicrm_paths['civicrm.private']['path'] = '/srv/example.com/private/civicrm'); ``` -#### Example 3: Try to follow Linux FHS and override most default paths. +#### Example 3: Try to follow Linux FHS and override most default paths -``` +``` php $civicrm_paths['civicrm.files']['path'] = '/var/www/sites/default/files/civicrm'); $civicrm_paths['civicrm.private']['path'] = '/var/lib/civicrm'); $civicrm_paths['civicrm.log']['path'] = '/var/log/civicrm'); +$civicrm_paths['civicrm.l10n']['path'] = '/var/lib/civicrm/l10n'); $civicrm_paths['civicrm.compile']['path'] = '/var/run/civicrm-compile'); $civicrm_paths['civicrm.root']['path'] = '/usr/share/php/civicrm-core'); $civicrm_paths['civicrm.root']['url'] = 'https://example.com/civicrm-core'); // with httpd path alias @@ -215,18 +215,18 @@ $civicrm_paths['cms.root']['path'] = '/usr/share/php/drupal-core'); $civicrm_paths['cms.root']['url'] = 'https://example.com/'); // with httpd path alias ``` -### Tip: Programmatic lookup +### Tip: Programmatically using [civicrm.files] If you are writing an extension or integration that needs to reference the data files of an existing installation, use a command to lookup the correct value. In `bash`, call the [`cv`](https://github.com/civicrm/cv) command-line tool: -``` -$ cv path -d'[civicrm.files]' -$ cv path -d'[civicrm.files]/upload' -$ cv url -d'[civicrm.files]' -$ cv url -d'[civicrm.files]/upload' +``` sh +cv path -d'[civicrm.files]' +cv path -d'[civicrm.files]/upload' +cv url -d'[civicrm.files]' +cv url -d'[civicrm.files]/upload' ``` Or in PHP, use `Civi::paths()`: @@ -242,15 +242,15 @@ Additionally, some items -- such as the log folder or cache folder -- are configurable. The most correct way to find these is to read a config variable. In `bash`: -``` -$ cv path -c configAndLogDir -$ cv path -c templateCompileDir -$ cv path -c templateCompileDir/en_US +``` sh +cv path -c configAndLogDir +cv path -c templateCompileDir +cv path -c templateCompileDir/en_US ``` Or in PHP: -``` +``` php echo CRM_Core_Config::singleton()->configAndLogDir; echo CRM_Core_Config::singleton()->templateCompileDir; echo CRM_Core_Config::singleton()->templateCompileDir . '/en_US'; @@ -273,8 +273,8 @@ In Backdrop, the `civicrm.settings.php` is often located in the site root. There are two instances of `civicrm.settings.php` in Joomla, within each of the components: - - front-end at `components/com_civicrm/civicrm.settings.php` - - back-end at `administrator/components/com_civicrm/civicrm.settings.php` +* front-end at `components/com_civicrm/civicrm.settings.php` +* back-end at `administrator/components/com_civicrm/civicrm.settings.php` The files are *nearly* identical. The one difference is that the front-end file has the site's normal base URL, while the back-end file has `/administrator/` on @@ -290,19 +290,18 @@ dangerous when upgrading: it is important in this case to keep the `civicrm` folder until the upgrade is complete and the site is verified to be working properly. - -### Tip: Programmatic lookup +### Tip: Programmatically using CIVICRM_SETTINGS_PATH If you are writing an extension or integration that needs to reference the settings of an existing installation, use the constant `CIVICRM_SETTINGS_PATH` to locate `civicrm.settings.php`. In `bash`: -``` -$ cv ev 'echo CIVICRM_SETTINGS_PATH;' +``` sh +cv ev 'echo CIVICRM_SETTINGS_PATH;' ``` Or in PHP: -```php +``` php echo CIVICRM_SETTINGS_PATH; ``` -- GitLab