«Пользовательский контроль» с MVC PHP - PullRequest
0 голосов
/ 17 февраля 2011

Мне было интересно, как добиться функциональности asp.net, подобной пользовательскому контролю, с помощью PHP в среде MVC, в частности CodeIgniter.

Чтобы лучше объяснить, что я хочу, вот несколько советов:

  • Пользовательский элемент управления .net - это файл с aspx и кодом (c # / vb), который обеспечивает функциональность для каждой страницы, которая его реализует (например, корзина покупок). Он легко добавляется на главную страницу, которая является контейнером для всех остальных страниц сайта.

  • В структуре MVC страница загружается контроллером, который загружает представление. Я понимаю, что могу загружать представления внутри представлений, но как предоставить код контроллера для "межсайтовых представлений", не повторяя его для каждого основного контроллера?

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

Ответы [ 4 ]

1 голос
/ 17 февраля 2011

Если вы хотите избежать дублирования кода в каждом контроллере, просто расширьте класс CI_Controller и выполните все настройки в вашем новом классе Controller при создании экземпляра ... и все ваши обычные контроллеры наследуются от New_Controller.

0 голосов
/ 17 февраля 2011

Отвечая на мой собственный вопрос: я нашел что-то, что стоит проверить.он предоставляет несколько триад MVC: https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/wiki/Home

0 голосов
/ 17 февраля 2011

Я очень мало работал с мастер-страницами, в основном в Sharepoint, но если вы хотите, чтобы так называемая страница front.master говорила, а затем загружал все другие страницы в этом контексте, лучше всего было бы создать новую библиотеку в качестве обработчика представления и запрограммируйте его так, чтобы он загружал вторичное представление в мастере.

Простой класс, состоящий из:

class MasterViewTemplate
{
    public $master = "v1.php";
    private $data = array();

    public function __set($key,$value)
    {
        $this->data[$key] = $value;
    }

    public function __get($key)
    {
        return $this->data[$key];
    }

    public function setMaster($master)
    {
        $this->master = $master;
    }

    public function display($page)
    {
        //Load the master file
        //Load the inner $page file
        //Inject the page contents into the master
    }
}

Это то, что вы искали.

0 голосов
/ 17 февраля 2011

Как сказал Шон, если функциональность находится на уровне контроллера, вы должны расширить CI_Controller.Может быть, некоторые функции должны быть на уровне представления, поэтому представление загрузчика можно использовать, чтобы помочь вам сохранить глобальный макет каждой страницы и включить общие функции.это примерно так:

[view] layout.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
        <?php
            $this->load->view('meta', $data);
        ?>
</head>
    <body>
        <div id="wrapper">

            <?php
            $this->load->view('header', $data);
            ?>
            <div id="contents">

                <?php include ('menu_izq.php'); ?>

                <div id="page">
                    <?php $this->load->view($page, $data); ?>
                    <div class="clear"></div>
                </div> 
            </div>
            <div style="clear: both;"></div>
            <?php $this->load->view('footer');?>
        </div>
    </body>
</html> 

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

    $data['page'] = 'incidents'; // this is the real contents
    $stylesheets[] = '/scripts/jscalendar-1.0/skins/aqua/theme.css';
    $data['stylesheets'] = $stylesheets;
    $scripts[] = '/scripts/jscalendar-1.0/calendar.js';
    $scripts[] = 'https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js';
    $scripts[] = '/scripts/autoNumeric-1.4.1.js';
    $scripts[] = '/scripts/autoLoader.js';
    $data['scripts'] = $scripts;
    $this->load->view('container',$data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...