JSON polymorphique : changer le type de modèle basé sur la réponse

Neil McGuigan

Traducteur

vermine

Il est parfois utile d'intervenir sur le modèle de la réponse JSON en reconstruisant une sorte d'héritage entre structures. L'auteur vous explique comment faire en se basant sur un modèle parent et en obtenant deux sous-modèles distincts.
Cet article est la traduction de Polymorphic JSON: Changing the model type based on the response publié sur ExtJS Tutorials.

- Titre : JSON polymorphique : changer le type de modèle basé sur la réponse

- Auteur : Neil McGuigan

- Traducteur : vermine

- Parution : 12 juillet 2012

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2012 Neil McGuigan. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Explications

- II. Les modèles

- III. Un exemple

- IV. Remerciements

I - Explications

J'utilise le Party Model et j'aimerais créer un modèle Individual ou Organization en fonction de la réponse JSON. Pour faire cela, je dois réécrire le Ext.data.reader.Reader. Idéalement, Sencha aurait déclenché un événement "création de modèle" qui nous permettrait d'intercepter le modèle au moment du Read.

Le Party Model est un modèle de conception de base de données relationnelle qui consiste à trouver des points communs entre plusieurs entités et à les synthétiser dans des tables plus abstraites.

II - Les modèles

Les objets ressemblent à ceci :

PARTY
id
name
getText() - retourne le nom

ORGANIZATION : PARTY
doingBusinessAs
getText() - retourne doingBusinessAs

INDIVIDUAL : PARTY
middleName
firstName
birthday
getText() réécriture - retourne le nom complet

Il faut manier correctement les champs et les associations qui sont redéfinis. Vous devez utiliser le nom de la propriété qui appartient à l'autre modèle pour la réécrire.

III - Un exemple

Ext.data.reader.Reader.override({
extractData:function(root){

var me = this,
records = [],
Model   = me.model,
length  = root.length,
convertedValues, node, record, i;

if (!root.length && Ext.isObject(root)) {
root = [root];
length = 1;
}

for (i = 0; i < length; i++) {
node = root[i];

/* réécriture */
if(me.types){
var typeCode = node[me.typeProperty || 'type'];
var type = me.types[typeCode];
me.model = Ext.ClassManager.get(type); //la référence du modèle est utilisée dans d'autres fonctions
Model = me.model;
me.buildExtractors(true); //il faut recompiler les Extractors
}
/* fin de la réécriture */

record = new Model(undefined, me.getId(node), node, convertedValues = {});
record.phantom = false;
me.convertRecordData(convertedValues, node, record);
records.push(record);

if (me.implicitIncludes) {
me.readAssociated(record, node);
}
}

return records;
}
});

//voici comment vous l'utiliseriez

Ext.define('My.model.Party', {
extend:'Ext.data.Model',

requires:[
'TD.model.Individual',
'TD.model.Organization'
],

fields:[
'id',
'type',
'name',
{
name:'text',
mapping:'name'
}
],

proxy:{
type:'ajax',
url:'parties',
reader: {
root:'parties',
types:{
'i':'My.model.Individual',
'o':'My.model.Organization'
}
}
}
});

//le json

{
success: true,
parties:[
{ id:4, type:'i', name:'chief', firstName:'el', middleName:'_', birthday:'May 1' },
{ id:99, type:'o', name:'Sencha, Inc.', doingBusinessAs:'Sencha' }
]
}

Votre structure parties contiendrait alors un objet Individual et un objet Organization.

IV - Remerciements

Cet article a été publié avec l'aimable autorisation de Neil McGuigan. L'article original peut être lu sur le blog ExtJS Tutorials : Polymorphic JSON: Changing the model type based on the response.
Je remercie également FirePrawn pour sa relecture rapide.