[Solved] PLG Entwickl.: Combo Freitextfeld -> Kategorien IDs -> Kategorienamen in Frontend

Hallo alle,

ich versuche ein Plugin zu entwickeln und bin schon auf dem Weg, zumindest steht ein Array in Template zu verfügung und SW crash nicht mehr.
Ich will die Werte eines Combo Freitextfeld für Artikel verarbeiten und in Frontend (Detailansicht) in einem Tab zeigen.

Für jede Produkt (Tintenpatronen) das Combo Freitextfeld bietet die Möglichkeit andere Kategorien zu zeigen (die Passende Drucker):

Das Plugin scheint zu funktionieren, aber ich habe noch Schwierigkeiten um Kategorienamen nach ID zu bekommen.
Habe nur die IDs der Passenden Kategorien.

Hier, einige Zeilen des Plugin:

class RouteSubscriber implements SubscriberInterface {
	private $pluginDirectory;
	private $config;

	public static function getSubscribedEvents()
	{
       return [
           'Enlight_Controller_Action_PostDispatchSecure' => 'writePassende',
		   'Enlight_Controller_Action_PostDispatch_Frontend_Detail' => 'getCategoriesName'
	   ];
	}

 

Die erste Funktion, die mein Combo Freitextfeld passende aufruft und prozessiert:

public function writePassende(\Enlight_Controller_ActionEventArgs $args) {
  $controller = $args->getSubject();
  $request = $controller->Request();
  $response = $controller->Response();
  $view = $controller->View();	
  $controllerName = $request->getControllerName();
		
  $view->addTemplateDir($this->pluginDirectory . '/Resources/views');
		
  // Only in Frontend
  if(!$request->isDispatched() || $response->isException() || ($request->getModuleName()!='frontend' && $request->getModuleName()!="widgets")) {
            return;
  }			
		
 // From string |12|26|22| to Array [12,26,22]
 $atr = explode("|", substr($view->sArticle['passende'], 1, -1));	
 $view->assign('digiPassendeCatsIDs', $atr);

}

Das Array digiPassendeCatsIDs steht in Frontend/Template zu verfügung, also NO PROBLEM! Das Plugin läuft!

Ich möchte aber die Werte dieses Array in meinem Plugin weiter verarbeiten und die entsprechende Kategoriename nach IDs zu bekommen.
Also:

catID = 12 ; Name: Accessoires
catID = 26 : Name: Coffee
catID = 22 ; Name: Sweet

sobald ich alle zwei Elemente habe, kann ich in Template (Detailansicht) ein Tab erstellen mit Links und URLs:

{foreach $digiPassendeCatsIDs as $value}
  KATEGORIENAMEN !!!
{/foreach}

Ich finde aber noch keine Lösung um Kategorienamen nach IDs zu bekommen.
URLs sind aber ganz ok…

Soll ich andere Events im Plugin aufrufen?
Soll ich eine SQL Query schreiben? Wenn ja, gibt es irgendwelche Beispiel?

Habe Tagelang im Forum gesucht und auch andere Plugins analysiert…

Foot-in-Mouth

Danke, ciao!

PS: es ist anstrengend, aber die Entwicklung macht Spaß

Du kannst den Kategorie Service Benutzen um die Kategorien zu holen :slight_smile:

1 „Gefällt mir“

Danke Shyim für deine Antwort,

ich versuche weiter in Forum mehr Informationen über " Kategorie Service" oder „Services“ zu finden, aber es sieht schwierig aus…
Leider, bin ich mit SW Entwicklung noch nicht so fit… Blush

Irgendwelche Reference in Developer Guide?
Auch Das Handbuch von Nögel hilft mir nicht über Services
Etwas schon in SW gebaut, wo ich die Struktur und Prozedur sehen kann?
Vielleicht in deinem „ShyimAttributeTransformer“ PLG? Wink

Danke, ciao!
 

Ich habe alles versucht, ich weiss es nicht wie ich einfach Kategoriename nach ID bekommen kann.
Kategorie Service ist da, aber sagt mir gar nichts… das Method (getList) brauche ich nicht…

public function getCategoriesName(\Enlight_Controller_ActionEventArgs $args) {
		
 $controller = $args->getSubject();
 $request = $controller->Request();
 $response = $controller->Response();
 $view = $controller->View();
		
 $passendeCatIDs = explode("|", substr($view->sArticle['passende'], 1, -1));

// I get this: (also, My Array von Freitextfelder mit Kat. IDs)
// [0 => 12]
// [1 => 26]
// [2 => 22]
		
 $context = $this->contextService->getShopContext();
 $categorie = Shopware()->Container()->get('shopware_storefront.category_service')->getList($passendeCatIDs, $context);
		
// I get this:
// [12 => Shopware\Bundle\StoreFrontBundle\Struct\Category Object (0)]
// [26 => Shopware\Bundle\StoreFrontBundle\Struct\Category Object (0)]
// [22 => Shopware\Bundle\StoreFrontBundle\Struct\Category Object (0)]
		
...
...

Kein großes Sprung …

YEAH!!!

public function getCategoriesName(\Enlight_Controller_ActionEventArgs $args) {
		
   $controller = $args->getSubject();
   $request = $controller->Request();
   $response = $controller->Response();
   $view = $controller->View();
		
   $passendeCatIDs = explode("|", substr($view->sArticle['passende'], 1, -1));
		
   $context = $this->contextService->getShopContext();
   $categories = Shopware()->Container()->get('shopware_storefront.category_service')->getList($passendeCatIDs, $context);
		
   $categoriesArray = $this->convertCategories($categories);	
		
   $view->assign('digiData', $categoriesArray);
		
// Only in Frontend ===
if(!$request->isDispatched() || $response->isException() || ($request->getModuleName()!='frontend' && $request->getModuleName()!="widgets")) {
            return;
        }
}
	
private function convertCategories($categories) {
   $converter = Shopware()->Container()->get('legacy_struct_converter');
   return array_map(function (Category $category) use ($converter) {
    $data = [
      'id' => $category->getId(),
      'name' => $category->getName()
    ];
  return $data;
  }, $categories);
}

In Output bekomme ich dies Multidim. Array:

Smarty_Variable Object (3)
->value = Array (3)
  12 => Array (2)
    id => 12
    name => "Accessoires"
  22 => Array (2)
    id => 22
    name => "Sweets (Liste)"
  26 => Array (2)
    id => 26
    name => "Coffee"
->nocache = null
->scope = "snippet:frontend/detail/tabs.tpl"

Genau was ich brauchte…

PS: In Struktur Advanced Menu geschaut…