Question

I've been working on a module in which I'm subscribing to commerce_order.place.post_transition event. However, it suddenly stopped working. Any ideas how I can debug it? I tried Xdebug but it won't even step in.

PS: Just to be clear, I'm talking about this stage:

post_transition

Below is my code:

<?php

namespace Drupal\aydinlik\EventSubscriber;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\user\Entity\User;
use Drupal\commerce_product\Entity\ProductVariation;
use Drupal\state_machine\Event\WorkflowTransitionEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Assigns the proper subscription when an order is placed.
 */
class OrderPaySubscriber implements EventSubscriberInterface {

  /**
   * Current user account.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $current_user;

  /**
   * The entity type manager
   * 
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entity_type_manager;

  /**
   * NodeAccessSubscriber constructor.
   *
   * @param \Drupal\Core\Session\AccountInterface $this->current_user
   *   Current user account.
   */
  public function __construct(AccountInterface $current_user, EntityTypeManagerInterface $entity_type_manager) {
    $this->current_user = $this->current_user;
    $this->entity_type_manager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events = ['commerce_order.place.post_transition' => ['addSubscription', -100]];
    $events = ['commerce_order.place.pre_transition' => ['removeSubscription', -100]];
    return $events;
  }

  /**
   * Adds subscription upon successful payment.
   *
   * @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event
   *   The event we subscribed to.
   */
  public function addSubscription(WorkflowTransitionEvent $event) {
    $dateTime = \DateTime::createFromFormat('Y-m-d',date('Y-m-d'));
    $today = $dateTime->format('Y-m-d');
    $this->current_user = User::load(\Drupal::currentUser()->id());
    /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
    $order = $event->getEntity();
    $order_items = $order->getItems();
    $order_item = reset($order_items);
    $product_variation = $order_item->getPurchasedEntity();
    $sku = $product_variation->getSku();
    $from = ["aylik", "yillik", "-"];
    $to = ["Aylık", "Yıllık", " "];
    $name = ucwords(str_replace($from, $to, $sku));
    $epaper_subscription = $this->entity_type_manager->getStorage('taxonomy_term')->loadByProperties(['name' => 'E-Gazete Aboneliği']);
    $subscription_duration = $this->entity_type_manager->getStorage('taxonomy_term')->loadByProperties(['name' => $name]);
    $this->current_user->field_abonelik_suresi[0] = ['target_id' => reset($subscription_duration)->id()];
    switch ($sku) {
        case 'aylik-abonelik':
            if (!empty($this->current_user->field_abonelik_turu)) {
              unset($this->current_user->field_abonelik_turu);
            }
            $this->current_user->field_abonelik_baslangic_tarihi->value = $today;
            $this->current_user->field_abonelik_bitis_tarihi->value = date('Y-m-d', strtotime('+1 month'));
            $this->current_user->field_abonelik_turu[] = ['target_id' => reset($epaper_subscription)->id()];
            $this->current_user->save();
            break;
        case '3-aylik-abonelik':
            if (!empty($this->current_user->field_abonelik_turu)) {
              unset($this->current_user->field_abonelik_turu);
            }
            $this->current_user->field_abonelik_baslangic_tarihi->value = $today;
            $this->current_user->field_abonelik_bitis_tarihi->value = date('Y-m-d', strtotime('+3 months'));
            $this->current_user->field_abonelik_turu[] = ['target_id' => reset($epaper_subscription)->id()];
            $this->current_user->save();
            break;
        case '6-aylik-abonelik':
            if (!empty($this->current_user->field_abonelik_turu)) {
              unset($this->current_user->field_abonelik_turu);
            }
            $this->current_user->field_abonelik_baslangic_tarihi->value = $today;
            $this->current_user->field_abonelik_bitis_tarihi->value = date('Y-m-d', strtotime('+6 months'));
            $this->current_user->field_abonelik_turu[] = ['target_id' => reset($epaper_subscription)->id()];
            $this->current_user->save();
            break;
        case 'yillik-abonelik':
            if (!empty($this->current_user->field_abonelik_turu)) {
              unset($this->current_user->field_abonelik_turu);
            }
            $this->current_user->field_abonelik_baslangic_tarihi->value = $today;
            $this->current_user->field_abonelik_bitis_tarihi->value = date('Y-m-d', strtotime('+1 year'));
            $earchive_subscription = $this->entity_type_manager->getStorage('taxonomy_term')->loadByProperties(['name' => 'E-Arşiv Aboneliği']);
            $this->current_user->field_abonelik_turu[] = ['target_id' => reset($epaper_subscription)->id()];
            $this->current_user->field_abonelik_turu[] = ['target_id' => reset($earchive_subscription)->id()];
            $this->current_user->save();
        default:
            # code...
            break;
    }
  }

  /*
   * Removes subscription upon pending payment.
   *
   * @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event
   *   The event we subscribed to.
   */
  public function removeSubscription(WorkflowTransitionEvent $event) {
    $this->current_user = User::load(\Drupal::currentUser()->id());
    if ($this->current_user->hasRole('abone')) {
      $this->current_user->removeRole('abone');
      $this->current_user->save();
    }
  }

}
Was it helpful?

Solution

You are overriding the array each time in getSubscribedEvents instead of adding entries to it.

It should look more like this:

public static function getSubscribedEvents() {
    $events = [];
    $events['commerce_order.place.post_transition'] = ['addSubscription', -100];
    $events['commerce_order.place.pre_transition'] = ['removeSubscription', -100];
    return $events;
  }

Or

public static function getSubscribedEvents() {
    return [
        'commerce_order.place.post_transition' => ['addSubscription', -100],
        'commerce_order.place.pre_transition' => ['removeSubscription', -100],
    ];
  }

Check https://api.drupal.org/api/drupal/vendor%21symfony%21http-kernel%21EventListener%21AbstractSessionListener.php/function/AbstractSessionListener%3A%3AgetSubscribedEvents/9.0.x for an example.

Licensed under: CC-BY-SA with attribution
Not affiliated with drupal.stackexchange
scroll top