Статьи

Примените принцип СУХОГО к созданию сайтов с ExpressionEngine 2

ExpressionEngine 2 — замечательная система управления контентом и, возможно, самая удобная для разработчиков CMS, используемая многими известными именами, такими как A List Apart, Andy Clarke и Veerle Pieters. По иронии судьбы, однако, его конфигурация по умолчанию плохо подходит для профессионального рабочего процесса веб-разработки, который обычно включает несколько сайтов, серверов и разработчиков.

Из этого туториала вы узнаете, как настроить ExpressionEngine 2, чтобы вы могли взяться за дело с надежной, но гибкой отправной точкой, которую можно легко развернуть в нескольких средах за считанные минуты.


Я не программист. Тем не менее, мантра программирования не повторяется , или принцип СУХОЙ для тех любителей аббревиатур среди нас действительно начал резонировать во мне, поскольку я все больше вовлекаюсь как в веб-разработку, так и в собственный бизнес. На самом деле, СУХОЙ это хороший совет для жизни в целом. Повторение себя стоит больше времени заранее и, возможно, намного больше в будущем, если вам придется вернуться и сделать одно и то же изменение в нескольких местах.

Кроме того, это мешает личностному росту, потому что, если вы делаете то, что уже сделали, вы не узнаете что-то новое. Что лучше, так это определить те места, где вы повторяете себя и придумываете систему для стандартизации этой задачи или фрагмента данных.


Когда я впервые начал работать с ExpressionEngine полтора года назад, это был одноразовый проект, и я был начинающим дизайнером. Само собой разумеется, СУХОЙ менталитет был самым дальним из моих мыслей. Я радостно напевал, следил за настройками в соответствии с ситуацией, ничего не документировал и получал удовольствие от пользовательских полей и групп шаблонов, которые делают EE мечтой дизайнера. Это было похоже на мое первое свидание с программным обеспечением. В конце концов, мне настолько понравился EE, что я решил стать эксклюзивным и «жениться» на нем как на своей CMS, которую я выбрал для всех будущих проектов.

Однако после третьего или четвертого сайта я начал замечать недостатки в наших отношениях (что может случиться, когда вы действительно с чем-то познакомитесь) и разочаровался в выполнении рутинных, повторяющихся задач, связанных с развертыванием и управлением EE. Это было особенно очевидно в некоторых текущих проектах, которые требовали двух или трехкратных еженедельных обновлений от разработки до подготовки к работающим серверам. Дело дошло до того, что я тратил почти столько же времени на управление развертыванием, сколько на самом деле программировал.


Не желая терять деньги и раба от скучной тяжелой работы, я старался навести порядок.

Далее следует плод моего и чужого труда, руководство по применению принципа DRY для разработки и развертывания сайтов с помощью EE.

Он познакомит вас с тем, как я настроил дряблую бессмысленную конфигурацию по умолчанию ExpressionEngine 2, и превратил ее в компактную и эффективную рабочую лошадку, которая практически не повторяет работу с EE. В частности, эти модификации будут:

  • Укажите начальную точку для всех часто используемых установленных надстроек и включенных настроек, чтобы вы не запускали мастер установки и не начинали каждый раз с нуля.
  • Интегрируйте EE с выбранной вами системой контроля версий для быстрого развертывания на нескольких веб-серверах или рабочих станциях разработчиков и простого управления кодом. Мой опыт работы с SVN, но все принципы применимы и к Git.
  • Централизуйте все настройки и настройки, чтобы упростить миграцию с одного сервера на другой, поэтому запуск и отправка обновлений — легкая задача, а не головная боль.

Это было довольно большое усилие, и я не мог сделать это один. Большое спасибо следующим людям, которые помогли мне, знали ли они это или нет:


Ради вашего здравого смысла, получите свежую копию последней сборки EE 2, прежде чем делать что-либо из этого. Загрузите и установите как обычно, желательно на локальном сервере, так как вы будете вносить множество изменений в файлы. Оставьте шаблоны Agile Records, когда вам будет предложено.

Возьмите файлы примеров, которые включены в этот учебник. Вам пока не нужно ничего с ними делать, но держите их под рукой.


