Source of file Variation.php
Size: 18,745 Bytes - Last Modified: 2021-12-24T06:46:07+00:00
/var/www/docs.ssmods.com/process/src/src/Model/Variation.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567 | <?php namespace Dynamic\Foxy\Model; use Bummzack\SortableFile\Forms\SortableUploadField; use SilverStripe\Assets\File; use SilverStripe\Forms\CheckboxField; use SilverStripe\Forms\CurrencyField; use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\FieldGroup; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\NumericField; use SilverStripe\Forms\ReadonlyField; use SilverStripe\Forms\TextField; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\ManyManyList; use SilverStripe\ORM\ValidationResult; use SilverStripe\Security\Permission; use SilverStripe\Security\Security; /** * Class Variation * @package Dynamic\Foxy\Model * * @property string $Title * @property bool $UseProductContent * @property string Content * @property float $WeightModifier * @property string $CodeModifier * @property float $PriceModifier * @property string $WeightModifierAction * @property string $CodeModifierAction * @property string $PriceModifierAction * @property bool $Available * @property int $Type * @property string $OptionModifierKey * @property int $SortOrder * @property float $FinalPrice * @property float $FinalWeight * @property string $FinalCode * @property int $VariationTypeID * * @method VariationType VariationType() * * @method ManyManyList Images() */ class Variation extends DataObject { /** * @var string */ private static $table_name = 'Variation'; /** * @var string */ private static $singular_name = 'Variation'; /** * @var string */ private static $plural_name = 'Variations'; /** * @var string[] */ private static $db = [ 'Title' => 'Varchar(255)', 'UseProductContent' => 'Boolean', 'Content' => 'HTMLText', 'WeightModifier' => 'Decimal(9,3)', 'CodeModifier' => 'Text', 'PriceModifier' => 'Currency', 'WeightModifierAction' => "Enum('Add,Subtract,Set', null)", 'CodeModifierAction' => "Enum('Add,Subtract,Set', null)", 'PriceModifierAction' => "Enum('Add,Subtract,Set', null)", 'Available' => 'Boolean', 'Type' => 'Int', 'OptionModifierKey' => 'Varchar(255)', 'SortOrder' => 'Int', 'FinalPrice' => 'Currency', 'FinalWeight' => 'Decimal(9,3)', 'FinalCode' => 'Varchar(255)', ]; /** * @var string[] */ private static $indexes = [ 'FinalPrice' => true, 'FinalWeight' => true, 'FinalCode' => true, ]; /** * @var string[] */ private static $has_one = [ 'VariationType' => VariationType::class, ]; /** * @var array */ private static $many_many = [ 'Images' => File::class, ]; /** * @var \string[][] */ private static $many_many_extraFields = [ 'Images' => [ 'SortOrder' => 'Int', ], ]; /** * @var string[] */ private static $owns = [ 'Images', ]; /** * @var string[] */ private static $default_sort = 'SortOrder'; /** * The relation name was established before requests for videos. * The relation has subsequently been updated from Image::class to File::class * to allow for additional file types such as mp4 * * @var array */ private static $allowed_images_extensions = [ 'gif', 'jpeg', 'jpg', 'png', 'bmp', 'ico', 'mp4', ]; /** * @return FieldList */ public function getCMSFields() { $this->beforeUpdateCMSFields(function (FieldList $fields) { $fields->removeByName([ 'Images', 'WeightModifier', 'CodeModifier', 'PriceModifier', 'WeightModifierAction', 'CodeModifierAction', 'PriceModifierAction', 'Available', 'Type', 'OptionModifierKey', 'SortOrder', 'ProductID', 'FinalPrice', 'FinalWeight', 'FinalCode', ]); $fields->insertBefore( 'Content', CheckboxField::create('Available') ->setTitle('Available for purchase') ); $fields->insertBefore( 'Content', $fields->dataFieldByName('VariationTypeID') ); $fields->insertBefore( 'Content', $fields->dataFieldByName('UseProductContent') ); $content = $fields->dataFieldByName('Content'); $content->hideUnless('UseProductContent')->isNotChecked()->end(); if ($this->exists()) { $fields->addFieldToTab( 'Root.ProductModifications', ReadonlyField::create('OptionModifierKey') ->setTitle(_t('Variation.ModifierKey', 'Modifier Key')) ); } if ($this->Product()->hasDatabaseField('Weight')) { $fields->addFieldtoTab( 'Root.ProductModifications', FieldGroup::create( DropdownField::create( 'WeightModifierAction', _t('Variation.WeightModifierAction', 'Weight Modification Type'), [ 'Add' => _t( 'Variation.WeightAdd', 'Add to Base Weight', 'Add to weight' ), 'Subtract' => _t( 'Variation.WeightSubtract', 'Subtract from Base Weight', 'Subtract from weight' ), 'Set' => _t('Variation.WeightSet', 'Set as a new Weight'), ] ) ->setEmptyString('') ->setDescription(_t( 'Variation.WeightDescription', 'Does weight modify or replace base weight?' )), NumericField::create("WeightModifier") ->setTitle(_t('Variation.WeightModifier', 'Weight')) ->setScale(3) ->setDescription(_t( 'Variation.WeightDescription', 'Only supports up to 3 decimal places' ))->displayIf('WeightModifierAction')->isNotEmpty()->end(), NumericField::create('FinalWeight') ->setTitle('Final Modified Weight') ->setDescription("Product's weight is {$this->Product()->Weight}") ->performDisabledTransformation() )->setTitle('Weight Modification') ); } $fields->addFieldsToTab( 'Root.ProductModifications', [ // Price Modifier Fields //HeaderField::create('PriceHD', _t('Variation.PriceHD', 'Modify Price'), 4), FieldGroup::create( DropdownField::create( 'PriceModifierAction', _t('Variation.PriceModifierAction', 'Price Modification Type'), [ 'Add' => _t( 'Variation.PriceAdd', 'Add to Base Price', 'Add to price' ), 'Subtract' => _t( 'Variation.PriceSubtract', 'Subtract from Base Price', 'Subtract from price' ), 'Set' => _t('Variation.PriceSet', 'Set as a new Price'), ] ) ->setEmptyString('') ->setDescription(_t('Variation.PriceDescription', 'Does price modify or replace base price?')), CurrencyField::create('PriceModifier') ->setTitle(_t('Variation.PriceModifier', 'Price')) ->displayIf('PriceModifierAction')->isNotEmpty()->end(), CurrencyField::create('FinalPrice') ->setTitle('Final Modified Price') ->setDescription("Product's price is {$this->Product()->Price}") ->performDisabledTransformation() )->setTitle('Price Modifications'), // Code Modifier Fields //HeaderField::create('CodeHD', _t('Variation.CodeHD', 'Modify Code'), 4), FieldGroup::create( DropdownField::create( 'CodeModifierAction', _t('Variation.CodeModifierAction', 'Code Modification Type'), [ 'Add' => _t( 'Variation.CodeAdd', 'Add to Base Code', 'Add to code' ), 'Subtract' => _t( 'Variation.CodeSubtract', 'Subtract from Base Code', 'Subtract from code' ), 'Set' => _t('Variation.CodeSet', 'Set as a new Code'), ] ) ->setEmptyString('') ->setDescription(_t('Variation.CodeDescription', 'Does code modify or replace base code?')), TextField::create('CodeModifier') ->setTitle(_t('Variation.CodeModifier', 'Code')) ->displayIf('CodeModifierAction')->isNotEmpty()->end(), TextField::create('FinalCode') ->setTitle('Final Modified Code') ->setDescription("Product's code is {$this->Product()->Code}") ->performDisabledTransformation() )->setTitle('Code Modification'), ] ); // Images tab $images = SortableUploadField::create('Images') ->setSortColumn('SortOrder') ->setIsMultiUpload(true) ->setAllowedExtensions($this->config()->get('allowed_images_extensions')) ->setFolderName('Uploads/Products/Images'); $fields->addFieldsToTab('Root.Images', [ $images, ]); }); return parent::getCMSFields(); } /** * */ public function onBeforeWrite() { parent::onBeforeWrite(); $modifierKeyField = 'OptionModifierKey'; $this->{$modifierKeyField} = $this->getGeneratedValue(); $codeModifierField = 'CodeModifier'; switch ($this->CodeModifierAction) { case 'Subtract': case 'Add': if ($this->config()->get('trimAllWhitespace') == false) { // trim the right of the code - some companies use spaces to denote options $trimmed = rtrim($this->{$codeModifierField}); // replace duplicate spaces $this->{$codeModifierField} = preg_replace('/\s+/', ' ', $trimmed); break; } /* falls through */ case 'Set': $trimmed = trim($this->{$codeModifierField}); $this->{$codeModifierField} = preg_replace('/\s+/', ' ', $trimmed); break; } $this->FinalPrice = $this->calculateFinalPrice(); $this->FinalCode = $this->calculateFinalCode(); if ($this->Product()->hasDatabaseField('Weight')) { $this->FinalWeight = $this->calculateFinalWeight(); } } /** * @return ValidationResult */ public function validate() { $validate = parent::validate(); $product = $this->Product(); if (!$this->Title) { $validate->addFieldError('Title', 'A title is required'); } /*if (!$this->VariationTypeID) { $validate->addFieldError('VariationTypeID', 'A variation type is required'); }//*/ if ($this->PriceModifierAction == 'Subtract' && $this->PriceModifier > $product->Price) { $validate->addFieldError('PriceModifier', "You can't subtract more than the price of the product ({$product->Price})"); } if ($this->WeightModifierAction == 'Subtract' && $this->WeightModifier > $product->Weight) { $validate->addFieldError('WeightModifier', "You can't subtract more than the weight of the product ({$product->Weight})"); } return $validate; } /** * @return string */ public function getGeneratedValue() { $modPrice = ($this->PriceModifier) ? (string)$this->PriceModifier : '0'; $modPriceWithSymbol = self::getOptionModifierActionSymbol($this->PriceModifierAction) . $modPrice; $modWeight = ($this->WeightModifier) ? (string)$this->WeightModifier : '0'; $modWeight = self::getOptionModifierActionSymbol($this->WeightModifierAction) . $modWeight; $modCode = self::getOptionModifierActionSymbol($this->CodeModifierAction) . $this->CodeModifier; return $this->Title . '{p' . $modPriceWithSymbol . '|w' . $modWeight . '|c' . $modCode . '}'; } /** * @param $oma * @param bool $returnWithOnlyPlusMinus * * @return string */ public static function getOptionModifierActionSymbol($oma, $returnWithOnlyPlusMinus = false) { switch ($oma) { case 'Subtract': $symbol = '-'; break; case 'Set': $symbol = ($returnWithOnlyPlusMinus) ? '' : ':'; break; default: $symbol = '+'; } return $symbol; } /** * @return string */ protected function getWeightModifierWithSymbol() { return $this->getOptionModifierActionSymbol($this->WeightModifierAction) . $this->WeightModifier; } /** * @return string */ protected function getPriceModifierWithSymbol() { return $this->getOptionModifierActionSymbol($this->PriceModifierAction) . $this->PriceModifier; } /** * @return string */ protected function getCodeModifierWithSymbol() { return $this->getOptionModifierActionSymbol($this->CodeModifierAction) . $this->CodeModifier; } /** * @return float */ protected function calculateFinalPrice() { $product = $this->Product();// this relation is set by a developer's data extension if ($this->PriceModifierAction == 'Add') { return $this->PriceModifier + $product->Price; } elseif ($this->PriceModifierAction == 'Subtract') { return $product->Price - $this->PriceModifier; } elseif ($this->PriceModifierAction == 'Set') { return $this->PriceModifier; } return $product->Price; } /** * @return float */ protected function calculateFinalWeight() { $product = $this->Product();// this relation is set by a developer's data extension if ($this->WeightModifierAction == 'Add') { return $this->WeightModifier + $product->Weight; } elseif ($this->WeightModifierAction == 'Subtract') { return $product->Weight - $this->WeightModifier; } elseif ($this->WeightModifierAction == 'Set') { return $this->WeightModifier; } return $product->Weight; } /** * @return string */ protected function calculateFinalCode() { $product = $this->Product();// this relation is set by a developer's data extension if ($this->CodeModifierAction == 'Add') { return "{$product->Code}{$this->CodeModifier}"; } elseif ($this->CodeModifierAction == 'Subtract') { return rtrim($product->Code, $this->CodeModifier); } elseif ($this->CodeModifierAction == 'Set') { return $this->CodeModifier; } return $product->Code; } /** * @return mixed|string */ public function getGeneratedTitle() { $modPrice = ($this->PriceModifier) ? (string)$this->PriceModifier : '0'; $title = $this->Title; $title .= ($this->PriceModifier != 0) ? ': (' . self::getOptionModifierActionSymbol( $this->PriceModifierAction, $returnWithOnlyPlusMinus = true ) . '$' . $modPrice . ')' : ''; return $title; } /** * @return bool */ public function getAvailability() { $available = $this->Available; $this->extend('updateAvailability', $available); return $available; } /** * @param $member * @return bool|int|void */ public function canCreate($member = null, $context = []) { if (!$member) { $member = Security::getCurrentUser(); } return Permission::checkMember($member, 'MANAGE_FOXY_PRODUCTS'); } /** * @param $member * @return bool|int|void|null */ public function canEdit($member = null, $context = []) { if (!$member) { $member = Security::getCurrentUser(); } return Permission::checkMember($member, 'MANAGE_FOXY_PRODUCTS'); } /** * @param $member * @return bool|int|void */ public function canDelete($member = null, $context = []) { if (!$member) { $member = Security::getCurrentUser(); } return Permission::checkMember($member, 'MANAGE_FOXY_PRODUCTS'); } } |