С версии 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().