Від автора: якщо ви розробляли модулі, то могли потрапити в ситуацію, коли писали загальні елементи, які підходять під всі контролери 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!
Створити інтернет-магазин на самій популярної 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!
Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!
Приступити до створення