Avatar billede _et Praktikant
27. februar 2012 - 22:32 Der er 10 kommentarer og
1 løsning

PHP Json vs ExtJS remoteJsonStore problem

Jeg har en php fil der generer nedenstående JSON output når den kaldes direkte.

Når jeg anvender dette output som input til et ExtJS JSON datastore får jeg følgende fejl:

invalid label
{"emails":[{"id":1,"pid":"6","bnr":"*",
|
/|\
| Firebug viser at fejle er her ved det første gåseøje!


Er der noget galt med formateringen af JSON outputtet? Det formateres med php koden:
  $retur['emails'] = $SQLresultat;
  echo json_encode($retur);

Hvad kan det ellers være der er galt??
Her er html/js og PHP output.

ajax.php output:
{"emails":[{"id":1,"pid":"6","bnr":"*","sm_server":"10.0.0.2","sm_port":"25","sm_user":"","sm_passw":"","se_from":"test.eu","se_to":"test1.com","se_cc":"test2.com","se_bcc":"test.eu","emailBody":"noget tekst"},{"id":2,"pid":"8","bnr":"*","sm_server":"10.0.0.2","sm_port":"25","sm_user":"","sm_passw":"","se_from":"test.eu","se_to":"test1.com","se_cc":"test2.com","se_bcc":"test.eu","emailBody":"noget andet tekst"}]}

index.html source:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Simpel JSON Test</title>
<link rel="stylesheet" type="text/css" href="extjs-3.4/resources/css/ext-all.css" />
<script type="text/javascript" src="extjs-3.4/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="extjs-3.4/ext-all.js"></script>
</head>
<body>

<script type="text/javascript">
Ext.onReady(function() {

    var remoteProxy = new Ext.data.ScriptTagProxy({
        url : 'ajax.php'   
    });     

    var recordFields = [   
        { name : 'id', mapping : 'id'},
        { name : 'firstname', mapping : 'pid'},
        { name : 'bnr', mapping : 'bnr'},
        { name : 'street', mapping : 'sm_server'},
        { name : 'city', mapping : 'sm_port'},
        { name : 'state', mapping : 'sm_user'},
        { name : 'zipcode', mapping : 'sm_passw'},
        { name : 'newRecordId', mapping : 'se_from'},       
        { name : 'seto', mapping : 'se_to'},
        { name : 'secc', mapping : 'se_cc'},
        { name : 'sebcc', mapping : 'se_bcc'},
        { name : 'emailbody', mapping : 'emailBody'}
    ];

    var remoteJsonStore = new Ext.data.JsonStore({
      proxy            : remoteProxy,     
      storeId          : 'ourRemoteStore',     
      root              : 'emails',     
      autoLoad          : false,     
      remoteSort        : true,     
      fields            : recordFields,     
      idProperty        : 'id'
    });                         

    var textFieldEditor = new Ext.form.TextField();
   
    var columnModel = [   
        {       
            header    : 'Last Name',     
            dataIndex : 'bnr',           
            sortable  : true,           
            editor    : textFieldEditor
        },
        {       
            header    : 'First Name',     
            dataIndex : 'firstname',           
            sortable  : true,           
            editor    : textFieldEditor
        },
        {       
            header    : 'Streed Address',     
            dataIndex : 'street',           
            sortable  : true,           
            editor    : textFieldEditor
        },
        {       
            header    : 'City',     
            dataIndex : 'city',           
            sortable  : true,           
            editor    : textFieldEditor
        },
        {       
            header    : 'State',     
            dataIndex : 'state',           
            sortable  : true,           
            editor    : textFieldEditor
        },
        {       
            header    : 'Zip Code',     
            dataIndex : 'zipcode',           
            sortable  : true,           
            editor    : textFieldEditor
        }       
    ];

    var grid = {   
        xtype      : 'editorgrid',       
        columns    : columnModel,       
        id          : 'myEditorGrid',       
        store      : remoteJsonStore,       
        loadMask    : true,       
        stripeRows  : true,       
        viewConfig  : { forceFit : true }
    };                         

    new Ext.Window({   
        height  : 350,       
        width  : 550,       
        border  : false,       
        layout  : 'fit',       
        items  : grid       
    }).show();   

    remoteJsonStore.load();
});

</script>
</body>
</html>
Avatar billede olebole Juniormester
27. februar 2012 - 23:17 #1
<ole>

Der er i hvertfald intet galt med JSON strengen

/mvh
</bole>
Avatar billede _et Praktikant
27. februar 2012 - 23:23 #2
Skal man lave recordFields til alle elementer i strengen, eller må man nøjes med nogle som jeg gør??
Avatar billede olebole Juniormester
27. februar 2012 - 23:34 #3
Det har jeg ingen anelse om, da jeg aldrig har brugt ExtJS.

Til gengæld giver det ikke rigtig mening at forsøge sig med Ajax, når man bruger iso-8859-1. JavaScripts ANSI funktioner til URL-encoding og -decoding har efterhånden været deprecated i mange år og er afløst af Unicode funktioner
Avatar billede olebole Juniormester
27. februar 2012 - 23:39 #4
- men, hvis det er et grid view, du skal loade, kunne jeg godt forestille mig, at du skal have alle felter med - men det er bare et skud.

Fejlen tyder dog på, at det ikke forventes, at der kommer et felt i JSON objektet, som hedder emails
Avatar billede _et Praktikant
27. februar 2012 - 23:44 #5
Jeg har prøvet med utf-8 - det gør ingen forskel.

Ang. "emails" feltet så er jeg ret sikker på det er korrekt, fordi JsonStore objektet har sat root parameteren til "emails".

Jeg vil prøve med alle felter imorgen.
Avatar billede olebole Juniormester
28. februar 2012 - 00:07 #6
Så undrer det mig bare, du får besked på, der er en ulovlig label - og at der i den forbindelse peges på, hvor emails begynder.

Når du skriver, du har prøvet med utf-8, hvad betyder det så? Betyder det, at alle filer er gemt som utf-8 - at indholdet er utf-8 - herunder at evt. database er sat op til at bruge utf-8 - og betyder det, at din server faktisk server dokumentet som utf-8?

Hvad bruger du af header i den fil, der udskriver JSON strengen?
Avatar billede _et Praktikant
28. februar 2012 - 08:02 #7
Så betyder det jeg har sat denne side til at være UDF-8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Hvad database og server kører har jeg umiddelbart ingen ide om?
Avatar billede _et Praktikant
28. februar 2012 - 08:19 #8
Det var fordi jeg anvendte remoteProxy - Da jeg flyttede URL ned i JsonStore i stedet virkede det.

Takker for hjælpen
Avatar billede olebole Juniormester
28. februar 2012 - 14:50 #9
Selvtak - men du bør stadig bruge utf-8. iso-8859-1 giver som sagt ikke mening i forhold til Ajax - og heller ikke i forhold til resten af nettet omkring dig. Fortiden tilhørte ANSI ... nutiden og fremtiden tilhører Unicode  =)
Avatar billede _et Praktikant
28. februar 2012 - 18:44 #10
Den eneste grund til ANSI er fordi det var et eksempel fra en bog.
Men det er godt at vide så det husker jeg.

Mvh
Teddy
Avatar billede olebole Juniormester
28. februar 2012 - 18:48 #11
*o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester