blocksHistory = ServiceContainer::getService(BlocksHistory::class); $this->adminSectionTree = ServiceContainer::getService(AdminSectionTree::class); } public function articlesSections($topCat, $Pos = 0, $ignored = null) { $SQL = sqlQueryBuilder() ->select('ab.id, ab.name, ab.descr, ab.figure') ->from('articles_branches', 'ab') ->where(\Query\Operator::equalsNullable(['ab.top_branch' => $topCat])) ->orderBy('ab.name', 'ASC') ->execute(); $data = []; foreach ($SQL as $key => $row) { if ($ignored == null || $ignored != $row['id']) { $data[$key]['id'] = $row['id']; $data[$key]['title'] = $row['name']; $data[$key]['figure'] = $row['figure']; $data[$key]['level'] = $Pos; $data[$key]['submenu'] = $this->articlesSections($row['id'], $Pos + 1, $ignored = null); } } return $data; } public function createObject() { $data = parent::createObject(); return $data; } public function get_vars() { $vars = parent::get_vars(); $pageVars = getVal('body', $vars); $ID = $this->getID(); $acn = $this->getAction(); if (!empty($ID)) { $pageVars['tree'] = $this->articlesSections(null); $pageVars['selected'] = $this->adminSectionTree->getSelected($this->getID(), 'articles_relation', 'id_art', 'id_branch'); $this->adminSectionTree->getOpened($pageVars['tree']); $pageVars['opened'] = $this->adminSectionTree->opened; $pageVars['articleURL'] = path('kupshop_content_articles_article_1', [ 'IDa' => $ID, 'slug' => StringUtil::slugify($pageVars['data']['title']), ]); $SQL = sqlQuery('SELECT id_auth FROM '.getTableName('articles_authors_relation')." WHERE id_art='".$ID."' "); foreach ($SQL as $row) { $pageVars['dbAuth'][$row['id_auth']] = 1; } $SQL = sqlQuery('SELECT id_branch FROM '.getTableName('articles_branches_admins')." WHERE id_admin='".$GLOBALS['adminID']."' "); $pageVars['permittedBranches'] = []; foreach ($SQL as $row) { $pageVars['permittedBranches'][$row['id_branch']] = 'ENABLED'; } // ----------------------------------------------------------------- // zjistit povolene autory $SQL = sqlQuery('SELECT id_auth FROM '.getTableName('articles_authors_admins')." WHERE id_admin='".$GLOBALS['adminID']."' "); $pageVars['permittedAuthors'] = []; foreach ($SQL as $row) { $pageVars['permittedAuthors'][$row['id_auth']] = 'ENABLED'; } if ($acn == 'edit') { $strSections = ''; $strAuthors = ''; // kdyz jsou nejake povolene sekce if (count($pageVars['permittedBranches']) > 0) { foreach ($pageVars['permittedBranches'] as $key => $value) { if ($strSections != '') { $strSections .= ' OR '; } $strSections .= "ar.id_branch='".$key."'"; } $no = returnSQLResult('SELECT COUNT(*) FROM '.getTableName('articles').' AS a, '.getTableName('articles_relation')." AS ar WHERE a.id='".$ID."' AND a.id=ar.id_art AND (".$strSections.') '); if (intval($no) == 0) { $acn = 'disabled'; // redirect("launch.php?s=error.php&id=1"); } } // kdyz jsou nejaci povoleni autori if (count($pageVars['permittedAuthors']) > 0) { foreach ($pageVars['permittedAuthors'] as $key => $value) { if ($strAuthors != '') { $strAuthors .= ' OR '; } $strAuthors .= "aar.id_auth='".$key."'"; } $no = returnSQLResult('SELECT COUNT(*) FROM '.getTableName('articles').' AS a, '.getTableName('articles_authors_relation')." AS aar WHERE a.id='".$ID."' AND a.id=aar.id_art AND (".$strAuthors.') '); if (intval($no) == 0) { $acn = 'disabled'; // redirect("launch.php?s=error.php&id=1"); } } if ($pageVars['data']['id_block']) { $pageVars['data']['blocks_history'] = $this->blocksHistory->getBlocksHistory($pageVars['data']['id_block']); } } foreach ($pageVars['tree'] as $key => $row) { if (count($pageVars['permittedBranches']) > 0 && !array_key_exists($row['id'], $pageVars['permittedBranches']) == true) { $pageVars['disabled'][$key] = true; } } $pageVars['data']['photos'] = sqlQueryBuilder()->select('id_photo')->from('photos_articles_relation') ->where(\Query\Operator::equals(['id_art' => $this->getID()])) ->orderBy('position')->execute()->fetchAll(); $tags = sqlQueryBuilder() ->select('at.id, at.tag') ->from('articles_tags_relation', 'atr') ->leftJoin('atr', 'articles_tags', 'at', 'at.id = atr.id_tag') ->where(\Query\Operator::equals(['atr.id_article' => $ID])) ->execute()->fetchAll(); $pageVars['data']['tags'] = array_combine(array_column($tags, 'id'), array_column($tags, 'tag')); $authors = sqlQueryBuilder() ->select('id_auth as id') ->from('articles_authors_relation') ->where(Operator::equals(['id_art' => $ID])) ->execute()->fetchAll(); $pageVars['data']['authors'] = array_combine(array_column($authors, 'id'), array_column($authors, 'id')); // related articles $relatedQb = sqlQueryBuilder() ->select('ar.id_article_related as value, ar.position, a.title as label') ->from('articles_related', 'ar') ->join('ar', 'articles', 'a', 'a.id = ar.id_article_related') ->where(Operator::equals(['ar.id_article' => $ID])) ->orderBy('ar.position') ->groupBy('ar.id_article, ar.id_article_related'); if (findModule(\Modules::ARTICLES_RELATED_TYPES)) { $relatedQb->addSelect('ar.type') ->addSelect('GROUP_CONCAT(ar.type) as types'); } $pageVars['articles_related'] = []; foreach ($relatedQb->execute() as $relatedKey => $relatedItem) { $pageVars['articles_related'][$relatedKey] = $relatedItem; if (!empty($relatedItem['types'])) { $relatedItem['types'] = array_map('intval', explode(',', $relatedItem['types'])); } } $pageVars['related_additional_data'] = [ 'articlesRelatedTypes' => $this->getArticlesRelatedTypes(), ]; } $pageVars['acn'] = $acn; $pageVars['articleTranslationsFigure'] = $this->getTranslationUtil()?->getTranslationsFigure(ArticlesTranslation::class, $this->getID()); $this->unserializeCustomData($pageVars['data']); $vars['body'] = $pageVars; return $vars; } public function getData() { $data = parent::getData(); $acn = $this->getAction(); if (getVal('Submit')) { $data['date'] = $this->prepareDateTime($data['date']); $data['date_created'] = $this->prepareDateTime($data['date_created']); $this->serializeCustomData($data); $data['url'] = trim($data['url'] ?? '', '/'); if (findModule('seo')) { if (empty($data['meta_title_changed'])) { $data['meta_title'] = ''; } } } if ($acn == 'add') { $data['figure'] = empty($data['figure']) ? 'Y' : $data['figure']; $data['seen'] = '0'; $data['type'] = empty($data['type']) ? 'A' : $data['type']; $data['rating_value'] = '0'; $data['rating_voted'] = '0'; $data['comments'] = 'Y'; $data['tags'] = []; $data['article_body'] = []; } return $data; } public function getObject() { $data = parent::getObject(); $ID = $this->getID(); $data['show_in_lead'] = 'N'; $no = returnSQLResult('SELECT COUNT(*) FROM photos_articles_relation WHERE id_art=:id AND show_in_lead="Y"', ['id' => $ID]); if ($no == 0) { $data['show_in_lead'] = 'Y'; } if ($data['id_block'] === null) { $data['blocks'] = []; } else { $data['blocks'] = $this->getBlocks($data['id_block']); } return $data; } public function handleUpdate() { $data = $this->getData(); $SQL = parent::handleUpdate(); if ($SQL) { $ID = $this->getID(); // SAVE BLOCKS if (!empty($data)) { if ($this->getAction() == 'edit') { // historii je treba ulozit jeste pred ulozenim bloku $this->blocksHistory->saveBlocksHistory(getVal('blocks', $data, [])); } $this->saveBlocks($data, $this->getID(), 'articles'); $this->updateBlocksPhotosPositions($this->getID(), 'articles', 'id_art'); } // ############################################ // # ZARAZENI DO SEKCI if (findModule('articles_sections') || findModule('news')) { sqlQuery('DELETE FROM '.getTableName('articles_relation')." WHERE id_art='".$ID."' "); if (isset($_POST['sec'])) { $no = count($_POST['sec']); if ($no > 0) { foreach ($_POST['sec'] as $key => $value) { if (!empty($key)) { sqlQuery('INSERT INTO '.getTableName('articles_relation')." SET id_art='".$ID."', id_branch='".$key."' "); } } unset($key, $value); } } } // ############################################ // # ZAPSANI AUTORU $this->deleteSQL('articles_authors_relation', ['id_art' => $ID]); if (!empty($data['authors'])) { foreach (array_unique($data['authors']) as $authorId) { $this->insertSQL('articles_authors_relation', ['id_art' => $ID, 'id_auth' => $authorId]); } } // ############################################ // Save related articles $this->deleteSQL('articles_related', ['id_article' => $ID]); foreach ($data['articles_related'] ?? [] as $related) { if (!empty($related['delete'])) { continue; } if (findModule(\Modules::ARTICLES_RELATED_TYPES)) { $types = $related['type'] ?? []; if (empty($types)) { $types = [$this->getArticlesRelatedTypes()[0]['id']]; } foreach ($types as $type) { sqlQueryBuilder() ->insert('articles_related') ->directValues( [ 'id_article' => $ID, 'id_article_related' => $related['id_article'], 'position' => $related['position'], 'type' => $type, ] )->execute(); } } else { sqlQueryBuilder() ->insert('articles_related') ->directValues( [ 'id_article' => $ID, 'id_article_related' => $related['id_article'], 'position' => $related['position'], ] )->execute(); } } // Save tags $this->deleteSQL('articles_tags_relation', ['id_article' => $ID]); if (!empty($data['tags'])) { foreach (array_unique($data['tags']) as $id_tag) { $this->insertSQL('articles_tags_relation', ['id_article' => $ID, 'id_tag' => $id_tag]); } } // Save translations figure $this->getTranslationUtil()?->updateTranslationsFigure(ArticlesTranslation::class, $this->getID(), $data['translation_figure'] ?? []); if (!empty($data['products'])) { foreach ($data['products'] as $id => $item) { $item['id'] = intval($id); if (!empty($item['delete']) || !$id) { if ($id > 0) { $this->deleteSQL('products_in_articles', ['id_product' => $item['id_product'], 'id_article' => $ID]); } continue; } try { if ($id < 0) { $this->insertSQL('products_in_articles', ['id_product' => $item['id_product'], 'id_article' => $ID]); } } catch (Doctrine\DBAL\DBALException $e) { if (intval($e->getPrevious()->errorInfo[1]) == '1062') { $this->returnError('Produkt je již k tomuto článku přidán!'); } } } $this->returnOK(); } } return $SQL; } public function handleDelete() { $IDa = $this->getID(); $object = $this->getObject(); writeDownActivity('smazán článek: '. returnSQLResult('SELECT title FROM '.getTableName('articles')." WHERE id='".$IDa."' ")); sqlQuery('DELETE FROM '.getTableName('photos_articles')." WHERE id_art='".$IDa."' "); sqlQuery('DELETE FROM '.getTableName('articles_relation')." WHERE id_art='".$IDa."' "); sqlQuery('DELETE FROM '.getTableName('articles_authors_relation')." WHERE id_art='".$IDa."' "); sqlQuery('DELETE FROM '.getTableName('articles')." WHERE id='".$IDa."' "); $this->removeBlocks($object['id_block']); redirect('launch.php?s=articles.php&acn=erased&refresh=parent&ErrStr='.urlencode('Článek byl odstraněn.')); } private function getArticlesRelatedTypes(): array { if (!findModule(\Modules::ARTICLES_RELATED_TYPES)) { return []; } return sqlQueryBuilder() ->select('id, name') ->from('articles_related_types') ->orderBy('id', 'ASC') ->execute()->fetchAllAssociative(); } } return Articles::class;