Если вам когда-либо приходилось переносить ExpressionEngine с одного сервера на другой, вы знаете, что эта задача не из легких; на самом деле, это полный кошмар, если вы не готовы. Во многом это связано с тем, что ExpressionEngine хранит переменные конфигурации и пути к серверам на протяжении всего процесса создания, до такой степени, что их сложно отследить и настроить при перемещении серверов.

Кенн Уилсон из Corvid Works резюмирует это лучше, чем мой:

«Это то, что делает Expression Engine настолько непереносимым — для перехода с одного сервера на другой, скажем, с разработки на производство, требуется обновить этот URL-адрес и информацию о пути буквально в дюжине мест. Это неуклюже, отнимает много времени и подвержено ошибкам ».

Он прав К счастью, есть другой способ. Вместо того, чтобы редактировать все эти переменные в дюжине мест на панели управления и, возможно, забыть о некоторых, вы можете объединить их в одном месте — файлы конфигурации. Это верно, все эти поля разбросаны по десяткам страниц в вашей карте CP в пару файлов PHP. По умолчанию ExpressionEngine хранит информацию о конфигурации, о которой вам нужно будет беспокоиться, в двух файлах. Эти:

  • system/expressionengine/config/config.php
  • system/expressionengine/config/database.php

Как вы можете себе представить, database.php хранит информацию о соединении с базой данных MySQL. Я полагаю, что EllisLab придерживается позиции, что легче найти информацию о БД, если она находится в собственном метко названном файле, но я собираюсь доказать обратное. Это СУХОЙ, черт возьми! Я предпочел бы открыть один файл и редактировать мои настройки из одного места, а не из двух, поэтому я полностью покончил с database.php данных.php. Ну, не совсем, но я взял все настройки базы данных и перевел их в config.php с небольшим количеством PHP.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
 
if ( ! defined(‘EXT’)){
exit(‘Invalid file request’);
}
 
/* THIS FILE WILL NEED PERMISSIONS SET TO 400 OR SIMILAR SO EE DOESN’T OVERWRITE IT.
 
require ‘config.php’;
break;
     
}
 
?>

Переименуйте существующий файл database.php во что-то вроде old-database.php и переместите его на рабочий стол, так как позже вам понадобятся настройки подключения. Замените его на database.php включенный в этот учебник, и установите разрешения равными 400, как указано.

Поздравляю. Вам никогда не придется беспокоиться о database.php снова.

Теперь этот database.php говорит ExpressionEngine, что нужно искать информацию о соединении с базой данных в config.php нам нужно на самом деле поместить ее туда, но есть проблема. Когда EE перемещается с одного сервера на другой, параметры подключения к базе данных необходимо изменить, чтобы отразить новую среду сервера. Если мы хотим разработать и внедрить EE с системой контроля версий (и, поверьте мне, мы это делаем), то каждый раз, когда мы развертываем рабочую копию на новый сервер, нам нужно будет загружать копию файла config.php , редактировать настройки базы данных, чтобы они были правильными для этого сервера, передайте его обратно на сервер по FTP и убедитесь, что наш контроль версий проигнорировал его при выполнении фиксации или обновления. В лучшем случае у нас будет отдельный файл конфигурации без контроля версий для каждого дополнительного сервера, на котором находится сайт. Для меня (и я шоу одного человека) это:

  • локальный сервер iMac
  • Локальный сервер Macbook Pro
  • промежуточный сервер
  • живой сервер

Добавьте еще пару разработчиков, если вы работаете в агентстве, и вы смотрите на множество этих пижонов, бегающих вокруг. Так что же происходит, когда вам нужно изменить другую переменную конфигурации, например, номер лицензии? Вы отправляете по электронной почте себе и другим разработчикам копию этого файла и загружаете его на все серверы один за другим? СУХОЙ, друзья мои, СУХОЙ. Единственный логический ответ — это единственный файл config.php управлением версиями, который может работать со всеми серверными средами.

Чепуха, вы могли бы сказать, но благодаря некоторому умному PHP это действительно возможно. Как видно из приведенного ниже примера, синтаксис регистра в PHP ищет IP-адрес и обслуживает соответствующие настройки базы данных на основе этого IP-адреса. Теперь единственное, что вам нужно знать и изменять при развертывании на новом сервере, — это IP-адрес и информация о соединении с базой данных, которые должны быть вам легко доступны.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* Environmental Variables */
 
