Коллеги, всем здрасьте! Возникла проблема: Был написан свой простенький модуль для вывода текста - привязанного к определенной странице. Написал админскую и "клиентскую" часть ... захожу в Макеты - пытаюсь добавить к какому-либо макету модуль - он отсутствует в списке. Модуль активирован. Код контроллера для админки: PHP: <?phpclass ControllerModuleSeoBlock extends Controller { private $error = array(); public function index() { $this->load->language('module/seo_block'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('extension/module'); $data['heading_title'] = $this->language->get('heading_title'); $data['text_edit'] = $this->language->get('text_edit'); $data['text_enabled'] = $this->language->get('text_enabled'); $data['text_disabled'] = $this->language->get('text_disabled'); $data['button_save'] = $this->language->get('button_save'); $data['button_cancel'] = $this->language->get('button_cancel'); $data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'); $this->load->model('module/seo_block'); if($this->request->server['REQUEST_METHOD'] == 'GET' && isset($_GET['action']) && $_GET['action']=='delete_custom_text' && isset($_GET['rec_id'])) { $this->model_module_seo_block->deleteCustomText((int)$_GET['rec_id']); $this->response->redirect($this->url->link('module/seo_block', 'token=' . $this->session->data['token'], 'SSL')); } else if (($this->request->server['REQUEST_METHOD'] == 'POST') && isset($_GET['action']) && $_GET['action']=='add_custom_text' ) { $x = explode("__", $this->request->post['custom_category']); if(sizeof($x) == 2 && trim($x[0]) != "") { $data = array( 'title' =>$this->request->post['custom_text_title'], 'text' =>$this->request->post['custom_text_content'], 'cat_id'=>$x[1], 'module'=>$x[0] ); $this->model_module_seo_block->addCustomText($data); } $this->response->redirect($this->url->link('module/seo_block', 'token=' . $this->session->data['token'], 'SSL')); } else if (($this->request->server['REQUEST_METHOD'] == 'POST') && isset($_GET['action']) && $_GET['action']=='edit_custom_text' && isset($_GET['rec_id']) ) { $x = explode("__", $this->request->post['custom_category']); if(sizeof($x) == 2 && trim($x[0]) != "") { $data = array( 'id' => (int)$_GET['rec_id'], 'title' =>$this->request->post['custom_text_title'], 'text' =>$this->request->post['custom_text_content'], 'cat_id'=>$x[1], 'module'=>$x[0] ); $this->model_module_seo_block->editCustomText($data); } $this->response->redirect($this->url->link('module/seo_block', 'token=' . $this->session->data['token'], 'SSL')); } $this->load->model('catalog/category'); $this->load->model('catalog/product'); $categories_1 = $this->model_catalog_category->getCategories(0); foreach ($categories_1 as $category_1) { $data['categories'][] = array( 'name' => $category_1['name'], 'id' => $category_1['category_id'], 'module' => 'product/category' ); $products = $this->model_catalog_product->getProductsByCategoryId($category_1['category_id']); if(sizeof($products) > 0) foreach ($products as $product) { $data['categories'][] = array( 'name' => $category_1['name']." > ".$product['name'], 'id' => $product['product_id'], //'cat_id' => $category_1['category_id'], 'module' => 'product/product' ); } } $this->load->model('catalog/information'); foreach ($this->model_catalog_information->getInformations() as $result) { $data['categories'][] = array( 'name' => $result['title'], 'id' => $result['information_id'], 'module' => 'information/information' ); } $arr = $this->model_module_seo_block->GetCustomTextItems(); $data['custom_texts'] = $arr; $data['action'] = $this->url->link('module/seo_block', 'token=' . $this->session->data['token'], 'SSL'); $data['breadcrumbs'] = array(); $data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL') ); $data['breadcrumbs'][] = array( 'text' => $this->language->get('text_module'), 'href' => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL') ); if (!isset($this->request->get['module_id'])) { $data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('module/seo_block', 'token=' . $this->session->data['token'], 'SSL') ); } else { $data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('module/seo_block', 'token=' . $this->session->data['token'] . '&module_id=' . $this->request->get['module_id'], 'SSL') ); } $data['header'] = $this->load->controller('common/header'); $data['column_left'] = $this->load->controller('common/column_left'); $data['footer'] = $this->load->controller('common/footer'); $this->response->setOutput($this->load->view('module/seo_block.tpl', $data)); } protected function validate() { if (!$this->user->hasPermission('modify', 'module/seo_block')) { $this->error['warning'] = $this->language->get('error_permission'); } return !$this->error; }} Подскажите - что я не сделал, почему модуль не виден в макетах? уже видел стандартные модули просмотрел - не понял в чем загвоздка. OpenCart 2.0.3.1 Заранее спасибо!
а я вообще не вижу чтобы у вас файл языка, лежал бы в папке module. Потому его даже в общем списке не видно.. не понятно как вы его вообще активировали..
Он там лежит, это я ошибся, когда копировал Прошу прощения! Переложил файл, на сервере он лежит в module.
Посмотрите другие модули например аккаунт, там есть настройка вкл и выкл. Пока модуль не будет включен и не сохранятся в базе настройки, то вы его в макетах не увидите.
Вы имеете ввиду контроллер? Просмотрел - все равно не понял. Если не сложно - натыкайте носом. Буду безмерно благодарен!
да вы прямо зайдите в любой модуль и увидите там переключатель, включено и выключено. Сами не справитесь если, подправлю в будни..
Вот код из контроллера account PHP: if (isset($this->request->post['account_status'])) { $data['account_status'] = $this->request->post['account_status']; } else { $data['account_status'] = $this->config->get('account_status'); } Если я правильно понимаю - вы про это говорите. Но тут он только читается из конфига. А вот где он устанавливается - вот хоть убейте - не могу понять. Подправлять не надо, надо носом ткнуть
тут все записывается PHP: if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $this->model_setting_setting->editSetting('account', $this->request->post);
Это я уже тоже понял ... делаю: var_dump в этот момент: array(2) { ["name"]=> string(12) "SEO Блок" ["status"]=> string(1) "1" } PHP: if (($this->request->server['REQUEST_METHOD'] == 'POST') && ($this->validate())) { $this->model_setting_setting->editSetting('seo_block', $this->request->post); //var_dump($this->request->post); } но у меня в ответе PHP: $data['status'] = $this->config->get('seo_block_status'); возвращается null
ответ был в строке PHP: if (!isset($this->request->get['module_id'])) { $this->model_extension_module->addModule('my_module', $this->request->post); } addModule отвечает за регистрацию модуля. Но вам, Vlad, все равно спасибо за помощь!
Конечно можно и как вы сделали, но если проанализируете, то так делают для модулей которые сохраняют свои копии настроек, такие как html, слайдшоу итд. Для модулей в единичном экземпляре применяют методы как у того же модуля account. Все настройки должны передаваться с префиксом модуля типа account_status для поля статуса. Посмотрите в шаблон модуля и увидите что везде для полей есть префикс у названий.
Здравствуйте. Столкнулся с такой же проблемой в опенкарт 4. Сутки пляски с бубнами. Каждая строчка кода была осознана и прописана в отдельной траншее мозга. Помолившись начал снова писать модуль (отстранившись от того, что было раньше). И сразу бинго (заглянул в файл openkart->admin->controller->extension->module.php). Я ж был уверен, что в таблице oc_module поле code придумано для красоты (чтобы записывать туда понятные мне символы). Но оказывается code это имя папки модуля.имя файла контроллера в admin. И никак иначе. Для раздумий: если на Озон в поиск вбить "Openсart" , то ничего не найдешь. И совсем другая картина, если вбить "wordpress". Может, не тем занимаемся?