Я использую следующую библиотеку шаблонов. То, что я пытаюсь сделать, – загрузить один или несколько верхних представлений внутри шаблона в виде массива, чтобы я мог легко загрузить их в шаблон с циклом 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», а затем остальную часть содержимого для «контента».
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;
Это то, что вы хотите:
// 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; }
То, что вы пытаетесь сделать, невозможно в этой библиотеке.
Полученная вами ошибка указывает, что классу CI Loader передаются недопустимые данные. Поэтому, взглянув на функцию загрузки библиотеки , ваш код не будет работать прямо здесь:
// 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, что недопустимо. Мне кажется, что ваши варианты – либо перестроить библиотеку, либо изменить свой подход.
Просто сделайте свой основной шаблон, и в нем есть что-то вроде этого:
$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.
Чтобы загрузить партикулы, все, что вам нужно сделать, это использовать:
$this->load->view('partial_location',$data);
внутри вашего основного вида. Поэтому, если у вас есть основной вид, называемый home_page.php, и вы хотите загрузить частичные элементы для верхних и нижних колонтитулов, вы можете просто использовать:
$this->load->view('header'); // Main page layout $this->load->view('footer');
Если вы хотите использовать пользовательские или разные данные внутри своих партикулов, просто определите их в своем контроллере:
$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!'