Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Вывести данные из php (https://javascript.ru/forum/extjs/55914-vyvesti-dannye-iz-php.html)

nik_neman 20.05.2015 16:45

Вывести данные из php
 
Здравствуйте.
Только сегодня познакомился с ExtJs. В версии 4.2.1 нашел необходимый мне пример 'custom-form'.
Теперь необходимо передавать в форму свои данные которые находятся в БД.
Начал 'смотреть' файл custom-form.js.
Ext.Loader.setConfig({enabled: true});
Ext.Loader.setPath('Ext.ux', '../ux');
Ext.require([
    'Ext.data.*',
    'Ext.panel.Panel',
    'Ext.view.View',
    'Ext.layout.container.Fit',
    'Ext.toolbar.Paging',
    'Ext.ux.form.SearchField',
    'Ext.ux.DataTip'
]);

Ext.define('Post', {
    extend: 'Ext.data.Model',
    idProperty: 'post_id',
    fields: [
        {name: 'postId', mapping: 'post_id'},
        {name: 'title', mapping: 'topic_title'},
        {name: 'topicId', mapping: 'topic_id'},
        {name: 'author', mapping: 'author'},
        {name: 'lastPost', mapping: 'post_time', type: 'date', dateFormat: 'timestamp'},
        {name: 'excerpt', mapping: 'post_text'}
    ]
});

Ext.onReady(function(){
    
    var forumId = 4;

    var store = Ext.create('Ext.data.Store', {
        model: 'Post',
        proxy: {
            type: 'jsonp',
            url: 'http://sencha.com/forum/topics-remote.php',
            extraParams: {
                forumId: forumId
            },
            reader: {
                type: 'json',
                root: 'topics',
                totalProperty: 'totalCount'
            }
        },
        listeners: {
            beforeload: function(){
                var params = store.getProxy().extraParams;
                if (params.query) {
                    delete params.forumId;
                } else {
                    params.forumId = forumId;
                }
            }
        }
    });
    store.loadPage(1);

    var resultTpl = Ext.create('Ext.XTemplate',
        '<tpl for=".">',
        '<div class="search-item">',
            '<h3><span>{lastPost:this.formatDate}<br>by {author}</span>',
            '<a href="http://sencha.com/forum/showthread.php?t={topicId}&p={postId}" target="_blank">{title}</a></h3>',
            '<p>{excerpt}</p>',
        '</div></tpl>',
    {
        formatDate: function(value){
            return Ext.Date.format(value, 'M j, Y');
        }
    });

    var panel = Ext.create('Ext.panel.Panel', {
        title: 'Forum Search',
        height: 300,
        width: 600,
        renderTo: 'search-panel',
        id: 'search-results',
        layout: 'fit',
        items: {
            overflowY: 'auto',
            xtype: 'dataview',
            tpl: resultTpl,
            store: store,
            itemSelector: 'div.search-item',
            emptyText: '<div class="x-grid-empty">No Matching Threads</div>'
        },
        dockedItems: [{
            dock: 'top',
            xtype: 'toolbar',
            items: {
                width: 400,
                fieldLabel: 'Search',
                labelWidth: 50,
                xtype: 'searchfield',
                store: store
            }
        }, {
            dock: 'bottom',
            xtype: 'pagingtoolbar',
            store: store,
            pageSize: 25,
            displayInfo: true,
            displayMsg: 'Topics {0} - {1} of {2}',
            emptyMsg: 'No topics to display'
        }]
    });
});

Есть ли пример исходника файла topics-remote.php, чтобы увидеть как хранятся там данные?
Заранее спасибо.

novikov 21.05.2015 08:21

post_id
topic_title
topic_id
author
post_time timestamp
post_text

nik_neman 21.05.2015 14:03

Спасибо за ответ, но можно по-подробней?
Хотя бы маленький пример.
Заранее спасибо.

novikov 22.05.2015 02:14

Нужно сформировать похожий JSON, как по ссылке в вашем примере. Это можно посмотреть в браузере.

http://sencha.com/forum/topics-remote.php

Из PHP обращаетесь к базе и выбираете из нужные таблиц строки. Собираете их в ассоциативный массив. Затем преобразуете его в строку JSON и возвращаете её через echo.

Используете $_GET['forum_id'], mysqli, json_encode.

Соответствия полей определены у вас в модели через свойство mapping. Но можно обойтись и без этого, а отправить из PHP те же названия полей, что используются в JavaScript'е.

nik_neman 22.05.2015 12:25

Попробовал вывести статические данные типа вот так:
$arr[] = array("topic_title"=>"Status bar error with IFrames", "author"=>"Daz", "post_text"=>"get better");
$json = json_encode($arr);
echo $json;

Нечего не выводит
Из файла topics-remote.php делал json_decode текста, чтобы посмотреть пример ассоциативного массива, но получал null.

novikov 22.05.2015 12:45

NULL из-за того, что не были заэкранированы одиночные кавычки:
' -> \'

var_dump(var_export(json_decode('...', true)));


array (
'totalCount' => '6679',
'topics' =>
array (
0 =>
array (
'post_id' => '604220',
'topic_title' => 'Status bar error with IFrames',
'topic_id' => '134120',
'author' => 'Daz',
'post_time' => '1305857168',
'post_text' => 'Ext version tested:

Ext 3.3.3

Adapter used:
ext

css used:
default ext-all.css

Browser versions tested against:
FF4 (firebug 1.7.1 installed)

...',
'forum_title' => 'Ext 3.x: Bugs',
'forumid' => '41',
'reply_count' => '0',
),
1 =>

nik_neman 22.05.2015 13:59

Спасибо за кавычки)

nik_neman 22.05.2015 14:08

echo выводить переменную json?

nik_neman 22.05.2015 14:16

В php файле сделал так
$arr[] = array(
    "totalCount" => '6679',
    "topics" =>
    array(
        array(
            "post_id" => "604220",
            "topic_title" => "Status bar error with IFrames",
            "topic_id" => "134120",
            "author" => "Daz",
            "post_time" => "1305857168",
            "post_text" => "Ext version tested:",
            "forum_title" => "EXT",
            "forumid" => "41",
            "reply_count" => "0"
            )
    )
);

$json = json_encode($arr);
echo $json;

Нечего не выводит.

Если объявить $arr, то в консоли ошибка - SyntaxError: missing ; before statement
{"totalCount":"6679","topics":[{"post_id":"604220","topic_title":"Status

novikov 22.05.2015 14:45

Квадратные скобки после имени переменной не нужны. Количество записей в totalCount должно быть реальным. Обычно этот параметр используется для разбивки результата запроса на страницы.

$arr = array(
    "totalCount" => '10',
    "topics" =>
    array(
        array(
            "post_id" => "604220",
            "topic_title" => "Status bar error with IFrames",
            "topic_id" => "134120",
            "author" => "Daz",
            "post_time" => "1305857168",
            "post_text" => "Ext version tested:",
            "forum_title" => "EXT",
            "forumid" => "41",
            "reply_count" => "0"
            )
    )
);

$json = json_encode($arr);
echo $json;


Часовой пояс GMT +3, время: 13:40.