Від автора: сьогодні ми розглянемо контролери OpenCart 2.x, їх загальну концепцію. У версії OpenCart 2.x вони впровадили зміни фреймворку, які потребують оновлення, на випадок якщо ви зробили якісь власні модулі у більш ранньої версії — наприклад, OpenCart 1.x. Сьогодні ми розглянемо практичний приклад того, що називається Guestbook (гостьова книга).
Чому користувальницький контролер?
Дещо, що ви можете запитати в першу чергу — чому саме користувальницький контролер? Давайте розберемося як можна швидше, що таке контролер в OpenCart, перш ніж ми займемося.
У контексті OpenCart контролер є незамінним компонентом фреймворку, який безпосередньо пов’язаний з процесом маршрутизації і відображає користувальницький інтерфейс. В цьому процесі він зв’язується з іншими важливими компонентами, такі як мова, модель і подання, щоб вибудувати остаточний результат.
Коли ви відкриваєте доступ до будь-якій сторінці OpenCart, фреймворк OpenCart шукає відповідний контролер і делегує його подальшу обробку. Будучи модульним за своєю природою, фреймворк OpenCart надає кілька контролерів, які пов’язані з логічно згрупованими функціональними можливостями.
Наприклад, група облікових записів містить контролери, які пов’язані з логіном, реєстрацією, профілем і аналогічними варіантами використання. Точно так само, контрольна група контролерів обробляє процес створення замовлення.
Інтернет-магазин на 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!
Створити інтернет-магазин на самій популярної 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 файл з наступним вмістом.
Це основний файл шаблону подання, який відповідає за відображення вмісту сторінки гостьової книги. У цьому файлі ми тільки що використовували змінні, які були налаштовані index методі контролера.
Важливо відзначити, що чуйність — це те, що поставляється з новітніми версіями OpenCart, підтримуваними платформою Bootstrap. Крім іншого, це досить звичайний матеріал HTML, який легко зрозуміти.
Отже, це те, що стосується налаштування файлу.
У нас є все готово, але як ви отримаєте доступ до файлу з front-end?
Під front-end ви можете отримати доступ до сторінки Guestbook, додавши змінну переадресації маршруту , тому URL-адреса має бути схожий на http: //your-opencart-store-url/index.php? Route = guestbook / entry .
Давайте розберемося, як OpenCart зіставляє URL-адресу з конкретним файлом контролера. Формат змінної маршруту — {fs}/{filename}/{methodname}.
Компонент {fs} відображає в каталозі під catalog/controller.
{Filename}відображає ім’я файлу контролера під catalog/controller/{fs}.
Нарешті, шукає метод контролера {methodname}, якщо він зазначений у маршруті, інакше він викличе метод index за замовчуванням.
Так виглядає кінцевий результат.
Звичайно, ви можете піти далі і протестувати його, відправивши форму, і тоді прийде повідомлення по електронній пошті на адресу, зареєстровану в якості адміністратора магазину.
Висновок
У будь-якому фреймворку завжди цікаво проводити реалізацію власних користувальницьких функцій. Це стало предметом сьогоднішнього підручника, в якому ми розширили OpenCart і розробили власні контролери, створивши досить просту, але корисну функціональність гостьової книги.
У цьому процесі ми зрозуміли, що мова йде не тільки про контролерах — було кілька інших ключових елементів, які були неминучі. Тому ми також розглянули їх: модель, мова та подання.
Інтернет-магазин на OpenCart!
Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!
Приступити до створення