OpenCart 3.x
We can use same MVC+L structure like in OC 1 and 2. Here is detailed example. Lats call it Custom Page.
Creating model using path /admin/model/custom/page.php
<?php
class ModelCustomPage extends Model {
public function getTotalInformationsOnCustomPage() {
$query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "information");
return $query->row['total'];
}
}
Your file path and model name should be the same. model/custom/page.php
becomes ModelCustomPage
.
Here you can see method public function getTotalInformationsOnCustomPage()
, it's just for instance, took it from Information Model. Optional.
Creating controller using path /admin/controller/custom/page.php
<?php
class ControllerCustomPage extends Controller {
public function index() {
$this->load->language('custom/page'); // calling Custom Page language
$this->document->setTitle($this->language->get('heading_title')); // set title from Custom Page language
$this->load->model('custom/page'); // calling Custom Page model
$data['information_total'] = $this->model_custom_page->getTotalInformationsOnCustomPage(); // calling model method
// breadcrumbs
$data['breadcrumbs'] = array();
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('custom/page', 'user_token=' . $this->session->data['user_token'], true)
);
// calling header, footer and column_left for our template to render properly
$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');
$this->response->setOutput($this->load->view('custom/page', $data)); // send our $data array to view
}
}
This is minimal set for good looking admin page, with all default menus and breadcrumbs.
As in model, your file path and controller name should be the same. controller/custom/page.php
becomes ControllerCustomPage
.
Creating language using path /admin/language/en-gb/custom/page.php
<?php
// Heading
$_['heading_title'] = 'Custom Page';
// Text
$_['text_custom_block'] = 'Custom Block';
$_['text_total_informations'] = 'Total informations:';
Creating view using path /admin/view/template/custom/page.twig
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<h1>{{ heading_title }}</h1>
<ul class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-thumbs-up"></i> {{ text_custom_block }}</h3>
</div>
<div class="panel-body">{{ text_total_informations }} {{ information_total }}</div>
</div>
</div>
</div>
{{ footer }}
In this example I used standard block structure, inherent in this system. You can use any HTML you want. As you can see, {{ header }}
, {{ column_left }}
, {{ footer }}
added for standard admin navigation support.
Working with .twig
files don't forget to clear twig cache to see changes.
After all those manipulations, don't forget to set permissions for your new application. In admin panel go to System > Users > User groups, edit Administrator group (or/and any other you want). On edit page set find custom/page
in both Access Permission and Modify Permission blocks, and mark it as selected. Save.
Now your new application is accessible by url yoursite.com/admin/index.php?route=custom/page&user_token=XXXXXX
Form this point you might want to add your custom page to the left menu of admin panel. You can do it by editing core files or, better, by OCMOD file.
Create custom_page.ocmod.xml
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Custom Page OCMOD</name>
<code>custom-page</code>
<version>1.0</version>
<author>Me</author>
<link>http://mywebsite.com</link>
<file path="admin/controller/common/column_left.php">
<operation>
<search><![CDATA[// Stats]]></search>
<add position="before"><![CDATA[
$data['menus'][] = array(
'id' => 'menu-custom',
'icon' => 'fa-thumbs-up',
'name' => $this->language->get('text_custom'),
'href' => $this->url->link('custom/page', 'user_token=' . $this->session->data['user_token'], true)
);
]]></add>
</operation>
</file>
<file path="admin/language/en-gb/common/column_left.php">
<operation>
<search><![CDATA[// Text]]></search>
<add position="after"><![CDATA[
$_['text_custom'] = 'Custom Page';
]]></add>
</operation>
</file>
</modification>
Install the file in Extensions > Installer
Than go to Extensions > Extensions and clear OCMOD cache.
In this OCMOD file we just modified 2 OpenCart core file without editing them directly. Now you will see a link on a Custom Page in left admin menu.
More about OCMOD you can read in
Opencart Modification System Related Questions
and
OpenCart OCMOD and VQMOD Modification Systems
$this->load->model('catalog/information');
might slow down your code loading un-needed libraries especially on busy sites with multiple admin users. – Bordeaux