Разработка плагина для Osclass: полное руководство

Интересные разработки

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

Подготовка к разработке

  1. Требования

    • Установленная Osclass (рекомендуется последняя версия)

    • Базовые знания PHP, SQL и понимание MVC-архитектуры

    • Доступ к файловой системе и базе данных

  2. Структура плагинов Osclass

    • Плагины располагаются в /oc-content/plugins/

    • Каждый плагин имеет свою папку с уникальным именем

Создание базовой структуры плагина

  1. Создайте папку для вашего плагина, например: /oc-content/plugins/my_plugin/

  2. Основные файлы плагина:

    • index.php — главный файл плагина

    • info.php — информация о плагине

    • install.php — скрипт установки

    • uninstall.php — скрипт удаления

    • configure.php — страница настроек (опционально)

Файл info.php

Этот файл содержит мета-информацию о вашем плагине:

<?php
return array(
    'plugin_name'        => 'My Custom Plugin',
    'plugin_version'     => '1.0',
    'plugin_description' => 'Описание функционала вашего плагина',
    'plugin_author'      => 'Ваше имя',
    'plugin_author_url'  => 'https://вашсайт.ru',
    'plugin_support_url' => 'https://вашсайт.ru/support',
    'plugin_update_url'  => 'https://вашсайт.ru/update-check',
    'plugin_category'    => 'category' // Например: administration, listings, security
);
?>

Основной файл плагина (index.php)

<?php
/*
 * Plugin Name: My Custom Plugin
 * Plugin URI: https://вашсайт.ru/plugins/my_plugin
 * Description: Расширение функционала Osclass
 * Version: 1.0
 * Author: Ваше имя
 * Author URI: https://вашсайт.ru
 */

// Защита от прямого доступа
if (!defined('OC_ADMIN')) {
    exit('Direct access is not allowed.');
}

// Регистрация хуков
function my_plugin_init() {
    // Пример регистрации хука
    osc_add_hook('init', 'my_plugin_function');
    osc_add_hook('posted_item', 'my_plugin_item_posted');
    
    // Регистрация страницы настроек
    osc_add_hook('admin_menu_init', 'my_plugin_admin_menu');
}

// Пример функции плагина
function my_plugin_function() {
    // Ваш код здесь
}

// Обработчик события публикации объявления
function my_plugin_item_posted($item) {
    // Логика после публикации объявления
    $itemId = $item['pk_i_id'];
    // Например, запись в лог или отправка уведомления
}

// Добавление пункта меню в админку
function my_plugin_admin_menu() {
    osc_add_admin_submenu_page(
        'plugins', 
        'Настройки My Plugin', 
        osc_route_admin_url('my-plugin-admin'), 
        'my_plugin_settings'
    );
}

// Инициализация плагина
my_plugin_init();
?>

Установочный файл (install.php)

