Hallo liebe shopware - Gemeinde,
beim Versuch, ein Plugin mit einem Freitextfeld in Form eines Auswahlfeldes (inklusive eigenem Model etc) kompatibel mit Shopware 5.2.0 zu machen, komme ich nicht weiter. Der vorhandene Code ist (von Shopware selbst) dieser hier: Backend Components - Basics . Das Plugin klappte bis Shopware Version 5.1.6 natürlich problemlos.
Unter Shopware 5.2.0 erzeugt man ja ein Auswahlfeld durch single_selection : Attribute system . Nur sieht ja jetzt aber das updateSchema und vorallem das Model eines Plugins, was nur ab Shopware Version 5.2.0 funktionieren soll, völlig anders aus.
Der Code von Shopware bis 5.1.6 des updateSchema:
protected function updateSchema(){
$this->registerCustomModels();
$em = $this->Application()->Models();
$tool = new \Doctrine\ORM\Tools\SchemaTool($em);
$classes = array(
$em->getClassMetadata('Shopware\CustomModels\Mymodel\Mymodel')
);
try {
$tool->dropSchema($classes);
} catch (Exception $e) {
}
$tool->createSchema($classes);
}
Der Code von Shopware bis 5.1.6 des Models:
namespace Shopware\CustomModels\Mymodel;
use Shopware\Components\Model\ModelEntity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="s_core_mymodel")
*/
class Mymodel extends ModelEntity{
/**
* @var integer $id
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $storagelocation
*
* @ORM\Column(type="text", nullable=true)
*/
private $name;
/**
* @return int
*/
public function getId(){
return $this->id;
}
/**
* @param string $storagelocation
*/
public function setName($name){
$this->name= $name;
}
/**
* @return string
*/
public function getName(){
return $this->name;
}
}
Ich habe vorerst probiert, das updateSchema als auch das Model so zu belassen (da es ja auch abwärtskompatibel sein soll) und das Freitextfeld folgendermaßen zu erzeugen:
$service = $this->get('shopware_attribute.crud_service');
$service->update(
's_articles_attributes',
'attr_text',
'single_selection',
[
'label' => 'MyText',
'supportText' => '',
'translatable' => false,
'displayInBackend' => true,
'position' => 1,
'custom' => false,
'entity' => \Shopware\CustomModels\Mymodel\Mymodel
],
null,
true
);
Leider wird mir nun kein einziger Wert im Auswahlfeld des Freitextfeldes angezeigt (es sind im Model aber natürlich genug Werte enthalten, das Auswahlfeld hat ja vorher auch funktioniert). Ich schätze mal, dass das entity nicht passt - ich habe da auch schon ein paar andere Möglichkeiten getestet, leider funktioniert keine.
Das updateSchema unter Shopware 5.2.0 sieht ja nun folgendermaßen aus:
$service = $this->container->get('shopware_attribute.crud_service');
//generates the database schema for the own entity SwagAttribute
$em = $this->container->get('models');
$schemaTool = new SchemaTool($em);
$schemaTool->updateSchema(
[$em->getClassMetadata(\SwagAttribute\Models\SwagAttribute::class)],
true
);
$service->update(
's_articles_attributes',
'my_multi_selection',
'multi_selection',
[
'entity' => \SwagAttribute\Models\SwagAttribute::class,
'displayInBackend' => true,
'label' => 'My multi selection',
],
null,
true
);
Das Model unter Shopware 5.2.0 sieht ja nun folgendermaßen aus:
namespace SwagAttribute\Models;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="s_test")
* @ORM\Entity
*/
class SwagAttribute
{
/**
* @var integer $id
*
* @ORM\Column(type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $name
*
* @ORM\Column(type="string", length=500, nullable=false)
*/
private $name;
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
}
Hat einer einen Tipp für mich, wie das entity aussehen müsste?
Beste Grüße
Sebastian