switch ( $_SERVER[‘SERVER_ADDR’] ) {
     
    // local
    case ‘127.0.0.1’ :
    $db[‘expressionengine’][‘hostname’] = «localhost»;
    $db[‘expressionengine’][‘username’] = «root»;
    $db[‘expressionengine’][‘password’] = «password»;
    $db[‘expressionengine’][‘database’] = «local-db»;
    break;
     
    // staging
    case ‘72.10.54.22’ :
    $db[‘expressionengine’][‘hostname’] = «mysql.exampleserver.com»;
    $db[‘expressionengine’][‘username’] = «admin»;
    $db[‘expressionengine’][‘password’] = «password»;
    $db[‘expressionengine’][‘database’] = «staging-db»;
    break;
     
    // live
    case ‘82.335.65.67’ :
    $db[‘expressionengine’][‘hostname’] = «mysql.exampleserver.com»;
    $db[‘expressionengine’][‘username’] = «admin»;
    $db[‘expressionengine’][‘password’] = «password»;
    $db[‘expressionengine’][‘database’] = «live-db»;
    break;
     
}

На этом этапе я хочу провести различие между тем, что я называю переменными среды, и универсальными переменными . Переменные среды различны в зависимости от среды сервера. Универсальные переменные одинаковы независимо от того, на каком сервере находится сайт, поэтому они выходят за пределы синтаксиса IP переключения / регистра. Это такие вещи, как пути к серверу и URL-адреса к папке тем, папке с шаблоном, CAPTCHA, номер лицензии, в основном все, кроме вышеупомянутой информации базы данных и IP-адреса (все они прокомментированы во включенном файле для справки).

Вы слышали, как я говорил, что пути к серверам и URL-адреса остаются неизменными независимо от того, на каком сервере вы находитесь? Да вы сделали. Пока структура папок вашего сайта остается одинаковой в каждом случае (и если вы используете контроль версий, это очевидно будет), пользовательский config.php включенный в эти руководства, использует переменные PHP для определения пути и URL-адреса корневого сервера и их заполнения. для вас. Почему EE не делает этого с самого начала, сбивает с толку меня, но я отвлекся. Больше не нужно забывать менять путь к папке с темами при переносе серверов и тратить час на то, чтобы выяснить, почему вместо CP отображается пустой экран. Кто-нибудь еще взволнован?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* Universal Variables */
 
$config[‘app_version’] = «211»;
$config[‘license_number’] = «0000-0000-0000-0000»;
$config[‘debug’] = «1»;
$config[‘install_lock’] = «»;
$config[‘system_folder’] = «admin»;
$config[‘doc_url’] = «http://expressionengine.com/user_guide/»;
$config[‘is_system_on’] = «y»;
$config[‘cookie_prefix’] = «»;
$config[‘site_name’] = «Flourish Interactive Codebase»;
$config[‘allow_extensions’] = «y»;
 
/* General
——————————————————————-*/
$config[‘site_index’] = «»;
$config[‘site_url’] = «http://».$_SERVER[‘HTTP_HOST’];
$config[‘server_path’] = $_SERVER[‘DOCUMENT_ROOT’];
$config[‘cp_url’] = $config[‘site_url’].»/».$config[‘system_folder’];
 
/* Universal database connection settings
——————————————————————-*/
$active_group = ‘expressionengine’;
$active_record = TRUE;
$db[‘expressionengine’][‘dbdriver’] = «mysql»;
$db[‘expressionengine’][‘dbprefix’] = «exp_»;
$db[‘expressionengine’][‘pconnect’] = FALSE;
$db[‘expressionengine’][‘swap_pre’] = «exp_»;
$db[‘expressionengine’][‘db_debug’] = FALSE;
$db[‘expressionengine’][‘cache_on’] = FALSE;
$db[‘expressionengine’][‘autoinit’] = FALSE;
$db[‘expressionengine’][‘char_set’] = «utf8»;
$db[‘expressionengine’][‘dbcollat’] = «utf8_general_ci»;
$db[‘expressionengine’][‘cachedir’] = $config[‘server_path’].$config[‘system_folder’].»/expressionengine/cache/db_cache/»;
 
