Webylon 3.1 API Docs
  • Package
  • Class
  • Tree
  • Deprecated
  • Download
Version: current
  • 3.2
  • 3.1

Packages

  • auth
  • Booking
  • cart
    • shipping
    • steppedcheckout
  • Catalog
  • cms
    • assets
    • batchaction
    • batchactions
    • bulkloading
    • comments
    • content
    • core
    • export
    • newsletter
    • publishers
    • reports
    • security
    • tasks
  • Dashboard
  • DataObjectManager
  • event
  • faq
  • forms
    • actions
    • core
    • fields-basic
    • fields-dataless
    • fields-datetime
    • fields-files
    • fields-formatted
    • fields-formattedinput
    • fields-relational
    • fields-structural
    • transformations
    • validators
  • googlesitemaps
  • guestbook
  • installer
  • newsletter
  • None
  • photo
    • gallery
  • PHP
  • polls
  • recaptcha
  • sapphire
    • api
    • bulkloading
    • control
    • core
    • cron
    • dev
    • email
    • fields-formattedinput
    • filesystem
    • formatters
    • forms
    • i18n
    • integration
    • misc
    • model
    • parsers
    • search
    • security
    • tasks
    • testing
    • tools
    • validation
    • view
    • widgets
  • seo
    • open
      • graph
  • sfDateTimePlugin
  • spamprotection
  • stealth
    • captha
  • subsites
  • userform
    • pagetypes
  • userforms
  • webylon
  • widgets

