Designer Design - multi subview - попытка добавить один мастер
Приветствую, я не совсем уверен, как реализовать свое видение в моем проекте.
Запуск, просто сосредоточьтесь на контроллере заказа.
Итак, мой заказ состоит из многих подзаголовков. Например, детали, история, адрес, прикрепленные файлы, заметки и т.д. Я помещаю их в интерфейс вкладки jQuery.
Покажите некоторый код.
layout.php
<div class="page-content">
<div class="row">
<div class="col-md-12">
<ul class="nav nav-tabs responsive hidden-xs hidden-sm">
<li class="<?php echo ($activeTabSub === "1") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Master details</a>
</li>
<li class="<?php echo ($activeTabSub === "2") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">History</a>
</li>
<li class="<?php echo ($activeTabSub === "wyk") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Address</a>
</li>
<li class="<?php echo ($activeTabSub === "3") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Files</a>
</li>
<li class="<?php echo ($activeTabSub === "4") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Notes</a>
</li>
<li class="<?php echo ($activeTabSub === "7") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a>
</li>
<li class="<?php echo ($activeTabSub === "8") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a>
</li>
<li class="<?php echo ($activeTabSub === "9") ? "active" : ""; ?>"><a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a>
</li>
</ul>
</div>
</div>
<?PHP $this->load->view($widget,$activeTabSub); ?>
<?PHP $this->load->view($main_content,$activeTabSub); ?>
</div>
В моем примере представление $widget представляет собой подвид, который является виджетами с инструментами, такими как различные кнопки редактирования/добавления для каждого отдельного активного TabSub. $Main_content - это представление html для каждого человека.
И теперь для контроллера [Order]
public function functiontolink1()
{
$data['main_content'] = 'x/y';
$data['widget'] = 'x/widget';
$data['heading'] = "";
$data['activeTab'] = 'pzlec';
$data['activeTabSub'] = '2';
$data['strona'] = 'text';
$data['dzial'] = 'text';
$seg= $this->uri->segment(3);
$data['zgl'] = $seg;
if(isset($seg)){
$data['pracownicy'] = $this->Zlecenia_model->pracownicy($zgloszenie);
switch($this->userGroup){
case 1 :
$data['main_content'] = 'x/y';
break;
case 2 :
$data['main_content'] = 'x/y';
break;
case 3 :
$data['widget'] = 'Client/x/widget';
$data['main_content'] = 'Client/x/y';
break;
default: show_404(); break;
}
$this->load->view('Client/x/layout',$data);
}else{
show_404();
}
}
public function functiontolink2()
{
$data['widget'] = 'x/widget';
$data['heading'] = "";
$data['activeTab'] = 'pzlec';
$data['activeTabSub'] = '2';
$data['strona'] = 'text';
$data['dzial'] = 'text';
$seg= $this->uri->segment(3);
if(isset($seg)){
$data['zgl'] = $seg;
$data['json'] = $this->Zlecenia_model->getSingle($zgloszenie);
$vvv= json_decode($data['json']);
$data['client'] = $this->Order_model->getclient($vvv[0]->klient);
switch($this->userGroup){
case 1 :
$data['main_content'] = 'x/y';
break;
case 2 :
$data['main_content'] = 'x/y';
break;
case 3 :
$data['widget'] = 'Client/x/widget';
$data['main_content'] = 'Client/x/y';
break;
default: show_404(); break;
}
$this->load->view('Client/x/layout',$data);
$this->load->view('zgloszenie/layout',$data);
}else{
show_404();
}
}
Как вы можете себе представить, у меня есть 9 из этих функций просмотра для каждой ссылки. Проблема начинается, когда я хотел бы иметь некоторые данные. i.e данные клиента по всем этим 9 subviews - вызывается только один раз, не на каждой странице [вкладка]. Я не совсем уверен, хорош ли мой проект. У вас есть предложения?
Ответы
Ответ 1
если ваша вкладка меню работает, вы можете буферизировать все ваши представления в один.
Я предполагаю, что вы используете bootstrap из своего образца кода.
Вот как они предлагают вам написать свою разметку для вкладок. http://getbootstrap.com/javascript/#tabs-examples Для их работы может потребоваться некоторая конфигурация javascript, поэтому вам нужно будет внимательно прочитать документы. Я сам не сам ботстрап, поэтому я могу немного помочь с этим.
<ul class="nav nav-tabs" role='tablist'>
<li role="presentation" class='active'>
<a href='#widget1' data-toggle="tab">widget1</a>
</li>
<li role="presentation">
<a href='#widget2' data-toggle="tab">widget2</a>
</li>
</ul>
<section class='tab-content'>
<div class='tab-pane active' id='widget1'>
<?php $this->load->view($widget1); ?>
</div>
<div class='tab-pane' id='widget2'>
<?php $this->load->view($widget2); ?>
</div>
</section>
Чтобы создать главный шаблон для обертывания всех ваших представлений, вам нужно расширить класс CI_Controller и просто установить свойство, называемое шаблоном, которое укажет на ваш шаблон
class MY_Controller extends CI_Controller
{
public $template;
public function __construct(){
parent::__construct();
// set the template in the constructor
// as this is where you should assign variables
// If you had an admin controller, you would create an admin controller
// extending this one, and override the $template variable.
$this->template = 'template/index' // views/template/index.php
}
}
вид/шаблон/index.php
Это ваш основной вид, который мы создали, расширив CI_Controller
<html>
<head></head>
<body>
<?php
// load "view" variable ANY controller sends us
$this->load->view($view);
?>
</body>
</html>
class Controller extends MY_Controller //extending the MY_Controller
{
public function index()
{
$data = array('username'=>'stackoverflow');
return $this->load->view($this->template, array(
'view' => 'your_main_view_with_tab_menu',
// the next two views are buffered as a string
// so you can easily inject them into your main tab menu view
// by setting the third paramter as true
'widget1' => $this->load->view('widget1_view', array('data' => $data), true),
'widget2' => $this->load->view('widget2_view', array('data' => $data), true)
));
}
}
Ответ 2
ok - предисловие к этому, оговорившись, что стиль кодирования является личным, и некоторые люди не согласятся вообще с тем, что я собираюсь предложить.
мое впечатление о том, что вы делаете, - это то, что вы пытаетесь сделать все как в контроллере, так и в представлении. прямо здесь этот код в вашем контроллере
$data['main_content'] = 'x/y';
$data['widget'] = 'x/widget';
$data['heading'] = "";
$data['activeTab'] = 'pzlec';
$data['activeTabSub'] = '2';
$data['strona'] = 'text';
$data['dzial'] = 'text';
Это слишком специфично. контроллер должен быть боссом высокого уровня, - что вы не беспокоитесь о деталях низкого уровня. "Получите мне это из базы данных - она вернулась? Если да, тогда сделайте это, если вы этого не сделаете".
введите другой путь - детали низкого уровня будут постоянно меняться. вы должны планировать эти изменения. и вы не хотите постоянно менять контроллеры, потому что любая ошибка приведет к снижению вашего приложения.
так что для каких моделей. снова люди будут спорить с этим и сказать, что это не должно быть Библиотеки или Помощники или что-то еще. дело в том, что вы хотите изолировать эти детали низкого уровня, и вы хотите поместить их в место, где это имеет смысл. так что через шесть месяцев вы можете посмотреть имена файлов и иметь приличную идею, когда вам нужно идти, чтобы делать обновления. его лучше иметь 10 моделей с конкретными именами и конкретными задачами, а затем несколько супермоделей, которые пытаются сделать слишком много.
и говоря о попытке сделать слишком много - реорганизовать эти методы контроллера, чтобы они не пытались делать так много разных вещей. например, почему вы будете собирать кучу данных, если вы собираетесь показать 404, потому что $seg не существует? проверка правильности $seg должна быть первой задачей. если он действителен, переходите к следующему методу. и если он недействителен, то не показывать 404 - показать вежливую страницу, которая является специфической для ошибки. то, когда это произойдет, у вас есть шанс выяснить, в чем проблема.
Наконец, я бы предложил - сделайте ваш шаблон макета полностью нейтральным - другими словами, нет html-кода. он просто вызывает другие взгляды. снова, что это делает? он подталкивает детали низкого уровня, такие как html и код компоновки CSS, к их собственным файлам. шаблон макета просто вызывает представления макета. поэтому, когда вам нужно внести изменения, его ясность, куда идти, и если вы сделаете ошибку, вы не внезапно принесете свой шаблон - вы ограничили его файлом вида, с которым будет гораздо легче справиться.