/* Member directory paths and urls
——————————————————————-*/
$config[‘avatar_url’] = $config[‘site_url’].»/uploads/system/avatars/»;
$config[‘avatar_path’] = $config[‘server_path’].»/uploads/system/avatars/»;
$config[‘photo_url’] = $config[‘site_url’].»/uploads/system/member_photos/»;
$config[‘photo_path’] = $config[‘server_path’].»/uploads/system/member_photos/»;
$config[‘sig_img_url’] = $config[‘site_url’].»/uploads/system/signature_attachments/»;
$config[‘sig_img_path’] = $config[‘server_path’].»/uploads/system/signature_attachments/»;
$config[‘prv_msg_upload_path’] = $config[‘server_path’].»/uploads/system/pm_attachments/»;
 
/* Misc directory paths and urls
——————————————————————-*/
$config[‘theme_folder_url’] = $config[‘site_url’].»/themes/»;
$config[‘theme_folder_path’] = $config[‘server_path’].»/themes/»;
 
/* Templates Preferences
——————————————————————-*/
$config[‘save_tmpl_files’] = «y»;
$config[‘tmpl_file_basepath’] = $config[‘server_path’].»/templates/»;
$config[‘site_404’] = «404/index»;
$config[‘strict_urls’] = «n»;

Чтобы установить пользовательский файл config.php :

  1. Переименуйте существующий файл config.php , расположенный в system/expressionengine/config/config.php , во что-то вроде old-config.php и переместите его на рабочий стол.
  2. Возьмите config.php включенный в это руководство, и поместите его в system/expressionengine/config . Установите разрешения на 400.
  3. Откройте новый config.php в редакторе кода вместе с old-database.php и old-config.php
  4. Скопируйте и вставьте настройки из старых файлов в новый. Файл был закомментирован, так что вы знаете, что и куда поместить.

Помните, что универсальная переменная может стать переменной среды, если вам это нужно. Допустим, вы хотите автоматически изменить имя своего сайта в зависимости от того, на каком сервере он находится, так что вы можете сразу увидеть, смотрите ли вы локальную, dev или живую версию своего сайта. Просто удалите переменную из области «универсальных переменных» и скопируйте ее в каждый случай IP, присваивая ей любое значение, которое вы хотите.


Давайте смотреть правде в глаза; Стандартная установка ExpressionEngine включает в себя множество файлов, которые вам не нужны, особенно если вы профессиональный разработчик, который не ковыряется в первый раз. К ним относятся файлы тем для примера сайта Agile Records, смайлики, вики-темы и многое другое. Зачем толстеть свой сайт без необходимости? Положите EE на диету и удалите все эти вещи, вы всегда можете взять свежую копию и добавить ее обратно в маловероятном случае, если она понадобится вам для вики, форума или другого сайта сообщества. Удалите только то, что имеет для вас смысл, но я сделал около десятка сайтов EE и никогда не использовал ни одного из них.

  • /themes/wiki_themes
  • /themes/site_themes/agile_records
  • /themes/profile_themes/agile_records
  • /images/smileys
  • /images/avatars

Подобно многим задачам в веб-разработке, нет единственно правильного способа решить эту проблему, но важно то, что вы выбираете путь и придерживаетесь его. Некоторым людям нравится помещать свои статические файлы ресурсов (изображения, css, js, swf и т. Д.) В папку /themes/site_themes/examplesite . Я предпочитаю размещать каждую папку ресурсов на верхнем уровне, потому что я ленивый и не люблю нажимать на три уровня подпапок, чтобы получить доступ к этим файлам во время разработки, плюс мне нравятся красивые короткие URL-адреса в моих HTML и CSS. Теперь, когда я привык к стандартной структуре, я не создаю дополнительные файлы или папки верхнего уровня без крайней необходимости (вы поймете почему через минуту). Вот как выглядит моя структура верхнего уровня.

  • .htaccess — объясню подробнее через минуту
  • system — переименуйте это пожалуйста
  • css
  • favicon.ico
  • fw — это сокращение от «framework», например мои фоновые изображения CSS
  • imagesimages не управляемые CMS
  • index.php
  • js
  • robots.txt
  • templates
  • themes — CP и темы типа поля
  • uploads — куда идут все документы и изображения, управляемые CMS

