Користувальницькі контролери в OpenCart 2

79

Від автора: сьогодні ми розглянемо контролери OpenCart 2.x, їх загальну концепцію. У версії OpenCart 2.x вони впровадили зміни фреймворку, які потребують оновлення, на випадок якщо ви зробили якісь власні модулі у більш ранньої версії — наприклад, OpenCart 1.x. Сьогодні ми розглянемо практичний приклад того, що називається Guestbook (гостьова книга).

Чому користувальницький контролер?

Дещо, що ви можете запитати в першу чергу — чому саме користувальницький контролер? Давайте розберемося як можна швидше, що таке контролер в OpenCart, перш ніж ми займемося.

У контексті OpenCart контролер є незамінним компонентом фреймворку, який безпосередньо пов’язаний з процесом маршрутизації і відображає користувальницький інтерфейс. В цьому процесі він зв’язується з іншими важливими компонентами, такі як мова, модель і подання, щоб вибудувати остаточний результат.

Коли ви відкриваєте доступ до будь-якій сторінці OpenCart, фреймворк OpenCart шукає відповідний контролер і делегує його подальшу обробку. Будучи модульним за своєю природою, фреймворк OpenCart надає кілька контролерів, які пов’язані з логічно згрупованими функціональними можливостями.

Наприклад, група облікових записів містить контролери, які пов’язані з логіном, реєстрацією, профілем і аналогічними варіантами використання. Точно так само, контрольна група контролерів обробляє процес створення замовлення.

Користувальницькі контролери в OpenCart 2

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення

У двох словах, коли потрібно створити функцію, яка не знаходиться в ядрі OpenCart, і, якщо вона використовує нову URL-адресу в термінології OpenCart, потрібно перейти на контролер. Він дає повний контроль над процесом створення сторінки — і тим, які елементи ви хочете відобразити на сторінці.

Створення інтерфейсу контролера

Сьогодні ми реалізуємо базову функціональність Guestbook, яка демонструє концепцію користувальницьких контролерів. В процесі цього ми створимо інтерфейс під front-end, який дозволить гостьовим користувачам надсилати свої відгуки, ввівши їхню назву і текст повідомлення.

Перш ніж продовжити, переконайтеся, що у вас встановлена робоча версія OpenCart 2.3.x. Цього більш ніж достатньо, щоб почати роботу над функцією Guestbook.

Для тих, хто не знайомий зі структурою OpenCart, потрібно шукати front-end контролери в catalog/controller. Це каталог, який управляє всіма контролерами за групами, грунтуючись на наданих функціях.

У нашому випадку ми створимо окрему групу під назвою guestbook. Потім створимо каталог catalog/controller/guestbook. Всередині цього каталогу створимо entry.php файл з наступним вмістом. Це файл контролера, який обробляє логіку програми та відправлення функцій гостьової книги.

