ajaxAction = 'publicator_action'; $this->isUnionAllowed = false; return true; } /** * Генерация основного контента поля * @param array $data @ref данные * @return string HTML */ public function view(array &$data = []) { $data['wrapper'] = ['colspan' => 2]; return '' . $this->form($data['name'], $this->value()); } /** * Инициализация компонента публикатор * @return \bff\db\Publicator */ public function publicatorInit() { if (! is_null($this->objectPublicator)) { return $this->objectPublicator; } $settings = $this->settings; $settings = array_merge([ 'photo_sz_view' =>['width' => 800], 'gallery_sz_view' => [ 'width' => 800, 'height' => false, 'vertical' => ['width' => false, 'height' => 400], 'quality' => 95, 'sharp' => [], ], 'video_width' => 560, 'video_height' => 315, 'use_wysiwyg' => true, ], $settings); if (empty($settings['controls'])) { $settings['controls'] = [ BasePublicator::blockTypeText, BasePublicator::blockTypePhoto, BasePublicator::blockTypeGallery, BasePublicator::blockTypeVideo, BasePublicator::blockTypeSubtitle, BasePublicator::blockTypeQuote, ]; } $folder = $this->form->folder(); $settings['images_path'] = \bff::path($folder, 'images'); $settings['images_url'] = \bff::url($folder, 'images'); $settings['images_path_tmp'] = \bff::path('tmp', 'images'); $settings['images_url_tmp'] = \bff::url('tmp', 'images'); $settings['admin_ajax_url'] = $this->ajaxUrl(); $settings['admin_ajax_act'] = $this->ajaxAction; $controller = $this->form->getController(); $this->objectPublicator = $controller->attachComponent( $this->name(), new BasePublicator($controller->module_name, $settings, false) ); return $this->objectPublicator; } /** * Вызов формы публикатора * @param string $name имя поля * @param array $content массив с данными о содержании * @return string HTML */ public function form($name, $content) { $id = $this->id(); $jsObj = 'j' . $this->form->jsObjectName('publicator' . $id); $this->form->contentJavascript('onReady', function() use ($jsObj, $id) { ?>publicatorInit()->form($content, $this->form->recordID(), $name, $jsObj); } /** * Проверка значения поля * @param array $data ['value' => &$value], 'value' - ссылка на значение поля * @return bool true - значение корректно, false - значение некорректно, пропустить (не сохраняется в БД) */ public function validate($data) { unset($data['value']['__empty__']); $prepare = $this->publicatorInit()->dataPrepare($data['value'], $this->form->recordID()); if (! isset($prepare['content'])) { return false; } $data['value'] = $prepare['content']; if (! parent::validate($data)) { return false; } if ($this->search && isset($prepare['content_search']) && isset($data['result'])) { $search = $prepare['content_search']; if (is_array($search) && $this->form->_toJSON()) { $search = json_encode($search, JSON_UNESCAPED_UNICODE); } $data['result'][ $this->search ] = $search; } return true; } /** * Проверка значения или выполнение действий после сохранения (точно есть recordID) * @param bool $isInserted - была добавленна новая запись false - редактирование существующей * @param array $data ['saved' => &$saved], 'saved' - сохраненные данные */ public function validateAfter($isInserted, $data) { if (! $isInserted) { return; } $name = $this->name(); if (! isset($data['saved'][$name])) { return; } # перенос изображений в постояный каталог $this->publicatorInit()->dataUpdate($data['saved'][$name], $this->form->recordID()); } /** * Обработка ajax запросов * @return array данные для ajax ответа */ public function ajax() { # прокидываем ajax запросы в публикатор $response = $this->publicatorInit()->ajax(); if ($response instanceof Response) { return $this->response($response); } return parent::ajax(); } /** * Обработка события удаления записи формой * @param int $recordID ID записи */ public function recordDelete($recordID) { $content = $this->form->_ajaxData($this->id()); $this->publicatorInit()->dataDelete($content, $this->form->recordID()); } }