OpenCart后台新增Price Manager菜单页面显示异常求助
OpenCart后台菜单页面跳出框架显示空白的解决方法
问题描述
作为OpenCart新手,在后台管理面板添加了名为Price Manager的菜单后,点击菜单链接页面无法在后台框架内正常显示,呈现空白独立页面。怀疑控制器名称存在问题,相关代码如下:
菜单代码
// Price Manager $data['menus'][] = [ 'id' => 'menu-pricemanager', 'icon' => 'fas fa-home', 'name' => 'price_manager', 'href' => $this->url->link('catalog/price_manager', 'user_token=' . $this->session->data['user_token']), 'children' => [] ];
控制器代码(原)
文件路径:controller/catalog/price_manager.php
<?php namespace Opencart\Admin\Controller\Catalog; class PriceManager extends \Opencart\System\Engine\Controller { public function index() { $this->load->language('catalog/price_manager'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('catalog/product'); if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $discountPercentage = (float) $this->request->post['discount_percentage'] / 100; $products = $this->model_catalog_product->getProducts(); foreach ($products as $product) { $price = $product['price']; $newPrice = $price - ($price * $discountPercentage); // $this->model_catalog_product->editProduct($product['product_id'], [ // 'special' => $newPrice // Set special price as the discounted price // ]); } $this->session->data['success'] = $this->language->get('text_success'); $this->response->redirect($this->url->link('catalog/price_manager', 'user_token=' . $this->session->data['user_token'], true)); } $data['heading_title'] = $this->language->get('heading_title'); $data['text_discount_percentage'] = $this->language->get('text_discount_percentage'); $data['button_apply_discount'] = $this->language->get('button_apply_discount'); $data['breadcrumbs'] = array(); $data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true), 'separator' => false ); $data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('catalog/price_manager', 'user_token=' . $this->session->data['user_token'], true), 'separator' => ' :: ' ); $data['action'] = $this->url->link('catalog/price_manager', 'user_token=' . $this->session->data['user_token'], true); $data['cancel'] = $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true); $this->response->setOutput($this->load->view('catalog/price_manager', $data)); } protected function validate() { if (!$this->user->hasPermission('modify', 'catalog/price_manager')) { $this->error['warning'] = $this->language->get('error_permission'); } return !$this->error; } }
视图代码(原)
文件路径:view/template/catalog/price_manager.php
{{ header }} {{ column_left }} <div id="content"> <div class="page-header"> <div class="container-fluid"> <div class="pull-right"> <button type="submit" form="form-price-manager" class="btn btn-primary">{{ button_apply_discount }}</button> </div> <h1>{{ heading_title }}</h1> </div> </div> <div class="container-fluid"> <div class="panel panel-default"> <div class="panel-body"> <form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-price-manager" class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label">{{ text_discount_percentage }}</label> <div class="col-sm-10"> <input type="text" name="discount_percentage" value="" class="form-control" /> </div> </div> </form> </div> </div> </div> </div> {{ footer }}
问题分析与解决方案
1. 视图重复渲染后台框架
OpenCart后台通过AJAX将页面内容加载到主框架的#content区域,视图中不需要包含{{ header }}、{{ column_left }}、{{ footer }}这些全局框架代码,否则会导致页面跳出后台框架独立显示。
修改视图代码:只保留内容部分,移除全局框架标签
<div class="page-header"> <div class="container-fluid"> <div class="pull-right"> <button type="submit" form="form-price-manager" class="btn btn-primary">{{ button_apply_discount }}</button> </div> <h1>{{ heading_title }}</h1> </div> </div> <div class="container-fluid"> <div class="panel panel-default"> <div class="panel-body"> <form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-price-manager" class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label">{{ text_discount_percentage }}</label> <div class="col-sm-10"> <input type="text" name="discount_percentage" value="" class="form-control" /> </div> </div> </form> </div> </div> </div>
2. 控制器输出方式不符合后台规范
控制器需要正确调用后台布局来渲染页面,确保内容能被加载到后台框架中。修改控制器的输出代码:
修改控制器最后一行:
原代码:
$this->response->setOutput($this->load->view('catalog/price_manager', $data));
替换为:
$data['content'] = $this->load->view('catalog/price_manager', $data); $this->response->setOutput($this->load->view('common/layout', $data));
3. 补充缺失的语言文件
确保语言文件存在,否则页面文本会显示为空。创建language/zh-cn/catalog/price_manager.php文件,添加以下内容:
<?php // Heading $_['heading_title'] = '价格管理器'; // Text $_['text_discount_percentage'] = '折扣百分比'; $_['button_apply_discount'] = '应用折扣'; $_['text_success'] = '操作成功'; $_['error_permission'] = '您没有权限修改价格管理器!';
4. 验证权限设置
进入后台【系统】>【用户】>【用户组】,编辑对应的管理员组,确保勾选了catalog/price_manager的修改权限,否则会因权限不足导致页面异常。
完成以上修改后,刷新后台缓存,重新点击Price Manager菜单,页面即可正常显示在后台框架内。
内容的提问来源于stack exchange,提问作者Maria Jeysingh Anbu
相关产品推荐
相关产品推荐

