CodeIgniter: MVC и виджеты? - PullRequest
       0

CodeIgniter: MVC и виджеты?

3 голосов
/ 06 августа 2011

Я новичок в codeigniter и создании веб-приложений с использованием MVC. Я пытаюсь обдумать, как реализовать модульные виджеты в моем приложении. Мой вопрос более теоретический на данный момент. У меня нет фактического кода, чтобы показать.

Что я хочу знать, так это то, как бы я создал виджет, управляемый данными, таким образом, чтобы я мог просто перетащить его на любую страницу, которую я хочу. Например, допустим, у меня есть виджет с именем Widget. Я создал файл модели с именем /models/widget_model.php. Затем у меня есть файл контроллера с именем /controllers/widget.php. Очевидно, мой контроллер будет использовать эту модель для получения необходимых данных из моей базы данных. Чего я не понимаю, так это как использовать этот виджет в виде нескольких представлений. Пока я вижу и понимаю, как использовать контроллер для управления конкретным представлением. Так что это в основном, как один контроллер используется на странице. Каков будет процесс использования этого виджета модульным способом?

Ответы [ 3 ]

5 голосов
/ 06 августа 2011

То, что вы ищете, это HMVC. Вы можете использовать две общие библиотеки / пакеты: Модульный CI или HMVC . При этом вы можете поместить что-то вроде <?php echo Modules::run('module/controller/method', $param, $...); ?> в качестве виджета в ваши файлы просмотра.

1 голос
/ 08 декабря 2012

Вы можете сделать это с помощью драйверов.Отправьте контроллер как ссылку на объект драйверу для использования класса представления.Затем вы просто загружаете драйверы и используете их в качестве плагинов.

Редактировать: Вот код, который я использую в своем приложении:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * CodeIgniter base widget driver
 * 
 * @author Alex
 * @version 1.0.0
 */
class Basedriver {

    /**
     * Current specified controller.
     * @var CI_Controller
     */
    public $controller;

    /**
     * Contents of the driver which should be outputted or returned.
     * @var string
     */
    protected $contents;

    /**
     * Loader Class
     * @var CI_Loader
     */
    protected $load;

    /**
     * Constructor function for Basedriver class
     */
    public function __construct()
    {
        $this->controller =& get_instance(); 
        $this->load = $this->controller->load;
    }

    /**
     * Renders driver data into specified output. If $echo_contents is true,
     * output is echoed to the client, otherwise it is returned.
     * @param boolean $echo_contents Specifies whether the content should be outputted or returned as string
     * @param mixed $params Array of parameters which should be sent to the driver
     * @return string Returned driver data if $echo_contents is set
     */
    public function render($params = NULL, $echo_contents = true)
    {
        $this->parse_params($params);
        $this->run();

        if ($echo_contents)
            echo $this->contents;
        else
            return $this->contents;

        return NULL;
    }

    /**
     * Default run function for all drivers, should be overidden by extending classes.
     */
    protected function run()
    {
        $this->contents = NULL;
    }

    /**
     * Parses parameters and sets them as variables.
     * Default variables need to be defined in extending class
     */
    protected function parse_params($params)
    {
        if ($params === NULL) return;
        foreach($params as $variable => $value)
        {
            if (isset($this->$variable))
                $this->$variable = $value;
        }
    }

}

/* End of file Basedriver.php */
/* Location: ./application/libraries/Basedriver.php */

Здесь есть класс загрузки, позволяющий использовать класс представления иКонтроллер позволяет вам использовать функции базы данных и предоставлять вам другой доступ, если вам это нужно.Этот класс должен быть загружен до того, как все остальные драйверы (виджеты) и все драйверы (виджеты) должны расширить этот класс.Вы можете сделать это, добавив 'basedriver' в массив $ config ['library'] в application / config / autoload.php.

Пример виджета драйвера:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    class Example extends Basedriver
    {
       protected $parameter1 = 'defaultvalueparam1';
       protected $parameter2 = 'defaultvalueparam2';

       protected function run()
       {
          // Widget logic here...
          // you can use $this->load->view and $this->controller->db here
          $this->contents = 'final_processed_data_here';
       }
    }

    /* End of file Example.php */
    /* Location: ./application/libraries/Example/Example.php */

Использование драйверакоторый расширяет Basedriver как виджет, например:

$this->load->driver('example');
$this->example->render(array('parameter1' => '1', 'parameter2' => '2'));
0 голосов
/ 06 августа 2011

Я думаю, вы могли бы просто использовать систему просмотра CI.Вы создаете представление для каждого виджета, затем вставляете любую переменную из своей модели и, наконец, отображаете полученный HTML-код где угодно.Я не могу думать о какой-либо конкретной трудности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...