Как стать гуру OpenCart? [закрыто]


98

Похоже, у них нет документации, кроме некоторых вызовов API на их официальных форумах. У меня есть опыт работы с Zend framework и CodeIgniter. Может ли кто-нибудь из мастеров OpenCart порекомендовать мне лучший способ его изучить и освоить в кратчайшие сроки? Скоро мне предстоит сделать с ним большой проект.



Это действительно важный вопрос, иногда преодоление стандартов SO действительно полезно ...
KAD

1
Большое спасибо за этот вопрос, он мне очень помог
Бипул Рой

@BipulRoy Я рада! Кажется, сейчас это популярный вопрос!
CodeCrack

Ответы:


311

Краткое руководство разработчика OpenCart 1.5.X для начинающих

Это руководство написано для разработчиков, уже знакомых с PHP, ООП и архитектурой MVC.

Ниже вы увидите примеры для корзины со стороны каталога. Сторона администратора идентична по функциям, за исключением представлений, которые указаны в соответствующем разделе.


Понимание библиотек

Все функции библиотеки доступны через контроллер, модель и представления, используя $this->library_name. Все это можно найти в /system/library/папке. Например, чтобы получить доступ к товарам в текущей корзине покупок, вам необходимо использовать Cartкласс, который находится в /system/library/cart.phpи к которому можно получить доступ с помощью$this->cart->getProducts()

Часто используемые предметы

  • customer.php - Функции, связанные с клиентами
  • user.php - Функции администратора, связанные с пользователем
  • cart.php - Функции, связанные с тележкой
  • config.php - Все настройки загружаются из этого
  • url.php - Функции генерации URL

Понимание параметра маршрута

Платформа OpenCart полагается на параметр route=aaa/bbb/cccв строке запроса, чтобы знать, что загружать, и является базовой функцией для поиска файлов, которые необходимо редактировать для каждой страницы. Большинство маршрутов фактически используют только те, aaa/bbbкоторые следует рассматривать как две части, однако некоторые из них содержат три части aaa/bbb/ccc. Первая часть aaaобычно связана с папкой внутри общей папки, такой как папки контроллера или шаблонов. Вторая часть обычно относится к имени файла без соответствующего расширения .phpили .tplрасширения. Третья часть объяснена в разделе «Общие сведения о контроллерах» ниже.


Понимание языков

