Hallo alle zusammen,
ich hätte da mal ein ganz seltsames Problem. Und zwar hab ich bei den Bestellungen eine neue action column eingebaut, die einen AJAX request rausschickt an den Controller des Plugins (Code folgt). Dieser Controller macht nichts als sich ein paar IDs rauszuholen und eine Instanz einer Klasse zu erzeugen, die sämtliche Daten der Bestellung raussucht und dann über einen weiteren Call an eine andere API weiterschickt. Nachdem der Controller durchgelaufen ist, sind plötzlich sämtliche Dokumente meiner Bestellung dupliziert, obwohl das Plugin zu keinem Zeitpunkt irgendwo Daten in die Datenbank schreibt. Hier mal etwas code…
Xyz/Views/backend/xyz/order/view/list.js
//{block name="backend/order/view/list/list" append}
Ext.define('Shopware.apps.xyz.order.view.list.List', {
override: 'Shopware.apps.Order.view.list.List',
createActionColumn: function() {
var me = this;
var actionItems = me.callParent(arguments);
actionItems.width = actionItems.width + 16;
actionItems.items.push(me.createSendOrderColumn());
return actionItems;
},
createSendOrderColumn: function () {
var me = this;
return {
iconCls: 'c-sprite-xyz-sendOffer',
action: 'xyzSendOrder',
tooltip: '{s name="xyz_send_order_tooltip"}Die Bestellung an Lex Office übertragen.{/s}',
getClass: function (val, meta, rec) {
if(rec.raw.attribute.xyz_order_sent === "1") { 'x-hidden'; }
else { return ''; }
},
handler: function(grid, rowIndex, colIndex) {
var record = grid.getStore().getAt(rowIndex);
Ext.Ajax.request({
url: '{url controller="Xyz" action="sendOrderToLO"}',
method: 'POST',
params: {
ordernumber: record.get('number')
},
beforeSend: Shopware.Notification.createGrowlMessage('{s name="xyz_send_order_note"}Hinweis{/s}', '{s name="xyz_send_order_initiated"}Die Bestellung wird übertragen.{/s}'),
success: function(response, opts)
{
var operation = Ext.decode(response.responseText);
if (operation.success === true) {
Shopware.Notification.createGrowlMessage('{s name="xyz_send_order_note"}Hinweis{/s}', '{s name="xyz_send_order_success"}Die Bestellung wurde erfolgreich übertragen.{/s}');
grid.getStore().load();
}
else {
Shopware.Notification.createGrowlMessage('{s name="xyz_send_order_note"}Hinweis{/s}', '{s name="xyz_send_order_error"}Die Bestellung konnte nicht übertragen werden! Es wird zu einem späteren Zeitpunkt nochmal versucht.{/s}');
}
}
});
}
}
}
});
//{/block}
Hier der Controller dazu:
Container();
$config = Shopware()->Plugins()->Backend()->Xyz()->Config();
$path = Shopware()->Plugins()->Backend()->Xyz()->Path();
$ordernumber = $this->Request()->get('ordernumber');
$repository = Shopware()->Models()->getRepository('Shopware\\Models\\Order\\Order');
$builder = $repository->createQueryBuilder('orders');
$builder->select()
->where('orders.number = ?1')
->setParameter(1, $ordernumber);
$query = $builder->getQuery();
/**
* @var \Shopware\Models\Order\Order $order
*/
$order = $query->getOneOrNullResult();
if (!$order) {
return false;
}
$docs = $order->getDocuments();
if ($docs && $docs->count() > 0)
{
$docSubscriber = new Document($container, $path, $config);
foreach ($docs as $document)
{
$docSubscriber->processDocument($document);
}
$this->setOrderDataSent($order->getId());
return $this->View()->assign([
'success' => true,
]);
} else {
return $this->View()->assign([
'success' => false,
]);
}
}
public function setOrderDataSent($orderID) {
$sql = 'UPDATE s_order_attributes
SET Xyz_order_sent = 1
WHERE orderID = ?;';
/** @var $connection \Doctrine\DBAL\Connection */
try
{
$connection = $this->get('dbal_connection');
}
catch (Exception $e) { }
try
{
$connection->executeQuery($sql, array($orderID));
}
catch (DBALException $e) { }
}
}
Die Zeile, die das instanziieren der Document klasse beinhaltet, ist code der bereits in diesem Plugin war und ich nur aufrufe (Das Plugin darf vom Hersteller aus von mir für unsere Zwecke erweitert werden). Dieser macht aber auch nichts anderes, als sich das Dokument per ID zu holen, aus dessen Struktur ein Array zu bilden und dieses dann an die externe API zu schicken. Ich hab schlichtweg keinen Schimmer wie es dazu kommen kann. Ich weiß aber, dass das Problem nicht bestand vor meiner Erweiterung (An der Document klasse kann es daher ja nicht liegen?) und ich weiß, dass es durch den Klick auf den Button in den Bestellungen ausgelöst wird - sehe nur gar keinen Zusammenhang.
Für Hilfe wäre ich echt dankbar!