OpenCart — от новичка до профессионала: подробнее об MVC

29 Мая 2022г. в 05:07

Написание реального Контроллера
С помощью OpenCart MVC Framework мы создадим простую форму. Для этого нужно сначала создать Контроллер. До этого я уже создал папку forms в catalog/controller. Примечание. Пользователи Mac и Linux — не забудьте изменить права доступа для каталога на 775. Внутри каталога forms я создал файл myform.php. Теперь давайте добавим в него код:

<?php
class ControllerFormsMyform extends Controller{

public function index()
{
$this->document->settitle('My Form'); // Для установки Тайтла страницы
$this->data['breadcrumbs'] = array(); // Инициализируем массив Хлебных крошек

$route = $this->request->get['route']; // Получаем "маршрут" URL-адреса, используя метод GET

// Создаем Хлебные крошки, связанные с главной страницей
$this->data['breadcrumbs'][] = array(
'text' => 'Home',
'href' => $this->url->link('common/home'), // путь маршрута на главную страницу
'separator' => false
);
// Привязываем текущую страницу к хлебным крошкам
$this->data['breadcrumbs'][] = array(
'text' => 'My Form',
'href' => $this->url->link($route), // путь маршрута к текущему url
'separator' => '| ' //Символ разделителя для Хлебных крошек
);

//Конец Хлебных крошек

$this->data['form_heading'] = 'My Form Heading'; // Используем ключевое слово $this->data для обработки данных контроллера для представления
$this->data['first_value'] = 'Firstname: ';
$this->data['second_value'] = 'Lastname: ';
$this->data['third_value'] = 'Passport No.: ';
$this->data['forth_value'] = 'Phone No.: ';

$this->data['continue'] = $this->url->link('common/home'); // Данные ссылки для кнопки "Далее"
$this->data['button_continue'] = 'Continue'; // Текст ссылки для кнопки "Далее"

// Добавляем дочерние элементы для Страницы: шапку, футер, столбцы
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);

$this->template = 'default/template/forms/myform.tpl'; //Привязываем файл шаблона / представления для Пользовательского интерфейса

$this->response->setoutput($this->render()); // Отображаем Шаблон
}


}

?>
<?php
class ControllerFormsMyform extends Controller{

public function index()
{
$this->document->settitle('My Form'); // Для установки Тайтла страницы
$this->data['breadcrumbs'] = array(); // Инициализируем массив Хлебных крошек

$route = $this->request->get['route']; // Получаем "маршрут" URL-адреса, используя метод GET

// Создаем Хлебные крошки, связанные с главной страницей
$this->data['breadcrumbs'][] = array(
'text' => 'Home',
'href' => $this->url->link('common/home'), // путь маршрута на главную страницу
'separator' => false
);
// Привязываем текущую страницу к хлебным крошкам
$this->data['breadcrumbs'][] = array(
'text' => 'My Form',
'href' => $this->url->link($route), // путь маршрута к текущему url
'separator' => '| ' //Символ разделителя для Хлебных крошек
);

//Конец Хлебных крошек

$this->data['form_heading'] = 'My Form Heading'; // Используем ключевое слово $this->data для обработки данных контроллера для представления
$this->data['first_value'] = 'Firstname: ';
$this->data['second_value'] = 'Lastname: ';
$this->data['third_value'] = 'Passport No.: ';
$this->data['forth_value'] = 'Phone No.: ';

$this->data['continue'] = $this->url->link('common/home'); // Данные ссылки для кнопки "Далее"
$this->data['button_continue'] = 'Continue'; // Текст ссылки для кнопки "Далее"

// Добавляем дочерние элементы для Страницы: шапку, футер, столбцы
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);

$this->template = 'default/template/forms/myform.tpl'; //Привязываем файл шаблона / представления для Пользовательского интерфейса

$this->response->setoutput($this->render()); // Отображаем Шаблон
}


}

?>
Просмотрите этот код и попробуйте создать такой контроллер.

Загрузка языков
OpenCart позволяет легко работать с языками. В приведенном выше примере использовались жестко закодированные тексты языков. Но рекомендуется использовать текстовые операторы.

Чтобы загрузить язык, используйте $this->language->load(маршрут пути к языку);, а для получения данных конкретного языка используется такой синтаксис $this->language->get(ключевое слово данных языкового файла);.

