2013-02-17 3 views
0

Я провел очень много исследований по этой теме, но я не могу найти, как я могу это сделать. Я пытаюсь добавить данные в параметр $data в представлении, которое вызывается из контроллера другого вида. Однако любые данные, которые я добавляю к subview через subcontroller, не могут быть получены с помощью subview. Однако, когда я пытаюсь передать данные в subview через клиентский вид, он работает отлично. Большинство исправлений на SO, кажется, ссылаться только называя $key in $data['key'] вместо $ данные так, что, кажется, не очень актуальны здесь ...codeigniter передает данные в вложенное представление

У меня есть два класса:

  • welcome.php - страницы
  • welcomemenu.php - набор элементов управления, предназначенное для быть загружен в welcome.php

Вот мой клиент Controller (страница, на которую он включен, welcome.php), который хранит возвращаемые Вэла из подвида $welcomemenu в своем массиве $ данных ...:

<?php 

class Welcome extends CI_Controller { 

    function __construct() { 
     parent::__construct();  
    } 

    function index() { 
     //echo 'this is the Welcome index function'; 
     $data['clienttestdata'] = 'data from welcome.php!'; 
     $data['welcomemenu'] = $this->load->view('welcome/welcomemenu', $data, true); 

     $this->load->helper('url'); 
     $this->load->view('templates/header'); 
     $this->load->view('pages/welcome', $data); 
     $this->load->view('templates/footer'); 

    } 
} 

А вот мнение клиента ("welcome_view.php" - кажется достаточно простым. $ Welcomemenu вар где я положил возвращения из моего класса компонента ...):

<section id="allWelcomeContent" class="mainBody"> 
     <header id="mainPageHdr" class=mainPageHdr> 
      <!-- other stuff from my header --> 
     </header> 
     <!-- this is where i want to put the welcome menu... --> 
     <section id="mainWelcomeContent" class="mainContent"> 
      <div> 
       <?php echo $welcomemenu;?> 
      </div> 
     </section> 
    </section> 

А вот контроллер для моего субкомпоненту welcomemenu.php:

<?php 

class Welcomemenu extends CI_Controller { 

    public function __construct() { 
     parent::__construct(); 
    } 

    public function index() { 
     $data['menu_items'] = array('About', 'Portfolio', 'Resume', 'Fun', 'Blog'); 
     $data['testdata'] = 'data from welcomemenu.php!'; 

     $this->load->view('welcome/welcomemenu', $data); 
    } 
} 

И наконец: Вот подпункт, который должен получать данные от своего собственного контроллера, но не может, хотя он может принимать данные от вызывающего клиента (т. е. $ clienttestdata отображается отлично, но нет данных testdata)!

<section> 
<!-- TODO: make this element repeatable so content can load from controller and/or model. --> 
<div id="divMenuItems"> 
    <?php echo $clienttestdata;?> 
    <?php echo $testdata;?> 
</div> 
</section> 

По-прежнему я не нашел подходящего решения. если кто-нибудь тогда, пожалуйста, дайте мне

ответ

1

Когда вы включаете частицу welcomemenu в свой метод Welcome/index, вы должны помнить, что представление не проходит через собственный контроллер. Вместо этого его содержимое возвращается в виде строки и сохраняется как параметр. Он получает все свои собственные параметры через те, которые вы посылаете к нему через $data:

$data['welcomemenu'] = $this->load->view('welcome/welcomemenu', $data, true); 

Эта точка зрения не будет, таким образом, иметь доступ ко всему $data до сих пор - ничего лишнего добавляется через контроллер Welcomemenu. Так, в приведенном выше случае, она будет иметь:

array 
(
    'clienttestdata' => 'data from welcome.php!' 
) 

Если добавить параметры, необходимые для $data (как $data['testdata']), ваш суб-представление будет иметь то, что ему нужно.

+0

ОК спасибо; Я думаю, что следую этой логике. Однако, это лучшая практика (т. Е. Чтобы данные субконтроллера контролировались клиентским контроллером)? Должен ли я рассматривать рефакторинг так, чтобы субконтроллер мог фактически помещать данные в подзаголовок, или я должен следовать моему текущему курсу развития? – lewiSnort

+0

То, как вы сейчас это делаете, прекрасно - потому что вы включаете его в класс 'Welcome', а не какой-либо другой. Все, что вам нужно запомнить, - это передать ему то, что вам нужно, через '$ data' или, возможно, еще один параметр под названием' $ sub_data' для ясности. – hohner

+0

ОК спасибо.Я думаю, что моя проблема в том, что я путаю функцию index() классов CI/php с конструктором этого класса. – lewiSnort

Смежные вопросы