Source of file Product.php
Size: 7,761 Bytes - Last Modified: 2021-12-23T10:59:54+00:00
/var/www/docs.ssmods.com/process/src/src/Model/Product.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 | <?php namespace XD\Shopify\Model; use SilverStripe\AssetAdmin\Forms\UploadField; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; use SilverStripe\Core\Convert; use SilverStripe\Forms\GridField\GridField; use SilverStripe\Forms\GridField\GridFieldConfig_RecordViewer; use SilverStripe\Forms\ReadonlyField; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBInt; use SilverStripe\ORM\HasManyList; use SilverStripe\TagField\TagField; use SilverStripe\Versioned\Versioned; use SilverStripe\View\Requirements; use SilverStripe\ORM\FieldType\DBCurrency; use XD\Shopify\Task\Import; /** * Class Product * * @author Bram de Leeuw * @package XD\Shopify * @subpackage Model * * @mixin Versioned * * @property string Title * @property string URLSegment * @property string ShopifyID * @property string Content * @property string Vendor * @property string ProductType * @property string Tags * * @property int ImageID * @method Image Image() * * @method HasManyList Variants() * @method HasManyList Images() */ class Product extends DataObject { private static $table_name = 'ShopifyProduct'; private static $currency = 'EUR'; private static $options = [ 'product' => [ 'contents' => [ 'title' => false, 'variantTitle' => false, 'price' => false, 'description' => false, 'quantity' => false, 'img' => false, ] ] ]; private static $db = [ 'Title' => 'Varchar', 'URLSegment' => 'Varchar', 'ShopifyID' => 'Varchar', 'Content' => 'HTMLText', 'Vendor' => 'Varchar', 'ProductType' => 'Varchar', 'Tags' => 'Varchar' ]; private static $default_sort = 'Created DESC'; private static $searchable_fields = [ 'Title', 'URLSegment', 'ShopifyID', 'Content', 'Vendor', 'ProductType', 'Tags' ]; private static $data_map = [ 'id' => 'ShopifyID', 'title' => 'Title', 'body_html' => 'Content', 'vendor' => 'Vendor', 'product_type' => 'ProductType', 'created_at' => 'Created', 'handle' => 'URLSegment', 'updated_at' => 'LastEdited', 'tags' => 'Tags', ]; private static $has_one = [ 'Image' => Image::class ]; private static $has_many = [ 'Variants' => ProductVariant::class, 'Images' => Image::class ]; private static $belongs_many_many = [ 'Collections' => Collection::class ]; private static $owns = [ 'Variants', 'Images', 'Image' ]; private static $indexes = [ 'ShopifyID' => true, 'URLSegment' => true ]; private static $summary_fields = [ 'Image.CMSThumbnail' => 'Image', 'Title', 'Vendor', 'ProductType', 'ShopifyID' ]; private static $casting = array( 'MetaTags' => 'HTMLFragment' ); private static $extensions = [ Versioned::class ]; public function getCMSFields() { $fields = parent::getCMSFields(); $fields->addFieldsToTab('Root.Main', [ ReadonlyField::create('Title'), ReadonlyField::create('URLSegment'), ReadonlyField::create('ShopifyID'), ReadonlyField::create('Content'), ReadonlyField::create('Vendor'), ReadonlyField::create('ProductType'), ReadonlyField::create('Tags'), UploadField::create('Image')->performReadonlyTransformation(), ]); $fields->addFieldsToTab('Root.Variants', [ GridField::create('Variants', 'Variants', $this->Variants(), GridFieldConfig_RecordViewer::create()) ]); $fields->addFieldsToTab('Root.Images', [ GridField::create('Images', 'Images', $this->Images(), GridFieldConfig_RecordViewer::create()) ]); $fields->removeByName(['LinkTracking','FileTracking']); return $fields; } public function getVariantWithLowestPrice() { return DataObject::get_one(ProductVariant::class, ['ProductID' => $this->ID], true, 'Price ASC'); } /** * @return DBCurrency|null */ public function getPrice() { if ($product = $this->getVariantWithLowestPrice()) { return $product->dbObject('Price'); } return null; } /** * @return DBCurrency|null */ public function getCompareAtPrice() { if ($product = $this->getVariantWithLowestPrice()) { return $product->dbObject('CompareAtPrice'); } return null; } /** * Merge in the configured button options * * @return string */ public function getButtonOptions() { return Convert::array2json(array_merge_recursive(self::config()->get('options'), [ 'product' => [ 'text' => [ 'button' => _t('Shopify.ProductButton', 'Add to cart'), 'outOfStock' => _t('Shopify.ProductOutOfStock', 'Out of stock'), 'unavailable' => _t('Shopify.ProductUnavailable', 'Unavailable'), ] ] ])); } public function getButtonScript() { if ($this->ShopifyID) { $currencySymbol = DBCurrency::config()->get('currency_symbol'); Requirements::customScript(<<<JS (function () { if (window.shopifyClient) { window.shopifyClient.createComponent('product', { id: {$this->ShopifyID}, node: document.getElementById('product-component-{$this->ShopifyID}'), moneyFormat: '$currencySymbol{{amount}}', options: {$this->ButtonOptions} }); } })(); JS ); } } public function Link($action = null) { $shopifyPage = ShopifyPage::inst(); return Controller::join_links($shopifyPage->Link('product'), $this->URLSegment, $action); } public function AbsoluteLink($action = null) { return Director::absoluteURL($this->Link($action)); } public function MetaTags($includeTitle = true) { $tags = ''; $this->extend('MetaTags', $tags); return $tags; } public function getOGImage() { if (($image = $this->Image()) && $image->exists()) { return $image->Pad(1200, 630)->getAbsoluteURL(); } return null; } /** * Creates a new Shopify Product from the given data * but does not publish it * * @param $shopifyProduct * @return Product * @throws \SilverStripe\ORM\ValidationException */ public static function findOrMakeFromShopifyData($shopifyProduct) { if (!$product = self::getByShopifyID($shopifyProduct->id)) { $product = self::create(); } $map = self::config()->get('data_map'); Import::loop_map($map, $product, $shopifyProduct); if ($product->isChanged()) { $product->write(); } return $product; } public static function getByShopifyID($shopifyId) { return DataObject::get_one(self::class, ['ShopifyID' => $shopifyId]); } public static function getByURLSegment($urlSegment) { return DataObject::get_one(self::class, ['URLSegment' => $urlSegment]); } function canView($member = null) { return true; } } |