Языки хранятся в /catalog/language/папке во your-languageвложенной папке . При этом общие текстовые значения, используемые на разных страницах, хранятся в your-language.phpфайле внутри папки, поэтому для английского языка на стороне каталога вы найдете значения в catalog/language/english/english.php. Для конкретного текста страницы вам понадобится routeдля страницы (это обычно так, но не всегда, поскольку вы можете указать любой языковой файл, который вам нравится). Например, на странице поиска есть маршрут product/search, и поэтому текст для этой страницы на конкретном языке можно найти в catalog/language/english/product/search.php(Обратите внимание, что имя файла и подпапка соответствуют маршруту, за которым следует .php.

Чтобы загрузить язык в контроллер, вы используете

$this->language->load('product/search');

Затем вы можете использовать функцию языковой библиотеки getдля получения определенных языковых текстов, таких как

$some_variable = $this->language->get('heading_title');

Языковые переменные назначаются в языковом файле с помощью специальной переменной, $_которая представляет собой массив ключей и текстовых значений. В вашем /catalog/language/english/product/search.phpвы должны найти что-то похожее на

$_['heading_title']     = 'Search';

Значения в глобальном языковом файле english/english.phpавтоматически загружаются и доступны для использования без $this->language->loadметода


Понимание контроллеров

Контроллеры загружаются на основе routeи довольно просты для понимания. Контроллеры находятся в /catalog/controller/папке. Продолжая предыдущий пример, /product/search.phpв этой папке находится Контроллер для страницы поиска . Еще раз обратите внимание, что используется маршрут, за которым .phpследует.

Открыв файл контроллера, вы увидите, что имя класса Pascal Case, расширяющее Controllerкласс, называется ControllerProductSearch. Это снова относится к маршруту, Controllerза которым следуют имя подпапки и имя файла без расширения с заглавной буквы. Использование заглавных букв на самом деле не требуется, но рекомендуется для удобства чтения. Стоит отметить, что имена классов не принимают никаких значений из подпапки и имени файла, кроме букв и цифр. Подчеркивания удалены.

Внутри класса есть методы. Методы в объявленном классе publicдоступны для запуска через маршрут - privateнет. По умолчанию при стандартном маршруте из двух частей (см. aaa/bbbВыше) index()вызывается метод по умолчанию . Если используется третья часть маршрута (см. cccВыше), вместо этого будет запущен этот метод. Например, account/return/insertзагрузит /catalog/controller/account/return.phpфайл и класс и попытается вызвать insertметод


Понимание моделей

Модели в OpenCart находятся в /catalog/model/папке и сгруппированы по функциям, а не по маршруту, поэтому вам нужно будет загрузить их в свой контроллер через

$this->load->model('xxx/yyy');

Это загрузит файл в подпапку с xxxименем yyy.php. Затем его можно использовать через объект

$this->model_xxx_yyy

и, как и в случае с контроллерами, вы можете вызывать только его publicметоды. Например, чтобы изменить размер изображения, вы должны использовать tool/imageмодель и вызвать ее resizeметод следующим образом

$this->load->model('tool/image');
$this->model_tool_image->resize('image.png', 300, 200);

Понимание присвоения переменных в представлениях из контроллера

Чтобы передавать значения в представление из контроллера, вам просто нужно присвоить данные $this->dataпеременной, которая по сути представляет собой массив пар ключ => значение. Например

$this->data['example_var'] = 123;

Доступ к этому в представлении должен быть легким для понимания, если вы знакомы с методом extract (), который преобразует каждый ключ в переменную. Таким образом, example_varключ становится $example_varи может быть доступен как таковой в представлении.


Понимание тем

Темы доступны только на стороне каталога и в основном представляют собой папку шаблонов, таблиц стилей и изображений тем. Папки /catalog/view/theme/с темами помещаются в папку, за которой следует название темы. Имя папки не имеет значения, за исключением defaultпапки

Сторона администратора использует /admin/view/template/(пропустив /theme/theme-name/путь, так как это не позволяет использовать разные темы)

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


Понимание представлений (шаблонов)

Как и в случае с языком и моделями, файлы представления обычно связаны с маршрутом, хотя и не обязательно. Шаблоны на стороне каталога обычно находятся в, /catalog/view/theme/your-theme/template/если он не существует, и в этом случае будут использоваться шаблоны темы по умолчанию. Для нашего примера страницы поиска выше это файл product/search.tpl. Для маршрутов, состоящих из трех частей, это обычно, aaa/bbb_ccc.tplхотя жестко заданных правил нет. В админке большинство страниц следуют этому правилу, за исключением тех страниц, где перечислены элементы, такие как страница со списком продуктов, и catalog/product_list.tplформа редактирования продукта находится внутри catalog/product_form.tpl. Опять же, они не установлены, но являются стандартом для тележки по умолчанию.

Файл шаблона на самом деле является просто другим файлом php, но с расширением .tpl и фактически запускается в файле контроллера, поэтому все вещи, которые вы можете закодировать в контроллере, можно запустить в файле шаблона (хотя не рекомендуется нужно)


Понимание объекта базы данных

Запросы выполняются с использованием

$result = $this->db->query("SELECT * FROM `" . DB_PREFIX . "table`");

DB_PREFIX как следует из названия, это константа, содержащая префикс базы данных, если он существует

$resultвернет объект для SELECTзапросов, содержащий несколько свойств

$result->row содержит данные первой строки, если один или несколько возвращаются в виде ассоциативного массива

$result->rows содержит массив результатов строк, идеально подходящий для цикла с использованием foreach

$result->num_rows содержит количество возвращенных результатов

Есть также несколько дополнительных методов, которые есть у $this->dbобъекта.

$this->db->escape()использует mysql_real_escape_string () для переданного значения

$this->db->countAffectedвозвращает количество строк, затронутых UPDATEзапросом и т. д.

$this->db->getLastId()возвращает последний идентификатор автоинкремента, используя mysql_insert_id ()


Понимание зарезервированных переменных

Вместо стандартного OpenCart имеет переменные для использования предопределен $_GET, $_POST, $_SESSION, $_COOKIE, $_FILES, $_REQUESTи$_SERVER

$_SESSIONредактируется с использованием $this->session->dataгде данные представляют собой ассоциативный массив, имитирующий$_SESSION

Ко всем остальным можно получить доступ с помощью $this->requestи они были «очищены», чтобы соответствовать включенным / отключенным магическим кавычкам, поэтому

$_GET становится $this->request->get

$_POST становится $this->request->post

$_COOKIE становится $this->request->cookie

$_FILES становится $this->request->files

$_REQUEST становится $this->request->request

$_SERVER становится $this->request->server


Резюме

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


3
Спасибо! Где ты это взял?
CodeCrack

64
Я это написал. Я решил, что нужно написать и соответствовать квестону
Джей Гилфорд

2
Очень хорошо. Намного информативнее, чем большинство руководств. У вас есть шанс продвинуться?
CodeCrack

3
Этому следует присвоить статус вики сообщества
Stann0rz

1
@UltimateKing - Это руководство уже предоставляет вам более чем достаточно информации, чтобы вы начали создавать свои собственные моды. В сети также есть учебные пособия по разработке модулей
Джей Гилфорд

36

Методы глобальной библиотеки: основные функции библиотеки opencart вместе с их функциями, большинство из них можно вызывать из любого места в каталоге или папках администратора (контроллеры, модели, представления)

CACHE
$this->cache->delete($key) - Deletes cache [product, category, country, zone, language, currency,
manufacturer]

CART
$this->cart->getProducts() Gets all products currently in the cart including options, discounted prices, etc.
$this->cart->add( $product_id, $qty = 1, $options = array()) - Allows you to add a product to the cart
$this->cart->remove( $key ) - Allows you to remove a product from the cart
$this->cart->clear() - Allows you to remove all products from the cart
$this->cart->getWeight() - Sum of the weight of all products in the cart that have require shipping set to Yes
$this->cart->getSubTotal() - returns the subtotal of all products added together before tax
$this->cart->getTotal() - returns the total of all products added together after tax
$this->cart->countProducts() - returns the count of all product in the cart
$this->cart->hasProducts() - returns true if there is at least one item in the cart
$this->cart->hasStock() - returns false if there is at least one item in the cart that is out of stock
$this->cart->hasShipping() - returns true if there is at least one item in the cart that requires shipping
$this->cart->hasDownload() - returns true if there is at least one item in the cart that has a download
associated

CONFIG
$this->config->get($key) - returns setting value by keyname based on application (catalog or admin)
$this->config->set($key, $value) - set the value to override the setting value. DOES NOT SAVE TO DATABASE

CURRENCY
$this->currency->set($currency) - set or override the currency code to be used in the session
$this->currency->format($number, $currency = '', $value = '', $format = TRUE) - format the currency
$this->currency->convert($value, $from, $to) - convert a value from one currency to another. Currencies must
exist
$this->currency->getId() - get the database entry id for the current currency (1, 2, 3, 4)
$this->currency->getCode() - get the 3-letter iso code for the current currency (USD, EUR, GBP, AUD, etc)
$this->currency->getValue($currency) - get the current exchange rate from the database for the specified
currency.
$this->currency->has(currency) - Check if a currency exists in the opencart currency list

CUSTOMER
$this->customer->login($email, $password) - Log a customer in
$this->customer->logout() - Log a customer out
$this->customer->isLogged() - check if customer is logged in
$this->customer->getId() - get the database entry id for the current customer (integer)
$this->customer->getFirstName() - get customer first name
$this->customer->getLastName() - get customer last name
$this->customer->getEmail() - get customer email
$this->customer->getTelephone() - get customer telephone number
$this->customer->getFax() - get customer fax number
$this->customer->getNewsletter() - get customer newsletter status
$this->customer->getCustomerGroupId() - get customer group id
$this->customer->getAddressId() - get customer default address id (maps to the address database field)

DATABASE
$this->db->query($sql) - Execute the specified sql statement. Returns row data and rowcount.
$this->db->escape($value) - Escape/clean data before entering it into database
$this->db->countAffected($sql) - Returns count of affected rows from most recent query execution
$this->db->getLastId($sql) - Returns last auto-increment id from more recent query execution 4

DOCUMENT (*Called from controller only before renderer)
$this->document->setTitle($title) - Set page title
$this->document->getTitle()- Get page title
$this->document->setDescription($description) - Set meta description
$this->document->getDescription()- Get meta description
$this->document->setKeywords()- Set meta keywords
$this->document->getKeywords()- Get meta keywords
$this->document->setBase($base) - Set page base
$this->document->getBase() - Get page base
$this->document->setCharset($charset) - Set page charset
$this->document->getCharset() - Get page charset
$this->document->setLanguage($language) - Set page language
$this->document->getLanguage()- Get page language
$this->document->setDirection($direction) - Set page direction (rtl/ltr)
$this->document->getDirection()- Get page direction (rtl/ltr)
$this->document->addLink( $href, $rel )  Add dynamic <link> tag
$this->document->getLinks()- Get page link tags
$this->document->addStyle( $href, $rel = 'stylesheet', $media = 'screen' )  Add dynamic style
$this->document->getStyles()- Get page styles
$this->document->addScript( $script ) - Add dynamic script
$this->document->getScripts()- Get page scripts
$this->document->addBreadcrumb($text, $href, $separator = ' &gt; ')  Add breadcrumb
$this->document->getBreadcrumbs()- Get Breadcrumbs

ENCRYPT
$this->encryption->encrypt($value) - Encrypt data based on key in admin settings
$this->encryption->decrypt($value) - Decrypt data based on key in admin settings

IMAGE
$this->image->resize($width = 0, $height = 0)

JSON
$this->json->encode( $data )
$this->json->decode( $data , $assoc = FALSE)

LANGUAGE
$this->language->load($filename);

LENGTH
$this->length->convert($value, $from, $to) - convert a length to another. units must exist
$this->length->format($value, $unit, $decimal_point = '.', $thousand_point = ',') - format the length to use
unit

LOG
$this->log->write($message) - Writes to the system error log

REQUEST
$this->request->clean($data) - Cleans the data coming in to prevent XSS
$this->request->get['x'] - Same as $_GET['x']
$this->request->post['x'] - Same as $_POST['x']

RESPONSE
$this->response->addHeader($header) - additional php header tags can be defined here
$this->response->redirect($url) - redirects to the url specified

TAX
$this->tax->setZone($country_id, $zone_id) - Set the country and zone id for taxing (integer)
$this->tax->calculate($value, $tax_class_id, $calculate = TRUE) - Calculate all taxes to be added to the total
$this->tax->getRate($tax_class_id) - Get the rates of a tax class id
$this->tax->getDescription($tax_class_id) - Get the description of a tax class id
$this->tax->has($tax_class_id) - Check if a tax class id exists in opencart

SESSION
$this->session->data['x'] - Same as $_SESSION['x']  

9

Существует веб-сайт OpenCart Wiki с документацией для начинающих разработчиков. Для получения более подробной информации следуйте приведенным ниже URL-адресам:

http://wiki.opencarthelp.com/doku.php?id=start
http://wiki.opencarthelp.com/doku.php?id=methods_reference

ИНТЕРНЕТ-АРХИВ ссылки

http://web.archive.org/web/20160305131349/http://wiki.opencarthelp.com/doku.php?id=start http://web.archive.org/web/20160305131349/http://wiki .opencarthelp.com / doku.php? id = method_reference

Например, ссылка на метод содержит подробную информацию о:

  1. Вход для клиентов
  2. Доступ к БД
  3. Обработка корзины покупок
  4. Конфиг
  5. Кеш
  6. Валюта

Тем не менее, некоторые страницы находятся в стадии разработки, но это будет полезно.

[Обновить]

По состоянию на январь 2018 года домен opencarhelp.com не работает.


Похоже, что через пару месяцев по-прежнему не хватает большого количества информации. Этот проект заброшен?
Pacerier

@Pacerier, я не уверен в этом.
Дхарманг

это отличная страница, даже вики с открытой корзиной ссылается на нее, вы можете увидеть ссылку здесь wiki.opencarthelp.com/doku.php?id=opencart_framework
Нассим

4

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

Обучение в процессе работы

Создав свой собственный фреймворк OpenCart с нуля с помощью нескольких файлов, вы сможете понять, как все устроено. Я буду имитировать для вас файловую структуру OpenCart.

Создать файл index.php

<?php
// My simpleCart

1. Реестр

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

создать файл с путем /system/engine/registry.php

<?php
// Registry class. 
class Registry
{
    private $data = array();

    public function set($key, $value){
        $this->data[$key] = $value;
    }

    public function get($key){
        return (isset($this->data[$key])) ? $this->data[$key] : false;
    }
}

в твоем index.php

<?php
// My simpleCart

//load dependency files
require_once('system/engine/registry.php');

//initialize registry
$registry = new Registry;

2. Вывод

Теперь давайте добавим вывод, который в будущем будет нашим HTML. В конце концов, вся идея состоит в том, чтобы отправить строку текста в браузер.

Создать файл system/library/response.php

<?php
class Response {
    private $output;

    public function getOutput() {
        return $this->output;
    }

    public function setOutput($output) {
        $this->output = $output;
    }

    public function output() {
        if ($this->output) {
            echo $this->output;
        }
    }
}

и в вашем index.php

<?php
// My simpleCart

//load dependency files
require_once('system/engine/registry.php');
require_once('system/library/response.php');

//initialize registry
$registry = new Registry;

//initialize response
$response = new Response;
//add response object to the registry
$registry->set('response', $response);

//lets set an output as a test
$registry->get('response')->setOutput('Hello World');

//send the output to the client
$registry->get('response')->output();

Обратите внимание, что я добавил Hello world только в качестве примера. Мы удалим это дальше. Обновите свой сайт, чтобы проверить это. Браузер должен отобразить Hello World.

3. Контроллеры

Думайте о контроллерах как о страницах. Они будут определять, что будет отображаться клиенту: текст, html, json, загрузка или даже изображение. На данный момент нам просто нужна страница, которая отправляет текст.

Мы создадим контроллер для homeстраницы.

добавить файл с путем catalog/controller/common/home.php

<?php

class ControllerCommonHome{

    private $registry = array();

    public function __construct($registry){
        $this->registry = $registry;
    }

    public function index(){

        $output = 'Home Page';
        //using the registry to get the response object and set the Output
        $this->registry->get('response')->setOutput($output);
    }
}

и отредактируйте свой index.php

<?php
// My simpleCart

//load registry
require_once('system/engine/registry.php');
//load response
require_once('system/library/response.php');

//initialize registry
$registry = new Registry;

//initialize response
$response = new Response;
//add resoinse object to the registry
$registry->set('response', $response);

//load controller common/home
require_once('catalog/controller/common/home.php');
$controller = new ControllerCommonHome($registry);
$controller->index();

//send the output to the client
$registry->get('response')->output();

обратите внимание, как я передал $refistryобъект ControllerCommonHome, чтобы получить к нему доступ внутри контроллера.

4. Маршрутизатор

Мы не хотим, чтобы контроллеры были жестко запрограммированы, верно. Мы будем использовать параметр routeиз URL-адреса, чтобы указать нашей тележке, какой контроллер загружать.

Создайте файл с путем system/library/request.php

<?php
class Request {
    public $get = array();

    //for now I just need the $_GET parameter
    public function __construct() {
        $this->get = $_GET;
    }
}

Создайте класс Router, который будет отвечать за инициализацию файла контроллера на основе маршрута (другими словами: динамически вызывать контроллер)

<?php
class Router {
    private $registry;

    public function __construct($registry) {
        $this->registry = $registry;
    }

    public function dispatch($route) {
        require_once('catalog/controller/'.$route.'.php');
        $class = "Controller".str_replace('/', '', $route);
        $controller = new $class($this->registry);
        $controller->index();
    }
}

загрузите это в свой index.php

<?php
require_once('system/engine/registry.php');
require_once('system/engine/router.php');
require_once('system/library/response.php');
require_once('system/library/request.php');

$registry = new Registry;

$response = new Response;
$registry->set('response', $response);

$request = new Request;
$registry->set('request', $request);

//get the route from the url
if(isset($registry->get('request')->get['route'])){
    $route = $registry->get('request')->get['route'];
}else{
    $route = 'common/home';
}

//initiate the router and dispatch it base on the route
$router = new Router($registry);
$router->dispatch($route);


$registry->get('response')->output();

Обратите внимание, как я загружаю все в объект, $registryа затем передаю его объекту, $routerкоторый затем передает его объекту $controller.

Этот пост уже слишком длинный, но я надеюсь, что он даст общее представление о шаблоне MVC в OpenCart.

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

Также посетите мой Youtube https://www.youtube.com/dreamvention и мой блог https://dreamvention.com/blog. Я буду публиковать для вас больше советов и руководств, ребята!


1

PHP - довольно большой язык с более чем 5000 встроенными функциями, поэтому одна из стратегий изучения новой платформы - определить, какие функции он использует наиболее часто, и потратить некоторое время на их изучение.

Я выполнил несколько запросов к исходному коду OpenCart, и вот 10 наиболее часто используемых функций:

array()
count()
explode()
implode()
mktime()
delete()
time()
date()
sprintf()
list()

Все 52 перечисленных здесь, а также команды Linux bash, которые вы можете использовать в любой базе кода для определения часто используемых функций: https://www.antropy.co.uk/blog/efficient-learning-for-new-opencart-developers/


1

Этот плейлист с видео на YouTube также может быть полезен, чтобы стать гуру разработчиков OpenCart:

OpenCart Видео Уроки

  1. Введение и содержание В этом видео проходит введение в серию
  2. Установка OpenCart на localhost В этом видео рассказывается об установке OpenCart на localhost
  3. Структура файлов и папок OpenCart Описывает структуру файлов и папок OpenCart.
  4. Создание схемы таблицы базы данных в OpenCart Показана схема таблицы базы данных и показано, как создавать таблицы базы данных в OpenCart.
  5. Методы предопределенных объектов библиотеки OpenCart В нем описаны методы предопределенных объектов библиотеки OpenCart и показано, где их найти.
  6. Шаблон MVCL, поток кода и запрос и ответ в OpenCart Он показывает шаблон MVCL, поток кода и запрос и ответ в OpenCart. Они описывают поток как на картинке ниже: MVCL описан с помощью кода

  7. Установка, настройка и удаление модуля OpenCart. В нем показаны три способа загрузки модулей, а затем установки, настройки и удаления модуля / расширения OpenCart 3.

  8. Макеты и положение в OpenCart 3 В нем описаны макеты и позиции OpenCart 3. Он показывает, как показывать настраиваемые макеты для разных страниц, приводя примеры страниц категорий. Мы показываем другой макет для другой категории.

  9. Обзор событий Opencart Вы узнаете, что такое события в OpenCart, как они работают и что делает их такими полезными.

  10. Документация по Opencart API для разработчика В этом видео будет показано, как использовать и создавать собственный API Opencart.

Как только вы посмотрите эти видео, можете начинать кодировать :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.