Hallo,
ich habe ein Plugin programmiert, welches einen override auf sAdmin (sGetOpenOrderData) macht über:
$this->subscribeEvent(‘sAdmin::sGetOpenOrderData::replace’,‘sAdminGetOpenOrderData’);
- Ich mache einen Extend auf -> Shopware_Components_Plugin_Bootstrap
- Das Plugin liegt unter Plugins/local/Frontend
- Da ich mir nicht anders zu helfen wusste, habe ich die Private Funktionen der sAdmin dupliziert in mein Plugin, da ich (Soweit ich sehe), sonst an die Funktionen aus meinem Plugin heraus nicht dran komme.
Hinweis: Sofern ich den print_R($orderData); die; drin lasse, bekomme ich die Werte die ich hinterher brauche.
Nehme ich den block raus, also dass die Funktion sich ganz normal ins Frontend einbringen soll, so wirft bei Aufruf von “Bestellungen” der Shop einen Fehler:
Fatal error: Uncaught TypeError: Argument 1 passed to Shopware_Controllers_Frontend_Account::applyTrackingUrl() must be of the type array, null given, called in [SHOPWARE_PATH]/engine/Shopware/Controllers/Frontend/Account.php on line 137 and defined in [SHOPWARE_PATH]/engine/Shopware/Controllers/Frontend/Account.php:751 Stack trace:
#0 [SHOPWARE_PATH]/engine/Shopware/Controllers/Frontend/Account.php(137): Shopware_Controllers_Frontend_Account->applyTrackingUrl(NULL)
#1 [SHOPWARE_PATH]/engine/Library/Enlight/Controller/Action.php(193): Shopware_Controllers_Frontend_Account->ordersAction()
#2 [SHOPWARE_PATH]/engine/Library/Enlight/Controller/Dispatcher/Default.php(549): Enlight_Controller_Action->dispatch(‘ordersAction’)
#3 [SHOPWARE_PATH]/engine/Library/Enlight/Controller/Front.php(222): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_R in [SHOPWARE_PATH]/engine/Shopware/Controllers/Frontend/Account.php on line 751
Jetzt stellen sich mir 2 Fragen:
-
GIbt es eine Möglichkeit, auf die (Helper) Funktionen von sAdmin zuzugreifen die von der sGetOpenOrderData direkt oder indirekt aufgerufen werden, ohne dass ich die in mein Plugin auslagern und anpassen muss ? Dann hätte ich nur die sGetOpenOrderData mit replace, statt aller helper Funktionen die davon aufgerufen werden.
-
Gehe ich mit den args falsch um ? Oder warum wirft der Shop einen: applyTrackingUrl() must be of the type array, null given, called … ? Für mich ist das nicht so ganz nachvollziehbar, da ich mich an die Vorgaben zur Plugin programmierung gehalten habe, wenn ich das so richtig gesehen habe.
public function sAdminGetOpenOrderData(\Enlight_Event_EventArgs $args)
{
$limitToShop = false; // If true, only orders from current shop are shown
$destinationPage = $args['destinationPage'];
$perPage = $args['perPage'];
$shop = Shopware()->Shop();
$mainShop = $shop->getMain() !== null ? $shop->getMain() : $shop;
$destinationPage = !empty($destinationPage) ? $destinationPage : 1;
$limitStart = Shopware()->Db()->quote(($destinationPage - 1) * $perPage);
$limitEnd = Shopware()->Db()->quote($perPage);
$sql = "
SELECT SQL_CALC_FOUND_ROWS o.*, cu.templatechar as currency_html, cu.symbol_position as currency_position, DATE_FORMAT(ordertime, '%d.%m.%Y %H:%i') AS datum, state.name as stateName
FROM s_order o
LEFT JOIN s_core_currencies as cu
ON o.currency = cu.currency
LEFT JOIN s_core_states as state ON state.id = o.status
WHERE userID = ? AND status != -1";
if ($limitToShop == true) $sql .= " AND subshopID = ?";
$sql .= " ORDER BY ordertime DESC LIMIT $limitStart, $limitEnd";
$params[0] = Shopware()->Session()->offsetGet('sUserId');
if ($limitToShop == true) $params[1] = $mainShop->getId();
$getOrders = Shopware()->Db()->fetchAll($sql, $params);
$foundOrdersCount = (int) Shopware()->Db()->fetchOne('SELECT FOUND_ROWS()');
foreach ($getOrders as $orderKey => $orderValue) {
$getOrders[$orderKey]['invoice_amount'] = $this->moduleManager->Articles()
->sFormatPrice($orderValue['invoice_amount']);
$getOrders[$orderKey]['invoice_amount_net'] = $this->moduleManager->Articles()
->sFormatPrice($orderValue['invoice_amount_net']);
$getOrders[$orderKey]['invoice_shipping'] = $this->moduleManager->Articles()
->sFormatPrice($orderValue['invoice_shipping']);
$getOrders = $this->processOpenOrderDetails($orderValue, $getOrders, $orderKey);
$getOrders[$orderKey]['dispatch'] = $this->sGetPremiumDispatch($orderValue['dispatchID']);
}
$filters['subject'] = $this;
$filters['id'] = Shopware()->Session()->get( "sUserId" );
if ($limitToShop == true) $filters['subshopID'] =Shopware()->Container()->get('shopware_storefront.context_service')->getShopContext()->getShop()->getId();
$orderData['orderData'] = $getOrders;
$getOrders = Shopware()->Events()->filter('Shopware_Modules_Admin_GetOpenOrderData_FilterResult',$getOrders, $filters);
if ($limitEnd != 0) {
// Make Array with page structure to render in template
$numberOfPages = ceil($foundOrdersCount / $limitEnd);
} else {
$numberOfPages = 0;
}
$orderData['numberOfPages'] = $numberOfPages;
$orderData['pages'] = $this->getPagerStructure($destinationPage, $numberOfPages);
echo "";
print_R($orderData);
die;
return $orderData;
}
Ach ja, eigentlich wollte ich mit dem Plugin nix anderes machen, als den Query von dem Shop lösen. Also dass man alle Shopbestellungen aller Shops sehen kann.
Danke schonmal für Anregungen bzw. Hilfen