Länderauswahl in Controller einfügen (DependencyInjection)

Hallo,

ich würde gerne auf einer Seite ein Dropdown mit den verschiedenen Ländern zur Verfügung stellen (so wie z.B. auf /account/register). Dafür habe ich mir die Registrierungsseite mal angeschaut und gesehen, dass die „Shopware\Core\System\Country\CountryCollection“ eingefügt wird. Als ich dies in der service.xml versucht hatte, bekam ich den Fehler, dass eine Abhängigkeit besteht und ich stattdessen die „Shopware\Core\System\Country\CountryDefinition“ einfügen soll.

        <service id="Plugin\Storefront\Controller\MeinController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="Shopware\Storefront\Page\GenericPageLoader"/>
            <argument type="service" id="Shopware\Core\System\Country\CountryDefinition"/>
        </service>

Nun habe ich in meinem Controller zwar die CountryDefiniton zur Verfügung:

$countries = $this->countryDefinition->getCollectionClass();

Jetzt habe ich nur die CollectionClass mit der ich aber wahrscheinlich nichts anfangen kann.

Irgendwie habe ich wahrscheinlich ein grundsätzliches Verständnisproblem, was ich per DependencyInjection einfügen muss, um die verschiedenen Collections zur Verfügung zu haben.

Ich wäre sehr dankbar, wenn mir da jemand etwas auf die Sprünge helfen könnte.
Vielen Dank im Voraus.

Noch nie versucht eine Collection einzufügen. Versuche es mal mit dem entsprechenden Repository, siehe…

@Max_Shop
Danke, ja, über das Repository kann ich mir die Länder natürlich „zusammenbasteln“. Ich dachte nur, es müsste doch eine Möglichkeit geben, die Länderauswahl direkt zu bekommen. Im Twig Template address-form.html.twig kommen sie aus „page.countries“. Schaut man sich die Seite an, steht dort die CountryCollection.

Vielleicht mal allgemeiner gefragt, weil da bei mir wohl eine Wissenslücke klafft: Wie kann ich denn generell rückverfolgen, welche Dinge ich per DependencyInjection einfügen kann (offensichtlich geht ja vieles nicht) und wie finde ich dann jeweils dazu die richtige service id (also die, die ich in der services.xml benötige: )

Und warum kann z.B. die AccountLoginPage.php einfache Page extenden und hat dann

public function getCountries(): CountryCollection
{
    return $this->countries;
}

zur Verfügung?

Ich weiß, ist jetzt vielleicht etwas viel verlangt, das zu erklären, aber ich komme mit google irgendwie nicht so recht weiter.
Vielen Dank noch mal.

In Shopware wird ja viel von Abstract-Klassen abgeleitet bzw. generell per extend erweitert. Sprich, alle Funktionen stehen dann zur Verfügung.

Die Injection ist ja nichts weiter, als die initiierte Klasse zu erhalten. Eine Collection ist von Standard her aber leer. Das heißt es kommt auf den Zeitpunkt darauf an, wann dein Code ausgeführt wird. Vermutlich wird in dem entsprechenden Controller sichergestellt, dass zuvor per Repository die Collection gefüllt wurde.

Hoffe, das hilft dir etwas.

1 „Gefällt mir“

Sorry @Max_Shop ich muss leider noch mal nachhaken in diesem Zusammenhang.

Ich habe die Länder nun per Controller meinem Twig Template zur Verfügung gestellt. Siehe:

in „countries“ #elements

Das Standard Twig Template würde die „countries“ allerdings in „page“ #countries #elements benötigen, siehe:

Ich kann natürlich Twig anpassen, aber bequemer wäre es, wenn ich die Daten entsprechend zur Verfügung stellen könnte. Ist das möglich?

Hier noch der Part im Controller, in dem ich die Daten übergebe:

    return $this->renderStorefront('@Plugin/storefront/account-request.html.twig', [
        'page' => $page,
        'salutations' => $salutations,
        'countries' => $countries
    ]);

Das Repository rufe ich wie folgt ab:

public function getCountries(Context $context): EntityCollection
{
    $criteria = new Criteria();
    $criteria->addFilter(new EqualsFilter('active', true));

    return $this->countryRepository->search($criteria, $context)->getEntities();
}

Vielen Dank noch mal.

Du musst $countries in $page packen. $page wird vermutlich ein Struck sein. Einfach den Aufbau ansehen und schauen, wie du Arrays dort hinzufügen kannst. Weiß es leider nicht auswendig.