public function registerProductPageMapper($services)
 {
     // Service to map pages to products and vice-versa
     $services['product.page_mapper.simple'] = function ($c) {
         $mapper = new \Message\Mothership\Commerce\ProductPageMapper\SimpleMapper($c['db.query'], $c['cms.page.loader'], $c['cms.page.authorisation'], $c['product.loader'], $c['product.unit.loader']);
         $mapper->setValidFieldNames('product');
         $mapper->setValidGroupNames(null);
         $mapper->setValidPageTypes('product');
         return $mapper;
     };
     $services['product.page_mapper.option_criteria'] = function ($c) {
         $mapper = new \Message\Mothership\Commerce\ProductPageMapper\OptionCriteriaMapper($c['db.query'], $c['cms.page.loader'], $c['cms.page.authorisation'], $c['product.loader'], $c['product.unit.loader']);
         $mapper->setValidFieldNames('product');
         $mapper->setValidGroupNames(null);
         $mapper->setValidPageTypes('product');
         return $mapper;
     };
     // Set the default product page mapper to the simple mapper
     $services['product.page_mapper'] = $services->raw('product.page_mapper.simple');
     $services['page.product_mapper'] = $services->raw('product.page_mapper.simple');
     // Extend twig with the product/page finders
     $services->extend('templating.twig.environment', function ($twig, $c) {
         $twig->addExtension(new \Message\Mothership\Commerce\ProductPageMapper\Templating\TwigExtension($c['page.product_mapper'], $c['product.page_mapper']));
         return $twig;
     });
 }
 public function registerServices($services)
 {
     $this->addOrderStatuses($services);
     $this->registerEmails($services);
     $this->registerStatisticsDatasets($services);
     $this->registerPaymentGateways($services);
     $services['form.orders.checkbox'] = $services->factory(function ($sm) {
         return new \Message\Mothership\Ecommerce\Form\Orders($sm);
     });
     /**
      * @deprecated
      */
     $services['form.pickup'] = $services->factory(function ($sm) {
         return new \Message\Mothership\Ecommerce\Form\Pickup($sm);
     });
     $services['form.fulfillment.pickup'] = $services->factory(function ($c) {
         return new \Message\Mothership\Ecommerce\Form\Fulfillment\Pickup($c['order.dispatch.loader']);
     });
     $services['file.packing_slip'] = $services->factory(function ($sm) {
         return new \Message\Mothership\Ecommerce\File\PackingSlip($sm);
     });
     $services['checkout.hash'] = function ($c) {
         return new \Message\Cog\Security\Hash\SHA1($c['security.salt']);
     };
     // Add payments logger
     $services['log.payments'] = function ($c) {
         $logger = new \Monolog\Logger('payments');
         return $logger;
     };
     // @todo move to commerce, where address is
     $services['address.form'] = $services->factory(function ($sm) {
         return new \Message\Mothership\Ecommerce\Form\AddressForm($sm);
     });
     $services['checkout.form.addresses'] = $services->factory(function ($sm) {
         return new \Message\Mothership\Ecommerce\Form\CheckoutAddressesForm($sm);
     });
     $services['checkout.form.register'] = $services->factory(function ($sm) {
         return new \Message\Mothership\Ecommerce\Form\CheckoutRegisterForm($sm);
     });
     $services['checkout.form.confirm'] = function ($c) {
         return new \Message\Mothership\Ecommerce\Form\CheckoutConfirmForm($c['gateways'], $c['translator']);
     };
     $services['product.form.upload_confirm'] = $services->factory(function ($c) {
         return new \Message\Mothership\Ecommerce\Form\Product\CsvUploadConfirm($c['routing.generator'], $c['product.form.upload_create_product_pages'], (bool) $c['cfg']->shop->shopParentPage);
     });
     $services['product.form.upload_create_product_pages'] = $services->factory(function ($c) {
         return new \Message\Mothership\Ecommerce\Form\Product\CreateProductPages($c['translator'], $c['cms.page.loader'], $c['http.session'], $c['product.page.variant_name_crawler'], $c['product.page.brand_validator'], $c['cfg']->shop->shopParentPage);
     });
     $services['product.form.product_page_publish'] = $services->factory(function ($c) {
         return new \Message\Mothership\Ecommerce\Form\Product\ProductPagePublish();
     });
     $services['product.form.product_page_create'] = $services->factory(function ($c) {
         return new \Message\Mothership\Ecommerce\Form\Product\ProductPageCreateSingle($c['cms.page.loader'], $c['product.option.loader']);
     });
     $services['product.page.unit_record.edit'] = $services->factory(function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\UnitRecord\Edit($c['db.transaction']);
     });
     $services['product.page.create'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\Create($c['cms.page.create'], $c['cms.page.edit'], $c['cms.page.loader'], $c['cms.page.content_loader'], $c['cms.page.content_edit'], $c['cms.page.types'], $c['product.page_type.listing'], $c['product.page.create_dispatcher'], $c['product.page.parent_create_dispatcher'], $c['product.page.exists'], $c['product.page_type.mapping']);
     };
     $services['product.page.exists'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\Exists($c['db.query']);
     };
     $services['product.page.upload_record.builder'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\UploadRecord\Builder();
     };
     $services['product.page.upload_record.create'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\UploadRecord\Create($c['db.transaction']);
     };
     $services['product.page.upload_record.loader'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\UploadRecord\Loader($c['db.query']);
     };
     $services['product.page.upload_record.edit'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\UploadRecord\Edit($c['db.transaction']);
     };
     $services['product.page_type.listing'] = function ($c) {
         return null;
     };
     $services['product.page_type.mapping'] = function ($c) {
         return [];
     };
     $services['product.page.create_dispatcher'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\ProductPageCreateEventDispatcher($c['event.dispatcher']);
     };
     $services['product.page.parent_create_dispatcher'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\ParentPageCreateEventDispatcher($c['event.dispatcher']);
     };
     $services['product.page.variant_name_crawler'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\UploadData\VariantNameCrawler($c['product.upload.heading_keys']);
     };
     $services['product.page.brand_validator'] = function ($c) {
         return new \Message\Mothership\Ecommerce\ProductPage\UploadData\BrandValidator($c['product.upload.heading_keys']);
     };
     // Override from commerce to allow the use of page mappings.
     $services['product.page_mapper.simple'] = function ($c) {
         $mapper = new \Message\Mothership\Commerce\ProductPageMapper\SimpleMapper($c['db.query'], $c['cms.page.loader'], $c['cms.page.authorisation'], $c['product.loader'], $c['product.unit.loader']);
         $mapper->setValidFieldNames('product');
         $mapper->setValidGroupNames(null);
         $mapper->setValidPageTypes(array_merge(['product'], array_values($c['product.page_type.mapping'])));
         return $mapper;
     };
 }