Skip to main content

Overview

OpenCart 4.x extensions follow a standardized directory structure under extension/{vendor}/. Each extension contains separate directories for admin, catalog, and system files.

Directory Structure

extension/{vendor}/
├── admin/
│   ├── controller/{type}/{name}.php
│   ├── model/{type}/{name}.php
│   ├── view/
│   │   └── template/{type}/{name}.twig
│   └── language/
│       └── en-gb/{type}/{name}.php
├── catalog/
│   ├── controller/{type}/{name}.php
│   ├── model/{type}/{name}.php
│   ├── view/
│   │   └── template/{type}/{name}.twig
│   └── language/
│       └── en-gb/{type}/{name}.php
├── system/
│   ├── library/{name}.php
│   └── config/{name}.php
└── install.json

Extension Types

TypePurposeExample
paymentPayment gatewaysPayPal, Stripe
shippingShipping methodsFlat rate, UPS
moduleContent modulesFeatured products, banners
totalOrder total calculationsTax, shipping, discounts
themeStore themesCustom designs
fraudFraud detectionIP blocking, max orders
captchaCAPTCHA systemsreCAPTCHA, Basic CAPTCHA
currencyCurrency convertersECB, Fixer.io
reportReporting toolsSales reports, analytics

File Naming Conventions

Namespace Pattern

Opencart\{Application}\Controller\Extension\{Vendor}\{Type}\{Name}

Examples

# Payment Extension
Vendor: opencart
Type: payment
Name: bank_transfer

Admin Controller:
  Path: extension/opencart/admin/controller/payment/bank_transfer.php
  Namespace: Opencart\Admin\Controller\Extension\Opencart\Payment
  Class: BankTransfer

Catalog Controller:
  Path: extension/opencart/catalog/controller/payment/bank_transfer.php
  Namespace: Opencart\Catalog\Controller\Extension\Opencart\Payment
  Class: BankTransfer

Extension Metadata

install.json

Every extension should include install.json:
{
    "name": "My Extension",
    "version": "1.0.0",
    "author": "Your Name",
    "link": "https://example.com",
    "type": "payment",
    "license": {
        "type": "MIT",
        "url": "https://opensource.org/licenses/MIT"
    }
}

Example: Payment Extension

Complete file structure for a payment gateway:
extension/myvendor/
├── admin/
│   ├── controller/
│   │   └── payment/
│   │       └── mypayment.php
│   ├── language/
│   │   └── en-gb/
│   │       └── payment/
│   │           └── mypayment.php
│   └── view/
│       └── template/
│           └── payment/
│               └── mypayment.twig
├── catalog/
│   ├── controller/
│   │   └── payment/
│   │       └── mypayment.php
│   └── language/
│       └── en-gb/
│           └── payment/
│               └── mypayment.php
└── install.json

Routing

Extensions are accessed via extended routes:
extension/{vendor}/{type}/{name}
extension/{vendor}/{type}/{name}.{method}
Examples:
extension/opencart/payment/bank_transfer
extension/opencart/payment/bank_transfer.confirm

Next Steps

Creating Modules

Build custom modules

Payment Gateways

Develop payment extensions

Shipping Methods

Create shipping methods

Event System

Use events in extensions