Разработка

Что мне использовать для редактирования PHP-кода?

Есть два основных варианта: текстовый редактор или интегрированная среда разработки (IDE).

Текстовый редактор

Если вы новичок в разработке ПО или не имеете большого опыта работы с IDE, использование текстового редактора позволит вам быстрее начать работу. Как минимум, вам понадобится редактор с подсветкой синтаксиса для облегчения чтения кода. Если вы планируете отправлять патчи в баг-трекер, убедитесь, что ваш текстовый редактор не меняет окончания строк. Если вы используете Windows, хорошим выбором будет Notepad++. Если вы работаете на Mac, популярным выбором является TextWrangler. Также можно попробовать TextMate.

Интегрированная среда разработки

IDE делает именно то, что подразумевает её название: включает набор инструментов, которые обычно используются отдельно. Большинство IDE включают контроль исходного кода, что позволяет напрямую фиксировать и обновлять код из вашего cvs-репозитория. В них может быть встроен FTP-клиент для упрощения передачи файлов на удалённый сервер. В них есть проверка синтаксиса для выявления ошибок перед запуском кода на сервере.

Три самые популярные бесплатные IDE для разработчиков PHP — это Eclipse, NetBeans и Codelobster. Eclipse имеет два разных плагина для работы с кодом PHP: PDT и PHPEclipse.

Мне не нравится формулировка чего-то в Elgg. Как мне это изменить?

Лучший способ сделать это — с помощью плагина.

Создать скелет плагина

Структура плагина

Найдите строку, которую вы хотите изменить

Все строки, которые видит пользователь, должны находиться в директории /languages или в директории языков плагина (/mod/<имя плагина>/languages). Это сделано для того, чтобы было легко изменить язык, используемый Elgg. Дополнительную информацию см. в документации для разработчиков: Интернационализация.

Чтобы найти строку, используйте grep или текстовый редактор с функцией поиска по файлам. (Хороший текстовый редактор для Windows — Notepad++) Допустим, мы хотим изменить строку «Add friend» на «Make a new friend». Команда grep для поиска этой строки будет grep -r "Add friend" *. Используя Notepad++, вы воспользуетесь командой «Найти в файлах». Вы будете искать строку, установите фильтр *.php, укажете базовую директорию Elgg и убедитесь, что поиск выполняется во всех поддиректориях. Также можно установить чувствительность к регистру.

Вы должны найти строку «Add friend» в файле /languages/en.php. В файле вы увидите что-то подобное:

'friend:add' => "Add friend",

Это означает, что каждый раз, когда Elgg видит friend:add, он заменяет это на «Add friend». Мы хотим изменить определение friend:add.

Переопределите строку

Чтобы переопределить это определение, мы добавим языковой файл в плагин, созданный на первом шаге.

  1. Создайте новую директорию: /mod/<имя вашего плагина>/languages

  2. Создайте в этой директории файл с именем en.php

  3. Добавьте в этот файл следующие строки

<?php

return array(
   'friend:add' => 'Make a new friend',
);

Убедитесь, что перед <?php нет пробелов или переносов строк.

Теперь вы закончили и должны иметь возможность включить плагин и увидеть изменения. Если вы переопределяете язык плагина, убедитесь, что ваш плагин загружается после того, который вы пытаетесь изменить. Порядок загрузки определяется на странице управления инструментами в разделе администрирования. По мере нахождения других элементов, которые вы хотите изменить, вы можете продолжать добавлять их в этот плагин.

Как мне найти код, который делает x?

Лучший способ найти код, который делает что-то, что вы хотите изменить, — использовать grep или аналогичный инструмент поиска. Если в вашей операционной системе нет grep, установите инструмент grep или используйте текстовый редактор/IDE с хорошим поиском по файлам. Notepad++ — хороший выбор для пользователей Windows. Eclipse с PHP и NetBeans — хорошие варианты для любой платформы.

Пример строки

Допустим, вы хотите найти, где расположен код окна Входа. Строка из окна Входа, которая должна быть достаточно уникальной, — это Remember me. Выполните grep по этой строке. Вы обнаружите, что она используется только в файле en.php в директории /languages. Там она используется для определения строки Интернационализация user:persistent. Теперь выполните grep по этой строке. Вы найдёте её в двух местах: в том же языковом файле en.php и в /views/default/forms/login.php. Последний определяет HTML-код, из которого состоит окно Входа.

Пример действия

Допустим, вы хотите найти код, который выполняется, когда пользователь нажимает кнопку Сохранить при размещении виджетов на странице профиля. Откройте страницу профиля тестового пользователя. Используйте Firebug для детального изучения HTML-кода страницы, пока не дойдёте до действия формы редактирования виджетов. Вы увидите, что URL от базового адреса — action/widgets/move.

Выполните grep по widgets/move, и будут возвращены два файла. Один — это код JavaScript для виджетов: /js/lib/ui.widgets.js. Другой, /engine/lib/widgets.php, — это место, где действие регистрируется с помощью elgg_register_action('widgets/reorder'). Если вы не знакомы с этой функцией, найдите её в справочнике API. Выполните поиск по функции, и она вернёт документацию по функции. Это подскажет вам, что действие находится в расположении по умолчанию, так как расположение файла не было указано. Расположение по умолчанию для действий — /actions, поэтому вы найдёте файл по адресу /actions/widgets/move.php.

