From 073905200e052b979cc52ec1d0ce20b56f363279 Mon Sep 17 00:00:00 2001 From: Franck Allimant Date: Sat, 10 May 2014 00:10:32 +0200 Subject: [PATCH] Added delivery country condition --- .../Implementation/MatchCountries.php | 180 ++++++++++++++++++ .../countries-condition.html | 14 ++ 2 files changed, 194 insertions(+) create mode 100644 core/lib/Thelia/Condition/Implementation/MatchCountries.php create mode 100644 templates/backOffice/default/coupon/condition-fragments/countries-condition.html diff --git a/core/lib/Thelia/Condition/Implementation/MatchCountries.php b/core/lib/Thelia/Condition/Implementation/MatchCountries.php new file mode 100644 index 000000000..2eceeee17 --- /dev/null +++ b/core/lib/Thelia/Condition/Implementation/MatchCountries.php @@ -0,0 +1,180 @@ + + * + */ +class MatchCountries extends ConditionAbstract +{ + /** Condition 1st parameter : quantity */ + CONST COUNTRIES_LIST = 'countries'; + + /** + * @inheritdoc + */ + public function __construct(FacadeInterface $facade) + { + $this->serviceId = 'thelia.condition.match_countries'; + + $this->availableOperators = [ + self::COUNTRIES_LIST => [ + Operators::IN, + Operators::OUT + ] + ]; + + parent::__construct($facade); + } + + /** + * @inheritdoc + */ + public function setValidatorsFromForm(array $operators, array $values) + { + $this->checkComparisonOperatorValue($operators, self::COUNTRIES_LIST); + + // Use default values if data is not defined. + if (! isset($operators[self::COUNTRIES_LIST]) || ! isset($values[self::COUNTRIES_LIST])) { + $operators[self::COUNTRIES_LIST] = Operators::IN; + $values[self::COUNTRIES_LIST] = []; + } + + // Be sure that the value is an array, make one if required + if (! is_array($values[self::COUNTRIES_LIST])) { + $values[self::COUNTRIES_LIST] = array($values[self::COUNTRIES_LIST]); + } + + // Check that at least one category is selected + if (empty($values[self::COUNTRIES_LIST])) { + throw new InvalidConditionValueException( + get_class(), self::COUNTRIES_LIST + ); + } + + $this->operators = [ self::COUNTRIES_LIST => $operators[self::COUNTRIES_LIST] ]; + $this->values = [ self::COUNTRIES_LIST => $values[self::COUNTRIES_LIST] ]; + + return $this; + } + + /** + * @inheritdoc + */ + public function isMatching() + { + // The delivery address should match one of the selected countries. + + /* TODO !!!! */ + return $this->conditionValidator->variableOpComparison( + $this->facade->getNbArticlesInCart(), + $this->operators[self::COUNTRIES_LIST], + $this->values[self::COUNTRIES_LIST] + ); + } + + /** + * @inheritdoc + */ + public function getName() + { + return $this->translator->trans( + 'Delivery country condition', + [], + 'condition' + ); + } + + /** + * @inheritdoc + */ + public function getToolTip() + { + $toolTip = $this->translator->trans( + 'The coupon applies to the selected delivery countries', + [], + 'condition' + ); + + return $toolTip; + } + + /** + * @inheritdoc + */ + public function getSummary() + { + $i18nOperator = Operators::getI18n( + $this->translator, $this->operators[self::COUNTRIES_LIST] + ); + + $cntryStrList = ''; + + $cntryIds = $this->values[self::COUNTRIES_LIST]; + + if (null !== $cntryList = CountryQuery::create()->findPks($cntryIds)) { + + /** @var Category $cntry */ + foreach($cntryList as $cntry) { + $cntryStrList .= $cntry->getTitle() . ', '; + } + + $cntryStrList = rtrim($cntryStrList, ', '); + } + + $toolTip = $this->translator->trans( + 'Only if order is delivered to countries %op% %countries_list%', [ + '%countries_list%' => $cntryStrList, + '%op%' => $i18nOperator + ], 'condition' + ); + + return $toolTip; + } + + /** + * @inheritdoc + */ + protected function generateInputs() + { + return array( + self::COUNTRIES_LIST => array( + 'availableOperators' => $this->availableOperators[self::COUNTRIES_LIST], + 'value' => '', + 'selectedOperator' => Operators::IN + ) + ); + } + + /** + * @inheritdoc + */ + public function drawBackOfficeInputs() + { + return $this->facade->getParser()->render('coupon/condition-fragments/countries-condition.html', [ + 'operatorSelectHtml' => $this->drawBackOfficeInputOperators(self::COUNTRIES_LIST), + 'countries_field_name' => self::COUNTRIES_LIST, + 'values' => isset($this->values[self::COUNTRIES_LIST]) ? $this->values[self::COUNTRIES_LIST] : array() + ] + ); + } +} diff --git a/templates/backOffice/default/coupon/condition-fragments/countries-condition.html b/templates/backOffice/default/coupon/condition-fragments/countries-condition.html new file mode 100644 index 000000000..1a03a5042 --- /dev/null +++ b/templates/backOffice/default/coupon/condition-fragments/countries-condition.html @@ -0,0 +1,14 @@ +
+ + {$operatorSelectHtml nofilter} +
+ +
+ + + {intl l='Use Ctrl+click to select (or deselect) more that one country'} +
\ No newline at end of file