2013-04-25 3 views
-1

Я ищу решение для загрузки заголовка/нижнего колонтитула/навигации только на начальном просмотре страницы.Переменная загрузки начальной страницы CodeIgniter?

Причина этого заключается в том, что моя панель навигации использует Ajax для визуализации содержимого целевой ссылки в основном содержимом div вместо фактической загрузки самой страницы.

Однако мне нужно что-то сказать по строкам, если его начальный вид, загрузить заголовок, навигация, а затем фактическую страницу, затем нижний колонтитул. Но если его исходный вид и страница не загружаются в область содержимого, поэтому, например, ссылка на навигацию или форма отправки, она не загружает заголовок, навигацию и нижний колонтитул, а только фактическую страницу.

Так, например, у меня есть эти 4 просмотры:

header_view navigation_view page_a_view footer_view

И этот контроллер:

controller_a

навигации содержит ссылку, которая «Page A 'и указывает на http://myurl.com/controller_a. Если эта ссылка нажата, мне нужно только, чтобы controller_a загружал представление page_a_view, потому что ссылка на навигацию будет загружать данные этой страницы в div.

Однако, если я перехожу непосредственно к http://myurl.com/controller_a, он также должен отображать заголовок/навигацию/нижний колонтитул.

Решение, которое я думал, что я на правильном пути с что-то вроде базового контроллера с функцией load_page(), который будет что-то вроде:

function load_page($page, $data) { 

    if($this->uri->segment($this->uri->total_segments()) == "initial_page_load") { 
     $this->load->view('header_view'); 
     $this->load->view('navigation_view'); 
     $this->load->view($page, $data); 
     $this->load->view('footer_view'); 
    } else { 
     $this->load->view($page, $data); 
    } 

} 

Так что, если я должен был пойти в http://myurl.com/controller_a/initial_page_load это было загрузите заголовок/навигацию/нижний колонтитул, но если бы я пошел на http://myurl.com/controller_a, это не так.

Однако это не распространяется на все возможности.

Другой способ, которым я думал, это проверить, есть ли ссылочный URL-адрес, если есть, не загружать заголовок/навигацию/нижний колонтитул. Но опять же, это не охватывает такие вещи, как, если ссылка была передана внешним сайтом?

Есть ли у кого-нибудь предложения, как я могу достичь того, что мне нужно?

+0

Не совсем уверен в рассуждениях о нисходящем ... – Ryan

ответ

0

Хотя я все еще тестирую это, похоже, делает именно то, что я ожидаю до сих пор! Это одна из тех из них, которые просто, но делает полную работу, поэтому мы надеемся, никаких проблем не всплывал ...

В MY_Controller.php

function load_page($page, $data) { 
    if(!$this->input->is_ajax_request()) { 
     $this->load->view('header_view'); 
     $this->load->view('navigation_view'); 
    } 
    $this->load->view($page, $data); 
    if(!$this->input->is_ajax_request()) { 
     $this->load->view('footer_view'); 
    } 
} 

Успели наткнуться этой функции при поиске в документации ввода класса

1

Это будет ваша страница просмотра всех видов. Для ваших других страниц вы будете динамически изменять содержимое на div, 'page_content' динамически через ajax.

**application/views/your_template_view.php** 
<?php 
    $this->load->view('header_view'); 
    $this->load->view('navigation_view'); 
?> 
<a href="javascript:void(0)" id='home' class='my_links'>Home</a> 
<a href="javascript:void(0)" id='about_us' class='my_links'>About us</a> 

<!-- 
    Make sure the id of the page is same as 
    the file name of view page for respective pages 
--> 

<div id='page_content'><?php echo $page_content; ?></div> 

<?php 
    $this->load->view('footer_view'); 
?> 
<script lang='javascript'> 
    $('.my_links').click(function(){ 
     $.post(
      '<?php echo site_url('test_controller/get_page_content') ?>', 
      {'page_content':$(this).attr('id')}, 
       function(response){ 
        if(response != '') 
         $('#page_content').text(response); 
       },'json' 
     ); 
    }); 
</script> 

Пусть это будет ваш контроллер:

**application/controller/test_controller.php** 
function your_page($param1 = '', $param2 ='') { 
    /*this one is for your initial page*/ 
    if($param1) 
     // send mail 
    if($param2) 
     // send mail 
    $data['page_content'] = $this->load->view('initial_page_load'); 
    $this->load->view('your_template_view', $data); 
} 
function get_page_content() 
{ 
    /*this one is for other pages, this provides page content 
     for the request made from ajax*/ 
    $page_title = $this->input->post('page_title'); 
    $page_content = $this->load->view($page_title); 
    echo json_encode($page_content); 
} 
+0

Я понимаю, что вы имеете в виду, однако я не могу просто создать одну начальную страницу по таким причинам, как отправленное электронное письмо, которое включает ссылки, такие как http: //www.myurl.com/controller_a/method_1/param_a/param_b – Ryan

+0

Это можно сделать по первому методу, см. обновленный ответ. .. – hsuk

0

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

if (!$this->session->userdata('nav_loaded')) { 
    $this->load->view('header_view'); 
} 

и т.д. ...

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

EDIT

Если вы хотите смешать Аякс и не-Ajax вызовов после этого сеанса varable не будет работать, конечно. Возможно, вы могли бы добавить параметр ajax в свои URL-адреса и настроить контроллеры в соответствии с этим.

public function index($ajax = false) { 
... 
    if (!ajax) { 
     $this->load->view('header_view'); 
    } 
    etc... 
} 

Таким образом, все вызов AJAX будет иметь этот дополнительный параметр в URL значение ИСТИНА (почти ничего, кроме нуля: index/1, index/ajax и т.д.).

+0

Где бы вы предложили удалить сеанс? Как будто я сначала загрузил страницу, он создал сеанс, поэтому страница содержимого, к которой я обращаюсь по ссылке навигации, не загружает ссылку навигации. Если я затем перейду непосредственно на страницу содержания, сессия будет существовать, и я остался бы с страница без заголовка/навигации/нижнего колонтитула – Ryan

+0

Никогда не удаляйте ее - недостатком является то, что вам придется загружать страницы с помощью ajax ... Если вы хотите смешивать ajax и no-ajax, возможно, вы можете поместить параметр ajax в ваши URL-адреса и настроить контроллеры в соответствии с этим. – Shomz

+0

Это тот маршрут, который, как я думал, решит мою проблему, однако он должен иметь этот параметр в URL-адресе. Если у меня есть только последний параметр в URL-адресе, и я не указываю метод внутри контроллера, например myurl.com/controller1/ajax_true, тогда он ищет метод ajax_true. – Ryan

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