Пишемо загальний код контролера в OpenCart

294

Від автора: якщо ви розробляли модулі, то могли потрапити в ситуацію, коли писали загальні елементи, які підходять під всі контролери OpenCart. Як думаєте, було б круто, якщо б ви могли писати загальний код десь в одному файлі і викликати його по необхідності! У цій статті ми обговоримо, як написати загальний код контролера і використовувати його в різних модулях.

Для вже знайомих з розробкою модулів в OpenCart створення спільних елементів – рутина (хедер, футер, сайдбар в index методі класу контролера). В мережі повно способів централізації загального коду, але ми розберемо спосіб OpenCart!

Припускаю, що ви працюєте в останній версії OpenCart і знайомі з процесом розробки модулів. Ми зосередимося більше на концепції, а не на обговоренні коду.

Створюємо загальний код контролера

Створіть папку catalog/controller/preactiondemo. Створіть файл common.php у цій папці з наступним кодом.

load->controller(‘common/header’);
$data[‘footer’] = $this->load->controller(‘common/footer’);
$data[‘preaction_text’] = “i’ve been set by the ‘setup’ method from ‘common’ controller file.”;
$args[‘controller’]->$args[‘method’]($data, FALSE);
}
}

Досить простий код! Ініціалізується пара змінних в масиві $data, крім останнього рядка методу setup. Повернемось до неї пізніше, вона розкриває секрет масиву $args.

Пишемо загальний код контролера в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення

Поняття процесу відправлення

Перш ніж продовжити писати код, я швидко поясню вам процес відправки в OpenCart.

Коли користувач переходить з будь-якого URL в OpenCart, створюється відповідний об’єкт action на основі змінної рядка запиту route. Шматок коду з index.php.

// Router
if (isset($request->get[‘route’])) {
$action = new Action($request->get[‘route’]);
} else {
$action = new Action(‘common/home’);
}

Далі викликається метод dispatch.

$controller->dispatch($action, new Action(‘error/not_found’));

Викликається метод dispatch, визначений у файлі system/engine/front.php. У цьому методі ви знайдете цикл while, який виконується до тих пір, поки $action не стане false.

while ($action) {
$action = $this->execute($action);
}

У циклі викликається метод execute, визначений у тому ж файлі, поки $action не дорівнює false. Це означає, що якщо метод контролера повертає об’єкт action, OpenCart відразу запустить action. Тут ми можемо викликати інший action прямо з того action. Давайте дізнаємося, як це зробити!

Виклик спільного контролера і налаштування представлення

Створіть файл preaction_demo.php у папці preactiondemo з наступним кодом.

$this, ‘method’=>’index’));
}
if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/preactiondemo/preaction_demo.tpl’)) {
$this->response->setOutput($this->load->view($this->config->get(‘config_template’) . ‘/template/preactiondemo/preaction_demo.tpl’, $data));
} else {
$this->response->setOutput($this->load->view(‘default/template/preactiondemo/preaction_demo.tpl’, $data));
}
}
}

Якщо $flag встановлено в true, ми повертаємо об’єкт класу action. А якщо процес відправки отримує об’єкт action, він продовжує роботу з цим action. Тобто в нашому випадку буде викликаний метод setup контролера common. Згадайте файл common.php, який ми створили в попередньому розділі.

Тут важливо зауважити, що ми передаємо array(‘controller’ => $this, ‘method’=>’index’) як аргумент, який далі передається як перший аргумент методу setup контролера common. Це допоможе нам повернутися в метод index контролера preaction_demo після ініціалізації змінних.

Далі в методі setup ми визначили кілька загальних змінних типу хедера, футера і т. д. В кінці ми передаємо контроль назад у головний контролер звідти, де був викликаний метод setup, з допомогою наступного виразу.

$args[‘controller’]->$args[‘method’]($data, FALSE);

Нам потрібно передати змінні, створені в методі setup через $data в оригінальний контролер, щоб використовувати їх там – головна мета статті. Ця змінна передається як перший аргумент методу вище. Другий аргумент дуже важливий, так як він перетвориться в змінну $flag. Це робиться, щоб уникнути нескінченного циклу.

Тепер давайте налаштуємо файл представлення catalog/view/theme/default/template/preactiondemo/preaction_demo.tpl з наступним кодом.

Ми закінчили з налаштуванням, тепер давайте перейдемо URL http://youropencartstoreurl/index.php?route=preactiondemo/preaction_demo. Повинно з’явитися повідомлення “i’ve been set by the ‘setup’ method from the ‘common’ controller file.”!

Ось так ви можете писати загальний код в одному місці і викликати екшен з інших контролерів. Так ви не будете дублювати код, і так легше змінювати код, часто зустрічається в модулях.

Висновок

Сьогодні ми вивчили крутий трюк в OpenCart. Ми дізналися, як викликати екшен з екшену! Звичайно, є різні способи, але цей давно був у мене в голові, і я вирішив поділитися їм з вами!

Пишемо загальний код контролера в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення