translit($values[self::$NAME]), ]); } } } public function _update(\Where $w, array $values) { $values[self::$UPDATED] = time(); return parent::_update($w, $values); } static function getMyStructure(){ if(self::$myStructure) return self::$myStructure; else return self::$myStructure = self::getStructure(0,UID); } public static function installUniques() { \DB::addIndex(self::$table_name,self::$ACCOUNT); \DB::addIndex(self::$table_name,self::$TEXT_ID); \DB::addIndex(self::$table_name,self::$PARENT); \DB::addIndex(self::$table_name,self::$POS); \DB::addIndex(self::$table_name,self::$IMAGE); \DB::addIndex(self::$table_name,self::$ID_1C); } static function renderCheckableTree($structure = [], $options = []){ $res = ''; $start_id = isset($options[$c = 'start_id']) ? $options[$c] : 0; $selected = isset($options[$c = 'selected']) ? $options[$c] : []; $res = ''; return $res; } static function getFullPath($id){ $res = [$id]; $s = self::getStructure(); $pid = $s['a'][$id][Category::$PARENT]; $c = 0; while(isset($s['a'][$pid])){ $res[] = $pid; $pid = $s['a'][ $pid ][Category::$PARENT]; if($c++>10) break; } return array_reverse($res); } static function getStructure($parent_id = 0,$UID = UID){ $res = []; $r = Relation::select($q = [ \Query::TABLES=>Relation::$table_name, \Query::WHERE => new \Where( \Where::_and([ \Where::_operator(Relation::$PARENT,'=',$parent_id), \Where::_operator(self::$ACCOUNT,'=',$UID), ])), \Query::SORT => [self::$POS=>'ASC'], \Query::LEFT_JOINS => [ [self::$table_name,Relation::$CAT,self::$ID], //[Image::$table_name,Image::$ID,self::$IMAGE], ], ]); while($l = \DB::fetch($r)){ $pid = $l[self::$PARENT]; $id = $l[self::$ID]; $res['a'][$id] = $l; $res[$pid][] = $id; } return $res; } public static function getName($v, array $options = []): string { return (string)($v[self::$NAME]?$v[self::$NAME]:'-'); } public static function getText($v, array $options = []): string { return $v[self::$TEXT]?$v[self::$TEXT]:''; } public function getPathId($cat_id){ $s = self::getMyStructure(); } static function getFullPathName($cat_id,$sep = ' / '){ $s = self::getMyStructure(); $path = self::getFullPath($cat_id); $names = []; $last = count($path)-1; foreach ($path as $k=>$v) { $isLast = $k==$last; $names[] = Category::getName($s['a'][$v]); } return implode($sep,$names); } public static function getWindowTableRules() { return [ \Query::WHERE=>new \Where( \Where::_and([ \Where::_operator(static::$ACCOUNT,'=',UID), \Where::_operator(static::$PARENT,'=',0), ]) ) ]; } public static function getEditTabs($values=[]) { $id = $values[self::$ID]; $isMainCategory = $values[self::$PARENT] == 0; return [ //* [ eTab::NAME=>'Редактировать', eTab::TYPE=>eTabType::FORM, eTab::CONTENT=>function($values=[]){ return self::_getForm($values, static::getFormOptions($values)); }, ], [ eTab::NAME=>($isMainCategory?'Категории каталога ':'Подкатегории категории ').'«'.h(self::getName($values)).'»', eTab::TYPE=>eTabType::TABLE, eTab::CONTENT=>function($values=[]){ $id = $values[self::$ID]; $link_id = '/shop/categories/'; $o = [ \Query::COUNT=>0, \Query::WHERE=>new \Where(\Where::_operator(Category::$PARENT,'=',$id)), \ModuleTable::FORM_INIT_DATA=>[ Category::$PARENT => $id, ], \ModuleTable::SORTABLE => true, \Query::SORT => [Category::$POS=>'ASC'], \ModuleTable::ROW_CLICK => eRowClick::CARD, \ModuleTable::TABLE_ID => self::$table_name.'_'.Category::$table_name.'_'.$id, \ModuleTable::COLUMN_RENDER => [ Category::$NAME => [ \ModuleTable::COLUMN_RENDER_LINK_ID => $link_id, \ModuleTable::COLUMN_RENDER_LINK_CSS_CLASS => 'link', //ModuleTable::COLUMN_RENDER_LINK_MODAL => true, ], ] ]; return $values['justData'] ? Category::getTableData( $o ) : Category::drawTable( $o ); }, ], /* [ eTab::NAME=>'Блоки', eTab::TYPE=>eTabType::TABLE, eTab::CONTENT=>function($values=[]){ $id = $values[self::$ID]; $link_id = \Site::sectionUrl( 'content/page/'.$id.'/block/' ); $o = [ \ModuleTable::ROW_CLICK => eRowClick::CARD, \Query::SORT=>BlocK::$POS, \Query::WHERE=>new \Where(\Where::_and([ \Where::_operator(Block::$TO,'=',msTo::CATEGORY), \Where::_operator(Block::$OID,'=',$id), ]) ), \ModuleTable::SORTABLE=>true, \ModuleTable::FORM_INIT_DATA=>[ Block::$TO => msTo::CATEGORY, Block::$OID => $id, ], \ModuleTable::TABLE_ID => self::$table_name.'_'.Block::$table_name.'_'.$id, \ModuleTable::COLUMN_RENDER => [ Block::$TEMPLATE => [ \ModuleTable::COLUMN_RENDER_LINK_ID => $link_id, \ModuleTable::COLUMN_RENDER_LINK_CSS_CLASS => 'link', \ModuleTable::COLUMN_RENDER_LINK_MODAL => true, \ModuleTable::COLUMN_RENDER_CARD_CONTROLLER => Block::$controller, \ModuleTable::COLUMN_RENDER_CARD_FORM_METHOD => 'getSettingsForm', //ModuleTable::COLUMN_RENDER_LINK_MODAL => true, ], ] ]; return $values['justData'] ? Block::getTableData( $o ) : Block::drawTable( $o ); }, ], /**/ /**/ //* [ eTab::NAME => 'Позиции товаров в категории', eTab::TYPE=>eTabType::TABLE, eTab::CONTENT => function ($values = []) { $id = $values[self::$ID]; $o = [ \Query::LEFT_JOINS => [ [Item::$table_name,Item::$ID,CategoryItem::$ITEM], ], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(CategoryItem::$CATEGORY,'=',$id) ])), \Query::COUNT => 200, \Query::SORT => CategoryItem::$POS, //\ModuleTable::HIDE_TITLE => true, \ModuleTable::NO_ADD_BUTTON => true, \ModuleTable::SORTABLE => true, \ModuleTable::NO_CHECKBOX => true, \ModuleTable::ROW_CLICK => eRowClick::NONE, \ModuleTable::TABLE_ID => self::$table_name.'_'.CategoryItem::$table_name.'_'.$id, \ModuleTable::COLUMN_RENDER => [ CategoryItem::$IMAGE=>[ \ModuleTable::COLUMN_RENDER_IMAGE_WRAP=>true, ] ] ]; $r = CategoryItem::select($o); $counter = 0; $remove_ids= []; while($l = \DB::fetch($r)){ if($l[Item::$ID]) { if ($l[CategoryItem::$POS] != $counter) { CategoryItem::updateById($l[CategoryItem::$ID], [ CategoryItem::$POS => $counter, ]); } $counter++; } else { $remove_ids[] = $l[CategoryItem::$ID]; } } if($remove_ids){ CategoryItem::delete(new \Where(\Where::_in(CategoryItem::$ID,$remove_ids))); } return $values['justData'] ? CategoryItem::getTableData( $o ) : CategoryItem::drawTable( $o ); }, ], /**/ [ eTab::NAME => 'SEO', eTab::TYPE=>eTabType::FORM, eTab::CONTENT => function ($values = []) { $id = $values[self::$ID]; return Seo::getFormTO(msTo::CATEGORY, $id); }, ], ]; } static function getForm($values = [], $options = []) :array { return [ self::getCommonFormInputs(), [ Form::VIEW =>Form::INPUT, Form::KEY_VALUE =>self::$PARENT, Form::TYPE =>eInputType::HIDDEN, ], [ Form::VIEW=>Form::ROW, Form::COLS => [ [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c', Form::KEY_VALUE =>self::$IMAGE, Form::TYPE =>eInputType::IMAGE, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$IMAGE), Input::LABEL => $c, Input::SRC => ($c = $values[self::$IMAGE]) ? Image::imageResize(Image::getByID($c)[Image::$URL],600,0,100) : '', ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-1-2', Form::KEY_VALUE =>self::$NAME, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$NAME), Input::LABEL => $c, ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-50', Form::KEY_VALUE =>self::$TEXT_ID, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$TEXT_ID), Input::LABEL => $c, Input::VALUE => ($c = $values[self::$TEXT_ID])?$c:'', ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-50', Form::KEY_VALUE =>self::$ID_1C, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$ID_1C), Input::LABEL => $c, Input::VALUE => $values[self::$ID_1C], ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c', Form::KEY_VALUE =>self::$TEXT, Form::TYPE =>eInputType::TEXTAREA, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$TEXT), Input::LABEL => $c, ], ], ] ], self::getCommonFormSubmits($values), ]; } static function columnInfo() : array { return [ new C([ C::VAR_NAME =>&self::$ID, C::TYPE =>eColumnType::INT, C::AUTO_INCREMENT =>true, C::PRIMARY =>true, C::DEFAULT =>0, C::HIDDEN =>true, C::TH =>V::get(Vars::$ID), ]), new C([ C::VAR_NAME => &self::$NAME, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 1023, C::TH => V::get(Vars::$NAME), ]), new C([ C::VAR_NAME => &self::$TEXT, C::TYPE => eColumnType::LONGTEXT, C::TH => V::get(Vars::$TEXT), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$TEXT_ID, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 255, C::TH => V::get(Vars::$TEXT_ID), ]), new C([ C::VAR_NAME => &self::$ID_1C, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 63, C::TH => V::get(Vars::$ID_1C), //C::HIDDEN => true, C::DEFAULT => '', ]), new C([ C::VAR_NAME => &self::$PARENT, C::TYPE => eColumnType::INT, C::DEFAULT => 0, C::TH => V::get(Vars::$PARENT), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$IMAGE, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$IMAGE), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$POS, C::TYPE => eColumnType::INT, C::DEFAULT => time(), C::TH => V::get(Vars::$POS), C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$ACCOUNT, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$ACCOUNT), C::DEFAULT => intval(UID), c::HIDDEN=>true, c::FUNC_VALUE => function($v){ if($id = $v[self::$ACCOUNT]) { return \Account::getName( \Account::getByID($id) ); } else return '-'; }, ]), new C([ C::VAR_NAME => &self::$CREATED, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$CREATED), C::DEFAULT => time(), c::FUNC_VALUE => function($v){return self::formatDate($v[self::$CREATED]);}, c::HIDDEN=>true, ]), new C([ C::VAR_NAME => &self::$UPDATED, C::TYPE => eColumnType::INT, C::DEFAULT => time(), C::TH => V::get(Vars::$UPDATED), c::FUNC_VALUE => function($v){return self::formatDate($v[self::$UPDATED]);}, c::HIDDEN=>true, ]), ]; } } new Category();