From 1758dab67b1799846ac7d95b7c36781ce325afe4 Mon Sep 17 00:00:00 2001 From: GoZ Date: Fri, 27 Jan 2017 16:15:04 +0100 Subject: [PATCH 1/6] Add multiprice recipe --- v2/recipes/index.md | 4 +- v2/recipes/multiprice.md | 121 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 v2/recipes/multiprice.md diff --git a/v2/recipes/index.md b/v2/recipes/index.md index 424862ec1..877330039 100644 --- a/v2/recipes/index.md +++ b/v2/recipes/index.md @@ -11,4 +11,6 @@ These recipes are all designed to work off of each other, so try it out - you ca [Products](products.md) - Products and types. -[Orders](orders.md) - Orders, order items, and their types. \ No newline at end of file +[Multiprice](multiprice.md) - Multiprice and multicurrency. + +[Orders](orders.md) - Orders, order items, and their types. diff --git a/v2/recipes/multiprice.md b/v2/recipes/multiprice.md new file mode 100644 index 000000000..688f7c437 --- /dev/null +++ b/v2/recipes/multiprice.md @@ -0,0 +1,121 @@ +# Multiprice and multicurrency + +We want to define a specific price and currency for each language. + +We need a new multiple commerce_price field in product variation in place of default price field. + +Add following field in a custom module or add your own multiple commerce_price field to product variation. + +## Creating field +```yaml +# config/install/field.field.commerce_product_variation.default.multiprice.yml +langcode: en +status: true +dependencies: + config: + - commerce_product.commerce_product_variation_type.default + - field.storage.commerce_product_variation.multiprice + module: + - commerce_price +id: commerce_product_variation.default.multiprice +field_name: multiprice +entity_type: commerce_product_variation +bundle: default +label: Multiprice +description: 'Define differents prices depending of currency' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: commerce_price +``` + +```yaml +# config/install/field.storage.commerce_product_variation.multiprice.yml +langcode: en +status: true +dependencies: + module: + - commerce_price + - commerce_product +id: commerce_product_variation.multiprice +field_name: multiprice +entity_type: commerce_product_variation +type: commerce_price +settings: { } +module: commerce_price +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false +``` + +* Hide default price field from product variation form display and display mode. +* Display multiprice field in form display and display mode. + +## Creating resolver + +### Add resolver to services + +```yaml +services: + commerce_multiprice_example.commerce_multicurrency_resolver: + class: Drupal\commerce_multiprice_example\Resolvers\CommerceMulticurrencyResolver + arguments: ['@request_stack'] + tags: + - { name: commerce_price.price_resolver, priority: 600 } +``` + +### Creating resolver + +Replace multiprice field name by your own field if needed. + +```php + 'USD', 'fr' => 'EUR', 'ja' => 'JPY']; + + // Get current language. + $language = \Drupal::languageManager()->getCurrentLanguage()->getId(); + + // Get default language. + $default_language = \Drupal::languageManager()->getDefaultLanguage()->getId(); + + // Set default price to null. Default price will be used to return currency + // of default language if no currency has been found for current language. + $default_price = NULL; + + // Find price for current language depending of its currency. + foreach ($entity->get('multiprice') as $price) { + if ($price->get('currency_code')->getValue() == $currency_by_language[$language]) { + return new Price($price->get('number')->getValue(), $price->get('currency_code')->getValue()); + } + elseif ($price->get('currency_code')->getValue() == $currency_by_language[$default_language]) { + $default_price = new Price($price->get('number')->getValue(), $price->get('currency_code')->getValue()); + } + } + + return $default_price; + } +} +``` + From 94a8630477a7f9462a692417054057e8f7c5afe2 Mon Sep 17 00:00:00 2001 From: GoZ Date: Sat, 28 Jan 2017 11:58:33 +0100 Subject: [PATCH 2/6] Add language manager as DependencyInjection --- v2/recipes/multiprice.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/v2/recipes/multiprice.md b/v2/recipes/multiprice.md index 688f7c437..034e83654 100644 --- a/v2/recipes/multiprice.md +++ b/v2/recipes/multiprice.md @@ -87,6 +87,23 @@ use Drupal\commerce_price\Resolver\PriceResolverInterface; */ class CommerceMulticurrencyResolver implements PriceResolverInterface { + /** + * The language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + + /** + * Constructs a new CommerceMulticurrencyResolver object. + * + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * The language manager. + */ + public function __construct(LanguageManagerInterface $language_manager) { + $this->languageManager = $language_manager; + } + /** * {@inheritdoc} */ @@ -95,10 +112,10 @@ class CommerceMulticurrencyResolver implements PriceResolverInterface { $currency_by_language = ['en' => 'USD', 'fr' => 'EUR', 'ja' => 'JPY']; // Get current language. - $language = \Drupal::languageManager()->getCurrentLanguage()->getId(); + $language = $this->languageManager->getCurrentLanguage()->getId(); // Get default language. - $default_language = \Drupal::languageManager()->getDefaultLanguage()->getId(); + $default_language = $this->languageManager->getDefaultLanguage()->getId(); // Set default price to null. Default price will be used to return currency // of default language if no currency has been found for current language. From a27a21543e15edd2a338a15a09240d880a442c04 Mon Sep 17 00:00:00 2001 From: GoZ Date: Sat, 28 Jan 2017 12:06:43 +0100 Subject: [PATCH 3/6] Miss switching resolver service arguments to language_manager --- v2/recipes/multiprice.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2/recipes/multiprice.md b/v2/recipes/multiprice.md index 034e83654..a2e26f14c 100644 --- a/v2/recipes/multiprice.md +++ b/v2/recipes/multiprice.md @@ -64,7 +64,7 @@ custom_storage: false services: commerce_multiprice_example.commerce_multicurrency_resolver: class: Drupal\commerce_multiprice_example\Resolvers\CommerceMulticurrencyResolver - arguments: ['@request_stack'] + arguments: ['@language_manager'] tags: - { name: commerce_price.price_resolver, priority: 600 } ``` From c75750c2b6e39effd0be7e9c94a72da8c2cee524 Mon Sep 17 00:00:00 2001 From: GoZ Date: Sat, 28 Jan 2017 12:26:39 +0100 Subject: [PATCH 4/6] language module has to be enabled and french and japanese languages should exist --- v2/recipes/multiprice.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/v2/recipes/multiprice.md b/v2/recipes/multiprice.md index a2e26f14c..3a4748d51 100644 --- a/v2/recipes/multiprice.md +++ b/v2/recipes/multiprice.md @@ -2,11 +2,16 @@ We want to define a specific price and currency for each language. +## Adding languages + +Enable language module and add French and Japanese languages. + +## Creating field + We need a new multiple commerce_price field in product variation in place of default price field. Add following field in a custom module or add your own multiple commerce_price field to product variation. -## Creating field ```yaml # config/install/field.field.commerce_product_variation.default.multiprice.yml langcode: en From f6cc9eab1a8c71071b070c1adb59a4bd7d12bdc5 Mon Sep 17 00:00:00 2001 From: GoZ Date: Sat, 28 Jan 2017 14:10:44 +0100 Subject: [PATCH 5/6] Replace multiprice field by 1 field by currency --- v2/recipes/multiprice.md | 149 +++++++++++++++++++++++++++++++-------- 1 file changed, 118 insertions(+), 31 deletions(-) diff --git a/v2/recipes/multiprice.md b/v2/recipes/multiprice.md index 3a4748d51..405807388 100644 --- a/v2/recipes/multiprice.md +++ b/v2/recipes/multiprice.md @@ -8,58 +8,156 @@ Enable language module and add French and Japanese languages. ## Creating field -We need a new multiple commerce_price field in product variation in place of default price field. +We need as many commerce_price fields as currency in product variation in place of default price field. -Add following field in a custom module or add your own multiple commerce_price field to product variation. +Add following fields in a custom module or add your own commerce_price fields to product variation. ```yaml -# config/install/field.field.commerce_product_variation.default.multiprice.yml +# config/install/field.field.commerce_product_variation.default.price_eur.yml langcode: en status: true dependencies: config: - commerce_product.commerce_product_variation_type.default - - field.storage.commerce_product_variation.multiprice + - field.storage.commerce_product_variation.price_eur module: - commerce_price -id: commerce_product_variation.default.multiprice -field_name: multiprice +id: commerce_product_variation.default.price_eur +field_name: price_eur entity_type: commerce_product_variation bundle: default -label: Multiprice -description: 'Define differents prices depending of currency' +label: Price EUR +description: 'Define price for EUR currency' required: true translatable: false default_value: { } default_value_callback: '' +settings: + available_currencies: + - 'EUR' +field_type: commerce_price +``` + +```yaml +# config/install/field.storage.commerce_product_variation.price_eur.yml +langcode: en +status: true +dependencies: + module: + - commerce_price + - commerce_product +id: commerce_product_variation.price_eur +field_name: price_eur +entity_type: commerce_product_variation +type: commerce_price settings: { } +module: commerce_price +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false +``` + +```yaml +# config/install/field.field.commerce_product_variation.default.price_usd.yml +langcode: en +status: true +dependencies: + config: + - commerce_product.commerce_product_variation_type.default + - field.storage.commerce_product_variation.price_usd + module: + - commerce_price +id: commerce_product_variation.default.price_usd +field_name: price_usd +entity_type: commerce_product_variation +bundle: default +label: Price USD +description: 'Define price for USD currency' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: + available_currencies: + - 'USD' field_type: commerce_price ``` ```yaml -# config/install/field.storage.commerce_product_variation.multiprice.yml +# config/install/field.storage.commerce_product_variation.price_usd.yml langcode: en status: true dependencies: module: - commerce_price - commerce_product -id: commerce_product_variation.multiprice -field_name: multiprice +id: commerce_product_variation.price_usd +field_name: price_usd entity_type: commerce_product_variation type: commerce_price settings: { } module: commerce_price locked: false -cardinality: -1 +cardinality: 1 translatable: true indexes: { } persist_with_no_fields: false custom_storage: false ``` -* Hide default price field from product variation form display and display mode. -* Display multiprice field in form display and display mode. +```yaml +# config/install/field.field.commerce_product_variation.default.price_jpy.yml +langcode: en +status: true +dependencies: + config: + - commerce_product.commerce_product_variation_type.default + - field.storage.commerce_product_variation.price_jpy + module: + - commerce_price +id: commerce_product_variation.default.price_jpy +field_name: price_jpy +entity_type: commerce_product_variation +bundle: default +label: Price JPY +description: 'Define price for JPY currency' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: + available_currencies: + - 'JPY' +field_type: commerce_price +``` + +```yaml +# config/install/field.storage.commerce_product_variation.price_jpy.yml +langcode: en +status: true +dependencies: + module: + - commerce_price + - commerce_product +id: commerce_product_variation.price_jpy +field_name: price_jpy +entity_type: commerce_product_variation +type: commerce_price +settings: { } +module: commerce_price +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false +``` + +* Hide default price field from product variation form display. +* Display default price field format to 'Calculated price' in display mode. ## Creating resolver @@ -119,24 +217,13 @@ class CommerceMulticurrencyResolver implements PriceResolverInterface { // Get current language. $language = $this->languageManager->getCurrentLanguage()->getId(); - // Get default language. - $default_language = $this->languageManager->getDefaultLanguage()->getId(); - - // Set default price to null. Default price will be used to return currency - // of default language if no currency has been found for current language. - $default_price = NULL; - - // Find price for current language depending of its currency. - foreach ($entity->get('multiprice') as $price) { - if ($price->get('currency_code')->getValue() == $currency_by_language[$language]) { - return new Price($price->get('number')->getValue(), $price->get('currency_code')->getValue()); - } - elseif ($price->get('currency_code')->getValue() == $currency_by_language[$default_language]) { - $default_price = new Price($price->get('number')->getValue(), $price->get('currency_code')->getValue()); - } - } + // Get value from currency price field. + if ($entity->hasField('price_' . strtolower($currency_by_language[$language]))) { + $price = $entity->get('price_' . strtolower($currency_by_language[$language]))->getValue(); + $price = reset($price); - return $default_price; + return new Price($price['number'], $price['currency_code']); + } } } ``` From c8641baf53e75e0a65cf20dfc6f1292f9353d839 Mon Sep 17 00:00:00 2001 From: GoZ Date: Sat, 28 Jan 2017 14:25:51 +0100 Subject: [PATCH 6/6] Remove line from end of file --- v2/recipes/multiprice.md | 1 - 1 file changed, 1 deletion(-) diff --git a/v2/recipes/multiprice.md b/v2/recipes/multiprice.md index 405807388..441e79e00 100644 --- a/v2/recipes/multiprice.md +++ b/v2/recipes/multiprice.md @@ -227,4 +227,3 @@ class CommerceMulticurrencyResolver implements PriceResolverInterface { } } ``` -