getSupplierListQueryBuilder um attribute erweitern

Ich muss den QueryBuilder der Helper Funktion für Supplier erweitern, damit ich die Attribute Felder im Backendlisting ausgeben kann.

 

public function getSupplierQuery(Enlight_Hook_HookArgs $args)
    {
        $builder = $args->getReturn();
        $builder->addSelect(
            array(
                'attribute.md_contact as md_contact',
                'attribute.md_fon as md_fon',
                'attribute.md_email as md_email'));

        $builder->LeftJoin('supplier.attribute', 'attribute');
        $args->setReturn($builder);
    }

Was ist hier falsch ?

Ich habe keinen Zugriff auf die Attributes Felder im Listing

Niemand ne Idee ? Ich bekomm immer ne Doctrine Exception.

Der Fehler lautet:

Fatal error: Uncaught exception ‘Doctrine\ORM\Query\QueryException’ with message ‘SELECT supplier.id as id, supplier.name as name, supplier.image as image, supplier.link as link, supplier.description as description, COUNT(articles.id) as articleCounter, attribute.md_contact as md_contact, attribute.md_fon as md_fon, attribute.md_email as md_email FROM Shopware\Models\Article\Supplier supplier LEFT JOIN supplier.articles articles LEFT JOIN supplier.attribute attribute GROUP BY supplier.id ORDER BY name ASC’ in /html/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:41 Stack trace: #0 /html/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(483): Doctrine\ORM\Query\QueryException::dqlError(‘SELECT supplier…’) #1 /html/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(759): Doctrine\ORM\Query\Parser->semanticalError(‘Class Shopware\…’, Array) #2 /html/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(279): Doctrine\ORM\Query\Parser->processDeferredPathExpression in /html/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php on line 63 503 Service Unavailable

Entsprechend gesetzt wurden auch die Attributes Felder

 

//{block name="backend/supplier/model/attribute/fields" append}

{ name : 'md_fon', type : 'string' },
{ name : 'md_email', type : 'string' },
{ name : 'md_contact', type : 'string' },
//{/block}

 

hi

 

kann hier keiner helfen ?

Hallo Megadruck,

in der Shopware Doku steht doch:

Attention : Although the field names are defined in snake_case when created using the CRUD-service, you need to use camelCase in name attributes.

Schau Dir mal Dein ArticleSupplier Attribut Model an. Hier müssten deine Attribute alle im CamelCase stehen.

Also im Query Builder einfach folgendes selektieren:

$builder->addSelect(
            array(
                'attribute.mdContact as md_contact',
                'attribute.mdFon as md_fon',
                'attribute.mdEmail as md_email'));

 

Habe ich auch schon gelesen und getestet. Hat auch nichts gebracht. Oder meinste, dass die in der DB auch so angelegt werden müssen ?

@megadruck schrieb:

Habe ich auch schon gelesen und getestet. Hat auch nichts gebracht. Oder meinste, dass die in der DB auch so angelegt werden müssen ?

Hallo,

versuch es mal eher so:

//{block name="backend/supplier/model/attribute/fields" append}
{ name : 'mdFon', type : 'string' },
{ name : 'mdEmail', type : 'string' },
{ name : 'mdContact', type : 'string' },
//{/block}

und:

$builder = $args->getReturn();

$builder->addSelect(
     array(
          'attribute.mdContact as md_contact',
          'attribute.mdFon as md_fon',
          'attribute.mdEmail as md_email'
     )
);

$builder->LeftJoin('supplier.attribute', 'attribute');

$args->setReturn($builder);

Beste Grüße

Sebastian

Also wie hast Du die Attribute denn angelegt?

Via Crud Service oder über die Freitextfeld Verwaltung im Backend oder direkt auf der DB?

Wie sind deine Attribute denn im Model definiert?

Schau mal unter var/cache/production_2017…/doctrine/attributes/ArticleSupplier.php und poste mal die Definition Deiner Attribute.

Das hatte ich auch schon in betracht gezogen und getestet. Leider hatte sich da nichts geändert.

Aber ich werde es mir jetzt nochmal anschauen

Da dieser immer abbricht mit dem Fehler ist, wird im cache auch nichts angelegt.

 

 

 

Für mich sieht es so aus, dass die Attribute nicht im Model vorhanden sind.

Du hast anscheinend immer noch nicht in der ArticleSupplier.php nachgeschaut?!

Falls Du die Attribute dort nicht findest, einfach mal die Models neu generieren.

Am besten via SSH ./console sw:generate:attributes

Backend neu laden und fertig!

1 „Gefällt mir“

Jetzt wurde das MOdel generiert.

Fehler war:

       $this->get('models')->generateAttributeModels(
            array(
                's_order_attributes',
                 's_articles_supplier_atributes'
            )

Wer siehts  ? :slight_smile:

 

Nicht desto trotz gibt es keine Ausgabe. Da muss ich mal weiterschauen.

 

class ArticleSupplier extends ModelEntity
{
    

    /**
     * @var integer $id
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(name="id", type="integer", nullable=false)
     */
     protected $id;


    /**
     * @var integer $articleSupplierId
     *
     * @ORM\Column(name="supplierID", type="integer", nullable=true)
     */
     protected $articleSupplierId;


    /**
     * @var string $mdFon
     *
     * @ORM\Column(name="md_fon", type="string", nullable=true)
     */
     protected $mdFon;


    /**
     * @var string $mdEmail
     *
     * @ORM\Column(name="md_email", type="string", nullable=true)
     */
     protected $mdEmail;


    /**
     * @var string $mdContact
     *
     * @ORM\Column(name="md_contact", type="string", nullable=true)
     */
     protected $mdContact;


    /**
     * @var \Shopware\Models\Article\Supplier
     *
     * @ORM\OneToOne(targetEntity="Shopware\Models\Article\Supplier", inversedBy="attribute")
     * @ORM\JoinColumns({
     * @ORM\JoinColumn(name="supplierID", referencedColumnName="id")
     * })
     */
    protected $articleSupplier;
    


    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
        return $this;
    }
    

    public function getArticleSupplierId()
    {
        return $this->articleSupplierId;
    }

    public function setArticleSupplierId($articleSupplierId)
    {
        $this->articleSupplierId = $articleSupplierId;
        return $this;
    }
    

    public function getMdFon()
    {
        return $this->mdFon;
    }

    public function setMdFon($mdFon)
    {
        $this->mdFon = $mdFon;
        return $this;
    }
    

    public function getMdEmail()
    {
        return $this->mdEmail;
    }

    public function setMdEmail($mdEmail)
    {
        $this->mdEmail = $mdEmail;
        return $this;
    }
    

    public function getMdContact()
    {
        return $this->mdContact;
    }

    public function setMdContact($mdContact)
    {
        $this->mdContact = $mdContact;
        return $this;
    }
    

    public function getArticleSupplier()
    {
        return $this->articleSupplier;
    }

    public function setArticleSupplier($articleSupplier)
    {
        $this->articleSupplier = $articleSupplier;
        return $this;
    }
    
}

 

Jetzt geht alles. Danke für Eure Hilfe