Загрузка контроллеров из других контроллеров

Вариант 1. С объявлением своей функции

Этот 100% рабочий вариант.

В любом файле, где нужно подгрузить контроллер, пишем

.//
$this->control('extension/shipping/dostavka'); //вызов своей функции подгрузки контроллера dostavka из директории extension/shipping
$cost  = $this->controller_extension_shipping_dostavka->calculatecost('delivery','pickup',$price); //обращение к функции контроллера, у которой , например, 3 аргумента
-----
//объявление функции подгрузки контроллера
    public function control($cont) {
         $file = DIR_APPLICATION . 'controller/' . $cont . '.php';
         $class = 'Controller' . preg_replace('/[^a-zA-Z0-9]/', '', $cont);
         if (file_exists($file)) {
         include_once($file);
         $this->registry->set('controller_' . str_replace('/', '_', $cont), new $class($this->registry));
         } else {
         trigger_error('Error: Could not load controller ' . $cont . '!');
         exit();
         }
    }

Вариант 2. Только с помощью средств Opencart

Это вариант не всегда работает и я не разобрался по каким причинам

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

$this->load->controller('custom/setting/getValue', array(
            'section' => 'availability', // Уникальный индификатор секции
            'setting' => 'freeforegions', // Уникальный индификатор поля
            'page' => 'shipping_deliboo' // Код формы в админ-панеле
        ));

где custom — путь к контроллеру setting, а getValue — его вызываемая функция

Допускается чтобы вызываемая функция имела только один аргумент. В данном случае в качестве аргумента указывается массив.