list = $list; $this->setController($list->getController(), $list->getControllerAction()); $this->setTemplateDir($list->getTemplateDir()); } /** * Добавление формы * @param Form $form * @param array $opt * @throws AdminFormsException */ public function formAdd($form, array $opt = []) { $id = $form->id(); if (isset($this->_forms[$id])) { throw new AdminFormsException('Error initialization ' . static::class . '. Form with ID = ' . $id . ' already exist'); } $this->_forms[$id] = [ 'id' => $id, 'form' => $form, 'opt' => $opt, ]; } protected function allowedForms($recordID) { $forms = $this->_forms; foreach ($forms as $k => $v) { if ($recordID) { if (isset($v['opt']['edit']) && ! $v['opt']['edit']) { unset($forms[$k]); continue; } } else { if (isset($v['opt']['add']) && ! $v['opt']['add']) { unset($forms[$k]); continue; } } } return $forms; } /** * Поиск активной формы * @param integer $recordID * @return Form */ protected function activeForm($recordID) { $form = false; $forms = $this->allowedForms($recordID); $ftab = (int)$this->input->postget('ftab', TYPE_STR); # don't change TYPE_STR to TYPE_INT if (isset($forms[ $ftab ])) { $form = $forms[ $ftab ]['form']; } if ( ! $form) { foreach ($forms as $v) { $form = $v['form']; break; } } if ( ! $form) { $form = reset($this->_forms); $form = $form['form']; } return $form; } /** * Генерация контента формы * @param integer|string $recordID ID записи * @throws * @return string HTML */ public function content($recordID) { $jsObjectList = $this->list->getTemplateJsObject(); $forms = $this->allowedForms($recordID); $form = $this->activeForm($recordID); $record = ['recordID' => $recordID]; if (count($forms) > 1 || $this->pills) { $this->wrapper()->icon($form->wrapper()->data('icon')); $this->wrapper()->title($recordID ? $this->titleEdit : $this->titleAdd); $form->wrapper()->popup($this->popup); $form->wrapper()->hide(); foreach ($forms as & $v) { /** @var Form $f */ $f = $v['form']; $v['title'] = ! empty($f->title) ? static::obCallableAuto($f->title) : 'Form'.$f->id(); } unset($v); $data = [ 'recordID' => $recordID, 'forms' => $forms, 'active' => $form->id(), 'content' => $form->view($record), 'jsObjectList' => $jsObjectList, ]; return $this->render($data, 'block.forms.tabs'); } else { $form->jsHistory($jsObjectList, $recordID ? $this->list->urlEdit($recordID) : $this->list->urlAdd()); $form->wrapper()->titleDefault($recordID ? $this->titleEdit : $this->titleAdd); $form->wrapper()->popup($this->popup); return $form->view($record); } } /** * Пробрасывание события onBeforeDelete от списка к формам * @param integer $recordID ID записи */ public function onBeforeDelete($recordID) { foreach ($this->_forms as $v) { /** @var $form Form */ $form = $v['form']; $form->recordBeforeDelete($recordID); } } /** * Пробрасывание события onDelete от списка к формам * @param integer $recordID ID записи */ public function onDelete($recordID) { foreach ($this->_forms as $v) { /** @var $form Form */ $form = $v['form']; $form->recordDelete($recordID); } } /** * Возвращаем название CSS класса блока * @param string $plus * @return string */ public function cssClass($plus = '') { return parent::cssClass( '-forms-tabs' . ($plus !== '' ? '-' . $plus : '') ); } /** * Список доступных форм * @return array */ public function forms(): array { $forms = []; foreach ($this->_forms as $k => $v) { if (empty($v['form'])) { continue; } $forms[$k] = $v['form']; } return $forms; } }