Hallo zusammen,
ich habe ein Problem mit der Erweiterung der Artikelliste im Backend. Mit Artikel-Attributen bekomme ich das relativ einfach hin. Nun möchte ich aber eine Spalte mit dem Inhalt eines eigenen Models integrieren und auch filterbar machen.
Ich habe ein Model custom/plugins/FpDemandPlanning/Models/Supplier.php -> hier habe ich das Feld $name, welches ich auslesen will.
Ich habe mich nun an diese beiden Events gehängt:
'SwagMultiEdit_Product_DqlHelper_getColumnsForProductListing_filterColumns' => 'filterBackendArticleColumns',
'SwagMultiEdit_Product_DqlHelper_getJoinColumns_filterColumns' => 'joinBackendArticleColumns',
public function filterBackendArticleColumns(\Enlight_Event_EventArgs $args) {
$result = $args->getReturn();
$shownColumns = $args->get('defaultColumns');
$columnPositions = array_flip($shownColumns);
$alias = 'FpDemandPlanning_Supplier';
$result['FpDemandPlanningSupplier'] = array(
'entity' => 'Supplier',
'field' => 'name',
'editable' => false,
'type' => 'string',
'nullable' => true,
'allowInGrid' => true,
'columnName' => 'name',
'alias' => $alias,
'table' => 'fp_demand_planning_supplier',
'show' => in_array($alias, $shownColumns),
'position' => array_key_exists($alias, $columnPositions) ? $columnPositions[$alias] : -1,
);
return $result;
}
public function joinBackendArticleColumns(\Enlight_Event_EventArgs $args) {
$join = $args->getReturn();
$join['FpDemandPlanning\Models\Supplier'] = 'FpDemandPlanning\Models\Supplier';
return $join;
}
Den /Shopware/Components/MultiEdit/Resource/Product/DqlHelper.php habe ich wie folgt erweitert, um die Spalte mit Daten zu füllen.
public function getDefaultColumns()
{
$columns = parent::getDefaultColumns();
$columns[] = 'FpDemandPlanning_Supplier';
return $columns;
}
public function getProductForListing($detailId) {
$article = parent::getProductForListing($detailId);
$articleObj = $this->getModelManager()->find(Article::class, $detailId);
$service = $this->container->get('fp_dashboard.dashboard_service');
$supplier = $service->getArticleFpSupplier($articleObj);
$article['FpDemandPlanning_Supplier'] = $supplier['name'];
return $article;
}
Beim Aufruf der Artikelliste erhalte ich nun folgende Fehlermeldung in SW:
Ups! Ein Fehler ist aufgetreten! Die nachfolgenden Hinweise sollten Ihnen weiterhelfen. [Semantical Error] line 0, col 147 near ‘WHERE detail.kind’: Error: Class ‘WHERE’ is not defined. in vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php on line 63 Stack trace: #0
Ich habe danach nachgesehen, woher das detail.kind überhaupt kommt, und sehe hier im DqlHelper.php die Funktion getDqlFromTokens , dort werden die Tokens durchgegangen und bei ISMAIN steht:
case 'ISMAIN':
$newTokens[] = ' detail.kind = 1 ';
continue 2;
Ich glaube, ich muss nun in der SwagMultiEdit_Product_DqlHelper_getJoinColumns_filterColumns die tokens ermitteln und auf Basis der Tokens überhaupt den Join durchführen, aber was sind die Tokens überhaupt? Muss ich ggf einen eigenen Token definieren, der nichts weiter mit meiner SQL macht? Wie kann ich das hier lösen, das er bei einem Token gar nichts macht, außer das er mir mein Ergebnis liefert und dieses filterbar ist?
Das ist ein etwas komplexeres Thema und ich hoffe jemand liest sich das Ganze durch kann mir helfen
Danke!