С версии 1.8 на 1.9
Содержание
В примерах мы обновляем вымышленный плагин «Photos».
Включены только ключевые изменения. Например, некоторые устаревшие функции не упоминаются здесь отдельно.
Каждый раздел будет содержать информацию о том, является ли изменение обратно совместимым с Elgg 1.8.
Файл манифеста
Изменения не требуются, если ваш плагин совместим с версией 1.8.
Тем не менее рекомендуется добавить тег <id>. Его значение должно соответствовать имени каталога, в котором находится плагин внутри каталога mod/.
Если вы вносите изменения, нарушающие обратную совместимость, вы должны обновить версию плагина и требуемую версию Elgg.
Пример (сокращённой) старой версии:
<?xml version="1.0" encoding="UTF-8"?>
<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
<name>Photos</name>
<author>John Doe</author>
<version>1.0</version>
<description>Adds possibility to upload photos and arrange them into albums.</description>
<requires>
<type>elgg_release</type>
<version>1.8</version>
</requires>
</plugin_manifest>
Пример (сокращённой) новой версии:
<?xml version="1.0" encoding="UTF-8"?>
<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
<name>Photos</name>
<id>photos</id>
<author>John Doe</author>
<version>2.0</version>
<description>Adds possibility to upload photos and arrange them into albums.</description>
<requires>
<type>elgg_release</type>
<version>1.9</version>
</requires>
</plugin_manifest>
$CONFIG и $vars[„config“]
И глобальная переменная $CONFIG, и параметр $vars['config'] объявлены устаревшими. Их следует заменить функцией elgg_get_config().
Пример старого кода:
// Using the global $CONFIG variable:
global $CONFIG;
$plugins_path = $CONFIG->plugins_path
// Using the $vars view parameter:
$plugins_path = $vars['plugins_path'];
Пример нового кода:
$plugins_path = elgg_get_config('plugins_path');
Примечание
Совместимо с 1.8
Примечание
Посмотрите, как был обновлён плагин community_plugins: https://github.com/Elgg/community_plugins/commit/f233999bbd1478a200ee783679c2e2897c9a0483
Файлы локализации
В Elgg 1.8 файлы локализации должны были использовать функцию add_translation(). В версии 1.9 достаточно просто вернуть массив, который ранее передавался функции в качестве параметра. Ядро Elgg будет использовать имя файла (например, en.php), чтобы определить, какой язык содержит файл.
Пример старого способа в languages/en.php:
$english = array(
'photos:all' => 'All photos',
);
add_translation('en', $english);
Пример нового способа:
return array(
'photos:all' => 'All photos',
);
Предупреждение
Не совместимо с 1.8
Уведомления
Одно из крупнейших изменений в Elgg 1.9 — система уведомлений. Новая система обеспечивает более гибкий и масштабируемый способ отправки уведомлений.
Пример старого способа:
function photos_init() {
// Tell core that we want to send notifications about new photos
register_notification_object('object', 'photo', elgg_echo('photo:new'));
// Register a handler that creates the notification message
elgg_register_plugin_hook_handler('notify:entity:message', 'object', 'photos_notify_message');
}
/**
* Set the notification message body
*
* @param string $hook Hook name
* @param string $type Hook type
* @param string $message The current message body
* @param array $params Parameters about the photo
* @return string
*/
function photos_notify_message($hook, $type, $message, $params) {
$entity = $params['entity'];
$to_entity = $params['to_entity'];
$method = $params['method'];
if (elgg_instanceof($entity, 'object', 'photo')) {
$descr = $entity->excerpt;
$title = $entity->title;
$owner = $entity->getOwnerEntity();
return elgg_echo('photos:notification', array(
$owner->name,
$title,
$descr,
$entity->getURL()
));
}
return null;
}
Пример нового способа:
function photos_init() {
elgg_register_notification_event('object', 'photo', array('create'));
elgg_register_plugin_hook_handler('prepare', 'notification:publish:object:photo', 'photos_prepare_notification');
}
/**
* Prepare a notification message about a new photo
*
* @param string $hook Hook name
* @param string $type Hook type
* @param Elgg_Notifications_Notification $notification The notification to prepare
* @param array $params Hook parameters
* @return Elgg_Notifications_Notification
*/
function photos_prepare_notification($hook, $type, $notification, $params) {
$entity = $params['event']->getObject();
$owner = $params['event']->getActor();
$recipient = $params['recipient'];
$language = $params['language'];
$method = $params['method'];
// Title for the notification
$notification->subject = elgg_echo('photos:notify:subject', array($entity->title), $language);
// Message body for the notification
$notification->body = elgg_echo('photos:notify:body', array(
$owner->name,
$entity->title,
$entity->getExcerpt(),
$entity->getURL()
), $language);
// The summary text is used e.g. by the site_notifications plugin
$notification->summary = elgg_echo('photos:notify:summary', array($entity->title), $language);
return $notification;
}
Предупреждение
Не совместимо с 1.8
Примечание
Посмотрите, как был обновлён плагин community_plugins для использования новой системы: https://github.com/Elgg/community_plugins/commit/bfa356cfe8fb99ebbca4109a1b8a1383b70ff123
Уведомления также можно отправлять с помощью функции notify_user().
Однако она была обновлена для поддержки трёх новых необязательных параметров, передаваемых внутри массива в качестве пятого параметра.
Эти параметры предоставляют плагинам уведомлений больший контроль, поэтому их следует указывать везде, где это возможно. Например, встроенный плагин site_notifications не будет работать корректно, если параметры отсутствуют.
Параметры:
object — объект, о котором отправляется уведомление (например, ElggEntity или ElggAnnotation). Это необходимо, чтобы плагины уведомлений могли предоставить ссылку на объект.
action — строка, описывающая действие, которое вызвало уведомление (например, «create», «update» и т.д.).
summary — строка, содержащая краткое описание уведомления. (Она должна быть более информативной, чем тема уведомления, но менее информативной, чем тело уведомления.)
Пример старого способа:
// Notify $owner that $user has added a $rating to an $entity created by him
$subject = elgg_echo('rating:notify:subject');
$body = elgg_echo('rating:notify:body', array(
$owner->name,
$user->name,
$entity->title,
$entity->getURL(),
));
notify_user($owner->guid,
$user->guid,
$subject,
$body
);
Пример нового способа:
// Notify $owner that $user has added a $rating to an $entity created by him
$subject = elgg_echo('rating:notify:subject');
$summary = elgg_echo('rating:notify:summary', array($entity->title));
$body = elgg_echo('rating:notify:body', array(
$owner->name,
$user->name,
$entity->title,
$entity->getURL(),
));
$params = array(
'object' => $rating,
'action' => 'create',
'summary' => $summary,
);
notify_user($owner->guid,
$user->guid,
$subject,
$body,
$params
);
Примечание
Совместимо с 1.8
Добавление элементов в список активности
add_to_river('river/object/photo/create', 'create', $user_guid, $photo_guid);
elgg_create_river_item(array(
'view' => 'river/object/photo/create',
'action_type' => 'create',
'subject_guid' => $user_guid,
'object_guid' => $photo_guid,
));
Вы также можете добавить необязательный параметр target_guid, который указывает цель действия создания.
Если бы фотография добавлялась, например, в фотоальбом, мы могли бы добавить её, передав также:
'target_guid' => $album_guid,
Предупреждение
Не совместимо с 1.8
Обработчики URL сущностей
Функция elgg_register_entity_url_handler() объявлена устаревшей. В версии 1.9 вместо неё следует использовать хук плагина 'entity:url', 'object'.
Пример старого способа:
/**
* Initialize the photo plugin
*/
my_plugin_init() {
elgg_register_entity_url_handler('object', 'photo', 'photo_url_handler');
}
/**
* Returns the URL from a photo entity
*
* @param ElggEntity $entity
* @return string
*/
function photo_url_handler($entity) {
return "photo/view/{$entity->guid}";
}
Пример нового способа:
/**
* Initialize the photo plugin
*/
my_plugin_init() {
elgg_register_plugin_hook_handler('entity:url', 'object', 'photo_url_handler');
}
/**
* Returns the URL from a photo entity
*
* @param string $hook 'entity:url'
* @param string $type 'object'
* @param string $url The current URL
* @param array $params Hook parameters
* @return string
*/
function photo_url_handler($hook, $type, $url, $params) {
$entity = $params['entity'];
// Check that the entity is a photo object
if ($entity->getSubtype() !== 'photo') {
// This is not a photo object, so there's no need to go further
return;
}
return "photo/view/{$entity->guid}";
}
Предупреждение
Не совместимо с 1.8
Веб-сервисы
В Elgg 1.8 API веб-сервисов входило в ядро, и методы публиковались с помощью expose_function(). Чтобы включить аналогичную функциональность для Elgg 1.9, активируйте плагин «Web services 1.9» и замените все вызовы expose_function() на elgg_ws_expose_function().