Обратите внимание — настоятельно рекомендуется создавать языковой файл для каждого контроллера и страницы. Путь к языку должен быть таким же, как для контроллера.

Загрузка и использование библиотек
Для удобства разработчиков платформа содержит несколько предустановленных библиотек. Они могут располагаться в каталоге /system/library. Библиотеки можно загружать непосредственно в контроллер с помощью синтаксиса: $this->library_name->method_name().

Ранее мы рассмотрели несколько библиотек, поэтому вы можете работать с ними с помощью своего кода. Некоторые чит-лист доступны следующим образом:

Библиотека Корзины
$this->cart->getProducts(); //Получает все товары, доступные в Корзине
$this->cart->add( $product_id, $qty = 1, $options = array()); // Добавить товар в Корзину
$this->cart->remove( $key ); // Удалить товар из Корзины
$this->cart->clear(); // Очистить Корзину
$this->cart->getWeight(); // Возвращает сумму по товарам в корзине
$this->cart->getSubTotal(); // Возвращает предварительную сумму по всем товарам в корзине
$this->cart->getTotal() ; // Возвращает полную сумму по всем товарам в Корзине
$this->cart->countProducts() ; // Возвращает количество товаров, доступных в Корзине
$this->cart->hasProducts(); // Возвращает true, если в Корзине доступен хотя бы один товар
$this->cart->hasStock(); // Возвращает false, если ни одного товара нет в наличии
$this->cart->getProducts(); //Получает все товары, доступные в Корзине
$this->cart->add( $product_id, $qty = 1, $options = array()); // Добавить товар в Корзину
$this->cart->remove( $key ); // Удалить товар из Корзины
$this->cart->clear(); // Очистить Корзину
$this->cart->getWeight(); // Возвращает сумму по товарам в корзине
$this->cart->getSubTotal(); // Возвращает предварительную сумму по всем товарам в корзине
$this->cart->getTotal() ; // Возвращает полную сумму по всем товарам в Корзине
$this->cart->countProducts() ; // Возвращает количество товаров, доступных в Корзине
$this->cart->hasProducts(); // Возвращает true, если в Корзине доступен хотя бы один товар
$this->cart->hasStock(); // Возвращает false, если ни одного товара нет в наличии
Библиотеки Конфигурации
$this->config->get($key); //Возвращает по ключевому слову настройки, исходя из приложения (каталог или панель администрирования)
$this->config->set($key, $value); // Устанавливает и переназначает значение параметра. (Не сохраняет его в базе данных)
CURRENCY
$this->currency->set($currency); // Устанавливает и переназначает код валюты по умолчанию, которая используется в Сессии
$this->currency->format($number, $currency = '', $value = '', $format = TRUE); // Задает формат Валюты
$this->currency->convert($value, $from, $to); // Конвертирует значение валюты в другую валюту
$this->currency->getId(); // Получает идентификатор текущей валюты
$this->currency->getCode() ; // Возвращает код валюты для текущей валюты
$this->currency->getValue($currency); // Возвращает курс обмена для предоставленной валюты
$this->currency->has(currency); // Возвращает true, если доступен список валют
$this->config->get($key); //Возвращает по ключевому слову настройки, исходя из приложения (каталог или панель администрирования)
$this->config->set($key, $value); // Устанавливает и переназначает значение параметра. (Не сохраняет его в базе данных)
CURRENCY
$this->currency->set($currency); // Устанавливает и переназначает код валюты по умолчанию, которая используется в Сессии
$this->currency->format($number, $currency = '', $value = '', $format = TRUE); // Задает формат Валюты
$this->currency->convert($value, $from, $to); // Конвертирует значение валюты в другую валюту
$this->currency->getId(); // Получает идентификатор текущей валюты
$this->currency->getCode() ; // Возвращает код валюты для текущей валюты
$this->currency->getValue($currency); // Возвращает курс обмена для предоставленной валюты
$this->currency->has(currency); // Возвращает true, если доступен список валют