<?php
function my_plugin_install() {
    // Создание необходимых таблиц в БД
    $query = <<<SQL
    CREATE TABLE IF NOT EXISTS %st_my_plugin_data (
        id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
        item_id INT(10) UNSIGNED NOT NULL,
        custom_field VARCHAR(255) NULL,
        created DATETIME NOT NULL,
        PRIMARY KEY (id),
        INDEX (item_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL;

    $conn = DBConnectionClass::newInstance();
    $db = $conn->getOsclassDb();
    $comm = new DBCommandClass($db);
    $comm->query(sprintf($query, DB_TABLE_PREFIX));

    // Добавление конфигурационных параметров
    osc_set_preference('my_plugin_enabled', '1', 'my_plugin', 'BOOLEAN');
    osc_set_preference('my_plugin_option', 'default_value', 'my_plugin', 'STRING');

    return true;
}
?>

Файл удаления (uninstall.php)

<?php
function my_plugin_uninstall() {
    // Удаление таблиц из БД
    $conn = DBConnectionClass::newInstance();
    $db = $conn->getOsclassDb();
    $comm = new DBCommandClass($db);
    $comm->query(sprintf('DROP TABLE %st_my_plugin_data', DB_TABLE_PREFIX));

    // Удаление конфигурационных параметров
    Preference::newInstance()->delete(array('s_section' => 'my_plugin'));

    return true;
}
?>

Страница настроек (configure.php)

<?php
function my_plugin_configure() {
    // Обработка формы
    if (Params::getParam('plugin_action') == 'done') {
        osc_set_preference('my_plugin_option', Params::getParam('my_plugin_option'), 'my_plugin', 'STRING');
        osc_add_flash_ok_message(__('Настройки сохранены', 'my_plugin'), 'admin');
        osc_redirect_to(osc_route_admin_url('my-plugin-admin'));
    }

    // Отображение формы
    ?>
    <div class="form-horizontal">
        <h2 class="render-title">Настройки My Plugin</h2>
        <form action="<?php echo osc_route_admin_url('my-plugin-admin'); ?>" method="post">
            <input type="hidden" name="plugin_action" value="done" />
            
            <div class="form-row">
                <div class="form-label">Опция плагина</div>
                <div class="form-controls">
                    <input type="text" class="xlarge" name="my_plugin_option" 
                           value="<?php echo osc_get_preference('my_plugin_option', 'my_plugin'); ?>" />
                </div>
            </div>
            
            <div class="form-actions">
                <input type="submit" value="Сохранить" class="btn btn-submit" />
            </div>
        </form>
    </div>
    <?php
}
?>

Основные концепции разработки плагинов

1. Работа с хуками (Hooks)

Osclass предоставляет систему хуков для интеграции вашего плагина:

// Добавление хука
osc_add_hook('hook_name', 'your_function_name');

// Примеры популярных хуков:
osc_add_hook('init', 'my_init_function'); // При инициализации системы
osc_add_hook('pre_item_post', 'my_pre_post_function'); // Перед публикацией объявления
osc_add_hook('posted_item', 'my_posted_function'); // После публикации объявления
osc_add_hook('item_search', 'my_search_function'); // При поиске объявлений
osc_add_hook('admin_menu_init', 'my_admin_menu_function'); // Для добавления пунктов в админ-меню

2. Работа с базой данных

Пример работы с БД в плагине:

// Вставка данных
function my_plugin_insert_data($itemId, $value) {
    $conn = DBConnectionClass::newInstance();
    $db = $conn->getOsclassDb();
    $comm = new DBCommandClass($db);
    
    $comm->insert(DB_TABLE_PREFIX.'t_my_plugin_data', array(
        'item_id' => $itemId,
        'custom_field' => $value,
        'created' => date('Y-m-d H:i:s')
    ));
    
    return $db->insertedId();
}

// Выборка данных
function my_plugin_get_data($itemId) {
    $conn = DBConnectionClass::newInstance();
    $db = $conn->getOsclassDb();
    $comm = new DBCommandClass($db);
    
    $comm->select('*');
    $comm->from(DB_TABLE_PREFIX.'t_my_plugin_data');
    $comm->where('item_id', $itemId);
    $result = $comm->get();
    
    return $result->result();
}

3. Добавление собственных страниц

Вы можете создавать новые страницы в админке или фронтенде:

// Для фронтенда
function my_plugin_routes() {
    osc_add_route('my-plugin-page', 'my-plugin', 'my-plugin', 'my_plugin_page_handler');
}

function my_plugin_page_handler() {
    // Ваш код для отображения страницы
    require_once 'my_plugin_page.php';
}

// Для админки
function my_plugin_admin_menu() {
    osc_add_admin_submenu_page(
        'plugins', 
        'My Plugin Page', 
        osc_route_admin_url('my-plugin-admin'), 
        'my_plugin_admin_page',
        'administrator'
    );
}

function my_plugin_admin_page() {
    // Код админ-страницы
    require_once 'my_plugin_admin_page.php';
}

Пример плагина: «Продвижение объявлений»

Давайте создадим простой плагин, который позволяет отмечать объявления как «Продвигаемые»:

  1. install.php — создаем таблицу для хранения продвигаемых объявлений

  2. index.php — добавляем хуки и функции для работы с плагином

  3. configure.php — страница настроек плагина

Реализация функций плагина

// В index.php
function promoted_items_init() {
    osc_add_hook('init', 'promoted_items_check');
    osc_add_hook('item_detail', 'promoted_items_display_badge');
    osc_add_hook('admin_menu_init', 'promoted_items_admin_menu');
}

// Проверка продвигаемых объявлений
function promoted_items_check() {
    $promoted = promoted_items_get_all();
    View::newInstance()->_exportVariableToView('promoted_items', $promoted);
}

// Отображение бейджа на продвигаемых объявлениях
function promoted_items_display_badge() {
    $itemId = osc_item_id();
    if (promoted_items_is_promoted($itemId)) {
        echo '<div class="promoted-badge">Продвигается</div>';
    }
}

// Добавление пункта в админ-меню
function promoted_items_admin_menu() {
    osc_add_admin_submenu_page(
        'items', 
        'Продвигаемые объявления', 
        osc_route_admin_url('promoted-items-admin'), 
        'promoted_items_admin_page'
    );
}

Тестирование и отладка плагина

  1. Включите режим отладки в Osclass (в файле config.php):

    define('OSC_DEBUG', true);
    define('OSC_DEBUG_LOG', true);
  2. Используйте логирование для отладки:

    osc_log('My Plugin', 'Debug message', 'debug');
  3. Проверьте совместимость с разными версиями Osclass

Публикация плагина

  1. Упакуйте плагин в zip-архив (только папку плагина, без родительских директорий)

  2. Опубликуйте на на нашем сайте

  3. Либо используйте для своих проектов

Заключение

Разработка плагинов для Osclass открывает широкие возможности для кастомизации вашей доски объявлений. Начните с простых плагинов, постепенно усложняя функционал. Изучайте стандартные плагины Osclass и документацию для более глубокого понимания системы.

Помните о безопасности:

  • Всегда проверяйте входные данные

  • Используйте подготовленные запросы для работы с БД

  • Ограничивайте права доступа где это возможно

Удачной разработки!

Свободен!

Оцените автора
( Пока оценок нет )
Osclass
Добавить комментарий