Сбросить переменные представления для вложенных представлений в codeigniter
Контроллер
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Main extends CI_Controller
{
public function index()
{
$this->load->model('Event');
$todays_events = $this->Event->get_todays_events();
$data = array(
'todays_events' => $todays_events
);
$this->load->view('main/index', $data);
}
}
?>
основной / индексный вид
<?php $this->load->view('partial/header'); ?>
<?php $this->load->view('components/calendar/mon_to_wed'); ?>
<?php $this->load->view('partial/footer'); ?>
Компоненты / календарь / mon_to_wed
(Имеет доступ к $todays_events, почему это так?)
<div id="calendar_today">
<h1>Whats Happening</h1>
<?php foreach($todays_events as $event) : ?>
<?php var_dump($event); ?>
<?php endforeach; ?>
</div>
2 ответа
Я прочитал файлы ядра CodeIgniter, хотя взлом ядра может решить эту проблему, существует другой метод, который помогает предотвратить определение переменных во внутренних представлениях.
Во-первых view
файл, сделайте эту инструкцию:
foreach ($_ci_vars as $key => $value) $_ci_vars[$key]=NULL;
$this->load->view('your-inner-view', $_ci_vars);
$this->load->view('your-second-inner-view', $_ci_vars);
$this->load->view('your-third-inner-view', $_ci_vars);
// and so on...
Я обновлю свой пост, если найду лучшее решение
ОБНОВИТЬ:
В заключение! Я нашел реальное решение, лучше сделать самостоятельно Loader
класс вместо использования по умолчанию. выполните инструкции ниже:
- копия
Loader.php
класс от/system/core/
на ваш/application/core/
- найти
$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
на линии № 805 - изменить / заменить эту строку на
$this->_ci_cached_vars = $_ci_vars;
CodeIgniter имеет кеширование переменной, как только вы используете load->view()
метод, переменные будут кэшироваться в массиве, а второе использование load->view()
вызвал слияние cached
переменные и new
переменные, если они существуют, и затем кэшировать результат в виде нового массива (который содержит старые переменные).
Итак, прекратите использование array_merge()
было бы решением;)
Данный ответ может работать для отдельных представлений, при сборке представления из нескольких вложенных представлений любые данные для общего представления удаляются вышеуказанным исправлением.
Что работает для меня, так это для явной установки этих элементов данных для подвид null
если они не нужны.
Например, подвид ожидает $a
, $b
а также $c
,
В первый раз, когда мы отрисовываем подэлемент, мы проходим $data['a'=>'whatever', 'b'=>'whatever', 'c'=>'whatever']
и представление отображается правильно.
Второй раз мы проходим $data['a'=>'whatever']
, $b и $c визуализируются во вспомогательном представлении с данными из первого вызова. Если вместо этого мы проходим $data['a'=>'whatever', 'b'=>null, 'c'=>null]
, b и c не визуализируются в подвиде.
Это, конечно, предполагает, что вы проверяете, являются ли данные нулевыми, прежде чем использовать их во вложенном представлении.