woocommerce-paypal-payments/modules/ppcp-settings/resources/js/extensions
Philipp Stracker af1815d4e1
🔀 Merge branch 'develop'
# Conflicts:
#	composer.json
#	composer.lock
#	modules/ppcp-settings/resources/js/Components/Screens/Settings/Components/Settings/Blocks/PaypalSettings.js
#	modules/ppcp-settings/resources/js/Components/Screens/Settings/Components/Settings/CommonSettings.js
#	modules/ppcp-settings/resources/js/Components/Screens/Settings/Components/Settings/ConnectionStatus.js
#	modules/ppcp-settings/resources/js/hooks/useStoreManager.js
#	modules/ppcp-settings/webpack.config.js
#	package.json
#	tests/PHPUnit/bootstrap.php
#	tests/stubs/WC_Integration.php
2026-01-28 14:35:25 +01:00
..
createExtensionStore.js Create base for extension REST endpoints 2025-11-11 14:32:44 +01:00
hooks.js ♻️ Minor clean up 2025-11-11 14:32:44 +01:00
index.js ♻️ Minor clean up 2025-11-11 14:32:44 +01:00
README.md 🔀 Merge branch 'develop' 2026-01-28 14:35:25 +01:00
registry.js 🏗️ Connect extension stores with useStoreManager 2025-11-11 14:32:44 +01:00
slots.js 🔌 Integrate extension slots into settings 2025-11-11 14:32:43 +01:00
store.js 🏗️ Connect extension stores with useStoreManager 2025-11-11 14:32:44 +01:00

Settings Extension

Extend the settings UI from other modules.

JavaScript

import { registerSetting, createExtensionStore, SLOTS } from '@ppcp-settings/extensions';

const useSettings = createExtensionStore( {
    name: 'js-extension-store',
    defaults: {
        active: false,
    },
} );

const MyExtension = () => {
    const { active, setActive } = useSettings();

    return (
        <SettingsBlock title="My Extension">
            <ControlToggleButton label="Active" value={ active } onChange={ setActive } />
        </SettingsBlock>
    );
};

registerSetting(
    SLOTS.PAYPAL_SETTINGS_END,
    'extension-id', // unique value, not used anywhere else 
    MyExtension
);

PHP

Steps:

  1. Data model - extends ExtensionDataModel
  2. REST endpoint - extends ExtensionRestEndpoint
  3. Settings module - extends ExtensionSettingsModule
  4. Create three DI services - services.php
  5. Call the settings init() method

1. Data Model

use WooCommerce\PayPalCommerce\Settings\Extension\ExtensionDataModel;

class MyExtensionDataModel extends ExtensionDataModel {
    
    protected const NAME = 'my-extension'; // Becomes 'woocommerce-ppcp-ext-my-extension'
    
    protected function get_defaults(): array {
        return array(
            'active' => false,
        );
    }
    
    public function is_active(): bool {
        return (bool) $this->data['active'];
    }
    
    public function set_active( bool $state ): void {
        $this->data['active'] = $state;
    }
}

2. REST Endpoint

use WooCommerce\PayPalCommerce\Settings\Extension\ExtensionRestEndpoint;

class MyExtensionEndpoint extends ExtensionRestEndpoint {
    
    protected const PATH = 'my-extension-settings';
    
    protected function sanitize_rest_data( array $data ): ?array {
        // Return null to reject
        if ( ! isset( $data['active'] ) ) {
            return null;
        }
        
        return array(
            'active' => (bool) $data['active'],
        );
    }
}

3. Settings Module

use WooCommerce\PayPalCommerce\Settings\Extension\ExtensionSettingsModule;

class MyExtensionSettingsModule extends ExtensionSettingsModule {
    
    protected const ASSETS_DIR    = 'modules/ppcp-my-module/assets/';
    protected const SCRIPT_HANDLE = 'ppcp-my-extension-settings';
}

4. DI Container

return array(
    'my-module.settings.model'    => static function (): MyExtensionDataModel {
        return new MyExtensionDataModel();
    },
    'my-module.settings.endpoint' => static function ( $container ): MyExtensionEndpoint {
        return new MyExtensionEndpoint(
            $container->get( 'my-module.settings.model' )
        );
    },
    'my-module.settings.module'   => static function ( $container ): MyExtensionSettingsModule {
        return new MyExtensionSettingsModule(
            $container->get( 'ppcp.path-to-plugin-folder' ),     // static dependency.
            $container->get( 'ppcp.path-to-plugin-main-file' ),  // static dependency.
            $container->get( 'my-module.settings.endpoint' )
        );
    },
);

5. Initialize

$settings_module = $container->get( 'my-module.settings.module' );
$settings_module->init();