PHPackages                             spryker-demo/company-document-feature - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. spryker-demo/company-document-feature

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

spryker-demo/company-document-feature
=====================================

Company Document Feature

1.0.0(9mo ago)00proprietaryPHP &gt;=8.2CI passing

Since Sep 25Pushed 9mo agoCompare

[ Source](https://github.com/spryker-demo/company-document-feature)[ Packagist](https://packagist.org/packages/spryker-demo/company-document-feature)[ RSS](/packages/spryker-demo-company-document-feature/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (3)Versions (2)Used By (0)

Company Document Feature Module
===============================

[](#company-document-feature-module)

[![Minimum PHP Version](https://camo.githubusercontent.com/ec21f169d70b69344c67d6f18fa1a24d20476d2f0cd680e8c4a1534c22f34e5f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345253344253230382e322d3838393242462e737667)](https://php.net/)

This feature handles company document functionality.

### Install the required modules using Composer

[](#install-the-required-modules-using-composer)

```
composer require spryker-demo/company-document-feature

```

### Add `SprykerDemo` namespace to configuration

[](#add-sprykerdemo-namespace-to-configuration)

```
$config[KernelConstants::CORE_NAMESPACES] = [
    ...
    'SprykerDemo',
];

```

### Add translations

[](#add-translations)

```
# data/import/common/common/glossary.csv

company.account.company_documents,Documents,en_US
company.account.company_documents,Dokumente,de_DE
company.account.company_documents,Documents,fr_FR
company.account.company_documents,Documentos,es_ES
company.account.company_document.name,Document name,en_US
company.account.company_document.name,Dokumentenname,de_DE
company.account.company_document.name,Nom du document,fr_FR
company.account.company_document.name,Nombre del documento,es_ES
company.account.company_document.upload_date,Upload Date,en_US
company.account.company_document.upload_date,Datum des Uploads,de_DE
company.account.company_document.upload_date,Date de téléchargement,fr_FR
company.account.company_document.upload_date,Fecha de subida,es_ES
company.account.company_document.download,Download,en_US
company.account.company_document.download,Download,de_DE
company.account.company_document.download,Télécharger,fr_FR
company.account.company_document.download,Descargar,es_ES
company.account.company_document.no_document.,No documents available at the moment,en_US
company.account.company_document.no_document.,Aktuell keine Dokumente verfügbar,de_DE
company.account.company_document.no_document.,Aucun document disponible pour le moment,fr_FR
company.account.company_document.no_document.,No hay documentos disponibles por el momento,es_ES

```

### Import translations

[](#import-translations)

```
console data:import:glossary

```

### Set up behavior

[](#set-up-behavior)

Activate the following plugins:

#### src/Pyz/Yves/Router/RouterDependencyProvider.php

[](#srcpyzyvesrouterrouterdependencyproviderphp)

```
...
use SprykerDemo\Yves\CompanyDocumentPage\Plugin\Router\CompanyDocumentPageRouteProviderPlugin;
...

class RouterDependencyProvider extends SprykerRouterDependencyProvider
{
    ...
    /**
     * @return array
     */
    protected function getRouteProvider(): array
    {
        return [
           new CompanyDocumentPageRouteProviderPlugin(),
        ];
    }
}
```

#### src/Pyz/Client/RabbitMq/RabbitMqConfig.php

[](#srcpyzclientrabbitmqrabbitmqconfigphp)

```
...
use SprykerDemo\Yves\CompanyDocumentPage\Plugin\Router\CompanyDocumentPageRouteProviderPlugin;
...

class RouterDependencyProvider extends SprykerRouterDependencyProvider
{
    ...
    protected function getRouteProvider(): array
    {
        return [
           new CompanyDocumentPageRouteProviderPlugin(),
        ];
    }
}
```

#### src/Pyz/Client/RabbitMq/RabbitMqConfig.php

[](#srcpyzclientrabbitmqrabbitmqconfigphp-1)

```
...
use SprykerDemo\Yves\CompanyDocumentPage\Plugin\Router\CompanyDocumentPageRouteProviderPlugin;
...

class RabbitMqConfig extends SprykerRabbitMqConfig
{
    ...
    protected function getPyzPublishQueueConfiguration(): array
    {
        return [
           ...
           CompanyDocumentStorageConfig::PUBLISH_COMPANY_DOCUMENT_QUEUE,
        ];
    }

    ...
    protected function getPyzSynchronizationQueueConfiguration(): array
    {
        return [
           ...
           CompanyDocumentStorageConfig::SYNC_STORAGE_COMPANY_DOCUMENT_QUEUE,
        ];
    }
}
```

#### src/Pyz/Zed/Publisher/PublisherDependencyProvider.php

[](#srcpyzzedpublisherpublisherdependencyproviderphp)

```
...
use SprykerDemo\Shared\CompanyDocumentStorage\CompanyDocumentStorageConfig;
use SprykerDemo\Zed\CompanyDocumentStorage\Communication\Plugin\Publisher\CompanyDocument\CompanyDocumentDeletePublisherPlugin;
use SprykerDemo\Zed\CompanyDocumentStorage\Communication\Plugin\Publisher\CompanyDocument\CompanyDocumentWritePublisherPlugin;
...

class PublisherDependencyProvider extends SprykerPublisherDependencyProvider
{
    ...
    protected function getPublisherPlugins(): array
    {
        return array_merge(
            ...
            $this->getCompanyDocumentStoragePlugins(),
        );
    }

    ...
    protected function getCompanyDocumentStoragePlugins(): array
    {
        return [
            CompanyDocumentStorageConfig::PUBLISH_COMPANY_DOCUMENT_QUEUE => [
                new CompanyDocumentWritePublisherPlugin(),
                new CompanyDocumentDeletePublisherPlugin(),
            ],
        ];
    }
}
```

#### src/Pyz/Zed/Queue/QueueDependencyProvider.php

[](#srcpyzzedqueuequeuedependencyproviderphp)

```
...
use SprykerDemo\Shared\CompanyDocumentStorage\CompanyDocumentStorageConfig;
...

class QueueDependencyProvider extends SprykerDependencyProvider
{
    ...
    protected function getProcessorMessagePlugins(Container $container): array
    {
        return [
            ...
            CompanyDocumentStorageConfig::PUBLISH_COMPANY_DOCUMENT_QUEUE => new EventQueueMessageProcessorPlugin(),
            CompanyDocumentStorageConfig::SYNC_STORAGE_COMPANY_DOCUMENT_QUEUE => new SynchronizationStorageQueueMessageProcessorPlugin(),
        ];
    }
}
```

#### src/Pyz/Zed/Publisher/PublisherDependencyProvider.php

[](#srcpyzzedpublisherpublisherdependencyproviderphp-1)

```
...
use SprykerDemo\Zed\CompanyDocumentStorage\Communication\Plugin\Publisher\CompanyDocument\CompanyDocumentPublisherTriggerPlugin
...

class PublisherDependencyProvider extends SprykerPublisherDependencyProvider
{
    ...
    protected function getPublisherTriggerPlugins(): array
    {
        return [
            ...
            new CompanyDocumentPublisherTriggerPlugin(),
        ];
}
```

#### src/Pyz/Zed/Synchronization/SynchronizationDependencyProvider.php

[](#srcpyzzedsynchronizationsynchronizationdependencyproviderphp)

```
...
use SprykerDemo\Zed\CompanyDocumentStorage\Communication\Plugin\Synchronization\CompanyDocument\CompanyDocumentSynchronizationDataBulkRepositoryPlugin;
...

class SynchronizationDependencyProvider extends SprykerSynchronizationDependencyProvider
{
    ...
    protected function getSynchronizationDataBulkPlugins(): array
    {
        return [
            ...
            new CompanyDocumentSynchronizationDataBulkRepositoryPlugin(),
        ];
    }
}
```

Extend CompanyDocumentStorageConfig:

#### src/Pyz/Zed/CompanyDocumentStorage/CompanyDocumentStorageConfig.php

[](#srcpyzzedcompanydocumentstoragecompanydocumentstorageconfigphp)

```
namespace Pyz\Zed\CompanyDocumentStorage;

use Pyz\Zed\Synchronization\SynchronizationConfig;
use SprykerDemo\Zed\CompanyDocumentStorage\CompanyDocumentStorageConfig as SprykerDemoCompanyDocumentStorageConfig;

class CompanyDocumentStorageConfig extends SprykerDemoCompanyDocumentStorageConfig
{
    ...
    /**
     * @api
     *
     * @return string|null
     */
    public function getSynchronizationQueuePoolName(): ?string
    {
        return SynchronizationConfig::DEFAULT_SYNCHRONIZATION_POOL_NAME;
    }
}
```

### Apply Twig customization

[](#apply-twig-customization)

```
# src/Pyz/Yves/CustomerPage/Theme/default/components/molecules/customer-navigation/customer-navigation.twig

{% extends model('component') %}
{% import _self as component %}

{% define config = {
    name: 'customer-navigation',
    tag: 'nav'
} %}

{% define data = {
    activePage: required,
    activeEntityId: required
} %}

{% block body %}
    {% if can('SeeCompanyMenuPermissionPlugin') %}
        {% include molecule('customer-navigation-sidebar', 'CustomerPage') with {
            modifiers: ['company'],
            data: {
                title: 'customer.menu.company.title' | trans,
                activePage: data.activePage,
                items: [
                    {
                        name: 'overview',
                        url: path('company/overview'),
                        label: 'company.account.overview' | trans,
                        icon: 'shopping-list'
                    },
                    {
                        name: 'users',
                        url: path('company/user'),
                        label: 'company.account.company_user' | trans,
                        icon: 'users'
                    },
                    {
                        name: 'business-unit',
                        url: path('company/business-unit'),
                        label: 'company.account.business_unit' | trans,
                        icon: 'office'
                    },
                    {
                        name: 'role',
                        url: path('company/company-role'),
                        label: 'company.account.company_role' | trans,
                        icon: 'user'
                    },
                    {
                        name: 'company-documents',
                        url: path('company/documents'),
                        label: 'company.account.company_documents' | trans,
                        icon: 'file',
                    },
                ]
            }
        } only %}
    {% endif %}
    {% embed molecule('customer-navigation-sidebar', 'CustomerPage') with {
        modifiers: ['customer'],
        data: {
            title: 'customer.menu.customer.title' | trans,
            activePage: data.activePage,
            activeEntityId: data.activeEntityId,
            items: [
                {
                    name: 'customer-overview',
                    url: path('customer/overview'),
                    label: 'customer.account.overview' | trans,
                    icon: 'page',
                },
                {
                    name: 'profile',
                    url: path('customer/profile'),
                    label: 'customer.account.profile_data' | trans,
                    icon: 'user',
                },
                {
                    name: 'address',
                    url: path('customer/address'),
                    label: 'customer.account.address' | trans,
                    icon: 'marker',
                },
                {
                    name: 'order',
                    url: path('customer/order'),
                    label: 'customer.account.order_history' | trans,
                    icon: 'history',
                },
                {
                    name: 'subscription',
                    url: path('subscription-product'),
                    label: 'customer.account.subscriptions' | trans,
                    icon: 'subscription',
                },
                {
                    name: 'return',
                    url: path('return/list'),
                    label: 'return_page.list.title' | trans,
                    icon: 'return-arrow',
                    isActiveItem:  'return/list' == data.activePage | default,
                },
                {
                    name: 'newsletter',
                    url: path('customer/newsletter'),
                    label: 'customer.account.newsletter' | trans,
                    icon: 'envelopes',
                },
            ]
        }
    } only %}
        {% block postContent %}
            {% widget 'ShoppingListMenuItemWidget' args [
                data.activePage,
                data.activeEntityId,
            ] only %}
            {% endwidget %}

            {% widget 'MultiCartMenuItemWidget' args [data.activePage] only %}{% endwidget %}

            {% widget 'QuoteRequestMenuItemWidget' args [data.activePage] only %}{% endwidget %}

            {% widget 'BusinessOnBehalfStatusWidget' use view('change-company-user', 'BusinessOnBehalfWidget') with {
                isActivePage: 'change-company-user' == data.activePage
            } only %}
                {% block body %}
                    {% include molecule('navigation-sidebar-item') with {
                        data: {
                            url: path('company/user/select'),
                            icon: 'building',
                            label: 'business_on_behalf_widget.no_selected_company' | trans,
                            name: 'no-company',
                            active: isActivePage,
                        },
                        modifiers: isActivePage ? ['active'] : [],
                    } only %}
                {% endblock %}
            {% endwidget %}
        {% endblock %}
    {% endembed %}
{% endblock %}

# src/Pyz/Yves/ShopUi/Theme/default/components/molecules/user-navigation/user-navigation.twig

{% extends model('component') %}

{% define config = {
    name: 'user-navigation',
    tag: 'ul',
} %}

{% define data = {
    user: required,
} %}

{% set cartQuantityText = cartQuantity > 0 ? cartQuantity ~ ' ' %}
{% set shouldShowMiniCart = findWidget('MiniCartWidget', [cartQuantityText]).isMultiCartAllowed %}

{%- block class -%}
    {{ parent() }} {{ config.jsName }}
{%- endblock -%}

{% block body %}

                {% include atom('icon') with {
                    modifiers: ['user'],
                    data: {
                        name: 'user',
                    },
                } only %}
                {% include atom('icon') with {
                    class: config.name ~ '__arrow',
                    data: {
                        name: 'caret-down',
                    },
                } only %}

            {% widget 'CustomerFullNameWidget' only %}{% endwidget %}

        {% if can('SeeCompanyMenuPermissionPlugin') %}
            {% include molecule('navigation-list') with {
                modifiers: ['secondary'],
                class: config.name ~ '__sub-nav',
                data: {
                    nodes: [
                        {
                            url: path('company/overview'),
                            title: 'company.account.overview' | trans,
                        },
                        {
                            url: path('company/user'),
                            title: 'company.account.company_user' | trans,
                        },
                        {
                            url: path('company/business-unit'),
                            title: 'company.account.business_unit' | trans,
                        },
                        {
                            url: path('company/company-role'),
                            title: 'company.account.company_role' | trans,
                        },
                        {
                            url: path('company/documents'),
                            title: 'company.account.company_documents' | trans,
                            cssItemClass: 'has-separator',
                        },
                        {
                            url: url('customer/overview'),
                            title: 'customer.account.overview' | trans,
                        },
                        {
                            url: url('customer/profile'),
                            title: 'customer.account.profile_data' | trans,
                        },
                        {
                            url: url('customer/address'),
                            title: 'customer.account.address' | trans,
                        },
                        {
                            url: url('customer/order'),
                            title: 'customer.account.order_history' | trans,
                        },
                        {
                            url: url('subscription-product'),
                            title: 'customer.account.subscriptions' | trans,
                        },
                        {
                            url: url('return/list'),
                            title: 'return_page.default_title' | trans,
                        },
                        {
                            url: url('customer/newsletter'),
                            title: 'customer.account.newsletter' | trans,
                        },
                        {
                            url: url('quote-request'),
                            title: 'quote_request_widget.request_for_quote.list.title' | trans,
                        },
                        {
                            url: url('logout'),
                            title: 'customer.logout' | trans,
                            additionalClass: 'link--additional',
                        },
                    ]
                },
            } only %}
        {% else %}
            {% include molecule('navigation-list') with {
                modifiers: ['secondary'],
                class: config.name ~ '__sub-nav',
                data: {
                    nodes: [
                        {
                            url: url('customer/overview'),
                            title: 'customer.account.overview' | trans,
                        },
                        {
                            url: url('customer/profile'),
                            title: 'customer.account.profile_data' | trans,
                        },
                        {
                            url: url('customer/address'),
                            title: 'customer.account.address' | trans,
                        },
                        {
                            url: url('customer/order'),
                            title: 'customer.account.order_history' | trans,
                        },
                        {
                            url: url('subscription-product'),
                            title: 'customer.account.subscriptions' | trans,
                        },
                        {
                            url: url('return/list'),
                            title: 'return_page.default_title' | trans,
                        },
                        {
                            url: url('customer/newsletter'),
                            title: 'customer.account.newsletter' | trans,
                        },
                        {
                            url: url('quote-request'),
                            title: 'quote_request_widget.request_for_quote.list.title' | trans,
                        },
                        {
                            url: url('logout'),
                            title: 'customer.logout' | trans,
                            additionalClass: 'link--additional',
                        },
                    ]
                },
            } only %}
        {% endif %}

                {% include atom('icon') with {
                    modifiers: ['quick-order'],
                    data: {
                        name: 'quick-order',
                    },
                } only %}

            {{ 'quick-order.page-title'|trans }}

    {% widget 'ShoppingListNavigationMenuWidget' with {config: config} only %}
        {% block body %}

                    {% include atom('icon') with {
                        modifiers: ['header-shopping-list'],
                        data: {
                            name: 'shopping-list',
                        },
                    } only %}

                    {{ 'customer.account.shopping_list'|trans }}

                        {% include atom('icon') with {
                            data: {
                                name: 'cross',
                            },
                        } only %}

                        {{ 'shopping_list.shopping_list'|trans }}

                    {% block listItems %}

                            {{ parent() }}

                    {% endblock %}
                    {% block listActions %}

                            {{ parent() }}

                    {% endblock %}

        {% endblock %}
    {% endwidget %}

        {% if not shouldShowMiniCart %}

                    {% include atom('icon') with {
                        modifiers: ['cart'],
                        data: {
                            name: 'cart',
                        },
                    } only %}

                {{ 'global.my-cart' | trans }}

        {% else %}
            {% embed molecule('cart-counter') with {
                class: config.jsName ~ '__trigger',
                data: {
                    quantity: cartQuantity,
                },
                attributes: {
                    'data-toggle-target': '.' ~ config.jsName ~ '__sub-nav-cart',
                },
                embed: {
                    parentConfigName: config.name,
                },
            } only %}
                {% block content %}
                    {% set linkClass = embed.parentConfigName ~ '__link' %}
                    {{ parent() }}
                {% endblock %}
            {% endembed %}

                {% widget 'MiniCartWidget' args [cartQuantityText] with {config: config} only %}
                    {% block body %}

                            {% include atom('icon') with {
                                data: {
                                    name: 'cross',
                                },
                            } only %}

                            {{ 'multi_cart_widget.cart.carts'|trans }}

                        {% block cartItems %}

                                {{ parent() }}

                        {% endblock %}

                        {% block cartActions %}

                                {{ parent() }}

                        {% endblock %}
                    {% endblock %}
                {% endwidget %}

        {% endif %}

    {% include molecule('toggler-accordion') with {
        attributes: {
            'wrap-class-name': config.jsName,
            'trigger-class-name': config.jsName ~ '__trigger',
            'class-to-toggle': config.name ~ '__sub-nav--touch-active',
            'active-on-touch': 'true',
        },
    } only %}

{% endblock %}

# src/Pyz/Yves/ShopUi/Theme/default/templates/page-layout-main/page-layout-main.twig

{% extends template('page-blank') %}

{% block meta %}
    {{ parent() }}

{% endblock %}

{% block headStyles %}
    {{ parent() }}

    {% if findWidget('FrontendConfiguratorWidget') %}
        {% widget 'FrontendConfiguratorWidget' only %}{% endwidget %}
    {% endif %}
{% endblock %}

{%- block class -%}js-page-layout-main__side-drawer-container{%- endblock -%}

{% block body %}

    {% if findWidget('FrontendConfiguratorWidget') %}
        {% set frontendConfiguratorWidget = findWidget('FrontendConfiguratorWidget') %}
    {% endif %}

    {% block notifications %}
        {% include organism('notification-area') only %}
    {% endblock %}

        {% widget 'AgentControlBarWidget' only %}{% endwidget %}

        {% block sidebar %}
            {% embed organism('side-drawer') with {
                attributes: {
                    'container-class-name': 'js-page-layout-main__side-drawer-container',
                    'trigger-class-name': 'js-page-layout-main__side-drawer-trigger',
                    'locked-body-class-name': 'is-locked-tablet',
                },
            } only %}
                {% block navigation %}
                    {% cms_slot 'slt-mobile-header' %}
                {% endblock %}
            {% endembed %}

            {% if is_granted('ROLE_USER') %}
                {% set customerFullNameWidget = findWidget('CustomerFullNameWidget') %}
                {% set customerFullName = customerFullNameWidget.customerFullName %}

                {% include organism('account-navigation') with {
                    attributes: {
                        'container-class-name': 'js-page-layout-main__side-drawer-container',
                        'trigger-class-name': 'js-page-layout-main__user-account-navigation-trigger',
                        'locked-body-class-name': 'is-locked-mobile',
                    },
                    data: {
                        title: customerFullName,
                        items: [
                            {
                                name: 'overview',
                                url: path('customer/overview'),
                                label: 'customer.account.overview' | trans,
                                icon: 'page'
                            },
                            {
                                name: 'profile',
                                url: path('customer/profile'),
                                label: 'customer.account.profile_data' | trans,
                                icon: 'user'
                            },
                            {
                                name: 'address',
                                url: path('customer/address'),
                                label: 'customer.account.address' | trans,
                                icon: 'marker'
                            },
                            {
                                name: 'order',
                                url: path('customer/order'),
                                label: 'customer.account.order_history' | trans,
                                icon: 'history'
                            },
                            {
                                name: 'returns',
                                url: path('return/list'),
                                label: 'return_page.default_title' | trans,
                                icon: 'return-arrow'
                            },
                            {
                                name: 'newsletter',
                                url: path('customer/newsletter'),
                                label: 'customer.account.newsletter' | trans,
                                icon: 'envelopes'
                            },
                            {
                                name: 'shopping-list',
                                url: path('shopping-list'),
                                label: 'customer.account.shopping_list' | trans,
                                icon: 'shopping-list'
                            },
                            {
                                name: 'shopping-cart',
                                url: path('multi-cart'),
                                label: 'page.multi_cart.shopping_cart.list.title' | trans,
                                icon: 'cart'
                            },
                            {
                                name: 'quote-request',
                                url: path('quote-request'),
                                label: 'quote_request_widget.request_for_quote.list.title' | trans,
                                icon: 'message',
                            },
                        ],
                    }
                } only %}

                {% if can('SeeCompanyMenuPermissionPlugin') %}
                    {% set menuItemCompanyWidget = findWidget('MenuItemCompanyWidget') %}
                    {% set companyName = menuItemCompanyWidget.companyName %}

                    {% include organism('account-navigation') with {
                        modifiers: ['company'],
                        attributes: {
                            'container-class-name': 'js-page-layout-main__side-drawer-container',
                            'trigger-class-name': 'js-page-layout-main__company-account-navigation-trigger',
                            'locked-body-class-name': 'is-locked-mobile',
                        },
                        data: {
                            introIcon: 'office',
                            title: companyName,
                            items: [
                                {
                                    name: 'overview',
                                    url: path('company/overview'),
                                    label: 'company.account.overview' | trans,
                                    icon: 'shopping-list'
                                },
                                {
                                    name: 'users',
                                    url: path('company/user'),
                                    label: 'company.account.company_user' | trans,
                                    icon: 'users'
                                },
                                {
                                    name: 'business-unit',
                                    url: path('company/business-unit'),
                                    label: 'company.account.business_unit' | trans,
                                    icon: 'office'
                                },
                                {
                                    name: 'role',
                                    url: path('company/company-role'),
                                    label: 'company.account.company_role' | trans,
                                    icon: 'user'
                                },
                                {
                                    name: 'company-documents',
                                    url: path('company/documents'),
                                    label: 'company.account.company_documents' | trans,
                                    icon: 'file',
                                }
                            ]
                        }
                    } only %}
                {% endif %}
            {% endif %}
        {% endblock %}

        {% block outside %}{% endblock %}

        {% block header %}

            {% embed organism('header') with {
                embed: {
                    logoSrc: frontendConfiguratorWidget.data.logoUrl ?? null,
                },
            } only %}
                {% block navigation %}
                    {% cms_slot 'slt-desktop-header' %}
                {% endblock %}

                {% block logo %}
                    {% include molecule('logo') with {
                        class: 'col ' ~  config.name ~ '__logo',
                        modifiers: ['main'],
                        attributes: {
                            src: embed.logoSrc,
                        }
                    } only %}
                {% endblock %}

                {% block mobile %}

                        {% include atom('icon') with {
                            modifiers: ['big'],
                            data: {
                                name: 'bars',
                            },
                        } only %}

                {% endblock %}
            {% endembed %}
        {% endblock %}

            {% block pageInfo %}

                        {% block breadcrumbs %}
                            {% include molecule('breadcrumb') only %}
                        {% endblock %}

                        {% block title %}
                            {{ data.title }}
                        {% endblock %}

            {% endblock %}

                {% block contentTop %}{% endblock %}

                {% block contentWrap %}

                        {% block content %}{% endblock %}

                {% endblock %}

                {% block contentBottom %}{% endblock %}

        {% block footer %}
            {% cms_slot 'slt-1' %}

            {% embed organism('footer') only %}
                {% block logosInner %}
                    {% cms_slot 'slt-footer-partners' %}
                {% endblock %}

                {% block navigationInner %}

                        {% cms_slot 'slt-footer-navigation' %}

                {% endblock %}

                {% block socialLinks %}
                    {% cms_slot 'slt-footer-social-links' %}
                {% endblock %}
            {% endembed %}
        {% endblock %}

    {% include atom('overlay-block') only %}
    {% include atom('touch-checker') only %}

    {% block globalComponents %}
        {% include molecule('action-single-click-enforcer') with {
            attributes: {
                'target-selector': '[data-init-single-click]',
            },
        } only %}

        {% include molecule('form-submitter') with {
            attributes: {
                'trigger-selector': '[data-form-submitter]',
            },
        } only %}

        {% include molecule('viewport-intersection-observer') only %}

        {% include molecule('node-animator') only %}

        {% include molecule('window-load-class-remover') with {
            attributes: {
                'target-class-name': 'page-layout',
                'trigger-class-name': 'page-layout--preload',
            },
        } only %}
    {% endblock %}

    {% block icons %}
        {% include atom('icon-sprite') only %}
    {% endblock %}
{% endblock %}

```

###  Health Score

30

—

LowBetter than 62% of packages

Maintenance57

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 50% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

281d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/c6756c39a921146991fee6b4090f4130af143ee3aa7a776b688365c5f3d5b511?d=identicon)[spryker\_solution\_consulting\_demos](/maintainers/spryker_solution_consulting_demos)

---

Top Contributors

[![devvent](https://avatars.githubusercontent.com/u/4672959?v=4)](https://github.com/devvent "devvent (2 commits)")[![asaulenko](https://avatars.githubusercontent.com/u/20285714?v=4)](https://github.com/asaulenko "asaulenko (1 commits)")[![MaryamTarekOmar](https://avatars.githubusercontent.com/u/98816701?v=4)](https://github.com/MaryamTarekOmar "MaryamTarekOmar (1 commits)")

### Embed Badge

![Health badge](/badges/spryker-demo-company-document-feature/health.svg)

```
[![Health](https://phpackages.com/badges/spryker-demo-company-document-feature/health.svg)](https://phpackages.com/packages/spryker-demo-company-document-feature)
```

###  Alternatives

[laminas/laminas-paginator

Paginate collections of data from arbitrary sources

246.1M97](/packages/laminas-laminas-paginator)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
