Suche in grid.Panel auch OneToMany Assoziationen durchsuchen

Hi Leute, ich habe ein grid.Panel, dessen Model mehrere OneToMany Assoziationen hat. Nun möchte ich, dass bei der Suche (oder besser beim FilterPanel) man auch Assoziationen durchsuchen kann. Sprich Model A hat OneToMany Assoziation B mit den Feldern id, value. Nun möchte dass auf dem grid.Panel von Model A alle Einträge erscheinen die einen Wert X im Feld “value” von der Assoziation haben.

An welcher Stelle im Backend Controller setzt ich da an? hab versucht das über die getList zu bewerkstelligen, aber da werden die Filter an den queryBuilder weitergegeben, der natürlich nichts findet und keine ergebnisse anzeigt.

Ok, ich habe es nun so gelöst:

Ich habe ein neues Feld dem Filterpanel hinzugefügt, indem ich beim FilterPanel die function createFilterFields und createFilters erweitere:

createFilterFields: function() {
  var me = this,
      container = me.callParent(arguments);

  var tagField = me.createTagFilterField();
  container.items.add(tagField);  
  return container;
},
createTagFilterField: function() {
  var me = this,
      formField = {};

  formField.xtype = 'textfield';
  formField.anchor = '100%';
  formField.margin = '0 3 7 0';
  formField.labelWidth = 130;
  formField.name = 'tags';
  formField.fieldLabel = 'Tags';

  //create filter field container to add a checkbox for each field.
  return Ext.create('Shopware.filter.Field', {
    field: formField,
    subApp: me.subApp
  });
},
createFilters: function() {
  var me = this;
  me.callParent();
  var values = me.getForm().getValues();

  me.gridPanel.getStore().filters.add(
    'tags',
    Ext.create('Ext.util.Filter', {
      property: 'tags',
      value: values['tags']
    })
  );
}

 

Dadurch bekomme ich beim list request an den Controller property: tags und value: …

page:1
start:0
limit:20
filter:[{"property":"tags","value":"test","operator":null,"expression":null}]

Jetzt kann ich bequem in der getList separate operationen durchführen und nach belieben die Daten raussuchen:

    protected function getList($offset, $limit, $sort = array(), $filter = array(), array $wholeParams = array())
    {
        // capture custom filters from backend list
        foreach ($filter as $condition) {
            if (isset($condition['property']) && $condition['property'] == 'tags') {
                $result = $this->getListByTagFilter($condition['value'], $offset, $limit, $sort, $filter, $wholeParams);
            }
        }

        // fallback if no custom filter was set:
        if (empty($result)) {
            $result = parent::getList($offset, $limit, $sort, $filter, $wholeParams);
        }

        // get additional data
        if ($result && !empty($result) && $result['success']) {
            foreach ($result['data'] as $key => $data) {
                $result['data'][$key] = $this->getAdditionalDetailData($data);
            }
        }

        return $result;
    }