Библиотека шаблонов CodeIgniter с 2D-массивом - PullRequest
2 голосов
/ 14 февраля 2012

Я использую следующий шаблон библиотека .Я пытаюсь загрузить один или несколько верхних представлений внутри шаблона в виде массива, чтобы я мог легко загрузить их в шаблон с помощью цикла for-each.

Это простой примеркак это можно использовать на контроллере:

    function index() {

    $data['title']  = 'My page title';

    $partials = array('content'=>'c_location'); //Load view about inside the template.

    $this->template->load('main', $partials, $data);
    }

В представлении у вас есть html вроде:

    <html>
    ....
    <?=$content?>
    ...
    </html?>

Это то, что я пытаюсь использовать: Контроллер:

   $partials = array('content'=>'c_location',
       array(
       'first_upper_content'=>'1_u_location','second_upper_content'=>'2_u_location'
       ) 
   );

Так, например, я мог бы передать для upper_content, верхний заголовок как «first_upper_content» и слайд для «second_upper_content», а затем остаток содержимого для «content».

Html:

    ...
     <?=$upper_content?> 

     <--if upper_content is a array, 
     I could display each content with a for loop-->

     <?=$content?>

Когда я пробую все, что я получаю:

Сообщение: pathinfo () ожидает, что параметром 1 будет строка, данный массив

Имя файла: core/Loader.php

Номер строки: 759

Как я могу это реализовать?Я имею в виду изменение

// Загрузка представлений в массив var

Внутри Template.php и добавление цикла foreach в html;

Ответы [ 4 ]

3 голосов
/ 14 марта 2012

Это то, что вы хотите:

    // Load views into var array
    foreach(array_flat($view) as $key => $file)

Включите вызов функции " array_flat " в Template.php, как показано выше.

Вам нужно будет определить эту функцию. Вы можете сделать это в любом автоматически загруженном помощнике или даже включить его в собственный класс Template (в этом случае вы должны назвать его как $this->array_flat в приведенном выше коде). Вот оно:

function array_flat($array)
{
    $result = array();

    foreach ($array as $key => $value)
    {
        if (is_array($value))
        {
            $result = array_merge($result, array_flat($value));
        }
        else
        {
            $result[$key] = $value;
        }
    }

    return $result;
}
3 голосов
/ 10 марта 2012

То, что вы пытаетесь сделать, невозможно с этой библиотекой.

Полученная ошибка указывает, что классу загрузчика CI передаются недопустимые данные.Итак, взглянув на функцию загрузки library , ваш код потерпит неудачу прямо здесь:

    // Load views into var array
    foreach($view as $key => $file)
    {
        $tpl[$key] = $this->CI->load->view($file, $vars, TRUE);
    }

Библиотека передает ваш вложенный массив в $partials непосредственно в CI Loader.С вашими данными эта строка работает так:

$tpl[0] = $this->CI->load->view(array(
       'first_upper_content'=>'1_u_location','second_upper_content'=>'2_u_location'
       ), vars, TRUE);

В руководстве пользователя CI это недопустимо.Мне кажется, что вы можете либо пересмотреть библиотеку, либо изменить свой подход.

2 голосов
/ 07 марта 2012

Просто создайте свой основной шаблон и добавьте в него что-то вроде этого:

$this->load->view('header');
if (is_array($page) {
    foreach($page as $key=>$val){
        $this->load->view($key, $val); // $val being optional parameters
    }
} else {
    $this->load->view($page);
} 
$this->load->view('footer');

В контроллере, $data['page'] будет содержать информацию о представлении, либо его имя (строка), либо массив имен для вызова по порядку. Конечно, у вас должны быть готовые представления с этими именами.

Это было из головы, но оно должно делать то, что ты хотел. Это делается без библиотек шаблонов, просто CI.

0 голосов
/ 07 марта 2012

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

$this->load->view('partial_location',$data);

внутри вашего основного вида.Поэтому, если у вас есть главное представление с именем home_page.php и вы хотите загрузить партиалы для верхних и нижних колонтитулов, вы можете просто использовать:

$this->load->view('header');

// Main page layout

$this->load->view('footer');

Если вы хотите использовать custom или различные данные внутри ваших партиалов, просто определите их в вашем контроллере:

$data = array(
   'content'        => 'about',
   'header_content' => 'Welcome to the site!',
   'footer_content' => 'Made by me!'
);

И в файле основного вида:

$this->load->view('header',$header_content);
// would echo 'Welcome to the site!'

echo $content;
// would echo 'about'

$this->load->view('footer',$footer_content);
// would echo 'Made by me!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...