Библиотека Клиентов
$this->customer->login($email, $password); // Вход в профиль Клиента
$this->customer->logout(); // Выход из профиля Клиента
$this->customer->isLogged(); // Возвращает true, если Пользователь авторизован
$this->customer->getId(); //Возвращает идентификатор текущего авторизованного пользователя
$this->customer->getFirstName() // Возвращает Имя текущего авторизованного пользователя
$this->customer->getLastName() // Возвращает Фамилию текущего авторизованного пользователя
$this->customer->getEmail() ; // Возвращает адрес электронной почты текущего авторизованного пользователя
$this->customer->getTelephone() ; // Возвращает Телефон Активного пользователя
$this->customer->getFax() ; // Возвращает Номер факса Активного пользователя
$this->customer->getNewsletter() ; // Возвращает статус подписки на электронную рассылку
$this->customer->getCustomerGroupId() ; // Возвращает идентификатор Группы Активного пользователя
$this->customer->login($email, $password); // Вход в профиль Клиента
$this->customer->logout(); // Выход из профиля Клиента
$this->customer->isLogged(); // Возвращает true, если Пользователь авторизован
$this->customer->getId(); //Возвращает идентификатор текущего авторизованного пользователя
$this->customer->getFirstName() // Возвращает Имя текущего авторизованного пользователя
$this->customer->getLastName() // Возвращает Фамилию текущего авторизованного пользователя
$this->customer->getEmail() ; // Возвращает адрес электронной почты текущего авторизованного пользователя
$this->customer->getTelephone() ; // Возвращает Телефон Активного пользователя
$this->customer->getFax() ; // Возвращает Номер факса Активного пользователя
$this->customer->getNewsletter() ; // Возвращает статус подписки на электронную рассылку
$this->customer->getCustomerGroupId() ; // Возвращает идентификатор Группы Активного пользователя
Библиотека базы данных
$this->db->query($sql) // Выполняет запрос MySQL и возвращает количество строк
$this->db->escape($value); // Очищает Значение и делает его безопасным для использования в базе данных
$this->db->getLastId($sql); //Возвращает последний добавленный идентификатор из последнего запроса
$this->db->query($sql) // Выполняет запрос MySQL и возвращает количество строк
$this->db->escape($value); // Очищает Значение и делает его безопасным для использования в базе данных
$this->db->getLastId($sql); //Возвращает последний добавленный идентификатор из последнего запроса
Библиотека документов
$this->document->setTitle($title); //Устанавливает Тайтл страницы
$this->document->getTitle(); // Получает Тайтл страницы
$this->document->setDescription($description); // Устанавливает Дескрипшен страницы
$this->document->getDescription(); // Получает Дескрипшен страницы
$this->document->setKeywords(); // Устанавливает ключевые слова для страницы
$this->document->getKeywords(); // Получает ключевые слова для страницы
$this->document->addStyle( $href, $rel = 'stylesheet', $media = 'screen' ); // Добавляет в документ таблицу стилей
$this->document->getStyles(); // Получает стили страницы
$this->document->addScript( $script ); // Добавляет в документ скрипты
$this->document->getScripts(); // Получает скрипты страницы
$this->document->setTitle($title); //Устанавливает Тайтл страницы
$this->document->getTitle(); // Получает Тайтл страницы
$this->document->setDescription($description); // Устанавливает Дескрипшен страницы
$this->document->getDescription(); // Получает Дескрипшен страницы
$this->document->setKeywords(); // Устанавливает ключевые слова для страницы
$this->document->getKeywords(); // Получает ключевые слова для страницы
$this->document->addStyle( $href, $rel = 'stylesheet', $media = 'screen' ); // Добавляет в документ таблицу стилей
$this->document->getStyles(); // Получает стили страницы
$this->document->addScript( $script ); // Добавляет в документ скрипты
$this->document->getScripts(); // Получает скрипты страницы
Создание представления
В OpenCart доступны шаблоны, которые используются для представлений. В приведенном выше контроллере мы указали расположение файла представления темы theme/default/template/forms/myform.tpl. Теперь создайте файл с таким именем и поместите в него следующий код:

<?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>
<div id="content"><?php echo $content_top; ?>
<div class="breadcrumb">
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<?php echo $breadcrumb['separator']; ?><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a>
<?php } ?>
</div>
<h1><?php echo $form_heading; ?></h1>
<div>
<form name="frm" method="POST" action="">
<table border="0">
<tr>
<td width="30%"><?php echo $first_value;?></td>
<td width="70%"><input type="text" name="first_value" /></td>

</tr>
<tr>
<td ><?php echo $second_value;?></td>
<td ><input type="text" name="second_value" /></td>

