1

I am struggling with closure and saving a variable.

In my class somePlugin i do have a public var $customerId , which should be updated after i execute my setUser() function. To do so i have a setter and getter function. In my init() function i do want to use the new var on a later EVENT_BEFORE_COMPLETE_ORDER event. However the variable $customerId does get reset to the default value after page reload.

How would i avoid that?

I tried using session but it seems like the session has been overwritten on reload as well

class somePlugin extends Plugin {

    public $customerId = '1234';

    public function init() {

        parent::init();
        self::$plugin = $this;

        Event::on( Order::class, Order::EVENT_BEFORE_COMPLETE_ORDER, function( Event $e ) {
            $order             = $e->sender;
            $customerId        = $this->getCustomerId();

            // on every page reload it does get reset to the default var, what is not wanted
            $order->customerId = $customerId;
        } );
    }

    public function setUser( $userId ) {

        self::$plugin = $this;

        // get userModel by userId
        $userModel = Craft::$app->users->getUserById( $userId );

        // check if  commerce record for craft user exists
        if ( ! $this->customers->getCustomerByUserId( $userId ) ) {

            // create and save new customer
            $newCustomer       = new Customer();
            $newCustomer->user = $userModel;
            $this->customers->saveCustomer( $newCustomer, false );
        }

        // store customerId
        $customerId = $this->customers->getCustomerByUserId( $userId )->id;

       // sets the new and wanted it wich gets overwritten by page reload
        $this->setCustomerId( $customerId );

    }

    public function setCustomerId( $customerId ) {
        $this->customerId = $customerId;
    }

    public function getCustomerId() {
        return $this->customerId;
    }
}

1 Answer 1

1

I figured that i could just use Craft::$app->getSession()->set( 'key', $value ); to store the vars in the craft session.

class somePlugin extends Plugin {

    public function init() {

        parent::init();
        self::$plugin = $this;

        Event::on( Order::class, Order::EVENT_BEFORE_COMPLETE_ORDER, function( Event $e ) {
            $order             = $e->sender;
            $order->customerId = $this->getCustomerId();
        } );
    }

    public function setUser( $userId ) {

        self::$plugin = $this;

        // get userModel by userId
        $userModel = Craft::$app->users->getUserById( $userId );

        // check if  commerce record for craft user exists
        if ( ! $this->customers->getCustomerByUserId( $userId ) ) {

            // create and save new customer
            $newCustomer       = new Customer();
            $newCustomer->user = $userModel;
            $this->customers->saveCustomer( $newCustomer, false );
        }

        // get and store customerId
        $customerId = $this->customers->getCustomerByUserId( $userId )->id;
        $this->setCustomerId( $customerId );

    }

    public function setCustomerId( $customerId ) {
        Craft::$app->getSession()->set( 'customerId', $customerId );
    }

    public function getCustomerId() {
        return Craft::$app->getSession()->get( 'customerId' );
    }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.