Classes

  • ExactMatchFilterWithEmpty
  • LeftAndMainQuota
  • TextFieldWithEmptyFlag
  • WebylonSiteConfig
  1 <?php
  2 /**
  3  * Базовые настройки сайта
  4  *
  5  * @package Webylon
  6  * @author inxo, menedem, dvp
  7  */
  8 class WebylonSiteConfig extends SiteConfigDecorator {
  9 
 10     /**
 11      * Список скрытых из админки полей
 12      */
 13     static $hidden_fields = array('LinkVK', 'LinkFB', 'LinkGP', 'LinkTW', 'LinkLJ', 'Theme', 'Tagline');
 14 
 15     /**
 16      * Флаг блокировки админки при превышении допустимого размера сайта
 17      */
 18     static $block_oversized = true;
 19 
 20     /**
 21      * Флаг запрета доступа в админку
 22      */
 23     static $cms_disabled = '';
 24 
 25     /**
 26      * Флаг запрета доступа в админку
 27      */
 28     static $use_site_agreement = false;
 29     
 30     /**
 31      * Имя поля с чекбоксом Согласен с правилами...
 32      */
 33     static $site_agreement_field = 'AgreeWithSiteRules';
 34     
 35     /**
 36      * Max размер загружаемого файла (90 МБ)
 37      */
 38     static $max_file_upload_size = 94371840;
 39     
 40     /**
 41      * Max размер загружаемого изображения (8 МБ)
 42      */
 43     static $max_image_upload_size = 8388608;
 44 
 45     /**
 46      * URL используемого API карт на сайте. !!!Должен заканчиваться на параметр для api ключа (например, для яндекс - на 'apikey=')
 47      */
 48     static $map_base_url = "https://api-maps.yandex.ru/2.0.48/?load=package.full&lang=ru-RU&apikey=";
 49     
 50     function extraStatics() {
 51         return array(
 52             'db' => array(
 53                 'AdminEmail' => 'Varchar',
 54                 'Copyrights' => 'HTMLText',
 55 
 56                 'Address' => 'HTMLText',
 57                 'WorkingHours' => 'HTMLText',
 58                 'Phone' => 'HTMLText',
 59                 'Fax' => 'HTMLText',
 60                 'ContactEmail' => 'Varchar',
 61 
 62                 'LinkVK' => 'Varchar(255)',
 63                 'LinkFB' => 'Varchar(255)',
 64                 'LinkGP' => 'Varchar(255)',
 65                 'LinkTW' => 'Varchar(255)',
 66                 'LinkLJ' => 'Varchar(255)',
 67 
 68                 'HtmlLeftBlock' => 'HTMLText',
 69                 'HtmlRightBlock' => 'HTMLText',
 70                 'HtmlFooterBlock' => 'HTMLText',
 71                 'HtmlShare' => 'HTMLText',
 72 
 73                 'MetaKeywords' => 'Text',
 74                 'MetaDescription' => 'Text',
 75                 'MetaTags' => 'Text',
 76                 
 77                 'SiteAgreementText' => 'Text',
 78                 
 79                 // для API Карт
 80                 'MapApiKey' => 'Varchar(250)',
 81             ),
 82 
 83             'defaults' => array(
 84                 'MetaKeywords' => '',
 85                 'MetaDescription' => '',
 86                 'MetaTags' => ''
 87             ),
 88             'has_one' => array(
 89                 'SiteAgreementPage' => 'SiteTree',
 90             )
 91         );
 92     }
 93 
 94     static function set_map_base_url($url) {
 95         self::$map_base_url = $url;
 96     }
 97 
 98     public function updateCMSFields(FieldSet &$fields) {
 99         $tab = self::get_config_tab($fields);
100 
101         if (method_exists('LeftAndMainQuota', 'sizeStatus')) {
102             $sizeInfo = LeftAndMainQuota::sizeStatus();
103 
104             if ($sizeInfo->Blocked) {
105                 $fields->insertBefore(new LiteralField('oversize', '<div id="oversizeMessage">' . sprintf(_t('SiteConfig.SITEBLOCKEDOVERSIZED', 'Site oversized used %d Mb from %d'), $sizeInfo->Used, $sizeInfo->Quota) . '</div>'), 'Title');
106             } elseif ($sizeInfo->State == 'over') {
107                 $fields->insertBefore(new LiteralField('oversize', '<div id="oversizeMessage">' . sprintf(_t('SiteConfig.SITEOVERSIZED', 'Site oversized used %d Mb from %d'), $sizeInfo->Used, $sizeInfo->Quota) . '</div>'), 'Title');
108             }           
109         }
110 
111         $tab->push(new EmailField('AdminEmail', $this->owner->fieldLabel('AdminEmail').sprintf(' (%s)', Email::getAdminEmail())));
112         $tab->push(new TextAreaField('Copyrights', $this->owner->fieldLabel('Copyrights')));
113         
114         if (self::$use_site_agreement) {
115             $tab->push(new TreeDropdownField('SiteAgreementPageID', $this->owner->fieldLabel('SiteAgreementPage'), 'SiteTree'));
116             $tab->push(new TextAreaField('SiteAgreementText', $this->owner->fieldLabel('SiteAgreementText')));
117         }
118         
119         $tab = self::get_config_tab($fields, 'Contacts');
120         $tab->push(new TextAreaField('Address', $this->owner->fieldLabel('Address')));
121         $tab->push(new TextAreaField('WorkingHours', $this->owner->fieldLabel('WorkingHours')));
122         $tab->push(new TextAreaField('Phone', $this->owner->fieldLabel('Phone')));
123         $tab->push(new TextAreaField('Fax', $this->owner->fieldLabel('Fax')));
124         $tab->push(new EmailField('ContactEmail', $this->owner->fieldLabel('ContactEmail')));
125         $tab->push(new TextField('LinkVK', $this->owner->fieldLabel('LinkVK')));
126         $tab->push(new TextField('LinkFB', $this->owner->fieldLabel('LinkFB')));
127         $tab->push(new TextField('LinkGP', $this->owner->fieldLabel('LinkGP')));
128         $tab->push(new TextField('LinkTW', $this->owner->fieldLabel('LinkTW')));
129         $tab->push(new TextField('LinkLJ', $this->owner->fieldLabel('LinkLJ')));
130 
131         $tab = self::get_config_tab($fields, 'HtmlBlocks');
132         $tab->push(new TextAreaField('HtmlLeftBlock', $this->owner->fieldLabel('HtmlLeftBlock')));
133         $tab->push(new TextAreaField('HtmlRightBlock', $this->owner->fieldLabel('HtmlRightBlock')));
134         $tab->push(new TextAreaField('HtmlFooterBlock', $this->owner->fieldLabel('HtmlFooterBlock')));
135         $tab->push($htmlShare = new TextAreaField('HtmlShare', $this->owner->fieldLabel('HtmlShare') . ' (<a target="_blank" href="http://api.yandex.ru/share/">http://api.yandex.ru/share/</a>)'));
136         $tab->push(new TextField('MapApiKey', $this->owner->fieldLabel('MapApiKey') . _t("SiteConfig.GetMapApiKeyLink")));
137 
138         $tab = self::get_config_tab($fields, 'SEO');
139         $tab->push(new TextField('MetaKeywords', $this->owner->fieldLabel('MetaKeywords')));
140         $tab->push(new TextAreaField('MetaDescription', $this->owner->fieldLabel('MetaDescription')));
141         $tab->push(new TextAreaField('MetaTags', $this->owner->fieldLabel('MetaTags')));
142         
143         // работа с robots.txt
144         $robots = null;
145         $error = null;
146         if (!is_file(BASE_PATH . '/robots.txt')) {
147             if (SSViewer::hasTemplate('robots')) {
148                 $baseRobots = $this->owner->renderWith('robots');
149                 $robots = @file_put_contents(BASE_PATH . '/robots.txt', $baseRobots);
150             }
151             if (!$robots) {
152                 $error = _t('SiteConfig.CANNOTCREATEFILE');
153             }
154         }       
155         if (!$error && !is_writable(BASE_PATH . '/robots.txt')) {
156             $error = _t('SiteConfig.CANNOTWRITETOFILE');
157         }
158         if ($robots = @file_get_contents(BASE_PATH . '/robots.txt')) {
159             $this->owner->RobotsFile = $robots;
160         }
161         if ($error) {
162             $tab->push(new LiteralField('BadRobotsFile', '<p>' . _t('SiteConfig.RobotsFile') . '</p>'));            
163             $tab->push(new LiteralField('BadRobotsFile', $error . '<p>&nbsp;</p>'));            
164         } else {
165             $tab->push($f = new TextAreaField('RobotsFile', _t('SiteConfig.RobotsFile'), 20));
166         }
167 
168         $this->hideUnselectedFields($fields);
169 
170         //добавляем скрипт для обновления дерева вставки файлов в визреде, чтобы сразу после загрузки админки (когда открывается SiteConfig) при переходе на MediawebPage все обновлялось
171         Requirements::customScript("
172             Behaviour.register({
173                 '#Form_EditForm' : {
174                     initialize : function() {
175                         this.observeMethod('PageLoaded', this.MediawebPageHandler);
176                         this.MediawebPageHandler();
177                     },
178                     MediawebPageHandler : function() {
179                         (function($) {
180                             if (($('#Form_EditForm_folder_id').length) && ($('input#Form_EditForm_folder_id').attr('folder_updated') != '1')) {
181                                 if ($('#TreeDropdownField_Form_EditorToolbarImageForm_FolderID')) {
182                                     $('#TreeDropdownField_Form_EditorToolbarImageForm_FolderID')[0].setValue($('#Form_EditForm_folder_id').val());
183                                     $('#TreeDropdownField_Form_EditorToolbarImageForm_FolderID')[0].refresh();
184                                 }
185                                 if ($('#TreeDropdownField_Form_EditorToolbarFlashForm_FolderID')) {
186                                     $('#TreeDropdownField_Form_EditorToolbarFlashForm_FolderID')[0].setValue($('#Form_EditForm_folder_id').val());
187                                     $('#TreeDropdownField_Form_EditorToolbarFlashForm_FolderID')[0].refresh();
188                                 }
189                                 if ($('#TreeDropdownField_Form_EditorToolbarLinkForm_file')) {
190                                     $('#TreeDropdownField_Form_EditorToolbarLinkForm_file')[0].setValue($('#Form_EditForm_folder_path').val());
191                                     $('#TreeDropdownField_Form_EditorToolbarLinkForm_file')[0].refresh();
192                                 }
193                                 $('input#Form_EditForm_folder_id').attr('folder_updated','1');
194                             }
195                         })(jQuery);
196                     }
197                 }
198             });
199         ");
200 
201 
202     }
203     
204     function populateDefaults() {
205         $this->owner->SiteAgreementText = _t('SiteConfig.default_SiteAgreementText', 'Default Site Agreement Text');
206     }
207     
208     function requireDefaultRecords() {
209         // пробуем создать дефолтный robots.txt
210         if (!is_file(BASE_PATH . '/robots.txt') && SSViewer::hasTemplate('robots')) {
211             $baseRobots = $this->owner->renderWith('robots');
212             $robots = @file_put_contents(BASE_PATH . '/robots.txt', $baseRobots);
213         }
214     }
215     
216     function onBeforeWrite() {
217         if ($this->owner->isChanged('RobotsFile') && is_file(BASE_PATH . '/robots.txt')) {
218             @file_put_contents(BASE_PATH . '/robots.txt', $this->owner->RobotsFile);
219         }
220     }
221 
222     /**
223      * Изменяет режим блокировки админки при превышении объема
224      *
225      * @param bool $state - блокировать или нет
226      */
227     static function set_block_oversized($state = true) {
228         self::$block_oversized = $state;
229     }
230 
231     /**
232      * Изменяет режим блокировки админки
233      *
234      * @param string $message - сообщение выдаваемое при блокировке
235      */
236     static function disable_cms($message) {
237         self::$cms_disabled = $message;
238     }
239 
240     /**
241      * Запрет создания страниц в корне сайта при превышенной квоте
242      *
243      */
244     function canCreateTopLevel(& $member = null) {
245         $sizeInfo = LeftAndMainQuota::sizeStatus();
246         if ($sizeInfo->Blocked) {
247             return false;
248         }
249         return true;
250     }
251 
252     /**
253      * Если в настройках установлен емайл администратора - прописывает его в классе Email
254      *
255      */
256     function setupAdminEmail() {
257         if ($this->owner->AdminEmail) {
258             Email::setAdminEmail($this->owner->AdminEmail);
259         }
260     }
261 
262     /**
263      * Возвращает емайл администратора сайта (из настроек или класса Email)
264      *
265      * @return string
266      */
267     function AdminEmail() {
268         return ($this->owner->AdminEmail) ? $this->owner->AdminEmail : Email::getAdminEmail();
269     }
270 
271     /**
272      * Возвращает емайл отправителя для писем с сайта
273      *
274      * @return string
275      */
276     function SenderEmail() {
277         if ($this->owner->AdminEmail) return $this->owner->AdminEmail;
278         return (strpos(Email::getAdminEmail(), 'mediaweb.ru') > 0) ? 'noreply@mediaweb.ru' : Email::getAdminEmail();
279     }
280 
281     /**
282      * Возвращает флаг наличия хотя бы одной ссылки на соцсети
283      * Названия полей ссылок на соц.сети должны начинаться с Link
284      *
285      * @return bool
286      */
287     function hasLinkFields() {
288         if ($allConfigFields = DataObject::database_fields('SiteConfig')) {
289             foreach($allConfigFields as $name=>$type) {             
290                 if ((strpos($name, 'Link') === 0) && ($this->owner->hasValue($name))) {
291                     return true;
292                 }
293             }
294         }
295         return false;
296     }
297 
298     /**
299      * Возвращает поле согласия с правилами сайта (в частности с обработкой персональных данных)
300      * 
301      * 
302      * @return string
303      */ 
304     function SiteAgreementField() {
305         if (self::$use_site_agreement && $this->owner->SiteAgreementText && $this->owner->SiteAgreementPageID && ($rulesPage = $this->owner->SiteAgreementPage())) {
306             $title = str_replace('$link', $rulesPage->Link(), $this->owner->SiteAgreementText);
307             $title = str_replace('$full_link', sprintf(_t("SiteConfig.SiteAgreementFullLink"), $rulesPage->Link(), $rulesPage->MenuTitle), $title);
308             $fields = new CheckboxField(self::$site_agreement_field, $title);
309             return $fields;
310         }
311     }
312 
313     /**
314      * Возвращает перавый номер из поля (полезно для ссылок)
315      * 
316      * @param string $field - имя поля [Phone]
317      * 
318      * @return string - первый телефонный номер в поле
319      */
320     function FirstPhone($field = 'Phone') {
321         $phone = $this->owner->$field;
322         $phone = preg_replace('/^[^\d(]+/s', '', $phone); // обрежем начало если это не телефон (включая "+")
323         $phone = preg_replace('/(\d)(\s+|\s?[()-]\s?)(\d)/s', '$1$3', $phone); // вырежем разделители  внутри номеров
324         $phone = preg_replace('/^(\d+).*$/s', '$1', $phone); // вернем первый набор цифр
325         return $phone;
326     }
327     
328     /**
329      * Превращает все телефоны в поле в кликабельные ссылки
330      * TODO проверка формата телефона (сейчас просто набор из "+", цифр, "(", ")" и "-")
331      * 
332      * @param string $field - имя поля [Phone]
333      * 
334      * @return string
335      */
336     function Phone2Links($field = 'Phone') {
337         $phone = $this->owner->$field;
338         $phone = preg_replace('/(\+?([\d-]|\s?\(|\)\s?)+)([^\d()-]|$)/', '<a href="tel:$1">$1</a>$3', $phone);
339         return $phone;
340     }
341     
342     /**
343      * Загружаем скрипт API карт на странице
344      * 
345      * @param string $url - другой адрес для карт
346      * 
347      */
348     function RequireMapApi($url = false) {
349         if (!$url) {
350             $url = self::$map_base_url;
351         }
352         if ($this->owner->MapApiKey) {
353             $url .= $this->owner->MapApiKey;
354         }
355         Requirements::javascript($url);
356     }
357     
358     function isNeedMapApiKey() {
359         return ($this->owner->MapApiKey) ? 1 : 0;
360     }
361 }
362 
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -
Webylon 3.1 API Docs API documentation generated by ApiGen 2.8.0