</tr>
<tr>
<td ><?php echo $third_value;?></td>
<td ><input type="text" name="third_value" /></td>

</tr>
<tr>
<td ><?php echo $forth_value;?></td>
<td ><input type="text" name="forth_value" /></td>

</tr>

</table>
<div class="buttons">
<div class="right"><input type="submit" class="button" value="<?php echo $button_continue; ?>" /></div>
</div>
</form>

</div>

<?php echo $content_bottom; ?></div>
<?php echo $footer; ?>
<?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>
<div id="content"><?php echo $content_top; ?>
<div class="breadcrumb">
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<?php echo $breadcrumb['separator']; ?><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a>
<?php } ?>
</div>
<h1><?php echo $form_heading; ?></h1>
<div>
<form name="frm" method="POST" action="">
<table border="0">
<tr>
<td width="30%"><?php echo $first_value;?></td>
<td width="70%"><input type="text" name="first_value" /></td>

</tr>
<tr>
<td ><?php echo $second_value;?></td>
<td ><input type="text" name="second_value" /></td>

</tr>
<tr>
<td ><?php echo $third_value;?></td>
<td ><input type="text" name="third_value" /></td>

</tr>
<tr>
<td ><?php echo $forth_value;?></td>
<td ><input type="text" name="forth_value" /></td>

</tr>

</table>
<div class="buttons">
<div class="right"><input type="submit" class="button" value="<?php echo $button_continue; ?>" /></div>
</div>
</form>

</div>

<?php echo $content_bottom; ?></div>
<?php echo $footer; ?>
Создание Модели
Модель поддерживает взаимодействие с базой данных и ее объектами. Поэтому, прежде чем начинать работу с моделью, перейдите в phpMyAdmin, выберите базу данных своего магазина (т. е. storedb) и выполните следующие инструкции в панели SQL.

CREATE TABLE `oc_myforms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_value` varchar(80) DEFAULT NULL,
`second_value` varchar(80) DEFAULT NULL,
`third_value` varchar(80) DEFAULT NULL,
`forth_value` varchar(80) DEFAULT NULL,
`date_added` datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `oc_myforms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_value` varchar(80) DEFAULT NULL,
`second_value` varchar(80) DEFAULT NULL,
`third_value` varchar(80) DEFAULT NULL,
`forth_value` varchar(80) DEFAULT NULL,
`date_added` datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
«oc» — это префикс таблицы, используйте собственный префикс базы данных. Теперь пришло время создать собственную модель. Цель создания модели — сохранение данных формы в базе данных. Поэтому давайте создадим нашу первую модель. Создайте в папке catalog/model/forms/ файл myforms.php и поместите в него следующий код:

<?php
class ModelFormsMyform extends Model {
public function saveData($data_array) {

$this->db->query("INSERT INTO " . DB_PREFIX . "myforms SET first_value='".$this->db->escape($data_array['first_value'])."' ,second_value='".$this->db->escape($data_array['second_value'])."',third_value='".$this->db->escape($data_array['third_value'])."',forth_value='".$this->db->escape($data_array['forth_value'])."',date_added=NOW() ");

$form_id = $this->db->getLastId(); // Returns last inserted id
return $form_id;
}
}
?>

<?php
class ModelFormsMyform extends Model {
public function saveData($data_array) {

$this->db->query("INSERT INTO " . DB_PREFIX . "myforms SET first_value='".$this->db->escape($data_array['first_value'])."' ,second_value='".$this->db->escape($data_array['second_value'])."',third_value='".$this->db->escape($data_array['third_value'])."',forth_value='".$this->db->escape($data_array['forth_value'])."',date_added=NOW() ");

$form_id = $this->db->getLastId(); // Returns last inserted id
return $form_id;
}
}
?>
Управление Моделью с помощью Контроллера
Таким образом, окончательный код контроллера будет выглядеть так:

