person-using-credit-card

Drupal Commerce – Elektronische Produkte verkaufen

Drupal Commerce ist ein umfassendes Tool zum Verkauf physischer Produkte über das Internet. In diesem Beitrag zeigen wir Ihnen, wie Sie mit wenig Aufwand einen Shop einrichten, um elektronische Produkte zu verkaufen, oder genauer gesagt, um Zugang zu beliebigen Dateien zu verkaufen. Neben Commerce werde ich das Group-Modul verwenden, um das Ziel zu erreichen.

Im vorherigen Beitrag über den Aufbau eines Shops in Drupal haben wir gezeigt, wie man das Commerce-Modul konfiguriert, um verschiedene Arten von physischen Produkten zu verkaufen. 

Wir werden jetzt einen weiteren Schritt gehen – ich zeige Ihnen, wie Sie das System konfigurieren, um elektronische Produkte wie E-Books, Musik oder beliebige andere Dateien zu verkaufen, indem Sie Commerce in Drupal verwenden.

Dieses Ziel kann auf verschiedene Weise erreicht werden, und eine davon ist die Kombination der Leistungsfähigkeit von Commerce und dem Group-Modul.

Warum diese Methode?

  • Nicht viel Programmieren,
  • Berechtigungen werden vom System und dem Group-Modul verwaltet,
  • Sie verkaufen den Zugang zu einer privaten Gruppe, in der der Kunde deren Inhalt sieht,
  • einfache Möglichkeit, das System für den Verkauf zu erweitern, z.B. Videokurse, die aus vielen Teilen bestehen,
  • Dateien werden über das Upload-Feld hochgeladen, das an den Inhaltstyp angehängt ist,
  • Produkt enthält eine einfache Referenz (Feld) auf die Gruppe, zu der es nach der Bezahlung zur Verfügung stehen soll.

Wie funktioniert es für den Admin?

  1. Sie verkaufen den Zugang zur Gruppe, in der die Dateien zum Herunterladen verfügbar sind.
  2. Sie fügen der mit der Gruppe verbundenen Inhalte eine private Datei hinzu.
  3. Sie erstellen ein Produkt (Commerce) und geben die ausgewählte Gruppe als Referenz an.

Wie funktioniert es für den Kunden?

  1. Produkt wird dem Warenkorb hinzugefügt.
  2. Kontoerstellung für den Kunden während des Kaufprozesses. Dies muss in der Commerce-Konfiguration eingestellt sein. Ein Konto ist notwendig, um den Kunden der Gruppe zuzuordnen, in der die Dateien hinzugefügt werden, auf die sie nach einer erfolgreichen Bezahlung Zugriff erhalten sollen.
  3. Weiterleitung zur Zahlung.
  4. Nach Abschluss der Zahlung wird der Zugang zur Gruppe gewährt. Die Hinzufügung des Kunden zur Gruppe erfolgt automatisch und wird durch zusätzlichen Code durchgeführt, der hinzugefügt werden muss.
  5. Der Benutzer wird zum Profil weitergeleitet, wo er Zugriff auf Dateien und Gruppen hat.

Konfiguration

Installieren Sie die Commerce- und Group-Module zusammen mit den Abhängigkeiten. 

Gruppe

Aktivieren Sie zusätzlich zum Group-Modul das Group Node-Modul (es ist Teil des Group-Moduls) – dank dieses können Sie bestimmen, welche Art von Inhalt mit einer bestimmten Gruppe verknüpft wird.

Fügen Sie den Gruppentyp hinzu – die Unterseite admin/group/types

In diesem Stadium können Sie im Typbearbeitungsmodus Felder hinzufügen, Berechtigungen und Rollen festlegen und die Art des mit der Gruppe verbundenen Inhalts definieren.

17

Fügen Sie die neue Gruppe hinzu – die Unterseite admin/group

16

Wenn nur ein Gruppentyp erstellt wird, dann wird jede erstellte Gruppe von diesem Typ sein. Wenn es mehr gibt, wählen Sie aus, zu welchem Typ sie gehören soll, wenn Sie die Gruppe hinzufügen. 

Auf der Seite admin/structure/types fügen Sie die Art des Inhalts hinzu, die als Inhaltstyp in der Gruppe verwendet werden soll. 

Fügen Sie ein privates Dateifeld hinzu.

Stellen Sie sicher, dass Sie ein richtig konfiguriertes privates Dateisystem in Ihrem Drupal haben. Stellen Sie dann in der Feldkonfiguration die Datei auf privat ein, sodass sie nicht für nicht autorisierte Personen sichtbar ist.

11

Erstellen Sie einen Inhaltstyp, der mit der Gruppe verbunden ist.

Die Seite admin/group/types / manage/GROUPTYPENAME/content listet die Arten von Inhalten auf, die mit einem bestimmten Gruppentyp assoziiert werden können.

Sie können dies mithilfe der Installieren-Schaltfläche durchführen

Dank dessen ist es möglich, Inhalte zu erstellen, die nur für die Mitglieder einer bestimmten Gruppe bestimmt sind. Somit wird jede Datei, die mit dem Inhalt verbunden ist, ebenfalls nur für die Personen in der Gruppe sichtbar sein.

18_0

Fügen Sie der Gruppe Inhalte mit der Datei hinzu

