Вопросы по CodeIgniter и HMVC

Прежде всего, приносим извинения за любое неудобство, вызванное этим сообщением, потому что я впервые публикую здесь вопрос, и мне нужно больше времени, чтобы привыкнуть к этому.

Q1. Я хочу создать 2 «главных контроллера» для FrontEnd и BackEnd следующим образом:

  • MY_Controller расширяет CI_Controller
  • FrontEnd расширяет MY_Controller, и все интерфейсные контроллеры расширяют FrontEnd.
  • BackEnd расширяет MY_Controller, и все внутренние контроллеры расширяют BackEnd.

Как лучше всего это сделать с помощью HMVC (MX)?

Спасибо @Wesley Murch за идею поместить 3 класса MY_Controller, Frontend, Backend в MY_Controller.php, но я думаю, что лучше поместить каждый класс в один файл php (чище). Или я ошибаюсь? Я думал создать такую ​​структуру:

  • ./core/MY_Controller.php (расширяет MX_Controller)
  • ./libraries/Backend.php (расширяет MY_Controller)
  • ./libraries/Frontend.php (расширяет MY_Controller)
  • Автоматическая загрузка Backend и Frontend в autoload.php
  • Все внешние контроллеры будут расширять Внешний интерфейс (например, class Blog extends Frontend).
  • Все серверные контроллеры будут расширять Backend (например, class Admin extends Backend).

Будет ли это работать без добавления еще одной строки кода в контроллеры бэкенда/интерфейса для include_once или require_once: ./libraries/Backend.php или < strong>./libraries/Backend.php?


Q2. Как реализовать несколько тем с помощью HMVC? Например, в MVC у нас может быть 2 темы, структурированные следующим образом:

  • ./application/views/theme1/view_files.php
  • ./application/views/theme2/view_files.php

Но в HMVC папки представлений находятся внутри отдельных папок, и если я хочу реализовать несколько тем, обычно мне приходится делать так:

  • ./application/modules/module1/views/theme1/view_files.php
  • ./application/modules/module1/views/theme2/view_files.php
  • ./application/modules/module2/views/theme1/view_files.php
  • ./application/modules/module2/views/theme2/view_files.php

Это не то, что я хочу, потому что я хочу поместить все файлы представлений темы только в одну папку, а позже, если я захочу создать новую тему, мне нужно будет дублировать только одну папку темы. Но мне интересно, как я могу это сделать, не нарушая модели HMVC (потому что, насколько мне известно, в модели HMVC Models, Views, Controllers должны быть в одной папке модуля - по крайней мере, с CI). Это конфликт, на котором я застрял.


person Michael Bui    schedule 22.07.2011    source источник


Ответы (1)


Просто откройте или создайте core/MY_Controller.php, создайте класс MY_Controller и настройте его на расширение MX_Controller, затем в том же файле создайте другие базовые контроллеры и настройте их на расширение MY_Controller. Вот пример, который вы можете скопировать/вставить, чтобы начать:

<?php defined('BASEPATH') OR exit('No direct script access.');

class MY_Controller extends MX_Controller {

    public function __construct()
    {
        // do some stuff here that affects all controllers
    }

}

class Frontend_Controller extends MY_Controller {

    public function __construct()
    {
        parent::__construct();
    }

}

class Backend_Controller extends MY_Controller {

    public function __construct()
    {
        parent::__construct();
        // Check admin login, etc.
    }

}

/* end file application/core/MY_Controller.php */

Что касается «несколько тем», не уверен, что вам нужно. Таблицы стилей? HTML-шаблоны? Вам нужно, чтобы пользователи переключали их или вы будете делать это вручную? Вам нужно обнаружить мобильные устройства и соответствующим образом изменить тему? Все вышеперечисленное? «Лучший» способ будет зависеть от вашей реализации.

Я думаю о создании двух расширений библиотеки из MY_Controller.php и их автоматической загрузке. Будет ли это работать?

Не знаю, зачем вам это нужно или нужно... просто не делайте этого. Вы должны расширять эти классы только другими контроллерами.