Режим отладки

В процессе установки вы, возможно, заметили флажок, управляющий включением или выключением режима отладки. Этот параметр также можно изменить на странице администрирования сайта. Режим отладки записывает много дополнительных данных в ваш PHP-лог. Например, при работе в этом режиме каждый запрос к базе данных записывается в ваши логи. Это может быть полезно для отладки проблемы, хотя может создавать огромный объём данных, которые могут вообще не относиться к проблеме. Вы можете поэкспериментировать с этим режимом, чтобы понять, как он работает, но убедитесь, что запускаете Elgg в обычном режиме на рабочем сервере.

Предупреждение

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

Что попадает в лог в режиме отладки?

  • Все запросы к базе данных

  • Профилирование запросов к базе данных

  • Время генерации страницы

  • Количество запросов на страницу

  • Список языковых файлов плагинов

  • Дополнительные ошибки/предупреждения по сравнению с обычным режимом (очень редко такие типы ошибок связаны с проблемами, которые могут у вас возникать)

Как выглядят данные?

[07-Mar-2009 14:27:20] Query cache invalidated
[07-Mar-2009 14:27:20] ** GUID:1 loaded from DB
[07-Mar-2009 14:27:20] SELECT * from elggentities where guid=1 and ( (1 = 1)  and enabled='yes') results cached
[07-Mar-2009 14:27:20] SELECT guid from elggsites_entity where guid = 1 results cached
[07-Mar-2009 14:27:20] Query cache invalidated
[07-Mar-2009 14:27:20] ** GUID:1 loaded from DB
[07-Mar-2009 14:27:20] SELECT * from elggentities where guid=1 and ( (1 = 1)  and enabled='yes') results cached
[07-Mar-2009 14:27:20] ** GUID:1 loaded from DB
[07-Mar-2009 14:27:20] SELECT * from elggentities where guid=1 and ( (1 = 1)  and enabled='yes') results returned from cache
[07-Mar-2009 14:27:20] ** Sub part of GUID:1 loaded from DB
[07-Mar-2009 14:27:20] SELECT * from elggsites_entity where guid=1 results cached
[07-Mar-2009 14:27:20] Query cache invalidated
[07-Mar-2009 14:27:20] DEBUG: 2009-03-07 14:27:20 (MST): "Undefined index:  user" in file /var/www/elgg/engine/lib/elgglib.php (line 62)
[07-Mar-2009 14:27:20] DEBUG: 2009-03-07 14:27:20 (MST): "Undefined index:  pass" in file /var/www/elgg/engine/lib/elgglib.php (line 62)
[07-Mar-2009 14:27:20] ***************** DB PROFILING ********************
[07-Mar-2009 14:27:20] 1 times: 'SELECT * from elggentities where guid=1 and (  (access_id in (2) or (owner_guid = -1) or (access_id = 0 and owner_guid = -1)) and enabled='yes')'
...
[07-Mar-2009 14:27:20] 2 times: 'update elggmetadata set access_id = 2 where entity_guid = 1'
[07-Mar-2009 14:27:20] 1 times: 'UPDATE elggentities set owner_guid='0', access_id='2', container_guid='0', time_updated='1236461868' WHERE guid=1'
[07-Mar-2009 14:27:20] 1 times: 'SELECT guid from elggsites_entity where guid = 1'
[07-Mar-2009 14:27:20] 1 times: 'UPDATE elggsites_entity set name='3124/944', description='', url='http://example.org/' where guid=1'
[07-Mar-2009 14:27:20] 1 times: 'UPDATE elggusers_entity set prev_last_action = last_action, last_action = 1236461868 where guid = 2'
[07-Mar-2009 14:27:20] DB Queries for this page: 56
[07-Mar-2009 14:27:20] ***************************************************
[07-Mar-2009 14:27:20] Page /action/admin/site/update_basic generated in 0.36997294426 seconds

Какие события запускаются при каждой загрузке страницы?

Существует 4 события Elgg, которые запускаются при каждой загрузке страницы:

  1. plugins_boot, system

  2. init, system

  3. ready, system

  4. shutdown, system

Первые три запускаются в Elgg\Application::bootCore. shutdown, system запускается в \Elgg\Application\ShutdownHandler после отправки ответа клиенту. Все они задокументированы.

Существуют и другие события, которые Elgg запускает периодически (например, при входе пользователя).

Копирование плагина

Часто задаются вопросы о том, как скопировать плагин. Допустим, вы хотите скопировать плагин blog, чтобы запустить один плагин под названием blog, а другой — poetry. Это несложно, но требует значительной работы. Вам потребуется:

  • изменить имя каталога

  • изменить имена всех функций (наличие двух функций с одинаковым именем приводит к сбою PHP)

  • изменить имя каждого представления (чтобы не переопределять представления оригинального плагина)

  • изменить любые подтипы модели данных

  • изменить языковой файл

  • изменить всё остальное, что было специфично для оригинального плагина

Примечание

Если вы пытаетесь клонировать плагин groups, у вас возникнет дополнительная сложность: плагин групп не устанавливает подтип.