SW 5.2 - REST API erweitern. Wie?

Hallo,

ich finde keinerlei Informationen, wie ich die API in SW 5.2 erweitern kann. Ich möchte gerne, dass beim Aufruf von api/articles im Ergebnis zusätzlich das Bild des Artikels ausgeliefert wird.

Ich habe nun ein Plugin namens „FpApi“ erstellt und folgenden Inhalt darin:

 

namespace FpApi;

use Shopware\Components\Plugin;
use Doctrine\Common\Collections\ArrayCollection;

class FpApi extends Plugin {

    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PreDispatch_Api_Articles' => 'onFrontendPostDispatchApiArticles'
        ];
    }//function



}

 

 

Dann habe ich in meinem Plugin Ordner FpApi/Controllers/Api/ eine Datei abgelegt, die folgendes macht:

class Shopware_Controllers_Api_DepositArticles extends Shopware_Controllers_Api_Rest {
    
    protected $resource = null;

    public function init()
    {
        $this->resource = \Shopware\Components\Api\Manager::getResource('article');
    }

    /**
     * Get list of article
     *
     * GET /api/articles/
     */
    public function indexAction()
    {
        $limit  = $this->Request()->getParam('limit', 1000);
        $offset = $this->Request()->getParam('start', 0);
        $sort   = $this->Request()->getParam('sort', array());
        $filter = $this->Request()->getParam('filter', array());

        $result = $this->resource->getList($offset, $limit, $filter, $sort);

        $this->View()->assign($result);
        $this->View()->assign('success', true);
    }

}

 

Nun frage ich mich - benötige ich in meiner FpApi.php überhaupt getSubscribedEvents? Und wie mache ich es möglich das meine indexAction in meinem Controller beim Aufruf von api/articles angesprochen wird? Ich würde mir wünschen es gäbe hierzu ein offizielles Tutorial.

Danke!

 

Hallo,

ich bin nicht sicher. aber ich glaube Sie können „forward“ funktion benuzten.

Mit diese funktion können Sie das Request forward zu deine Controller.

und nicht vergessen " Register your plugin controller"

https://developers.shopware.com/developers-guide/plugin-system/#register-plugin-controller-with-template

Viele Grüße,

Ahmad

Hallo Ahmad,

danke Dir für deine Antwort. Register your plugin Controller muss ich doch nur machen, wenn ich in diese mFall ein Template benutzen möchte - das möchte ich ja nicht, ich möchte nur den Api Controller verwenden.

Ich habe gedacht, dass durch das Event “Enlight_Controller_Action_PreDispatch_Api_Articles” mein Plugin angesprochen wird, wenn api/articles/ aufgerufen wird. Ich weiß nur nicht, wie ich von meiner FpApi.php auf meinen Controller komme.

Hallo,

Benutzen Sie in ihr ‚onFrontendPostDispatchApiArticles‘ funktion das ‚forward‘ funktion.

 

Wir holen uns über einen 2. API Call die Image Information.

$ergebnis = $client->get(‘articles/Fotolia_XXL_36482210?useNumberAsId=true’);
$media = $client->get(‘media/’ . $ergebnis[‘data’][‘images’][0][‘mediaId’]);
$bild = $media[‘data’][‘path’];
echo $bild;

Wäre das für euch eine Option?

Hallo Matthias,

geht so - meine Idealvorstellung ist, dass ich einfach das $result aus der indexAction nehme, dort die ArticleID auslesen, eine Abfrage auf das Model mache, $result dementsprechend erweitere und zurückgebe. 

Das bekomme ich auch hin, wenn ich wüsste wie ich es in meiner Plugin-Konfiguration hinbekomme, dass das Plugin überhaupt aufgerufen wird wenn ich api/articles eingebe.

Ich habe testweise in meinen Controller im Plugin geschrieben:  $this->View()->assign(‚test‘); - aber wenn ich api/articles aufrufe, sehe ich alle Artikel. Also irgendwie scheint mein Plugin beim Event api/articles gar nicht ausgeführt zu werden…

He he, @matthiasftl beschreibt eine saubere Lösung, Du schreibst, dass du was hinbekommst aber dann doch nicht… nimmt doch das was geht.

1 „Gefällt mir“

@NextMike‍ - Sehe ich eben nicht so. Denn es ist mir nicht klar, wie ich aus meiner FpApi.php meinen Controller ansteuern kann. 

FpApi.php:

 'onFrontendPostDispatchApiArticles'
        ];
    }//function

    public function onFrontendPostDispatchApiArticles(\Enlight_Event_EventArgs $args) {
    }
}

Wie sage ich hier in onFrontendPostDispatchApiArticles(), dass bei der /api/articles meine indexAction() in meinem Controller Shopware_Controllers_Api_DepositArticles() aufrufen soll.

 

@matthiasftl‍ - Wo führt ihr denn euren Code aus? Im Controller oder in eurer Plugin Bootstrap?

 

Wir nutzen ein eigenes PHP Script mit der Rest API von Shopware, wo wir die Produkte im Shop generieren.

Hallo @elbsurfer‍,

ich gluabe, bis jetzt haben Sie nicht “forward” funktion probieren.

also zuerst “Register your plugin controller” ist etwas Sie müssen hinzufügen, damit Shopware weiß, welche Datei für Ihren Controller verantwortlich ist.

Ihre Plugin darf sein:

namespace FpApi;

use Shopware\Components\Plugin;
use Doctrine\Common\Collections\ArrayCollection;

class FpApi extends Plugin {

	public static function getSubscribedEvents()
	{
		return [
			'Enlight_Controller_Dispatcher_ControllerPath_Api_DepositArticles' => 'onDepositArticlesController',
			'Enlight_Controller_Action_PreDispatch_Api_Articles' => 'onApiPreDispatchArticles'
		];
	}

	public function onDepositArticlesController()
	{
		return $$this->getPath() . '/Controllers/Api/DepositArticles.php';
	}

	public function onApiPreDispatchArticles(\Enlight_Event_EventArgs $args) {
		/**@var $controller \Shopware_Controllers_Api_Articles*/
		$controller = $args->getSubject();

		/**
		 * @var $request \Zend_Controller_Request_Http
		 */
		$request = $controller->Request();

		/**
		 * @var $response Zend_Controller_Response_Http
		 */
		$response = $controller->Response();

		// This for forward all actions
		$controller->forward($request->getActionName(),'DepositArticles');

		// This for forward just the action you want e.g "index"
		if($request->getActionName() == 'index'){
			$controller->forward($request->getActionName(),'DepositArticles');
		}
	}
}

und ich habe “onFrontendPostDispatchApiArticles” zu “onApiPreDispatchArticles” geänderet, weil deine Subscribe ist für Api module nicht frontend und PreDispatch event nict PostDispatch. (dass nur um der Name mehr Logic werde).

Viele Grüße,

Ahmad

1 „Gefällt mir“

Hallo Elbsurfer,

 

stehe vor einem ähnlichem Problem. Würde gerne im ListAll die Artikelnummer mit drin haben. Bist du eventuell schon weitergekommen und hast das Problem gelöst?

Aktuell muss ich per Listall mir die Artikel holen und dann in einer Schleife jeden Artikel per getbyid mit der ID aus dem Listall holen. Das dauert extrem lange. Dabei brauch ich eigentlich nur die doofe Artikelnummer.

 

LG