Перейти к содержанию
  • В связи с блокировкой банка QIWI оплата через сайт не возможна.
    Для оплаты и получения дополнений просьба писать в личные сообщения
    Admin*у
    После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

Пользовательские контроллеры в OpenCart 2


Рекомендуемые сообщения

Сегодня мы рассмотрим концепцию контроллеров в OpenCart 2.x. С выпуском версии OpenCart 2.x они внедрили изменения фреймворка, требующие обновления, если вы сделали какие-либо пользовательские модули в более ранней версии - OpenCart 1.x. Мы рассмотрим практический пример того, что мы будем называть гостевой книгой в этом учебнике.

Прежде чем двигаться дальше в этой статье, вы можете рассмотреть это как продолжение того, что я написал ранее. В этой статье я объяснил, как создать пользовательскую страницу в OpenCart 1.x, и если вы уже последовали этой статье, вы можете быстро пропустить большинство разделов сегодня!

Конечно, это OpenCart 2.x, который будет обсуждаться сегодня, поэтому убедитесь, что вы внимательно следите за кодом.

Если вы хотите узнать больше о шаблоне и контроллерах OpenCart, вы можете пройти пару первых разделов этой статьи. 

Зачем вообще пользовательский контроллер?

То, что вы можете спросить в первую очередь - почему пользовательский контроллер? Давайте быстро поймем, что такое контроллер в OpenCart, прежде чем мы займемся этим.

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

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

Например, группа account содержит контроллеры, которые занимаются регистрацией, входом, профилем и аналогичными вариантами использования. Аналогично, группа контроллеров checkout обрабатывает процесс создания заказа.

В двух словах, когда вы хотите создать функцию, которая не находится в ядре OpenCart, и если она использует новый URL-адрес в терминологии OpenCart, вы должны перейти на пользовательский контроллер. Он даст вам полный контроль над процессом создания страницы - какие элементы вы хотите отображать на своей странице.

Создание пользовательского контроллера

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

Прежде чем продолжить, убедитесь, что у вас есть рабочая установка OpenCart 2.3.x. 

Для тех, кто не знаком с фреймворком OpenCart, местом для поиска интерфейсных контроллеров является catalog/controller. Это каталог, который управляет всеми контроллерами по группам, основываясь на предоставляемых ими функциях.

В нашем случае мы создадим отдельную группу под названием guestbook. Идем дальше и создаем каталог catalog/controller/guestbook. Внутри этого каталога создайте файл entry.php со следующим содержимым. Это файл контроллера, который обрабатывает логику приложения и логику отправки наших функций гостевой книги.

