2012-05-04 6 views
1

(Исходные вопросы) Я использую скрипт jquery ui для управления конкретными активными ключевыми словами в моем webapp. Просмотр здесь: www.rickymason.net/letschat/main/home для справкиjquery ui «selectable» - нужно вызвать функцию codeigniter

У меня очень мало опыта работы с javascript, и я пытаюсь выяснить, как запустить функцию, которую я имею в своей основной модели.

Обновлено функция на основе ответов:

Я обновил свой код для поддержки нового формата JSON/AJAX. Это потребовало от меня создания активного/неактивного фильтра сеанса, чтобы пользователь мог нормально добавлять фильтры и всегда использовать AJAX для обновления списка потоков. Это только имело для меня больше смысла.

Вот код, который у меня есть в настоящее время, и он по-прежнему не работает. Я пытаюсь сделать это, когда пользователь нажимает на выбираемую категорию (через JQuery UI), divID, связанный с выбором, передается через AJAX и возвращает массив нитей, который обновляет div id = "board".

Вот мой текущий контроллер настройка:

public function home($page = 'home') 
    { 
     $data['user_id'] = $this->tank_auth->get_user_id(); 
     $data['username'] = $this->tank_auth->get_username(); 
     $data['threads'] = $this->thread_model->session_load(); 
     $data['title'] = ucfirst($page); // Capitalize the first letter 
     $data['page'] = $page; 
     $this->load->view('templates/head', $data); 
     $this->load->view('templates/nav', $data); 
     $this->load->view('main/newthread', $data); 
     $this->load->view('main/addfilter', $data); 
     $this->load->view('main/checkbox', $data); 
     $this->load->view('main/displayfilter',$data); 
     $this->load->view('main/board', $data); 
     $this->load->view('templates/footer'); 
    } 

    public function updatefilters($filters) 
    { 
     $filterarray = split("|", $filters); 
     $this->thread_model->create_session_filter($filterarray); 
     $threadarray = $this->thread_model->get_threads(); 
     $data['json'] = '{"content":' + $threadarray + '}'; 
     $this->load->view('json_view', $data); // See step 4!!! 
    } 

Вот мой текущий код модели:

public function get_threads() 
    { 
      $filter = $this->session->userdata('filter'); 
      $num_tags = count($filter); 
      if ($num_tags > 0 && $num_tags <= 8) { 
       $sql_select = "SELECT DISTINCT t.* "; 
       $sql_from = " FROM "; 
       $sql_where = " WHERE "; 
       $sql_joins = ""; 
       $sql_order = "ORDER BY t.timestamp DESC"; 
       for ($i=0;$i<$num_tags;++$i) { 
        if ($i==0) { 
        $sql_from .= " filter AS f "; 
        $sql_where .= " f.tag LIKE '%" . $filter[0] . "%'"; 
        $sql_joins .= " INNER JOIN filter_thread AS ft ON ft.filter_id = f.filter_id 
            INNER JOIN thread AS t ON ft.thread_id = t.thread_id"; 
        } 
        else { 
        $sql_where .= " OR f.tag LIKE '%" . $filter[$i] . "%'"; 
        } 
       } 
      } else { 
       break; 
      } 
      $sql = $sql_select . $sql_from . $sql_joins . $sql_where . $sql_order; 

      $query = $this->db->query($sql); 
      $thread = $query->result_array(); 
     return json_encode($thread); //I am aware this is not correct 
    } 

    public function create_session_filter($filterstring) 
    { 
     $filterarray[] = $filterstring; 
     $filter['filter'] = $filterarray; 
     if ($this->session->userdata('filter') == TRUE) { 
      $sessionfilter = $this->session->userdata('filter'); 
      $new = array_merge($sessionfilter, $filter['filter']); 
      $this->session->unset_userdata('filter'); 
      $filter['filter'] = $new; 
      $this->session->set_userdata($filter); 
     } else { 
      if (!$filterstring) {} else { 
      $this->session->set_userdata($filter); 
      } 
     } 
    } 

    public function create_session_inactive_filter($filterstring) 
    { 
     $filterarray[] = $filterstring; 
     $filter['inactivefilter'] = $filterarray; 
     if ($this->session->userdata('inactivefilter') == TRUE) { 
      $sessionfilter = $this->session->userdata('inactivefilter'); 
      $new = array_merge($sessionfilter, $filter['inactivefilter']); 
      $this->session->unset_userdata('inactivefilter'); 
      $filter['inactivefilter'] = $new; 
      $this->session->set_userdata($filter); 
     } else { 
      if (!$filterstring) {} else { 
      $this->session->set_userdata($filter); 
      } 
     } 
    } 

А вот мой текущий код вида:

приложение/главный/json_view .php

<?php 
header("Content-Type: application/json"); 
echo $json; 
?> 

ПРИМЕНЕНИЕ/главная/bdisplayfilter.php

