Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Применение библиотек > ExtJs - не получается передать данные в ComboBox


Автор: DmiSbr 15.11.2011, 11:31
Доброго всем дня !
Подскажите начинающему в Web-разработке

Использую связку: на серверной стороне - CodeIgniter, клиентская часть - ExtJS
Из базы данных на Firebird выбираются данные из таблицы "Перечень валют"

my_model.php
Код

...
function get_currency() {
    $query = $this-> db-> query('select CUR_ID, CUR_NAME from CURRENCY order by CUR_ID');
    return $query;
}
...

my_controller.php
Код

...
function get_data() {
    $query = $this-> my_model-> get_currency();
    while ($obj = $query-> _fetch_object()) {
        $arr[] = $obj;
    }
    echo '{"currency":' . json_encode($arr) . '}'; 
}
...

my_view.php
Код

...
<script type="text/javascript">
     Ext.onReady(function(){
         Ext.QuickTips.init();
    
         var store = new Ext.data.JsonStore({
    root: 'currency',
         fields: ['CUR_ID', 'CUR_NAME'],
         proxy: new Ext.data.ScriptTagProxy ({
            url: '/index.php/my_controller/get_data',
            method: 'POST'
         })
    });


         store.load();
                
         var currency = new Ext.form.ComboBox({
    name: 'currency',
    triggerAction: 'all',
    displayField: 'CUR_NAME',
    valueField: 'CUR_ID',
    bodyStyle: 'padding: 10px',
    store: store
        });
    
        var p = new Ext.Panel({
    title: 'Test',
    renderTo: 'form',
    width: 910,
    autoHeight: true,
    bodyStyle: 'padding: 10px',
    items   : [{
        xtype: 'displayfield',
        value: 'Наименование валюты'
    }, 
    currency
        ]});

});
</script>
...

ComboBox не заполняется данными
Если вывести в контроллере данные
Код

...     
$data['combo_data'] = $this-> get_data();
     $this-> load-> view('fb_view', $data);
...

А во вью сделать вывод <?print_r($combo_data);?>
массив выводиться:
{"currency":[{"CUR_ID":1,"CUR_NAME":"\u0414\u043e\u043b\u043b\u0430\u0440 \u0421\u0428\u0410"},{"CUR_ID":2,"CUR_NAME":"\u0415\u0432\u0440\u043e"},{"CUR_ID":3,"CUR_NAME":"\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c"},{"CUR_ID":4,"CUR_NAME":"\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u043e\u0432"},{"CUR_ID":5,"CUR_NAME":"\u041a\u0430\u043d\u0430\u0434\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440"},{"CUR_ID":6,"CUR_NAME":"\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0430\u044f \u0433\u0440\u0438\u0432\u043d\u0430"},{"CUR_ID":7,"CUR_NAME":"\u041d\u0435\u043c\u0435\u0446\u043a\u0430\u044f \u043c\u0430\u0440\u043a\u0430"}]} 

Подскажите в чем ошибка, бьюсь неделю. Опробовал несколько вариантов, результат тот же.

Автор: ashain 15.11.2011, 12:58
Может попробовать сначало сделать статическую страницу, и загрузить в комбобокс данные. Если всё ок, то искать зарытую собаку во view.

Автор: DmiSbr 15.11.2011, 18:01
2 ashain
Статическую страницу я делал. CodeIgniter замечательно передает данные в ComboBox
my_controller.php
Код

...
public function get_currency_list() {
    $s = '';
    $query = $this-> my_model-> get_currency();
    foreach($query-> result() as $row) {
        $s .= '<option value="'.$row->CUR_ID.'" >'.$row-> CUR_NAME.'</option>';
    }
    return $s;
}
...
public function index() {
    $data['currency_list'] = $this-> get_currency_list();
    $this-> load-> view('my_view', $data);
}
...

my_view.php
Код

...
    <div>Наименование валюты<strong>*</strong></div>
    <select id="currency" <?echo $currency_list;?></select>
...

Мне интересно было разобраться с ExtJS. Мой код практически полностью повторяет пример из книги "ExtJS in Action", но почему-то не хочет работать. При использовании локального Store тоже все замечательно работает   smile 

Автор: -=Ustas=- 15.11.2011, 19:38
DmiSbr, firebug что показывает?

Автор: DmiSbr 16.11.2011, 05:32
2 -=Ustas=-
В том то и проблема, что firebug молчит, как будто все прекрасно

Автор: -=Ustas=- 16.11.2011, 10:12
DmiSbr, на такой случай есть console.log пошагово. Проставьте везде по коду и смотрите что и где происходит, если нет возможности альтернативной отладки (например с помощью aptana).

Автор: DmiSbr 17.11.2011, 12:58
Заработал такой вариант
my_controller.php
Код

...
$query = $this-> my_model-> get_currency();
$i=0;
while ($obj = $query-> _fetch_object()) {
     $arr[] = $obj;
     $i++;
}
echo '{"total" : '.$i.', "currency" : ' . json_encode($arr) . '}';
...

my_view.php
Код

...
var store = new Ext.data.Store({
    proxy: new Ext.data.HttpProxy({
        metod: 'GET',
        url : '/index.php/fb/get_combo'
    }),
    reader: new Ext.data.JsonReader({
        root: 'currency',
        totalProperty: 'total',
        fields: ['CUR_ID','CUR_NAME']
    }),
    autoLoad: true
});
        
var currency = new Ext.form.ComboBox({
    typeAhead: true,
    name: 'currency',
    triggerAction: 'all',
    displayField: 'CUR_NAME',
    valueField: 'CUR_ID',
    store: store
});
...

теперь ComboBox заполняется, но.... Вверху страницы печатается массив store
если в контроллере заменить строку возврата echo ... на return ... ComboBox становиться пустым
Что же опять не так ? Во всех примерах возврат происходит именно через echo... Как избавиться от массива вверху страницы ? Или переделать возврат данных на страницу ?

2 -=Ustas=-
console.log не спасает. Пытался после создания и загрузки массива выводить 
Код

    console.log(store.getTotalCount());
    console.log(store.getAt(1).get('CUR_NAME'));
 дынные выводятся только в случае локальной загрузки JsonStore

Добавлено через 12 минут и 3 секунды
Прошу прощения.... забыл убрать передачу из контроллера store при загрузке вьюшки
Сейчас все замечательно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)