Добавление страницы администратора в OpenCart версии 2

У меня проблема с добавлением страницы администратора в Opencart2, и ответы на почти идентичные вопросы на SO не помогают, поэтому я считаю, что проблема специфична для OC2.

После ответа на этот вопрос Я по-прежнему получаю сообщение об ошибке "Неустранимая ошибка: вызов неопределенного метода ControllerCustomHelloWorld::render() в C:\websites\weddingshoponline\shop\admin\controller\custom\helloworld.php в строке 13. Любая помощь будет высоко оценена, так как я хожу по кругу.

Спасибо.

PS Откат на предыдущую версию OC - неверный ответ, хоть и хороший.


person Gavin Simpson    schedule 24.10.2014    source источник
comment
В OC2 вы больше не звоните $this->render(). Проблема в том, что вы следовали учебнику/ответу, применимому для OC ‹ 2.0. Загляните в другие контроллеры в OC 2.0, чтобы узнать, как делается рендеринг страницы (в принципе его нет, вы только устанавливаете переменные для рендеринга — шаблон, содержимое позиций модуля, готово).   -  person shadyyx    schedule 24.10.2014
comment
Да, я сделал это, спасибо за ответ. Это вызвало новую проблему с необъявленными переменными $header и $footer, но я надеялся, что мне не придется заниматься этим, поскольку у меня все еще есть способ создать новый модуль в oc2.   -  person Gavin Simpson    schedule 24.10.2014
comment
Я не хотел писать это здесь, но почему бы и нет - ТАК не хватает хороших вопросов и хороших ответов... Проверьте мой ответ.   -  person shadyyx    schedule 24.10.2014
comment
Да, почему бы и нет? Ваш ответ правильный, и я завершил добавление простой страницы администратора. Ваш ответ в значительной степени правильный, поэтому я приму его как таковой и опубликую рабочие файлы в качестве образца через мес. Я просто отмахивался от комментария $headers/$footers.   -  person Gavin Simpson    schedule 24.10.2014


Ответы (2)


Различий между рендерингом страниц в OC ‹ 2.0 и OC 2.0 немного, но вы должны их знать.

1. $data

В OC ‹ 2.0 вы бы сделали это:

$this->data['text_button_save'] = $this->language->get('text_button_save');

а в OC 2.0 только $data, т.е.

$data['text_button_save'] = $this->language->get('text_button_save');

который передается методу $this->load->view() в качестве аргумента, например:

$this->response->setOutput($this->load->view('catalog/category_list.tpl', $data));

2. $this->render()

ушел. Теперь вместо этого вы звоните $this->load->view('catalog/category_list.tpl', $data).

3. $this->children

ушел. Теперь позиции дочерних модулей шаблона создаются как часть свойств шаблона, в то время как вам нужно вызывать их контроллеры вручную (ПОЧЕМУ?):

$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');

Я думал, на кой черт понадобились эти изменения. Что было улучшено? Они хотели, чтобы разработчики писали меньше кода? Теперь это больше следует принципам ООП, MVC, WTF (извините)? И получил ответ: НЕТ (или ничего на первое).

Нам все еще нужно загрузить переводы (я имею в виду, нам все еще нужно загрузить перевод каждой отдельной строки). И gettext существует уже более 8 лет...

Вместо короткого $this->response->setOutput($this->render()); теперь приходится вызывать гораздо более длинное (и непонятное) $this->response->setOutput($this->load->view('catalog/category_form.tpl', $data));. Почему мы не можем просто сделать это: $this->render('catalog/category_form.tpl', $data); ???

Лично я считаю, что OC 2.0 — это те же экскременты (с точки зрения разработчиков), что и раньше. Они просто изменили упаковку. Но, честно говоря, экскременты есть и побольше, вот почему я застрял на OpenCart :-)

person shadyyx    schedule 24.10.2014
comment
Это все еще лучше, чем начинать с нуля и писать свои собственные :) - person Gavin Simpson; 24.10.2014
comment
Я хотел, я начал, но у меня нет на это времени. Я предпочитаю проводить свободное время с женой, понимаете? :-) - person shadyyx; 24.10.2014

Разрабатывая ответ shadyyx на вопрос, при этом код, который у меня работает... Я не говорю, что он идеален, просто он работает.

админ\контроллер\обычай\helloworld.php

<?php
class ControllerCustomHelloWorld extends Controller
{
    private $error = array();
    public function index()
    {
        $this->load->model('setting/setting');
        $this->load->language('custom/helloworld');

        $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')
        );

        $data['heading_title'] = $this->language->get('heading_title');
        $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('custom/helloworld.tpl', $data));
    }
}
?>

админ\язык\английский\пользовательский\helloworld.php

<?php
// Heading
$_['heading_title'] = 'My First Admin Page...';
    // Text
    $_['text_module']         = 'Modules';
    $_['text_success']        = 'Success: You have modified module account!';
    $_['text_content_top']    = 'Content Top';
    $_['text_content_bottom'] = 'Content Bottom';
    $_['text_column_left']    = 'Column Left';
    $_['text_column_right']   = 'Column Right';
    // Entry
    $_['entry_layout']        = 'Layout:';
    $_['entry_position']      = 'Position:';
    $_['entry_status']        = 'Status:';
    $_['entry_sort_order']    = 'Sort Order:';
    // Error
    $_['error_permission']    = 'Warning: You do not have permission to modify module account!';
    ?>

админ\модель\обычай\helloworld.php

<?php
class ModelCustomHelloWorld extends Model
{
    public function HelloWorld()
    {
        $sql = "SELECT * FROM " . DB_PREFIX . "category_description"; 
        $implode = array();
        $query = $this->db->query($sql);
        return $query->rows;    
    }
}
?>

admin\view\template\custom\helloworld.php

<?php echo $header; ?><?php echo $column_left; ?>
<div id='content'>
<h1><?php echo $heading_title; ?></h1>
<?phpecho 'I can also create a custom admin page.!'<br/>; ?>
<?php print_r($my_results);?>
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
<?php } ?>
</div> 
<?php echo $footer; ?>
person Gavin Simpson    schedule 24.10.2014