<script> 
    $(function() { 
     $("#selectable").selectable({ 
      selected: updateFilters, 
      unselected: updateFilters 
     }); 
     function updateFilters(ev, ui){  
     alert ("hello"); 
     // get the selected filters 
     var $selected = $('#selectable').children('.ui-selected'); 
     // create a string that has each filter separated by a pipe ("|") 
     var filters = $selected.map(function(){return this.id;}).get().join("|"); 
     $.ajax({ 
      url: '/main/updateFilters', //see step 2 
      data: { filters: filters }, 
      success: function(data){ 
       // data is whatever json you decide to return from the server. 
       // An easy way to do things is have data look like this: 
       // { content: "<div>All my new threads that I want to show up</div>" } 
       // then, you can replace some element on the page with the new content 
       // For example, say your container has an id of threadContainer: 
       $('#select').replaceWith(data.content); 
      } 
     }); } 
    }); 
</script> 
<ol id="selectable"> 
    <li class="ui-state-default" id="everything">Everything!</li> 
    <li class="ui-state-default" id="entertainment">Entertainment</li> 
    <li class="ui-state-default" id="sci/tech">Sci/Tech</li> 
    <li class="ui-state-default" id="news">News</li> 
    <?php 

    if ($this->session->userdata('inactivefilter') == true) { 
      $inactivefilter = $this->session->userdata('inactivefilter'); 
      foreach ($inactivefilter as $new) 
       { 
        echo "<li class='ui-state-default' id='custom'>$new</li>"; 
       } 
     } 
    ?> 
</ol> 
<?php 
if ($this->session->userdata('inactivefilter') == true) { 
echo "<form action='".base_url()."main/clear_filter'><input type='submit' value=clear></form>"; 
} ?> 

ответ

3

EDIT: Я обновил URL-адрес и данные части вызова Ajax и добавил еще один шаг, чтобы включить параметры строки запроса.

1) Сделать AJAX называют

Вы хотите, чтобы один и тот же вызов для выбранных и невыделенные, так как вы можете иметь несколько фильтров и нужны вещи, чтобы соответствующим образом обновить на обоих мероприятиях. Итак, я определю общую функцию, которую могут вызвать оба события.

$(function() { 
    $("#selectable").selectable({ 
     selected: updateFilters, 
     unselected: updateFilters 
    }); 
    function updatefilters(ev, ui){ 
     // get the selected filters 
     var $selected = $('#selectable').children('.ui-selected'); 
     // create a string that has each filter separated by a pipe ("|") 
     var filters = $selected.map(function(){return this.id;}).get().join("|"); 
     $.ajax({ 
      url: '/index.php', 
      data: { c: main, m: updateFilters, filters: filters }, 
      success: function(data){ 
       // data is whatever json you decide to return from the server. 
       // An easy way to do things is have data look like this: 
       // { content: "<div>All my new threads that I want to show up</div>" } 
       // then, you can replace some element on the page with the new content 
       // For example, say your container has an id of threadContainer: 
       $('#threadContainer').replaceWith(data.content); 
      } 
     }); 
    } 
}); 

2) Включение параметров строки запроса в приложении/config.php

Раздел называется Включение запроса строк в нижней части этой статьи объясняет, как это сделать: http://codeigniter.com/user_guide/general/urls.html

3) Создайте действие, которое получит фильтры

Обратите внимание, что я использую contr oller, называемый страницей (который будет жить в /application/controllers/page.php). Это действие (updateFilters) может жить в любом контроллере, который вы хотите.

class Page extends CI_Controller { 

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

    function index() 
    { 
    } 

    function updateFilters($filters) 
    { 
     $filterarray = split("|", $filters); 
     create_session_filter($filterarray); 

     $articlesHTML = getThreadList($filterarray); // See step 4!!! 
     $data['json'] = '{"content":' + $articlesHTML + '}'; 
     $this->load->view('json_view', $data); // See step 5!!! 
    } 

    /* I've updated this slightly to accept an array */ 
    public function create_session_filter($filterarray) 
    { 
     $filter['filter'] = $filterarray; 
     //... the rest of your stuff you already had 
    } 
} 

4) Реализовать метод getThreadList

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

5) Создание json_view (если уже не существует)

Это позволит установить тип контента, так что браузер знает контента JSON.

В /application/views/json_view.php:

<?php 
header("Content-Type: application/json"); 
echo $json; 
?> 
+0

удивительно! Спасибо. Я попытаюсь реализовать как можно скорее. Вернусь к вам с правильным ответом. –

+0

Исходный код javascript, по-видимому, делает категории недоступными. Это затрудняет испытание; Любая идея, почему это может произойти? –

+0

Я не уверен. Вы видите ошибки javascript? В Chrome они появятся, если вы нажмете F12 и нажмите Консоль. В Firefox это же верно, если у вас более новая версия или у вас установлен Firebug. – lbstr

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