Source of file BusinessLocation.php
Size: 11,324 Bytes - Last Modified: 2021-12-24T05:17:49+00:00
/var/www/docs.ssmods.com/process/src/src/Model/BusinessLocation.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 | <?php namespace Innoweb\SocialMeta\Model; use BetterBrief\GoogleMapField; use Innoweb\SocialMeta\Extensions\ConfigExtension; use Sheadawson\DependentDropdown\Forms\DependentDropdownField; use SilverStripe\Core\Config\Config; use SilverStripe\Forms\CheckboxField; use SilverStripe\Forms\CheckboxSetField; use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\FieldGroup; use SilverStripe\Forms\GridField\GridField; use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor; use SilverStripe\Forms\LiteralField; use SilverStripe\ORM\DataObject; use SilverStripe\Versioned\Versioned; use UncleCheese\DisplayLogic\Forms\Wrapper; class BusinessLocation extends DataObject { private static $singular_name = 'Business Location'; private static $plural_name = 'Business Locations'; private static $table_name = 'SocialMetaBusinessLocation'; private static $extensions = [ Versioned::class ]; private static $db = [ 'MicroDataType' => 'Varchar(255)', 'MicroDataTypeSpecific' => 'Varchar(255)', 'MicroDataStreetAddress' => 'Varchar(255)', 'MicroDataPOBoxNumber' => 'Varchar(255)', 'MicroDataCity' => 'Varchar(255)', 'MicroDataPostCode' => 'Varchar(255)', 'MicroDataRegion' => 'Varchar(255)', 'MicroDataCountry' => 'Varchar(255)', 'MicroDataPhone' => 'Varchar(255)', 'MicroDataFax' => 'Varchar(255)', 'MicroDataEmail' => 'Varchar(255)', 'MicroDataPaymentAccepted' => 'Varchar(255)', 'IsMicroDataCoordinatesEnabled' => 'Boolean', 'MicroDataLocationLongitude' => 'Varchar', 'MicroDataLocationLatitude' => 'Varchar' ]; private static $has_one = [ 'SocialMetaConfigOf' => DataObject::class ]; private static $has_many = [ 'MicroDataOpeningHours' => OpeningHours::class ]; private static $searchable_fields = []; private static $summary_fields = [ 'MicroDataTitle' => 'Name/Title', 'AddressAsString' => 'Address' ]; private static $casting = [ 'AddressAsString' => 'Varchar(255)' ]; public function getParentConfig() { $class = $this->SocialMetaConfigOfClass; return ($class) ? $class::get()->byID($this->SocialMetaConfigOfID) : null; } public function getMicroDataSchemaType($baseTypeOnly = false) { return ($this->MicroDataTypeSpecific && !$baseTypeOnly) ? $this->MicroDataTypeSpecific : $this->MicroDataType; } public function getAddressAsString() { $address = []; if ($this->MicroDataStreetAddress) { $address[] = $this->MicroDataStreetAddress . ','; } if ($this->MicroDataPOBoxNumber) { $address[] = $this->MicroDataPOBoxNumber . ','; } if ($this->MicroDataRegion) { $address[] = $this->MicroDataRegion; } if ($this->MicroDataPostCode) { $address[] = $this->MicroDataPostCode; } if ($this->MicroDataCountry) { $address[] = ', ' . $this->MicroDataCountry; } $address = implode(' ', $address); return $address; } public function getMicroDataMapLink() { if ($this->MicroDataStreetAddress) { $address = []; $address[] = $this->MicroDataStreetAddress . ','; if ($this->MicroDataCity) { $address[] = $this->MicroDataCity; } if ($this->MicroDataRegion) { $address[] = $this->MicroDataRegion; } if ($this->MicroDataPostCode) { $address[] = $this->MicroDataPostCode; } $address = implode(' ', $address); return 'https://www.google.com.au/maps/place/' . urlencode($address); } return null; } public function getCMSFields() { $fields = parent::getCMSFields(); $separateEntity = $this->getParentConfig() ? $this->getParentConfig()->IsMicroDataAdditionalLocationsSeparateEntities : false; $fields->removeByName('MicroDataType'); $fields->removeByName('MicroDataTypeSpecific'); $fields->removeByName('MicroDataPaymentAccepted'); $fields->removeByName('IsMicroDataCoordinatesEnabled'); $fields->removeByName('MicroDataLocationLatitude'); $fields->removeByName('MicroDataLocationLongitude'); if (!$separateEntity) { $fields->removeByName('MicroDataPhone'); $fields->removeByName('MicroDataFax'); $fields->removeByName('MicroDataEmail'); } if ($separateEntity) { $typeSpecificSource = function($type) { if ($type === 'Organization') { $key = 'organization_types'; } else if ($type === 'LocalBusiness') { $key = 'localbusiness_types'; } else { return []; } return Config::inst()->get(ConfigExtension::class, $key); }; $typeField = DropdownField::create( 'MicroDataType', 'Type', [ 'Organization' => 'Organisation', 'LocalBusiness' => 'Local Business' ] ); $typeSpecificField = DependentDropdownField::create( 'MicroDataTypeSpecific', 'More specific type', $typeSpecificSource ) ->setDepends($typeField) ->setEmptyString('- select -'); $fields->insertBefore('MicroDataStreetAddress', $typeField); $fields->insertBefore('MicroDataStreetAddress', $typeSpecificField); $fields->addFieldToTab( 'Root.MapCoordinates', FieldGroup::create( CheckboxField::create('IsMicroDataCoordinatesEnabled', 'Enable Location Coordinates') ) ->setTitle('Location Coordinates') ->setName('EnableLocationCoordinatesGroup') ); if ($this->getParentConfig()) { $mapsAPIKey = $this->getParentConfig()->getMicroDataMapsAPIKey(); if ($mapsAPIKey) { $fields->addFieldToTab( 'Root.MapCoordinates', $mapField = Wrapper::create( GoogleMapField::create( $this, 'Coordinates', [ 'field_names' => [ 'Longitude' => 'MicroDataLocationLongitude', 'Latitude' => 'MicroDataLocationLatitude' ], 'api_key' => $mapsAPIKey ] ) ) ); } else { $fields->addFieldToTab( 'Root.MapCoordinates', $mapField = Wrapper::create( LiteralField::create( 'CoordinatesInfo', '<p>'._t('SocialMetaBusinessLocation.AddGoogleMapsAPIKey', 'Please add a Google Maps API key to the main config in order to enable coordinates.').'</p>' ) ) ); } $mapField->displayIf('IsMicroDataCoordinatesEnabled')->isChecked(); } $fields->addFieldToTab( 'Root.Main', $paymentAcceptedField = Wrapper::create( CheckboxSetField::create( 'MicroDataPaymentAccepted', 'Payment Accepted', [ 'cash' => 'Cash', 'cheque' => 'Cheque', 'credit card' => 'Credit Card', 'eftpos' => 'EFTPos', 'invoice' => 'Invoice', 'paypal' => 'PayPal' ] ) ) ); $paymentAcceptedField->displayIf('MicroDataType')->isEqualTo('LocalBusiness'); $fields->removeByName('MicroDataOpeningHours'); $fields->addFieldsToTab( 'Root.OpeningHours', [ LiteralField::create( 'OpeningHoursInfoField', '<p>Opening hours are only applicable to locations of type <em>Local Business</em></p><br><br>' ), GridField::create( 'MicroDataOpeningHours', 'Opening Hours', $this->MicroDataOpeningHours(), GridFieldConfig_RecordEditor::create() ) ] ); } return $fields; } protected function onBeforeDelete() { parent::onBeforeDelete(); $items = $this->MicroDataOpeningHours(); if ($items && $items->Count() > 0) { foreach ($items as $item) { $item->delete(); } } } protected function onBeforeWrite() { parent::onBeforeWrite(); $separateEntity = ($this->getParentConfig()) ? $this->getParentConfig()->IsMicroDataAdditionalLocationsSeparateEntities : false; if (!$separateEntity) { $this->MicroDataType = ''; $this->MicroDataTypeSpecific = ''; $this->MicroDataPhone = ''; $this->MicroDataFax = ''; $this->MicroDataEmail = ''; $this->MicroDataPaymentAccepted = ''; $this->IsMicroDataCoordinatesEnabled = false; $this->MicroDataLocationLongitude = ''; $this->MicroDataLocationLatitude = ''; $items = $this->MicroDataOpeningHours(); if ($items && $items->Count() > 0) { foreach ($items as $item) { $item->delete(); } } } else { if ($this->MicroDataType === 'Organization') { $this->MicroDataPaymentAccepted = ''; $items = $this->MicroDataOpeningHours(); if ($items && $items->Count() > 0) { foreach ($items as $item) { $item->delete(); } } } if (!$this->IsMicroDataCoordinatesEnabled) { $this->MicroDataLocationLongitude = ''; $this->MicroDataLocationLatitude = ''; } } } } |