<?php
class ControllerFormsMyform extends Controller{

public function index()
{

if (($this->request->server['REQUEST_METHOD'] == 'POST')) {


$this->load->model('forms/myform'); //маршрут пути без .php

$form_id = $this->model_forms_myform->saveData($this->request->post); //Parse all the posted data

if($form_id)
{
$this->redirect($this->url->link('forms/myform')); //Снова перезагружаем форму

}
}

$this->document->settitle('My Form'); // Для установки Тайтла страницы
$this->data['breadcrumbs'] = array(); // Инициализируем массив Хлебных крошек
$route = $this->request->get['route']; // Получаем "маршрут" URL-адреса, используя метод GET

// Создаем Хлебные крошки, связанные с главной страницей
$this->data['breadcrumbs'][] = array(
'text' => 'Home',
'href' => $this->url->link('common/home'), // путь маршрута на главную страницу
'separator' => false
);
// Привязываем текущую страницу к хлебным крошкам
$this->data['breadcrumbs'][] = array(
'text' => 'My Form',
'href' => $this->url->link($route), // путь маршрута к текущему url
'separator' => '| ' //Символ разделителя для Хлебных крошек
);

//Конец Хлебных крошек

$this->data['form_heading'] = 'My Form Heading'; // Используем ключевое слово $this->data для обработки данных контроллера для представления
$this->data['first_value'] = 'Firstname: ';
$this->data['second_value'] = 'Lastname: ';
$this->data['third_value'] = 'Passport No.: ';
$this->data['forth_value'] = 'Phone No.: ';

$this->data['continue'] = $this->url->link('common/home'); // Данные ссылки для кнопки "Далее"
$this->data['button_continue'] = 'Continue'; // Текст ссылки для кнопки "Далее"

// Добавляем дочерние элементы для Pages: шапку, футер, столцы
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);

$this->template = 'default/template/forms/myform.tpl'; //Привязываем файл шаблона / представления для Пользовательского интерфейса

$this->response->setoutput($this->render()); // Отображаем Шаблон
}


}

?>

<?php
class ControllerFormsMyform extends Controller{

public function index()
{

if (($this->request->server['REQUEST_METHOD'] == 'POST')) {


$this->load->model('forms/myform'); //маршрут пути без .php

$form_id = $this->model_forms_myform->saveData($this->request->post); //Parse all the posted data

if($form_id)
{
$this->redirect($this->url->link('forms/myform')); //Снова перезагружаем форму

}
}

$this->document->settitle('My Form'); // Для установки Тайтла страницы
$this->data['breadcrumbs'] = array(); // Инициализируем массив Хлебных крошек
$route = $this->request->get['route']; // Получаем "маршрут" URL-адреса, используя метод GET

// Создаем Хлебные крошки, связанные с главной страницей
$this->data['breadcrumbs'][] = array(
'text' => 'Home',
'href' => $this->url->link('common/home'), // путь маршрута на главную страницу
'separator' => false
);
// Привязываем текущую страницу к хлебным крошкам
$this->data['breadcrumbs'][] = array(
'text' => 'My Form',
'href' => $this->url->link($route), // путь маршрута к текущему url
'separator' => '| ' //Символ разделителя для Хлебных крошек
);

//Конец Хлебных крошек

$this->data['form_heading'] = 'My Form Heading'; // Используем ключевое слово $this->data для обработки данных контроллера для представления
$this->data['first_value'] = 'Firstname: ';
$this->data['second_value'] = 'Lastname: ';
$this->data['third_value'] = 'Passport No.: ';
$this->data['forth_value'] = 'Phone No.: ';

$this->data['continue'] = $this->url->link('common/home'); // Данные ссылки для кнопки "Далее"
$this->data['button_continue'] = 'Continue'; // Текст ссылки для кнопки "Далее"

// Добавляем дочерние элементы для Pages: шапку, футер, столцы
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);

$this->template = 'default/template/forms/myform.tpl'; //Привязываем файл шаблона / представления для Пользовательского интерфейса

$this->response->setoutput($this->render()); // Отображаем Шаблон
}


}

?>
Таким образом, условный оператор будет проверять, существуют ли какие-либо данные, передаваемые из метода POST. Если да, то будет происходить их запись в базу данных. Обратите внимание, что вы можете добавить собственную валидацию для данных POST.

Заключение
Бинго! Мы создали реальное приложение Модель-Представление-Контроллер для OpenCart. Вы можете продолжить изучение MVC; однако целью данной статьи было дать вам общее представление, и мы этой цели достигли. В следующих статьях мы рассмотрим создание модулей и библиотек OpenCart. Пожалуйста, напишите в комментариях, если у вас возникли какие-либо вопросы.