Bearbeiten Sie die Gruppe und gehen Sie auf den Reiter Nodes

Hier können Sie der Gruppe den bestehenden Inhalt hinzufügen oder einen neuen erstellen. 
Beim Erstellen eines neuen Eintrags fügen Sie eine Datei hinzu. Jetzt können Sie testen, ob tatsächlich nur die Mitglieder der Gruppe Zugriff auf die Datei haben. 

Commerce

Fügen Sie einen neuen Produkttyp hinzu, der zum Verkauf von elektronischen Produkten verwendet wird. Eine detaillierte Beschreibung, wie das zu tun ist, finden Sie im vorherigen Abschnitt zur Commerce-Konfiguration.

Fügen Sie dem Produkttyp ein neues Feld hinzu, das als Referenz auf die erstellte Gruppe dient. 

Feldtyp: Referenz -> Andere…
Positionstyp: Gruppe

Das Feld kann einzeln- oder mehrfachbewertet sein.
In den Feldeinstellungen prüfen Sie die Typen von Gruppen, auf die sich die Referenz beziehen soll.

14

In Commerce sollten Sie mindestens eine Zahlungsmethode konfiguriert haben.

Erst nach einem erfolgreichen Kaufprozess und wenn der Bestellstatus auf "abgeschlossen" gesetzt wird, wird die Mitgliedschaft in der ausgewählten Gruppe gewährt.

Code

Die Hauptfunktionalität, nämlich die Zuordnung des Kunden zur ausgewählten Gruppe mit der Datei, wird mit dem PHP-Code durchgeführt, den Sie selbst schreiben müssen, z.B. in einem neuen Modul.

Das Beispiel eines solchen Codes, der den Kunden den Gruppen aus dem Referenzfeld zuordnet, wird unter Verwendung von EventSubscriber aufgebaut, da Ihr System nur überwachen und reagieren sollte, wenn die Bestellung bezahlt wird.

Die Lösung, die ich verwendet habe
Ich habe ein neues commerce_groups Modul erstellt

Dem Modul wurde ein Dienst hinzugefügt – die Datei commerce_groups.services.yml

services:
  commerce_groups:
    class: '\Drupal\commerce_groups\EventSubscriber\AttachUserToGroup'
    arguments: ['@entity_type.manager']
    tags:
      - { name: 'event_subscriber' }

Der Dienst wird in der AttachUserToGroup-Klasse definiert
Ein Argument wurde hinzugefügt – entity_type.manager, weil ich es als Abhängigkeit in den Objektkonstruktor (Dependency Injection) einfügen musste
Das Tag event_subscriber informiert Drupal, dass die Klasse Ereignisse protokollieren möchte, die von anderen Modulen ausgelöst werden. 
Das Ereignis, das wir registrieren möchten, ist in der Methode getSubscribedEvents in der Klasse AttachUserToGroup definiert, die von EventSubscriberInterface erbt

static function getSubscribedEvents() {
  $events['commerce_order.place.post_transition'] = ['orderCompleteHandler'];

  return $events;
}

commerce_order.place.post_transition ist ein Ereignis, das nach erfolgreicher Bezahlung des Produkts ausgelöst wird.
orderCompleteHandler ist eine Methode, die die gesamte Logik enthält, was passieren soll, wenn ein bestimmtes Ereignis auftritt. 
Im Folgenden finden Sie ein Beispiel für einen funktionierenden Code, der nach einer erfolgreichen Transaktion den Kunden allen Gruppen aus dem Feld field_group_ref zuordnet.

 /**
     * Fügen Sie den Kunden zur Gruppe hinzu.
     *
     * @param WorkflowTransitionEvent $event
     * @throws \Drupal\Core\Entity\EntityStorageException
     */
    public function orderCompleteHandler(WorkflowTransitionEvent $event) {
      /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
      $order = $event->getEntity();
      $uid_value = $order->get('uid')->getValue();

      $gids = [];
      foreach ($order->getItems() as $order_item) {
        /** @var \Drupal\commerce_product\Entity\ProductVariation $product_variation */
        $product_variation = $order_item->getPurchasedEntity();
        $product = $product_variation->getProduct();
        $group_value = $product->get('field_group_ref')->getValue();
        foreach ($group_value as $group) {
          $gids[] = $group['target_id'];
        }
      }

      /** @var \Drupal\user\Entity\User $account */
      $account = User::load($uid_value[0]['target_id']);

      foreach ($gids as $gid) {
        /** @var \Drupal\group\Entity\Group $group */
        $group = Group::load($gid);
        if ($group) {
          $group->addMember($account);
          $group->save();
        }
      }
    }

Anzeigen von Dateien in der Gruppe.

Der schnellste Weg ist, eine Ansicht zu erstellen, die auf der Hauptseite der Gruppe alle den Inhalten zugefügten Dateien anzeigt, die mit der Gruppe verbunden sind.

15

Zusammenfassung

Commerce und Group sind zwei große, aktiv unterstützte Module, die in Kombination die wahre Leistungsfähigkeit von Drupal zeigen. Mit minimalem Programmieraufwand können Sie ein komplexes und erweiterbares System zum Verkauf sowohl physischer als auch elektronischer Produkte erstellen. Beide Module werden in Drupal 9 – der neuesten Version des Systems – verfügbar sein.
 

Drupal-Commerce-Services-Banner-Blog-Droptica