load->language(‘guestbook/guestbook’);
$this->document->setTitle($this->language->get(‘heading_title’));
if (($this->request->server[‘REQUEST_METHOD’] == ‘POST’) && $this->validate()) {
$this->load->model(‘guestbook/guestbook’);
$data[‘subject’] = sprintf(‘New guestbook entry submitted by %s’, $this->request->post[‘guest_name’]);
$data[‘message’] = $this->request->post[‘guest_message’];
$this->model_guestbook_guestbook->processGuestbookEntry($data);
$this->session->data[‘success’] = $this->language->get(‘text_success’);
$this->response->redirect($this->url->link(‘guestbook/entry’, «, ‘true’));
}
$data[‘success’] = «;
if (isset($this->session->data[‘success’])) {
$data[‘success’] = $this->session->data[‘success’];
unset($this->session->data[‘success’]);
}
$data[‘breadcrumbs’] = array();
$data[‘breadcrumbs’][] = array(
‘text’ => $this->language->get(‘text_home’),
‘href’ => $this->url->link(‘common/home’)
);
$data[‘breadcrumbs’][] = array(
‘text’ => $this->language->get(‘heading_title’),
‘href’ => $this->url->link(‘guestbook/entry’, «, true)
);
$data[‘heading_title’] = $this->language->get(‘heading_title’);
$data[‘entry_guest_name’] = $this->language->get(‘entry_guest_name’);
$data[‘entry_guest_message’] = $this->language->get(‘entry_guest_message’);
$data[‘entry_submit’] = $this->language->get(‘entry_submit’);
if (isset($this->error[‘guest_name’])) {
$data[‘error_guest_name’] = $this->error[‘guest_name’];
} else {
$data[‘error_guest_name’] = «;
}
if (isset($this->error[‘guest_message’])) {
$data[‘error_guest_message’] = $this->error[‘guest_message’];
} else {
$data[‘error_guest_message’] = «;
}
$data[‘action’] = $this->url->link(‘guestbook/entry’, «, ‘true’);
if (isset($this->request->post[‘guest_name’])) {
$data[‘guest_name’] = $this->request->post[‘guest_name’];
} else {
$data[‘guest_name’] = «;
}
if (isset($this->request->post[‘guest_message’])) {
$data[‘guest_message’] = $this->request->post[‘guest_message’];
} else {
$data[‘guest_message’] = «;
}
$data[‘column_left’] = $this->load->controller(‘common/column_left’);
$data[‘column_right’] = $this->load->controller(‘common/column_right’);
$data[‘content_top’] = $this->load->controller(‘common/content_top’);
$data[‘content_bottom’] = $this->load->controller(‘common/content_bottom’);
$data[‘footer’] = $this->load->controller(‘common/footer’);
$data[‘header’] = $this->load->controller(‘common/header’);
$this->response->setOutput($this->load->view(‘guestbook/entry’, $data));
}
protected function validate() {
if (utf8_strlen(trim($this->request->post[‘guest_name’])) error[‘guest_name’] = $this->language->get(‘error_guest_name’);
}
if (utf8_strlen(trim($this->request->post[‘guest_message’])) error[‘guest_message’] = $this->language->get(‘error_guest_message’);
}
return !$this->error;
}
}

Згідно з угодами OpenCart про імена, ім’я класу починається з ключового слова Controller, за яким слідує ім’я каталогу Guestbook в нашому випадку, в якому знаходиться файл класу. Крім того, в кінці додається ім’я файлу класу Entry.

Кожен клас контролера надає де-факто index метод, який обробляє велику частину логіки контролера. Далі ми розглянемо код index методі, і при необхідності створимо інші файли.

У більшості випадків ми почнемо з включення мовного файлу для конкретної групи. Таким чином OpenCart управляє ярликами статичного мови у всьому додатку. Природно, це робить реалізацію багатомовних сайтів дуже простий.

$this->load->language(‘guestbook/guestbook’);

Перш ніж рухатися далі, давайте створимо відповідний мовний файл, щоб наш контролер міг його знайти. Створіть catalog/language/en-gb/guestbook/guestbook.php файл з наступним вмістом.

Як можна побачити, ми просто призначаємо мітки зі своїми значеннями у масиві мов. Повернемося до нашого контролера. Наступне наше завдання — налаштувати тег заголовка HTML сторінки.

$this->document->setTitle($this->language->get(‘heading_title’));

Уважні користувачі помітили, що ми використовували мовне змінну heading_title, визначену в мовному файлі, створеному хвилину тому.

Щоб зрозуміти наступний фрагмент коду, нам потрібно створити файл моделі. Тому на мить я отвлеку вас на створення файлу моделі catalog/model/guestbook/guestbook.php з наступним вмістом.

protocol = $this->config->get(‘config_mail_protocol’);
$mail->parameter = $this->config->get(‘config_mail_parameter’);
$mail->smtp_hostname = $this->config->get(‘config_mail_smtp_hostname’);
$mail->smtp_username = $this->config->get(‘config_mail_smtp_username’);
$mail->smtp_password = html_entity_decode($this->config->get(‘config_mail_smtp_password’), ENT_QUOTES, ‘UTF-8’);
$mail->smtp_port = $this->config->get(‘config_mail_smtp_port’);
$mail->smtp_timeout = $this->config->get(‘config_mail_smtp_timeout’);
$mail->setTo($this->config->get(‘config_email’));
$mail->setFrom($this->config->get(‘config_email’));
$mail->setSender(html_entity_decode($this->config->get(‘config_name’), ENT_QUOTES, ‘UTF-8’));
$mail->setSubject($data[‘subject’]);
$mail->setText($data[‘message’]);
$mail->send();
}
}

