Установка, удаление и свои таблицы
Настройки помещаются в общую таблицу setting, но спискам записей — заявкам на звонок, строкам журнала — нужна своя таблица. Миграций в OpenCart нет. Таблицу создаёт метод install() контроллера панели, а удаляет uninstall().
Когда вызываются методы
Кнопка в Extensions → Extensions | Метод |
|---|---|
| Install | install() |
| Uninstall | uninstall() |
Оба метода лежат в контроллере панели дополнения, рядом с 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 при удалении.