Skip to content

Customising Passes

The plugin builds sensible defaults (membership card with user name and Member ID as QR code), then fires events so your custom module can modify the pass before it's signed and sent. These follow Craft's standard event patterns.

Register event handlers in your module or plugin's init() method:

php
use craft\base\Event;
use newism\wallet\services\ApplePassService;
use newism\wallet\services\GooglePassService;

A complete working example is included in demo/modules/wallet-demo/: a bare-bones Craft module that applies a black and gold theme to both Apple and Google passes.

EVENT_BUILD_APPLE_PASS

Fires when an Apple Wallet pass is being generated. Modify the StoreCard to change colors, barcode, fields, and images.

Event class: newism\wallet\events\BuildApplePassEvent

PropertyTypeDescription
applePass\Passbook\PassThe Apple pass object, pre-populated with defaults
passnewism\wallet\models\PassThe unified Pass model (generatorHandle, sourceId, etc.)
usercraft\elements\UserThe user the pass is being generated for

Forced after your listener: passTypeIdentifier, webServiceURL, authenticationToken

Example: Black and gold theme

php
use newism\wallet\events\BuildApplePassEvent;
use newism\wallet\services\ApplePassService;
use yii\base\Event;

Event::on(
    ApplePassService::class,
    ApplePassService::EVENT_BUILD_APPLE_PASS,
    function(BuildApplePassEvent $event) {
        $applePass = $event->applePass;
        $user = $event->user;
        $pass = $event->pass;

        // Change colors
        $applePass->setBackgroundColor('rgb(0, 0, 0)');
        $applePass->setForegroundColor('rgb(255, 255, 255)');
        $applePass->setLabelColor('rgb(200, 200, 200)');

        // Replace the structure with custom fields
        $structure = new \Passbook\Pass\Structure();

        $memberIdField = new \Passbook\Pass\Field('memberId', (string)$user->id);
        $memberIdField->setLabel('Member ID');
        $structure->addHeaderField($memberIdField);

        $nameField = new \Passbook\Pass\Field('name', $user->fullName);
        $nameField->setLabel('Name');
        $structure->addPrimaryField($nameField);

        $applePass->setStructure($structure);
    }
);

EVENT_BUILD_GOOGLE_PASS_OBJECT

Fires when a Google Wallet pass object is being generated. Modify the payload array to change the pass content.

Event class: newism\wallet\events\BuildGooglePassObjectEvent

PropertyTypeDescription
payloadarrayThe Google pass object payload, pre-populated with defaults
passnewism\wallet\models\PassThe unified Pass model (generatorHandle, sourceId, etc.)
usercraft\elements\UserThe user the pass is being generated for

Forced after your listener: id, classId, state

Example: Change background color and card title

php
use newism\wallet\events\BuildGooglePassObjectEvent;
use newism\wallet\services\GooglePassService;
use yii\base\Event;

Event::on(
    GooglePassService::class,
    GooglePassService::EVENT_BUILD_GOOGLE_PASS_OBJECT,
    function(BuildGooglePassObjectEvent $event) {
        $event->payload['hexBackgroundColor'] = '#000000';
        $event->payload['cardTitle']['defaultValue']['value'] = 'My Organisation';
    }
);

EVENT_BUILD_GOOGLE_PASS_CLASS

Fires when a Google Wallet pass class (template) is being created or updated. Modify the payload array to control which fields are displayed on the card layout.

Event class: newism\wallet\events\BuildGooglePassClassEvent

PropertyTypeDescription
payloadarrayThe Google pass class payload, pre-populated with defaults
classIdstringThe full class ID (issuerId.classSuffix)
generator?GeneratorInterfaceThe generator that owns this class, or null in legacy context

Forced after your listener: id, callbackOptions

WARNING

After changing the pass class template, re-run php craft wallet/setup/google-class to push the updated class to Google.

Example: Custom card layout

php
use newism\wallet\events\BuildGooglePassClassEvent;
use newism\wallet\services\GooglePassService;
use yii\base\Event;

Event::on(
    GooglePassService::class,
    GooglePassService::EVENT_BUILD_GOOGLE_PASS_CLASS,
    function(BuildGooglePassClassEvent $event) {
        $event->payload['classTemplateInfo'] = [
            'cardTemplateOverride' => [
                'cardRowTemplateInfos' => [
                    [
                        'oneItem' => [
                            'item' => [
                                'firstValue' => [
                                    'fields' => [
                                        ['fieldPath' => "object.textModulesData['memberId']"],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ];
    }
);