<?php
 class ControllerGuestbookEntry extends Controller {
   private $error = array();
  
   public function index() {
     $this->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'])) < 1) {
       $this->error['guest_name'] = $this->language->get('error_guest_name');
     }
      
     if (utf8_strlen(trim($this->request->post['guest_message'])) < 1) {
       $this->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 со следующим содержимым.

<?php
 // Heading
 $_['heading_title']  = 'Guestbook';
  
 // Entry
 $_['entry_guest_name']   = 'Your Name';
 $_['entry_guest_message']   = 'Message';
 $_['entry_submit']   = 'Submit';
 $_['text_success']   = 'Success: Your entry has been successfully submitted.';
  
 // Error
 $_['error_guest_name'] = 'Please enter Your Name!';
 $_['error_guest_message'] = 'Please enter Message!';

Как вы можете видеть, мы просто назначаем метки своими значениями в массиве языков.

Вернемся к нашему контроллеру. Следующее - настроить тег заголовка HTML для нашей страницы.

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

Внимательные читатели уже заметили, что мы использовали языковую переменную heading_title, определенную в языковом файле, созданном минуту назад.

Чтобы понять следующий фрагмент кода, нам нужно создать файл модели.

Поэтому на мгновение я отвлеку вас на создание файла модели в catalog/model/guestbook/guestbook.php со следующим содержимым.

<?php
 class ModelGuestbookGuestbook extends Model {
   public function processGuestbookEntry($data) {
     // send email notification to store admin 
     $mail = new Mail();
     $mail->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, который уведомляет администратора магазина о новой записи в гостевой книге. Наконец, мы перенаправляем пользователя обратно на страницу ввода гостевой книги.

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

$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 инициализирует общие элементы заголовка страницы, нижнего колонтитула и тому подобного, как показано в следующем фрагменте.

$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 со следующим содержимым.

<?php echo $header; ?>
 <div class="container">
   <ul class="breadcrumb">
     <?php foreach ($breadcrumbs as $breadcrumb) { ?>
     <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
     <?php } ?>
   </ul>
   <?php if ($success) { ?>
     <div class="alert alert-success"><i class="fa fa-check-circle"></i> <?php echo $success; ?></div>
   <?php } ?>
   <div class="row"><?php echo $column_left; ?>
     <?php if ($column_left && $column_right) { ?>
     <?php $class = 'col-sm-6'; ?>
     <?php } elseif ($column_left || $column_right) { ?>
     <?php $class = 'col-sm-9'; ?>
     <?php } else { ?>
     <?php $class = 'col-sm-12'; ?>
     <?php } ?>
     <div id="content" class="<?php echo $class; ?>"><?php echo $content_top; ?>
       <h1><?php echo $heading_title; ?></h1>
       <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" class="form-horizontal">
           <div class="form-group required">
             <label class="col-sm-2 control-label" for="input-guest-name"><?php echo $entry_guest_name; ?></label>
             <div class="col-sm-10">
               <input type="text" value="<?php echo $guest_name; ?>" name="guest_name" placeholder="<?php echo $entry_guest_name; ?>" id="input-guest-name" class="form-control" size="10" />
               <?php if ($error_guest_name) { ?>
               <div class="text-danger"><?php echo $error_guest_name; ?></div>
               <?php } ?>
             </div>
           </div>
           <div class="form-group required">
             <label class="col-sm-2 control-label" for="input-guest-message"><?php echo $entry_guest_message; ?></label>
             <div class="col-sm-10">
               <textarea name="guest_message" placeholder="<?php echo $entry_guest_message; ?>" id="input-guest-message" class="form-control"><?php echo $guest_message; ?></textarea>
               <?php if ($error_guest_message) { ?>
               <div class="text-danger"><?php echo $error_guest_message; ?></div>
               <?php } ?>
             </div>
           </div>
           <div class="form-group required">
             <label class="col-sm-2">&nbsp;</label>
             <div class="col-sm-10">
               <input type="submit" value="<?php echo $entry_submit; ?>" class="btn btn-primary" />
             </div>
           </div>
       </form>
       <?php echo $content_bottom; ?></div>
     <?php echo $column_right; ?></div>
 </div>
 <?php echo $footer; ?>

Это наш основной файл шаблона, который отвечает за отображение содержимого нашей страницы гостевой книги. В этом файле мы только что использовали переменные, которые были настроены в методе контроллера index.

Важно отметить, что отзывчивость - это то, что поставляется с новейшими версиями OpenCart, поддерживаемыми платформой Bootstrap. Помимо этого, это довольно обычный HTML, который довольно просто понять.

Итак, это то что касается настройки файлов.

У нас все готово, но как вы получите доступ к этому из front-end?

На фронтенде вы можете получить доступ к странице «Гостевая книга», добавив переменную переадресации маршрута, поэтому URL-адрес должен быть похож на http://your-opencart-store-url/index.php?route=guestbook/entry.

Давайте разбираться, как OpenCart сопоставляет любой URL-адрес с конкретным файлом контроллера.

Формат переменной маршрута - {directory}/{filename}/{methodname}.

Компонент {directory} отображается в каталог catalog/controller.

{filename} сопоставляется с именем файла контроллера в catalog/controller/{directory}.

Наконец, он будет искать метод контроллера с именем {methodname}, если он указан в маршруте, иначе он вызовет метод index по умолчанию.‘

Вот как выглядит конечный результат.

custom-controllers-opencart-2.png

Конечно, вы можете пойти дальше и протестировать его, отправив форму, и вы должны получить уведомление по электронной почте на адрес электронной почты, зарегистрированный в качестве администратора магазина.

Заключение

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

В этом процессе мы поняли, что речь идет не только о контроллерах - было несколько других ключевых элементов, которые были неизбежны. Поэтому мы также создали их: модель, язык и представление.

В конце было приятно видеть рабочий прецедент того, что я обещал в начале статьи.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...