В OpenCart модель відповідає за обробку бізнес-логіки програми. Якщо ви хочете реалізувати будь-яку логіку, яка включає базу даних, то це місце, куди вона повинна входити.

Угода про іменування класу моделі аналогічно з класом контролера. Щоб все було простіше, ми впровадили метод, processGuestbookEntry, який повідомляє адміністратора магазину по електронній пошті, коли користувач додає запис в гостьовій книзі. Досить просто, так?

Повернемося до контролера і розглянемо наступний фрагмент коду в черзі.

if (($this->request->server[‘REQUEST_METHOD’] == ‘POST’) && $this->validate()) {
$this->load->model(‘guestbook/guestbook’);
$data[‘subject’] = sprintf(‘New guestbook entry submitted by %s’, $this->request->post[‘guest_name’]);
$data[‘message’] = $this->request->post[‘guest_message’];
$this->model_guestbook_guestbook->processGuestbookEntry($data);
$this->session->data[‘success’] = $this->language->get(‘text_success’);
$this->response->redirect($this->url->link(‘guestbook/entry’, «, ‘true’));
}

Він перевіряє дійсний POST запит і виконує базову перевірку даних, надісланих користувачем, викликаючи validate метод.

Код $this->load->model(‘guestbook/guestbook’) використовується для завантаження моделі, яку ми визначили мить тому. Відразу ж після цього ми готуємо $data масив на основі введення користувача і викликаємо processGuestbookEntry метод, який повідомляє адміністратора магазину про записи в гостьовій книзі. Нарешті, ми перенаправляємо користувача на сторінку записи.

Користувальницькі контролери в OpenCart 2

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення

Наступний фрагмент встановлює повідомлення про успішне завершення, яке буде відображатися при відправці форми.

$data[‘success’] = «;
if (isset($this->session->data[‘success’])) {
$data[‘success’] = $this->session->data[‘success’];
unset($this->session->data[‘success’]);
}

Далі є фрагмент, який використовується для створення панелі посилань для сторінки.

$data[‘breadcrumbs’] = array();
$data[‘breadcrumbs’][] = array(
‘text’ => $this->language->get(‘text_home’),
‘href’ => $this->url->link(‘common/home’)
);
$data[‘breadcrumbs’][] = array(
‘text’ => $this->language->get(‘heading_title’),
‘href’ => $this->url->link(‘guestbook/entry’, «, true)
);

Наступний фрагмент є важливою деталлю, це те, що ви будете використовувати більшу частину часу для передачі інформації з методу контролера в шаблон подання.

$data[‘heading_title’] = $this->language->get(‘heading_title’);
$data[‘entry_guest_name’] = $this->language->get(‘entry_guest_name’);
$data[‘entry_guest_message’] = $this->language->get(‘entry_guest_message’);
$data[‘entry_submit’] = $this->language->get(‘entry_submit’);

Аналогічно призначенню змінних OpenCart ініціалізує загальні елементи page-header, footer і тп, як показано в наступному фрагменті.

$data[‘column_left’] = $this->load->controller(‘common/column_left’);
$data[‘column_right’] = $this->load->controller(‘common/column_right’);
$data[‘content_top’] = $this->load->controller(‘common/content_top’);
$data[‘content_bottom’] = $this->load->controller(‘common/content_bottom’);
$data[‘footer’] = $this->load->controller(‘common/footer’);
$data[‘header’] = $this->load->controller(‘common/header’);

Нарешті, він викликає шаблон подання, щоб відобразити фактичну сторінку!

$this->response->setOutput($this->load->view(‘guestbook/entry’, $data));

Ми ще не створили шаблон подання, і зараз ідеальний час для цього! Йдемо далі і створюємо catalog/view/theme/default/template/guestbook/entry.tpl файл з наступним вмістом.