1. #11
    Sencha User
    Join Date
    May 2007
    Posts
    191
    Vote Rating
    0
    temporary is on a distinguished road

      0  

    Default


    Has someone ported this to ext-2.0-rc1?

    Bye, Stephan

  2. #12
    Ext User
    Join Date
    Jan 2008
    Posts
    17
    Vote Rating
    0
    ramonj is on a distinguished road

      0  

    Default


    You might want to check this sample http://www.miamicoder.com/post/2008/...-run-time.aspx. It doesn't exactly solve your columns problem, but maybe it will give you some ideas on the approaches you can take.

  3. #13
    Ext User
    Join Date
    Jun 2007
    Posts
    8
    Vote Rating
    0
    hendra1 is on a distinguished road

      0  

    Default


    Yeah i looking for a dynamic grid columns in ext 2.0
    But i couldnt found it
    Does anyone know where i can found tutorial or example code , dynamic grid in ext 2.0

    Thanks in advance

  4. #14
    Ext User
    Join Date
    Mar 2008
    Posts
    2
    Vote Rating
    0
    extsv is on a distinguished road

      0  

    Default looking for a dynamic grid columns in ext 2.0

    looking for a dynamic grid columns in ext 2.0


    It would be very helpful if you could upload the example code with Ext 2.0. Could not find any other examples in the forum also. Please help in this regard.

    Thanks in advance.

  5. #15
    Ext User
    Join Date
    Apr 2008
    Posts
    75
    Vote Rating
    0
    spextjs is on a distinguished road

      0  

    Default Dynamic columns grid

    Dynamic columns grid


    Hi,
    I need to make a dynamic grid with varying number of columns(based on 1. how many reporting periods for an entity_id and 2.which tab is clicked). I used your code in the following manner. There are no errors in the console but the grid is not rendering. Can you tell me what I am doing wrong. When the debugger is on, I am able to see the data correctly populated in the dynamic cols.

    This grid is being called from another panel. The creditStatsPanel and CreditStatsGrid are called from a jason page.

    Here is my code for CreditStatsGrid :
    Ext.ns('SPD');
    SPD.CreditStatsGrid = Ext.extend(SPD.SPDGridPanel, {
    initComponent: function() {
    this.height = 500;
    var ds = new Ext.data.Store({
    url: '/spd/getCreditStats.do',
    reader: new Ext.data.DynamicJsonReader({root: 'creditStats'}),
    remoteSort: true
    });
    if(!this.colModel) {
    this.colModel = new Ext.grid.ColumnModel([]);
    }
    ds.load();
    ds.on('load', function(){
    ds.recordType = ds.reader.recordType;
    ds.fields = ds.recordType.prototype.fields;
    this.colModel= new Ext.grid.DynamicColumnModel(ds);

    });
    this.store=ds;
    this.on("render",this.renderComponent,this);
    SPD.CreditStatsGrid.superclass.initComponent.call(this);
    },
    renderComponent: function(){
    this.initComponent();
    this.doLayout();
    }
    });
    Ext.data.DynamicJsonReader = function(config){
    Ext.data.DynamicJsonReader.superclass.constructor.call(this, config, []);
    };
    Ext.extend(Ext.data.DynamicJsonReader, Ext.data.JsonReader, {
    getRecordType : function(data) {
    var i = 0, arr = [];
    //debugger;
    for (var name in data[0]) { arr[i++] = name; } // is there a built-in to do this?
    //alert(arr);
    this.recordType = Ext.data.Record.create(arr);
    return this.recordType;
    },

    readRecords : function(o){ // this is just the same as base class, with call to getRecordType injected
    this.jsonData = o;
    var s = this.meta;
    var sid = s.id;
    //debugger;
    var totalRecords = 34; // need to make this dynamic get the total sort_order or total store.length
    if(s.totalProperty){
    var v = parseInt(eval("o." + s.totalProperty), 10);
    if(!isNaN(v)){
    totalRecords = v;
    }
    }
    var root = s.root ? eval("o." + s.root) : o;
    var recordType = this.getRecordType(root);
    var fields = recordType.prototype.fields;
    var records = [];
    for(var i = 0; i < root.length; i++){
    var n = root[i];
    var values = {};
    var id = (n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
    for(var j = 0, jlen = fields.length; j < jlen; j++){
    var f = fields.items[j];
    var map = f.mapping || f.name;
    var v = n[map] !== undefined ? n[map] : f.defaultValue;
    v = f.convert(v);
    values[f.name] = v;
    }
    var record = new recordType(values, id);
    record.json = n;
    records[records.length] = record;
    }
    return {
    records : records,
    totalRecords : totalRecords || records.length
    };
    }
    });

    Ext.grid.DynamicColumnModel = function(store){
    var cols = [];
    var recordType = store.recordType;
    var fields = recordType.prototype.fields;
    //debugger;
    for (var i = 0; i < fields.keys.length; i++)
    {
    var fieldName = fields.keys[i];
    var field = recordType.getField(fieldName);
    cols[i] = {header: field.name, dataIndex: field.name, width:300};

    }
    this.colModel= Ext.grid.DynamicColumnModel.superclass.constructor.call(this, cols);
    };
    Ext.extend(Ext.grid.DynamicColumnModel, Ext.grid.ColumnModel, {});
    Ext.reg('creditstatsgrid', SPD.CreditStatsGrid);


    ----------------------------------------------------------------
    Ext.ns('SPD');

    SPD.creditStatsPanel = Ext.extend(SPD.SPDPanel, {

    tplMarkup: [
    '<tpl for=".">',
    '<table width="663" cellspacing="0" cellpadding="0" border="0">',
    '<tbody><tr>',
    '<td width="225" valign="middle" height="25" align="left">',
    '<div class="dirgrey">',
    'Select Source',
    '</div>',
    '</td>',
    '<td width="187" valign="middle" height="25" align="left">',
    '<div class="dirgrey">',
    'Select Period',
    '</div>',
    '</td>',
    '<td width="180" valign="middle" height="25" align="left">',
    '<div class="dirgrey">',
    'Select Currency ',
    '</div>',
    '</td>',
    '<td width="180" valign="middle" height="25" align="left">',
    '<div class="dirgrey">',
    'Select Currency Conversion ',
    '</div>',
    '</td>',
    '<td width="140" valign="middle" height="25" align="left">',
    '<div class="dirgrey">',
    'Select Column Order ',
    '</div>',
    '</td>',
    '</tr>',
    '</tbody></table>',
    '</tpl>'
    ],


    initComponent: function() {

    /*this.store1 = new SPD.SPDJsonStore({
    fields: ['YEAR','PERIOD_DESCR','DATADATE'],
    url: '/spd/getCreditStats.do',
    root: 'columnHeader',
    totalProperty: 'total'
    });*/

    this.tools = [{
    id: 'toggle',
    handler: this.toggleCollapse,
    scope: this
    }];

    var tpl = new Ext.XTemplate(this.tplMarkup);
    //this.entityId = (entityId != null)? entityId.dom.innerHTML : null;
    //debugger;
    SPD.colOrder = [
    ['Latest on Left','L'],
    ['Latest on Right','R']
    ];
    var colOrdds = new Ext.data.SimpleStore({
    fields: ['DD_OPTION','DD_VALUE'],
    data : SPD.colOrder
    });
    var sourceStore = new Ext.data.JsonStore({
    url: SPD.ServerUrls.loadSourceList,
    root: 'sourceList',
    fields: ['DD_OPTION','DD_VALUE']

    });

    var periodStore = new Ext.data.JsonStore({
    url: SPD.ServerUrls.loadPeriodList,
    root: 'periodList',
    fields: ['DD_OPTION','DD_VALUE'],

    });
    var currencyStore = new Ext.data.JsonStore({
    url: SPD.ServerUrls.loadCurrencyList,
    root: 'currencyList',
    fields: ['DD_OPTION','DD_VALUE']

    });
    var currConvStore = new Ext.data.JsonStore({
    url: SPD.ServerUrls.loadCurrConvList,
    root: 'curConvList',
    fields: ['DD_OPTION','DD_VALUE']
    });
    if(null != Ext.get("fs_tab")){
    this.fs_tab = Ext.get("fs_tab").dom.innerHTML;
    }

    if(null != Ext.get("entityId")){
    this.entityId = Ext.get("entityId").getValue();
    }
    var headerItems = [{
    xtype: 'spd-panel',
    itemId:'crestHeaderPanel',
    layout: 'table',
    layoutConfig: {
    columns: 3
    },

    items:[{
    xtype: 'combo',
    itemId: 'sourceList',
    store: sourceStore,
    displayField:'DD_OPTION',
    value:'Adjusted',
    valueField:'DD_VALUE',
    typeAhead: true,
    mode: 'local',
    triggerAction: 'all',
    selectOnFocus:true,
    cls:'searchdrop3',
    name:'source'

    },{
    xtype: 'combo',
    itemId: 'periodList',
    store: periodStore,
    displayField:'DD_OPTION',
    value:'Annual',
    valueField:'DD_VALUE',
    typeAhead: true,
    mode: 'local',
    triggerAction: 'all',
    selectOnFocus:true,
    name:'period'

    },{
    xtype: 'combo',
    itemId: 'currencyList',
    store: currencyStore,
    displayField:'DD_OPTION',
    value:'Reported Currency',
    valueField:'DD_VALUE',
    typeAhead: true,
    mode: 'local',
    triggerAction: 'all',
    selectOnFocus:true,
    name:'currency'

    },{
    xtype: 'combo',
    itemId: 'currConvList',
    store: currConvStore,
    displayField:'DD_OPTION',
    value:'Historical',
    valueField:'DD_VALUE',
    typeAhead: true,
    mode: 'local',
    triggerAction: 'all',
    selectOnFocus:true,
    name:'curconvCmb',
    colspan:1

    },{
    xtype: 'combo',
    itemId: 'columnOrderList',
    store: colOrdds,
    displayField:'DD_OPTION',
    value:'Latest on Left',
    valueField:'DD_VALUE',
    typeAhead: true,
    mode: 'local',
    triggerAction: 'all',
    selectOnFocus:true,
    name:'colOrdCmb'

    },{
    xtype: 'button',
    text: 'Go',
    itemId: 'crestHeaderButton'
    }]
    }];

    this.items = headerItems.concat(this.items);
    sourceStore.load({
    params: {
    start: 0,
    limit: 15
    }
    });
    currencyStore.load({
    params: {
    start: 0,
    limit: 15
    }
    });
    currConvStore.load({
    params: {
    start: 0,
    limit: 15
    }
    });
    periodStore.load({
    params: {
    start: 0,
    limit: 15,
    entityId:this.entityId,
    fs_tab:this.fs_tab

    }
    });

    //this.button = Ext.getComponent('crestHeaderPanel').getComponent('crestHeaderButton');

    SPD.creditStatsPanel.superclass.initComponent.call(this);

    },
    registerListeners: function(){
    this.button.on('click',this.refreshComponents, this);
    },
    refreshComponents: function(){

    /*var record = this.sourceList.store.getAt(this.sourceList.selectedIndex);
    source = record.get('DD_VALUE');

    var record = this.periodList.store.getAt(this.periodList.selectedIndex);
    period = record.get('DD_VALUE');

    var record = this.currencyList.store.getAt(this.currencyList.selectedIndex);
    currency = record.get('DD_VALUE');

    var record = this.currConvList.store.getAt(this.currConvList.selectedIndex);
    currconv = record.get('DD_VALUE');

    var record = this.columnOrderList.store.getAt(this.columnOrderList.selectedIndex);
    colorder = record.get('DD_VALUE');


    var creditstatsgrid = Ext.getCmp('creditstatsgrid');
    creditstatsgrid.source = source;
    creditstatsgrid.period = period;
    creditstatsgrid.currency = currency;
    creditstatsgrid.currconv = currconv;
    creditstatsgrid.colorder = colorder;

    var creditstatsgrid = Ext.getCmp('creditstatsgrid');
    creditstatsgrid.fireEvent('refresh', this);
    */

    }
    });


    Ext.reg('creditStatsPanel', SPD.creditStatsPanel);

  6. #16
    Ext User
    Join Date
    Apr 2008
    Posts
    75
    Vote Rating
    0
    spextjs is on a distinguished road

      0  

    Default DynamicColumnModel

    DynamicColumnModel


    Where did you call showGrid function from? How can this be changed to include GridPanel instead of Grid?





    Quote Originally Posted by SteveEisner View Post
    Here's what I came up with:

    Dynamic Json Reader: this will read whatever data comes back from the JSON call. It doesn't take a record definition because it builds it on the fly. Unfortunately it only has any record information *after* the JSON call has completed, so you can't simply pass it into a Grid, etc. because it won't be initialized at that time.

    Code:
    Ext.data.DynamicJsonReader = function(config){
        Ext.data.DynamicJsonReader.superclass.constructor.call(this, config, []);
    };
    Ext.extend(Ext.data.DynamicJsonReader, Ext.data.JsonReader, {
        getRecordType : function(data) {
            var i = 0, arr = [];
            for (var name in data[0]) { arr[i++] = name; } // is there a built-in to do this?
            
            this.recordType = Ext.data.Record.create(arr);
            return this.recordType;
            },
            
        readRecords : function(o){ // this is just the same as base class, with call to getRecordType injected
            this.jsonData = o;
            var s = this.meta;
        	var sid = s.id;
        	
        	var totalRecords = 0;
        	if(s.totalProperty){
                var v = parseInt(eval("o." + s.totalProperty), 10);
                if(!isNaN(v)){
                    totalRecords = v;
                }
            }
        	var root = s.root ? eval("o." + s.root) : o;
        	
        	var recordType = this.getRecordType(root);
        	var fields = recordType.prototype.fields;
        	
            var records = [];
    	    for(var i = 0; i < root.length; i++){
    		    var n = root[i];
    	        var values = {};
    	        var id = (n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
    	        for(var j = 0, jlen = fields.length; j < jlen; j++){
    	            var f = fields.items[j];
    	            var map = f.mapping || f.name;
    	            var v = n[map] !== undefined ? n[map] : f.defaultValue;
    	            v = f.convert(v);
    	            values[f.name] = v;
    	        }
    	        var record = new recordType(values, id);
    	        record.json = n;
    	        records[records.length] = record;
    	    }
    	    return {
    	        records : records,
    	        totalRecords : totalRecords || records.length
    	    };
        }
    });
    DynamicColumnModel: this takes a Store as a parameter, and from that it will build a default ColumnModel where all the fields are included and have width: 300.

    Code:
    Ext.grid.DynamicColumnModel = function(store){
        var cols = [];
        var recordType = store.recordType;
        var fields = recordType.prototype.fields;
        
        for (var i = 0; i < fields.keys.length; i++)
        {
            var fieldName = fields.keys[i];
            var field = recordType.getField(fieldName);
            cols[i] = {header: field.name, dataIndex: field.name, width:300};
        }
        Ext.grid.DynamicColumnModel.superclass.constructor.call(this, cols);
    };
    Ext.extend(Ext.grid.DynamicColumnModel, Ext.grid.ColumnModel, {});

    Here's how I use it -

    Code:
    function showGrid(container, url)
    {
        // create the Data Store
        var ds = new Ext.data.Store({
            proxy: new Ext.data.HttpProxy({url: url}),
            reader: new Ext.data.DynamicJsonReader({root: '...my root, yours will be different...'}),
            remoteSort: true
            });
        ds.on('load', function() {
            // Reset the Store's recordType
            ds.recordType = ds.reader.recordType;
            ds.fields = ds.recordType.prototype.fields;
    
            // Create the grid
            var grid = new Ext.grid.Grid(container, {
               ds: ds,
               cm: new Ext.grid.DynamicColumnModel(ds),
               selModel: new Ext.grid.RowSelectionModel({singleSelect:true}),
               enableColLock:true
            });
               
            // render it
            grid.render();
        });
        ds.load();
    }
    I haven't really put it through its paces yet but it seems to work for whatever JSON calls I try. If this were more generic I'd want to add some things like:
    * Some way to provide column widths and types for known columns - merge with the unknowns. Maybe a callback function of some sort.
    * A better way to declare this type of grid that has to wait until the data has been fetched before rendering.
    * A DynamicXmlReader to match the JSON reader
    * etc.

    Note if Jack reads this: the DynamicJsonReader code could be even smaller if you adopt the change I made to the readRecords() method...

    Steve

  7. #17
    Ext User
    Join Date
    Sep 2008
    Posts
    8
    Vote Rating
    0
    tidalbobo is on a distinguished road

      0  

    Default


    Quite an old thread.. But can u possibly provide the code for this functionality?
    Now that i know u have it, i dont like to reinvent the wheel.
    Thank you in advance.


    Quote Originally Posted by Animal View Post
    Well, if you fist find out what the records are going to contain, you can create an appropriate ColumnModel programatically by simply assembling a column config Array.

    My wrapper of the Grid sends an encoded query to the server, receives back info about the columns, builds the ColumnModel and Record definition on the fly from this recieved info, creates the Grid and loads it.

    I only have one Grid class which will handle all my possible queries.

  8. #18
    Ext User
    Join Date
    Oct 2008
    Posts
    78
    Vote Rating
    0
    nick saint is on a distinguished road

      0  

    Default


    Please, if it's not hard explain how to use it.
    Really need it
    Thank you
    Nick

    Quote Originally Posted by SteveEisner View Post
    Here's what I came up with:

    Dynamic Json Reader: this will read whatever data comes back from the JSON call. It doesn't take a record definition because it builds it on the fly. Unfortunately it only has any record information *after* the JSON call has completed, so you can't simply pass it into a Grid, etc. because it won't be initialized at that time.

    Code:
    Ext.data.DynamicJsonReader = function(config){
        Ext.data.DynamicJsonReader.superclass.constructor.call(this, config, []);
    };
    Ext.extend(Ext.data.DynamicJsonReader, Ext.data.JsonReader, {
        getRecordType : function(data) {
            var i = 0, arr = [];
            for (var name in data[0]) { arr[i++] = name; } // is there a built-in to do this?
            
            this.recordType = Ext.data.Record.create(arr);
            return this.recordType;
            },
            
        readRecords : function(o){ // this is just the same as base class, with call to getRecordType injected
            this.jsonData = o;
            var s = this.meta;
            var sid = s.id;
            
            var totalRecords = 0;
            if(s.totalProperty){
                var v = parseInt(eval("o." + s.totalProperty), 10);
                if(!isNaN(v)){
                    totalRecords = v;
                }
            }
            var root = s.root ? eval("o." + s.root) : o;
            
            var recordType = this.getRecordType(root);
            var fields = recordType.prototype.fields;
            
            var records = [];
            for(var i = 0; i < root.length; i++){
                var n = root[i];
                var values = {};
                var id = (n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
                for(var j = 0, jlen = fields.length; j < jlen; j++){
                    var f = fields.items[j];
                    var map = f.mapping || f.name;
                    var v = n[map] !== undefined ? n[map] : f.defaultValue;
                    v = f.convert(v);
                    values[f.name] = v;
                }
                var record = new recordType(values, id);
                record.json = n;
                records[records.length] = record;
            }
            return {
                records : records,
                totalRecords : totalRecords || records.length
            };
        }
    });
    DynamicColumnModel: this takes a Store as a parameter, and from that it will build a default ColumnModel where all the fields are included and have width: 300.

    Code:
    Ext.grid.DynamicColumnModel = function(store){
        var cols = [];
        var recordType = store.recordType;
        var fields = recordType.prototype.fields;
        
        for (var i = 0; i < fields.keys.length; i++)
        {
            var fieldName = fields.keys[i];
            var field = recordType.getField(fieldName);
            cols[i] = {header: field.name, dataIndex: field.name, width:300};
        }
        Ext.grid.DynamicColumnModel.superclass.constructor.call(this, cols);
    };
    Ext.extend(Ext.grid.DynamicColumnModel, Ext.grid.ColumnModel, {});
    Here's how I use it -

    Code:
    function showGrid(container, url)
    {
        // create the Data Store
        var ds = new Ext.data.Store({
            proxy: new Ext.data.HttpProxy({url: url}),
            reader: new Ext.data.DynamicJsonReader({root: '...my root, yours will be different...'}),
            remoteSort: true
            });
        ds.on('load', function() {
            // Reset the Store's recordType
            ds.recordType = ds.reader.recordType;
            ds.fields = ds.recordType.prototype.fields;
    
            // Create the grid
            var grid = new Ext.grid.Grid(container, {
               ds: ds,
               cm: new Ext.grid.DynamicColumnModel(ds),
               selModel: new Ext.grid.RowSelectionModel({singleSelect:true}),
               enableColLock:true
            });
               
            // render it
            grid.render();
        });
        ds.load();
    }
    I haven't really put it through its paces yet but it seems to work for whatever JSON calls I try. If this were more generic I'd want to add some things like:
    * Some way to provide column widths and types for known columns - merge with the unknowns. Maybe a callback function of some sort.
    * A better way to declare this type of grid that has to wait until the data has been fetched before rendering.
    * A DynamicXmlReader to match the JSON reader
    * etc.

    Note if Jack reads this: the DynamicJsonReader code could be even smaller if you adopt the change I made to the readRecords() method...

    Steve

  9. #19
    Ext User
    Join Date
    Dec 2008
    Posts
    2
    Vote Rating
    0
    jayantkolekar is on a distinguished road

      0  

    Default


    Hi Steve,

    I am new to ExtJS could you help me by giving some information about dynamic column in grid. Also can you post a sample Json you have created.

  10. #20
    Ext User
    Join Date
    Jan 2009
    Posts
    1
    Vote Rating
    0
    alf-solution is on a distinguished road

      0  

    Lightbulb Updated and working exemple

    Updated and working exemple


    Hi,

    As many of you, I am new to ExtJS and it is not simple to get in. I also faced the problem of having a grid with dynamic columns. Based on the exemple of this thread I managed to get it working, so I thought it would be helpfull to some of you to discover this solution.

    The solution is working with PHP5 and JSON.

    I order to test with different table, I wrote a small PHP file that will get as parameter the table name. So to see the result use the URL :
    Code:
    http://localhost/List.php5?table=sometablename
    All the ExtJS files should be placed into a subdirectory called "scripts".
    The file templaces.inc.php (see below) should be into a subdirectory called "includes".
    If you prefer to put those files somewhere else, please adapt the files according to the changes.

    The file List.php5
    PHP Code:
    <?php
    /***********************************************
        This exemple use a small template engine, like 
        smarty, spip,... that I wrote to have some kind
        of MVC model.
     ***********************************************/
    include_once('./includes/templates.inc.php');

    if (isset(
    $_GET['table'])){
       
    $tablename $_GET['table'];
    } else {
      
    $tablename='box';
    }

    // load the template
    $myTemplate = new template('template/GetMembers.html');

    header('Content-Type: text/html; charset=ISO-8859-15');
    // Replace the variable {tablename} with the name of the table to retrieve data from.
    $myTemplate->variable('tablename'$tablename);
    ob_start();
    echo 
    $myTemplate->traitement();
    ob_end_flush();
    ?>
    The file templates.inc.php
    [PHP]
    <?php
    class template
    {
    private $template;
    private $debug_mode;
    private $fichier;
    private $blocs;
    private $chrono;
    private $debut;

    function template($template, $mode=0, $chrono=FALSE)
    {
    if(is_file($template))
    {
    $this->template=file_get_contents($template);
    $this->fichier=$template;
    }
    else if($mode!='debug')
    {
    echo 'Template introuvable';
    }
    else
    {
    echo 'Template - Erreur. L\'erreur retourn

Similar Threads

  1. Max columns limitation in grid?
    By jarrod in forum Ext 1.x: Bugs
    Replies: 9
    Last Post: 26 Jun 2010, 4:52 AM
  2. Dynamic Columns for Grid
    By kinky_lizzard in forum Ext 1.x: Help & Discussion
    Replies: 7
    Last Post: 24 May 2010, 11:20 PM
  3. Grid - Double Header Columns
    By FuryVII in forum Ext 2.x: Help & Discussion
    Replies: 0
    Last Post: 23 Feb 2007, 7:21 AM
  4. Nested Grid Columns
    By dlibby00 in forum Community Discussion
    Replies: 4
    Last Post: 29 Jan 2007, 9:53 AM

Thread Participants: 30

Turkiyenin en sevilen filmlerinin yer aldigi xnxx internet sitemiz olan ve porn sex tarzi bir site olan mobil porno izle sitemiz gercekten dillere destan bir durumda herkesin sevdigi bir site olarak tarihe gececege benziyor. Sitenin en belirgin ozelliklerinden birisi de Turkiyede gercekten kaliteli ve muntazam, duzenli porno izle siteleri olmamasidir. Bu yuzden iste. Ayrica en net goruntu kalitesine sahip adresinde yayinlanmaktadir. Mesela diğer sitelerimizden bahsedecek olursak, en iyi hd porno video arşivine sahip bir siteyiz. "The Best anal porn videos and slut anus, big asses movies set..." hd porno faketaxi