Freitextfeld an Frontend übergeben

In der Doku zu Freitextfeldern wird ja explizit gesagt das nicht alle Freitextfelder überall ans Frontend übergeben werden. Shopware 5 - Einstellungen - Freitextfelder / Attribute

Es wird gesagt das man ein eigenes Plugin dafür benötigt, jedoch habe ich leider gar keinen Ansatzpunkt (auch die Developer Doku verstehe ich einfach nicht gut genug dafür) was dieses Plugin beinhaltet und wie es aufgebaut wird.

Hat jemand schon einmal so ein Plugin geschrieben und könnte vielleicht Teile davon hier posten?
Damit ich einen kleinen Anhaltspunkt habe und mich daran etwas entlanghangeln kann.

Danke sehr!

Um welche Art von Freitextfelder geht es denn? Vielleicht ist ein Plugin gar nicht nötig.

Das gleiche wie im anderen Post :smiley:
Nur dieses mal etwas genauer in die Richtung gefragt wie ich es übergebe.

s_order_attributes soll in account/order_item_details.tpl nutzbar sein.

Hm, ich habe mir das eben mal angeschaut. Die Attribute aus „s_order_attributes“ kann man zwar inerhalb der Bestellung eintragen, werden aber von Shopware nicht an das Frontend übermittelt :frowning: Eigentlich schon wieder totaler Käse. Wenn ich so etwas anlege, dann ist es Bestandteil der Bestellung und sollte auch im Frontend nutzbar sein. Es gibt glaub ich ähnliche Fälle auch bei Bereichen.

Ja, da Shopware das nicht in die Reihe bekommt, muss man wohl in diesem Fall ein Plugin bauen. Bedeutet, man muss sich dafür mit der Plugin-Programmierung befassen. Das ist auch nicht mit wenigen Sätzen oder Code-Beispielen erklärt. Wenn ich Zeit habe, schaue ich mir das mal mit an.

1 Like

Das wäre klasse, vielen Dank!
Ich finde es auch sehr ärgerlich das es nicht übergeben wird. Wie du schon sagst ist es durchaus berechtigt dieses Feld im Frontend nutzen zu wollen

Hab sowas vor langer Zeit mal genutzt. Keine Ahnung ob das noch in der aktuellen Version läuft, kannst du dir ja mal ansehen.

Grüße

1 Like

Einen ähnlichen Ansatz habe ich zum Test mit einem Widges erstellt. Wie hast du aber deine Ausgabe der Attribute an die Liste der Bestellungen weitergereicht? Also an „order_item_details.tpl“ …

Ich habe ebenfalls mal etwas geknobelt und das über ein Widges Controller Plugin gelöst - also so zum Test. In der „order_item_details.tpl“ trage ich dann nur die Short-Code ein, da wo ich die Ausgabe vom bestimmten Attribut haben möchte. Das war jetzt die schnellste Lösung - also für mich. Überlege aber noch, ggf. das Listing der Bestellungen abzufangen und dort die Attribute mit beizupacken. Aber da bin ich aus Zeitgründen noch nicht dazu gekommen - schreibe hier in meiner Kaffeepause bzw. in meiner Freizeit.

Ich glaube so könnte es gehen. Es wird praktisch ein Hilfs-Array „$sOrdersAttribute“ erzeugt welche alle Attribute zur jeweiligen Bestellnummer enthält. Im Template „order_item_details.tpl“ wird nur noch an der gewünschten Position der Inhalt vom Hilfs-Array ausgelesen - also so „{$sOrdersAttribute[$offerPosition.ordernumber][‚attribute1‘]}“ für Spalte „attribute1“.

Das ganze funktioniert jedenfalls unter Shopware 5.7.6

<?php

namespace testOrder;

use Shopware\Components\Plugin;
use Shopware\Components\Plugin\Context\InstallContext;
use Shopware\Components\Plugin\Context\UpdateContext;
use Shopware\Components\Plugin\Context\ActivateContext;
use Shopware\Components\Plugin\Context\DeactivateContext;
use Shopware\Components\Plugin\Context\UninstallContext;


class testOrder extends Plugin {

  /**/
  public function install(InstallContext $context) {
  }

  /**/
  public function activate(ActivateContext $context)  {
    $context->scheduleClearCache(ActivateContext::CACHE_LIST_ALL);
  }

  /**/
  public function update(UpdateContext $context) {
    $context->scheduleClearCache(UpdateContext::CACHE_LIST_ALL);
  }

  /**/
  public function deactivate(DeactivateContext $context) {
    $context->scheduleClearCache(DeactivateContext::CACHE_LIST_ALL);
  }

  /**/
  public function uninstall(UninstallContext $context) {
    if ($context->getPlugin()->getActive()) { $context->scheduleClearCache(UninstallContext::CACHE_LIST_ALL); }
  }

  /**/
  public static function getSubscribedEvents() {
    $events = Array(
    'Enlight_Controller_Action_Frontend_Account_Orders' => 'Frontend_Account_Orders',
    );
    return $events;
  }


  /////////////////////////////////////////////////////////


  /*
  Im Template die Attribute dann so ausgeben:
  {$sOrdersAttribute[Bestellnummer][Name Attributspalte in Datenbank]}
  {$sOrdersAttribute[$offerPosition.ordernumber]['attribute1']}
  */
  public function Frontend_Account_Orders(\Enlight_Event_EventArgs $arguments) {

    $controller = $arguments->getSubject();
  	$request = $controller->Request();
  	$view = $controller->View();

    $admin = Shopware()->Modules()->Admin();
    $destinationPage = (int)$request->sPage;
    $orderData = $admin->sGetOpenOrderData($destinationPage);

    $sOrdersAttribute = [];

    foreach ( $orderData['orderData'] as $val ) {
      $sOrdersAttribute[ $val['ordernumber'] ] = $this->GetOrdersAttribute($val['id']); 
    }

    $view->assign('sOrdersAttribute', $sOrdersAttribute );
  }


  /**/
  public function GetOrdersAttribute( $orderID ) {
    $query = "SELECT * FROM s_order_attributes WHERE orderID = ? ";
    return Shopware()->Db()->fetchRow($query, [ $orderID ] );
  }


}
?>

2 Likes

Klasse!

Vielen Dank.
Ich schaue mal das ich es eingebunden kriege, es sieht aber schon mal vielversprechend aus.

Ich hab das damals nur im Account gebraucht und dementsprechend an den View übergeben.
$AfOrderAttributes wirft dir dann die ganzen Bestellungen mit den Attributen aus.

Grüße

1 Like

Hat wunderbar geklappt.
Nur bei diesem Part musste ich die Anführungszeichen ändern da Shopware sonst nicht laden wollte.
{$sOrdersAttribute[$offerPosition.ordernumber]["attribute1"]} hat funktioniert!

Ja das mit den Anführungszeichen kommt vom Forum, nicht von mir :slight_smile:

1 Like

Ja dachte ich mir fast schon! Vielen Dank nochmal