Теперь я дошел до разговора о .htaccess . Это загадка для многих разработчиков, и, честно говоря, для меня тоже, но я знаю достаточно, чтобы использовать его для удаления этого неприглядного index.php из других симпатичных URL-адресов EE. Я использую вариант метода exclude из ExpressionEngine Wiki . Это никоим образом не гарантирует работу на вашем веб-хосте, но для меня это работает на MAMP Pro, HostGator и MediaTemple, как (gs), так и (dv). Применяются обычные предостережения, например, mod_rewrite должен быть включен в http.conf Apache и т. Д. Если вы используете этот метод удаления index.php и хотите добавить новый файл или папку верхнего уровня на свой сайт (и я имею в виду «настоящий «Файл или папка, а не запись EE, шаблон или группа шаблонов), вам нужно добавить исключение в .htaccess иначе файл / папка будут недоступны.

Чтобы установить мой собственный .htaccess , temp.htaccess включенный файл с именем temp.htaccess в папку верхнего уровня. Удалите «временную» часть имени файла (все до точки). Ваша операционная система может предупредить вас, что переименование файла разрушит юниверс. Игнорируйте это и нажмите ОК. Файл может исчезнуть, и это нормально, потому что .htaccess — это скрытый файл. Теперь, если вы хотите отредактировать его, вам нужно, чтобы скрытые файлы были видны в настройках вашей ОС.


После разработки нескольких сайтов EE появились дополнения, которые я либо не хочу, либо не могу жить. Это лучшее, что может предложить сообщество разработчиков EE, и они имеют честь быть установленными в моей кодовой базе, так что каждый новый сайт получает их с самого начала. Они есть (и все они бесплатны):

Не просто установите их, настройте их. Например, я установил все свои шаблоны уведомлений по электронной почте для Freeform, создал дополнительные настраиваемые поля формы на основе того, что я обычно использую для стандартной формы контакта, и у меня есть шаблон с именем contact.html котором есть код формы интерфейса пользователя. , включая проверку JavaScript и сообщение об успехе. Даже если мне нужно добавить поле или два или переместить этот код формы в другой шаблон, это вопрос настройки, а не создания с нуля каждый раз. DRY. За исключением CSS-стилей, эта форма готова к выходу из коробки.

Будьте в поиске другой статьи, как только я расскажу об этом и о нескольких коммерческих дополнениях для EE2 более подробно.


Предоставление неограниченного доступа к моему клиенту страшно и для них, и для меня.

Это одна из тех вещей, которые вы, вероятно, забудете сделать, пока не закончите работу с сайтом, но это не обязательно должно быть, если он находится в вашей кодовой базе. Учетная запись администратора EE по умолчанию принадлежит к группе участников Super Admins, которая обязательно имеет доступ ко всему. Предоставить неограниченный доступ к моему клиенту страшно и для них, и для меня, поэтому я создаю вторую группу участников под названием Admins. Я обычно жду, пока они не выберут адрес электронной почты, прежде чем я на самом деле создаю их учетную запись, но это займет всего пару секунд после того, как вы определите разрешения для группы участников.

В этой группе пользователей я отключил весь доступ к шаблонам, администрированию сайтов и участников, коммуникационному модулю и надстройкам. Все, что нужно большинству клиентов, — это создавать и редактировать контент, и, возможно, просматривать свои представления Freeform. Вот и все. Упростите свою жизнь и свою и заберите то, что им не нужно. Опять же, я должен был настроить это раньше, но отправная точка лучше, чем начинать с нуля.


