Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Установка, удаление и свои таблицы

Настройки помещаются в общую таблицу setting, но спискам записей — заявкам на звонок, строкам журнала — нужна своя таблица. Миграций в OpenCart нет. Таблицу создаёт метод install() контроллера панели, а удаляет uninstall().

Когда вызываются методы

Кнопка в Extensions → ExtensionsМетод
Installinstall()
Uninstalluninstall()

Оба метода лежат в контроллере панели дополнения, рядом с index() и save().

Модель для SQL

Запросы кладут в модель панели дополнения. Создайте файл вручную:

// extension/acme_hello/admin/model/module/acme_hello.php
namespace Opencart\Admin\Model\Extension\AcmeHello\Module;
 
class AcmeHello extends \Opencart\System\Engine\Model
{
    public function install(): void
    {
        $this->db->query(
            "CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "acme_callback` (
                `callback_id` INT NOT NULL AUTO_INCREMENT,
                `name` VARCHAR(64) NOT NULL,
                `phone` VARCHAR(32) NOT NULL,
                `customer_id` INT NOT NULL DEFAULT 0,
                `date_added` DATETIME NOT NULL,
                PRIMARY KEY (`callback_id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
        );
    }
 
    public function uninstall(): void
    {
        $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "acme_callback`");
    }
}

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

Методы контроллера

// extension/acme_hello/admin/controller/module/acme_hello.php
public function install(): void
{
    $this->load->model('extension/acme_hello/module/acme_hello');
 
    $this->model_extension_acme_hello_module_acme_hello->install();
}
 
public function uninstall(): void
{
    $this->load->model('extension/acme_hello/module/acme_hello');
 
    $this->model_extension_acme_hello_module_acme_hello->uninstall();
}

Модель дополнения загружают по маршруту extension/acme_hello/module/acme_hello, а имя свойства — тот же маршрут с подчёркиваниями.

Дополнение уже установлено, поэтому в Extensions → Extensions → Modules нажмите Uninstall, а затем Install. Откройте phpMyAdmin — в списке появилась таблица oc_acme_callback.

Чтение таблицы

Добавьте метод в ту же модель и вызовите его со страницы настроек:

public function getCallbacks(): array
{
    $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "acme_callback` ORDER BY `date_added` DESC LIMIT 20");
 
    return $query->rows;
}
// в index() контроллера панели
$this->load->model('extension/acme_hello/module/acme_hello');
 
$data['callbacks'] = $this->model_extension_acme_hello_module_acme_hello->getCallbacks();

Шаблон выводит массив циклом for под формой настроек. Пока таблица пуста.

Что ядро удаляет само

При удалении ядро стирает настройки, сохранённые с кодом дополнения. Таблицы, события и задачи cron, созданные в вашем install(), — ваша ответственность: всё, что там создано, удаляется в uninstall().

Частая ошибка

CREATE TABLE пишут без IF NOT EXISTS. Повторная установка — после неудачной первой попытки или после копирования базы — останавливается с ошибкой «Table already exists». Пишите IF NOT EXISTS при создании и IF EXISTS при удалении.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.