Weitere Shopware 6 Beiträge:
Schnell-Referenz: Häufig verwendete Code-Schnipsel und Anweisungen für Entwickler.
# Ein Theme erstellen
bin/console theme:create MyfavThemeNameSnakeCase
# Wenn ein Child-Theme die Config-Werte von einem anderen Parent-Theme erben soll
# muss das Theme nach der Installation und vor der Aktivierung noch über die Kommando-Zeile aktualisiert werden,
# weil Shopware sonst die Konfiguration nicht sauber übernimmt.
# (Fehlermeldung bspw.: Unable to compile the theme "MyThemeName". Undefined variable $parent-settings-border-radius: /usr/www/users/shopware/custom/plugins/ParentTheme/src/Resources/app/storefront/src/scss/overrides.scss on line 20, at column 1)
# (Thanks to: https://forum.shopware.com/t/theme-vererbung-2-themes/68481/19 )
bin/console theme:refresh
# Im Subscriber
<service id="Swag\BasicExample\Subscriber\MySubscriber">
<argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService" />
<tag name="kernel.event_subscriber"/>
</service>
# Im Controller Controller
<service id="Myfav\Superplugin\Storefront\Controller\MyController" public="true">
<call method="setContainer">
<argument type="service" id="service_container" />
</call>
<argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService" />
</service>
Controller, Subscriber und ServiceDecorator werden in der service.xml definiert. Dort ist eine Übergabe von weiteren Services problemlos möglich. Um die Plugin-Konfiguration auszulesen, verwenden wir immer den SystemConfigService.
# use
use Shopware\Core\System\SystemConfig\SystemConfigService;
# Konfiguration auslesen
$myConfig = $this->systemConfigService->get('MeinPluginName.config');
# 1. Eine Migration erstellen
# 2. Entity erstellen, bestehend aus:
# a) Collection
# b) Definition
# c) Entity
# d) Eintrag in der Datei services.xml als neuen Service
# 3. Per DI in der service.xml im Ziel-Controller oder Subscriber injizieren
<argument type="service" id="myfav_defined_entity.repository" />
# 4. In Controller oder Subscriber Constructor übernehmen
private $myfavDefinedEntityRepository;
public function __construct($myfavDefinedEntityRepository) {
$this->myfavDefinedEntityRepository = $myfavDefinedEntityRepository;
}
# 5. Datensatz in der Datenbank erzeugen
$this->myfavDefinedEntityRepository->create([
[
'email' => $email,
'customerId' => $customerId,
'orderId' => $order->getId(),
'dateConfirmedInCheckout' => new \DateTime()
]
], $context);
# 6. Context abholen
## 6.a) Context in einem Subscriber abholen
### Die Methoden eines Subscribers verfügen i.d.R. über ein Event. Dieses Event bringt den Context mit:
$context = $event->getContext();
## 6.b) Context in einem Controller abholen
### Externe Referenz auf Context-Klasse angeben
use Shopware\Core\Framework\Context;
### In den Methoden, die per Route angesprochen werden, kann der Context automatisch per DI bezogen werden:
/**
* @Route("/hello-world", name="frontend.helloworld", methods={"GET"})
*/
public function helloworld(Context $context) {
# Theme kompilieren und Cache leeren.
bin/console theme:compile
bin/console cache:clear
# Javascript und ähnlichen Storefront Kram kompilieren
# Hier direkt mit bash, weil sh unter Umständen nicht funktioniert, wenn die falsche Shell dahinter steckt.
bin/build-storefront.sh
# Administration kompilieren (z.B. um Module zu erstellen)
bin/build-administration.sh
# App deinstallieren/installieren
bin/console app:install --activate MeinTechnischerAppName
bin/console app:uninstall MeinTechnischerAppName
# Datenbank-Migration für ein Plugin starten
/bin/console database:migrate MyPlugin --all
# Assets übernehmen
bin/console assets:install
# Administrator anlegen
php bin/console user:create --admin --email=john@doe.com --firstName="John" --lastName="Doe" --password=johndoe123 --no-interaction johndoe
Siehe auch Shopware-Dokumentation: Add custom module
Dieser Teil orientiert sich stark an Symfony.
Zuerst holt man sich das Request-Object, in einem Controller bspw. einfach über DI in der Methode. Danach kann man die Variablen über das Request-Object abfragen.
# Use-Anweisung einfügen:
use Symfony\Component\HttpFoundation\Request;
# Request-Objekt über die Dependency-Injection laden:
public function meineFunktion(Request $request): JsonResponse {
# Daten abrufen:
$id = $request->query->get('id'); // get Anfrage
$id = $request->request->get('id'); // post Anfrage