Поздравляем, теперь у вас должна быть намного лучшая отправная точка для вашего следующего проекта ExpressionEngine. Чтобы вы могли добавить к нему и использовать его повторно, создайте новый проект в вашем контроле версий и зафиксируйте свою настроенную кодовую базу ExpressionEngine как версию номер один. Ниже приведены примеры некоторых типичных операций, которые вам, вероятно, нужно будет выполнить после того, как у вас появятся новые проекты в конвейере (может варьироваться в зависимости от настроек сервера или если вы используете Git вместо SVN).

  • Очистите все кеши вашего кода.
  • Экспорт базы данных и импорт под новым именем проекта с использованием PHPMyAdmin или аналогичного.
  • SVN экспортирует копию вашей кодовой базы в папку рабочей копии нового проекта SVN. ОЧЕНЬ ВАЖНО: обратите внимание, что я сказал экспорт, а не оформление заказа.
  • Установите для следующих папок и их содержимого разрешения 777:
    • /templates
    • /uploads (или как называется ваша папка загрузки)
    • /system/expressionengine/cache/db_cache
  • Добавьте информацию о подключении к БД для новой БД в config.php . Измените имя сайта, номера лицензий и любые другие параметры, которые вам нужно изменить.
  • Загрузите панель управления и измените настройки загрузки файлов. Они хранятся в базе данных и не могут быть помещены в конфигурацию по какой-то единственной причине.
  • Сходить с ума.
  • Очистить все кэши.
  • Экспорт и импорт базы данных с использованием PHPMyAdmin или аналогичного.
  • Найдите IP-адрес и информацию о базе данных и добавьте новый раздел IP-адресов в config.php .
  • Зафиксируйте config.php в вашем хранилище.
  • Проверьте репозиторий вашего сайта в папке public_html вашего нового сервера.
    • Если это локальный сервер, используйте ваш SVN-клиент.
    • Если это удаленный сервер, используйте команду SSH svn checkout http://samplerepository.com/sampleproject/. Пробел и точка после косой черты проверяют содержимое папки в текущей папке, в противном случае вы получите public_html / sampleproject / index.php, если не указать точку.
  • Установите для следующих папок и их содержимого разрешения 777:
    • /templates
    • /uploads (или как называется ваша папка загрузки)
    • /system/expressionengine/cache/db_cache
  • Загрузите панель управления и измените настройки загрузки файлов.
  • Очистите все кэши (только если вы внесли изменения в базу данных).
  • Экспорт и импорт базы данных с использованием PHPMyAdmin или аналогичного (только если вы внесли изменения в базу данных).
  • Запустите обновление SVN на своей копии сайта:
    • Если это локальный сервер, используйте ваш SVN-клиент.
    • Если это удаленный сервер, используйте команду SSH svn update. Вам не нужно повторно вводить URL или пароль.
  • Загрузите панель управления и измените настройки загрузки файлов (только если вы внесли изменения в базу данных).

Занимаясь своим бизнесом, проектируя и разрабатывая офигенные веб-сайты ExpressionEngine, будьте всегда в курсе того, что вы делаете, с точки зрения общей функциональности. Некоторые части функциональности веб-сайта практически идентичны на разных сайтах, им просто нужны небольшие настройки разметки и CSS-оболочка, чтобы легко переходить с одного на другой.

В будущем микроформаты будут стандартизировать разметку еще больше! Это идеальные кандидаты для включения в вашу кодовую базу. Одна из тех, что мы уже обсуждали, — это вездесущая контактная форма. Некоторые другие потенциальные «стандартные» функции (у меня было несколько клиентов, которые спрашивали об этом):

  • Блоги и связанные с ними формы комментариев
  • Адрес или V карты
  • Разделы новостей
  • Карты сайта в формате XML или «Google»
  • Поиск и страницы результатов поиска
  • Custom Share This! код типа
  • Сроки Facebook или Twitter

Теоретически у вас могут быть каналы и категории, настраиваемые группы полей и шаблоны, готовые к работе (я знаю, что для многих из них). Ваш клиент по-прежнему получает такую ​​же стоимость, какую он получил бы, если бы вы создали эти части вручную для их сайта (возможно, больше, поскольку они будут дорабатываться и проверяться чаще), а вы выполняете меньше работы, что означает, что вы можете оценивать себя более конкурентоспособно или, если вы продаете фиксированную комиссию, взимайте ту же цену и получайте больше прибыли. Не забудьте развлекаться и получать удовольствие от разработки с ExpressionEngine!