CodeIgniter, включая код из одного представления в другое? - PullRequest
2 голосов
/ 17 июля 2011

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

$this->load->view('header.php', $headerstuff);
$this->load->view($contentView);
$this->load->view('footer.php', $footerstuff);

Проблема в том, что мне нужнопоместить некоторый JavaScript (который является определенным для каждого представления контента) в заголовок.Я делал это с помощью оператора switch, содержащего js внутри библиотеки шаблонов.Но это не имеет смысла в модели mvc.

Пример (из того, что я делал), (в библиотеке шаблонов, выше предыдущего кода):

$headerstuff['js'] = '';
switch ($contentView)
{
    case 'main':
        $headerstuff['js'] = 'JAVASCRIPT INCLUDE CODE 1';
        break;
    case 'product':
        $headerstuff['js'] = 'JAVASCRIPT INCLUDE CODE 2';
        break;
}

Я не могухотя придумайте другой способ сделать это.Я хотел бы (в идеале) сохранить js в переменной внутри файла представления содержимого и (каким-то образом) загрузить это в представление заголовка.Честно говоря, я даже не думаю, что это возможно.

Есть ли у кого-нибудь лучший способ сделать это, чем мое текущее решение?

Спасибо,
Макс

Ответы [ 2 ]

1 голос
/ 17 июля 2011

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

Помощник по активам:

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

if ( ! function_exists('css'))
{
    function css($array) {
        // If the object passed is a string, convert it into an array
        if ( is_string($array) ) {
            $array = explode(" ", $array);
        }

        // Add additional CSS Files
        if ( isset($array) ) {
            foreach ( $array as $i => $file ) {
                // If it's not the first one add a tab character.
                if ( $i > 0 ) echo "\t";
                echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"". $file ."\">\n";
            }
        }
    }
}

if ( ! function_exists('js'))
{
    function js($array) {
        // If the object passed is a string, convert it into an array
        if ( is_string($array) ) {
            $array = explode(" ", $array);
        }

        // Add additional JavaScript Files
        if ( isset($array) ) {
            foreach ( $array as $i => $file ) {
                // If it's not the first one add a tab character.
                if ( $i > 0 ) echo "\t";
                echo "<script src=\"". $file ."\"></script>\n";
            }
        }
    }
}

Это делает одну из двух вещей.Я позволю вам добавлять файлы в файл контроллера, что приятно.Я делаю это, создавая объект данных:

$data['css'] = array('/path/to/styles.css', '/path/to/otherstuff.css');
$data['js'] = array('/path/to/javascript.js');

Затем в вашем заголовке сделайте следующее:

<?
    $defaultCSS = array("/assets/css/global.css");
    $css = (isset($css)) ? array_merge($defaultCSS, $css) : $defaultCSS;        
    css($css);

    $defaultJS = array("/assets/js/global.js");
    $js = (isset($js)) ? array_merge($defaultJS, $js) : $defaultJS;
    js($js);
?>

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

Надеюсь, это поможет.

0 голосов
/ 17 июля 2011

Как насчет наличия контроллера скриптов, который действует как маленький прокси:

/**
 * A basic controller which allows for the display of basic views.
 */
class Scripts extends CI_Controller
{

    public function _remap( $meth, array $params )
    {
        // ensure that parent directory contents can't be revealed.
        if( !$meth || strpos( $meth, '.' ) !== FALSE ) show_404();
        foreach( $params as $arg )
            // I put all css in a folder called css all js goes into 
            // a folder called js. It can be overly simple, but it works

            // (if you need these files to be php files, just add '.php'
            // to the end of the FILE's name. No need to worry about that
            // here, CodeIgniter's got your back...)
            $this->load->view( "$meth/${params}.$meth" ); 
    }
}

Как использовать:

Для каждого контроллера (или, вы можете легко изменить это для каждого метода), поместите соответствующий js-файл в папку views / js. Назовите каждый после соответствующего контроллера. Затем укажите на каждый из них с точки зрения:

Затем в заголовке:

<script type="text/javascript" src="
<?php 

// honestly, I normally use a helper function here, but this is the 
// short... short version.
echo base_url() . '/scripts/js/' . load_class('Router')->fetch_class();
// You can also replace the controller name with the view name by using the
// variable $_ci_view, you can get the full path with $_ci_path

?>" ></script>

Лучшая часть? Ваш контроллер не зависит от содержимого представления. Представление является более или менее независимым от контроллера (это переменная, заранее заполненная из внешнего источника и просто ... там). Фактически, единственное, что «нужно знать» - это файлы JS / CSS, и они все равно находились на индивидуальной конфигурации.

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