Plugin programmiert, was mache ich falsch ?

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

Niemand eine Idee ?

Ich hab die Exception nochmal etwas genauer analysiert, und gesehen, dass der Fehler durch die engine/Shopware/Controllers/Frontend/account.php hervorgerufen wird, wobei die restlichen Sachen der Exception wohl folgefehler sind, weil die $orderData wohl nix kriegt
 

    public function ordersAction()
    {
        $destinationPage = (int) $this->Request()->sPage;
        $orderData = $this->admin->sGetOpenOrderData($destinationPage);
        $orderData = $this->applyTrackingUrl($orderData);

        $this->View()->assign('sOpenOrders', $orderData['orderData']);
        $this->View()->assign('sNumberPages', $orderData['numberOfPages']);
        $this->View()->assign('sPages', $orderData['pages']);

        //this has to be assigned here because the config method in smarty can't handle array structures
        $this->View()->assign('sDownloadAvailablePaymentStatus', Shopware()->Config()->get('downloadAvailablePaymentStatus'));
    }

Hieraus resultierend stellt sich jetzt die Frage für mich, warum der call $orderData = $this->admin->sGetOpenOrderData($destinationPage); in der account.php scheinbar keine Werte kriegt.