Что касается тем, я хочу иметь несколько тем для представлений, таких как: - /views/theme1/view_files.php - /views/theme2/view_files.php Насчет js/css/images я могу организовать сам. Сначала я исправлю тему, но позже я могу позволить пользователю выбирать. С MVC я могу поместить темы в подпапки /views/, как указано выше, но с HMVC мне нужно найти другой способ упорядочить их в темах, потому что папки просмотра разделены (я хочу, чтобы все файлы просмотра одной и той же темы были только в 1 папка)..

Поскольку это слишком широкий вопрос, чтобы его здесь решать, а вы, похоже, еще ничего не пробовали, я приведу вам минимум:

class MY_Controller extends MX_Controller {

    public function __construct()
    {
        // do some stuff here that affects all controllers
        $this->theme = 'theme1'; // matches your directory name in /views/themes/
    }

}

С вашего контроллера:

$this->load->view('themes/'.$this->theme.'/my_view_file');

При использовании HMVC файл всегда будет искаться в текущем модуле, а затем возвращаться к каталогам приложений по умолчанию, если он не существует. Если по какой-то причине вам нужно быть явным, вы можете указать путь с именем модуля (например, для перекрестной загрузки ресурсов между модулями). Пример:

// From "blog" module
$this->load->view('events/index');
// We just loaded `modules/events/views/index` from the blog module

В любом случае, это не полное решение, но, надеюсь, оно поможет вам начать работу с идеей. Есть миллионы способов сделать это, вот две библиотеки шаблонов, которые уже поддерживают темы:

person Wesley Murch    schedule 22.07.2011
comment
Я думаю о создании двух расширений библиотеки из MY_Controller.php и их автоматической загрузке. Будет ли это работать? Что касается тем, я хочу иметь несколько тем для представлений, таких как: - /views/theme1/view_files.php - /views/theme2/view_files.php О js/css /images, я могу организовать сам. Сначала я исправлю тему, но позже я могу позволить пользователю выбирать. С MVC я могу поместить темы во вложенные папки /views/, как указано выше, но с HMVC мне нужно найти другой способ упорядочить их в темах, потому что папки представлений разделены (я хочу, чтобы все файлы представлений такая же тема будет только в 1 папке).. - person Michael Bui; 22.07.2011
comment
Извините, я забыл упомянуть, что вместо того, чтобы создавать 2 класса в 1 файле, я хочу создать 2 библиотеки Backend и Frontend, расширяемые из MY_Controller, и автоматически загружать Backend и Frontend в файлах конфигурации. Затем в контроллерах я буду расширять как: class Blog extends Frontend - person Michael Bui; 22.07.2011
comment
О темах, потому что в модели HMVC папки представлений находятся в отдельных папках модуля, и поэтому я застрял в группировании их в 1 папку темы. По вашему мнению, theme1 находится внутри /application/views/ или в /application/modules/module1/views/? Если это внутри /application/views/, их модель HMVC будет нарушена, верно? Но если он внутри /application/modules/module1/views/, то как сгруппировать все файлы просмотра темы в 1 папку (тогда позже, если я захочу создать новую тему, мне просто нужно продублировать эта папка)? - person Michael Bui; 22.07.2011
comment
Это очень необычно. Что не так с (распространенным) методом, который я опубликовал? Кроме того, уточните вопрос, редактируя его, а не публикуя комментарии. Например, я могу удалить свой ответ, и никто не увидит ваши обновления. Кроме того, вы задаете здесь два очень несвязанных вопроса, было бы лучше сделать их двумя отдельными. - person Wesley Murch; 22.07.2011
comment
Извините, я нажал на стрелку вверх, но это не разрешено, потому что у меня всего 6 баллов. Я только что обновил свой пост по вашему совету. Большое спасибо за помощь мне. Я определенно считаю, что ваш ответ очень полезен для меня в разъяснении создания главных контроллеров Backend и Frontend. Единственное, на чем я застрял, — это организация файлов просмотра в одну папку темы, не нарушая концепции моделей HMVC (каждый треугольник MVC должен быть изолирован как небольшая система). - person Michael Bui; 22.07.2011
comment
Мой совет по темам: потратьте некоторое время на работу над этим, а когда застрянете - откройте новый вопрос здесь и дайте конкретные детали. Втискивать два несвязанных вопроса в один — плохая идея. - person Wesley Murch; 22.07.2011