{{ heading_title }}
- {% if articles %} --
{{ article['name'] }}
-{{ article['description'] }}
- {% if configblog_review_status %} - {% if article.rating %} - - {% endif %} - {% endif %} -{{ text_empty }}
- - {% endif %} - {{ content_bottom }}diff --git a/.gitignore b/.gitignore index 26d6e54..f6d9950 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ public/image/* *.old *.orig *.sql +!database/migrations/*.sql *.sql.gz *.tar *.tar.gz diff --git a/public/admin/controller/blog/article.php b/public/admin/controller/blog/article.php index 367fd15..6a298b2 100644 --- a/public/admin/controller/blog/article.php +++ b/public/admin/controller/blog/article.php @@ -442,6 +442,12 @@ class ControllerBlogArticle extends Controller { $data['error_keyword'] = ''; } + if (isset($this->error['category'])) { + $data['error_category'] = $this->error['category']; + } else { + $data['error_category'] = ''; + } + $url = ''; if (isset($this->request->get['filter_name'])) { @@ -596,8 +602,8 @@ class ControllerBlogArticle extends Controller { $data['main_blog_category_id'] = 0; } - if (isset($this->request->post['article_blog_category'])) { - $categories = $this->request->post['article_blog_category']; + if (isset($this->request->post['article_category'])) { + $categories = $this->request->post['article_category']; } elseif (isset($this->request->get['article_id'])) { $categories = $this->model_blog_article->getArticleCategories($this->request->get['article_id']); } else { @@ -756,6 +762,10 @@ class ControllerBlogArticle extends Controller { $this->error['meta_h1'][$language_id] = $this->language->get('error_meta_h1'); } } + + if (empty($this->request->post['article_category'])) { + $this->error['category'] = $this->language->get('error_category'); + } if (isset($this->request->post['article_seo_url']) && is_array($this->request->post['article_seo_url'])) { foreach ($this->request->post['article_seo_url'] as $store_id => &$languages) { @@ -932,4 +942,4 @@ class ControllerBlogArticle extends Controller { $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } -} \ No newline at end of file +} diff --git a/public/admin/controller/blog/setting.php b/public/admin/controller/blog/setting.php index f19fbfa..5e53838 100644 --- a/public/admin/controller/blog/setting.php +++ b/public/admin/controller/blog/setting.php @@ -41,12 +41,6 @@ class ControllerBlogSetting extends Controller { $data['entry_image_related'] = $this->language->get('entry_image_related'); $data['entry_width'] = $this->language->get('entry_width'); $data['entry_height'] = $this->language->get('entry_height'); - $data['entry_name'] = $this->language->get('entry_name'); - $data['entry_html_h1'] = $this->language->get('entry_html_h1'); - $data['entry_meta_title'] = $this->language->get('entry_meta_title'); - $data['entry_meta_description'] = $this->language->get('entry_meta_description'); - $data['entry_meta_keyword'] = $this->language->get('entry_meta_keyword'); - $data['help_comment'] = $this->language->get('help_comment'); $data['help_article_limit'] = $this->language->get('help_article_limit'); $data['help_article_description_length'] = $this->language->get('help_article_description_length'); @@ -222,36 +216,6 @@ class ControllerBlogSetting extends Controller { $data['configblog_image_related_height'] = $this->config->get('configblog_image_related_height'); } - if (isset($this->request->post['configblog_name'])) { - $data['configblog_name'] = $this->request->post['configblog_name']; - } else { - $data['configblog_name'] = $this->config->get('configblog_name'); - } - - if (isset($this->request->post['configblog_html_h1'])) { - $data['configblog_html_h1'] = $this->request->post['configblog_html_h1']; - } else { - $data['configblog_html_h1'] = $this->config->get('configblog_html_h1'); - } - - if (isset($this->request->post['configblog_meta_title'])) { - $data['configblog_meta_title'] = $this->request->post['configblog_meta_title']; - } else { - $data['configblog_meta_title'] = $this->config->get('configblog_meta_title'); - } - - if (isset($this->request->post['configblog_meta_description'])) { - $data['configblog_meta_description'] = $this->request->post['configblog_meta_description']; - } else { - $data['configblog_meta_description'] = $this->config->get('configblog_meta_description'); - } - - if (isset($this->request->post['configblog_meta_keyword'])) { - $data['configblog_meta_keyword'] = $this->request->post['configblog_meta_keyword']; - } else { - $data['configblog_meta_keyword'] = $this->config->get('configblog_meta_keyword'); - } - $data['header'] = $this->load->controller('common/header'); $data['column_left'] = $this->load->controller('common/column_left'); $data['footer'] = $this->load->controller('common/footer'); @@ -294,4 +258,4 @@ class ControllerBlogSetting extends Controller { return !$this->error; } -} \ No newline at end of file +} diff --git a/public/admin/controller/common/column_left.php b/public/admin/controller/common/column_left.php index 991c02b..86ed7a9 100644 --- a/public/admin/controller/common/column_left.php +++ b/public/admin/controller/common/column_left.php @@ -182,6 +182,14 @@ class ControllerCommonColumnLeft extends Controller { ); } + if ($this->user->hasPermission('access', 'service/category')) { + $service[] = array( + 'name' => $this->language->get('text_service_category'), + 'href' => $this->url->link('service/category', 'user_token=' . $this->session->data['user_token'], true), + 'children' => array() + ); + } + if ($service) { $data['menus'][] = array( 'id' => 'menu-service', diff --git a/public/admin/controller/service/category.php b/public/admin/controller/service/category.php new file mode 100644 index 0000000..7a2b769 --- /dev/null +++ b/public/admin/controller/service/category.php @@ -0,0 +1,683 @@ +load->language('service/category'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('service/category'); + + $this->getList(); + } + + public function add() { + $this->load->language('service/category'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('service/category'); + + if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validateForm()) { + $this->model_service_category->addCategory($this->request->post); + + $this->session->data['success'] = $this->language->get('text_success'); + + $url = ''; + + if (isset($this->request->get['sort'])) { + $url .= '&sort=' . $this->request->get['sort']; + } + + if (isset($this->request->get['order'])) { + $url .= '&order=' . $this->request->get['order']; + } + + if (isset($this->request->get['page'])) { + $url .= '&page=' . $this->request->get['page']; + } + + $this->response->redirect($this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true)); + } + + $this->getForm(); + } + + public function edit() { + $this->load->language('service/category'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('service/category'); + + if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validateForm()) { + $this->model_service_category->editCategory($this->request->get['service_category_id'], $this->request->post); + + $this->session->data['success'] = $this->language->get('text_success'); + + $url = ''; + + if (isset($this->request->get['sort'])) { + $url .= '&sort=' . $this->request->get['sort']; + } + + if (isset($this->request->get['order'])) { + $url .= '&order=' . $this->request->get['order']; + } + + if (isset($this->request->get['page'])) { + $url .= '&page=' . $this->request->get['page']; + } + + $this->response->redirect($this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true)); + } + + $this->getForm(); + } + + public function delete() { + $this->load->language('service/category'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('service/category'); + + if (isset($this->request->post['selected']) && $this->validateDelete()) { + foreach ($this->request->post['selected'] as $service_category_id) { + $this->model_service_category->deleteCategory($service_category_id); + } + + $this->session->data['success'] = $this->language->get('text_success'); + + $url = ''; + + if (isset($this->request->get['sort'])) { + $url .= '&sort=' . $this->request->get['sort']; + } + + if (isset($this->request->get['order'])) { + $url .= '&order=' . $this->request->get['order']; + } + + if (isset($this->request->get['page'])) { + $url .= '&page=' . $this->request->get['page']; + } + + $this->response->redirect($this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true)); + } + + $this->getList(); + } + + public function repair() { + $url = ''; + + $this->load->language('service/category'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('service/category'); + + if ($this->validateRepair()) { + $this->model_service_category->repairCategories(); + + $this->session->data['success'] = $this->language->get('text_success'); + + $this->response->redirect($this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true)); + } + + $this->getList(); + } + + protected function getList() { + + $url = ''; + + $data['breadcrumbs'] = array(); + + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('text_home'), + 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) + ); + + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('heading_title'), + 'href' => $this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true) + ); + + $data['add'] = $this->url->link('service/category/add', 'user_token=' . $this->session->data['user_token'] . $url, true); + $data['delete'] = $this->url->link('service/category/delete', 'user_token=' . $this->session->data['user_token'] . $url, true); + $data['repair'] = $this->url->link('service/category/repair', 'user_token=' . $this->session->data['user_token'] . $url, true); + + $data['enabled'] = $this->url->link('service/category/enable', 'user_token=' . $this->session->data['user_token'] . $url, true); + $data['disabled'] = $this->url->link('service/category/disable', 'user_token=' . $this->session->data['user_token'] . $url, true); + + if (isset($this->request->get['path'])) { + if ($this->request->get['path'] != '') { + $this->path = explode('_', $this->request->get['path']); + $this->service_category_id = end($this->path); + $this->session->data['path'] = $this->request->get['path']; + } else { + unset($this->session->data['path']); + } + } elseif (isset($this->session->data['path'])) { + $this->path = explode('_', $this->session->data['path']); + $this->service_category_id = end($this->path); + } + + $data['categories'] = $this->getCategories(0); + + if (isset($this->error['warning'])) { + $data['error_warning'] = $this->error['warning']; + } else { + $data['error_warning'] = ''; + } + + if (isset($this->session->data['success'])) { + $data['success'] = $this->session->data['success']; + + unset($this->session->data['success']); + } else { + $data['success'] = ''; + } + + if (isset($this->request->post['selected'])) { + $data['selected'] = (array)$this->request->post['selected']; + } else { + $data['selected'] = array(); + } + + $url = ''; + $category_total = $this->model_service_category->getTotalCategories(); + + $data['results'] = $this->language->get('text_category_total') . ($category_total); + + $data['header'] = $this->load->controller('common/header'); + $data['column_left'] = $this->load->controller('common/column_left'); + $data['footer'] = $this->load->controller('common/footer'); + + $this->response->setOutput($this->load->view('service/category_list', $data)); + } + + protected function getForm() { + + if (isset($this->error['warning'])) { + $data['error_warning'] = $this->error['warning']; + } else { + $data['error_warning'] = ''; + } + + if (isset($this->error['name'])) { + $data['error_name'] = $this->error['name']; + } else { + $data['error_name'] = array(); + } + + if (isset($this->error['meta_title'])) { + $data['error_meta_title'] = $this->error['meta_title']; + } else { + $data['error_meta_title'] = array(); + } + + if (isset($this->error['meta_h1'])) { + $data['error_meta_h1'] = $this->error['meta_h1']; + } else { + $data['error_meta_h1'] = array(); + } + + if (isset($this->error['keyword'])) { + $data['error_keyword'] = $this->error['keyword']; + } else { + $data['error_keyword'] = ''; + } + + $url = ''; + + if (isset($this->request->get['sort'])) { + $url .= '&sort=' . $this->request->get['sort']; + } + + if (isset($this->request->get['order'])) { + $url .= '&order=' . $this->request->get['order']; + } + + if (isset($this->request->get['page'])) { + $url .= '&page=' . $this->request->get['page']; + } + + $data['breadcrumbs'] = array(); + + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('text_home'), + 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) + ); + + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('heading_title'), + 'href' => $this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true) + ); + + if (!isset($this->request->get['service_category_id'])) { + $data['action'] = $this->url->link('service/category/add', 'user_token=' . $this->session->data['user_token'] . $url, true); + } else { + $data['action'] = $this->url->link('service/category/edit', 'user_token=' . $this->session->data['user_token'] . '&service_category_id=' . $this->request->get['service_category_id'] . $url, true); + } + + $data['cancel'] = $this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true); + + if (isset($this->request->get['service_category_id']) && ($this->request->server['REQUEST_METHOD'] != 'POST')) { + $category_info = $this->model_service_category->getCategory($this->request->get['service_category_id']); + } + + $data['user_token'] = $this->session->data['user_token']; + + $this->load->model('localisation/language'); + + $data['languages'] = $this->model_localisation_language->getLanguages(); + + if (isset($this->request->post['category_description'])) { + $data['category_description'] = $this->request->post['category_description']; + } elseif (isset($this->request->get['service_category_id'])) { + $data['category_description'] = $this->model_service_category->getCategoryDescriptions($this->request->get['service_category_id']); + } else { + $data['category_description'] = array(); + } + + $language_id = $this->config->get('config_language_id'); + if (isset($data['category_description'][$language_id]['name'])) { + $data['heading_title'] = $data['category_description'][$language_id]['name']; + } + + if (isset($this->request->post['path'])) { + $data['path'] = $this->request->post['path']; + } elseif (!empty($category_info)) { + $data['path'] = $category_info['path']; + } else { + $data['path'] = ''; + } + + if (isset($this->request->post['parent_id'])) { + $data['parent_id'] = $this->request->post['parent_id']; + } elseif (!empty($category_info)) { + $data['parent_id'] = $category_info['parent_id']; + } else { + $data['parent_id'] = 0; + } + + $this->load->model('setting/store'); + + $data['stores'] = array(); + + $data['stores'][] = array( + 'store_id' => 0, + 'name' => $this->language->get('text_default') + ); + + $stores = $this->model_setting_store->getStores(); + + foreach ($stores as $store) { + $data['stores'][] = array( + 'store_id' => $store['store_id'], + 'name' => $store['name'] + ); + } + + if (isset($this->request->post['category_store'])) { + $data['category_store'] = $this->request->post['category_store']; + } elseif (isset($this->request->get['service_category_id'])) { + $data['category_store'] = $this->model_service_category->getCategoryStores($this->request->get['service_category_id']); + } else { + $data['category_store'] = array(0); + } + + if (isset($this->request->post['image'])) { + $data['image'] = $this->request->post['image']; + } elseif (!empty($category_info)) { + $data['image'] = $category_info['image']; + } else { + $data['image'] = ''; + } + + $this->load->model('tool/image'); + + if (isset($this->request->post['image']) && is_file(DIR_IMAGE . $this->request->post['image'])) { + $data['thumb'] = $this->model_tool_image->resize($this->request->post['image'], 100, 100); + } elseif (!empty($category_info) && is_file(DIR_IMAGE . $category_info['image'])) { + $data['thumb'] = $this->model_tool_image->resize($category_info['image'], 100, 100); + } else { + $data['thumb'] = $this->model_tool_image->resize('no_image.png', 100, 100); + } + + $data['placeholder'] = $this->model_tool_image->resize('no_image.png', 100, 100); + + if (isset($this->request->post['top'])) { + $data['top'] = $this->request->post['top']; + } elseif (!empty($category_info)) { + $data['top'] = $category_info['top']; + } else { + $data['top'] = 0; + } + + if (isset($this->request->post['column'])) { + $data['column'] = $this->request->post['column']; + } elseif (!empty($category_info)) { + $data['column'] = $category_info['column']; + } else { + $data['column'] = 1; + } + + if (isset($this->request->post['sort_order'])) { + $data['sort_order'] = $this->request->post['sort_order']; + } elseif (!empty($category_info)) { + $data['sort_order'] = $category_info['sort_order']; + } else { + $data['sort_order'] = 0; + } + + if (isset($this->request->post['category_seo_url'])) { + $data['category_seo_url'] = $this->request->post['category_seo_url']; + } elseif (isset($this->request->get['service_category_id'])) { + $data['category_seo_url'] = $this->model_service_category->getCategorySeoUrls($this->request->get['service_category_id']); + } else { + $data['category_seo_url'] = array(); + } + + if (isset($this->request->post['status'])) { + $data['status'] = $this->request->post['status']; + } elseif (!empty($category_info)) { + $data['status'] = $category_info['status']; + } else { + $data['status'] = true; + } + + if (isset($this->request->post['noindex'])) { + $data['noindex'] = $this->request->post['noindex']; + } elseif (!empty($category_info)) { + $data['noindex'] = $category_info['noindex']; + } else { + $data['noindex'] = 1; + } + + if (isset($this->request->post['category_layout'])) { + $data['category_layout'] = $this->request->post['category_layout']; + } elseif (isset($this->request->get['service_category_id'])) { + $data['category_layout'] = $this->model_service_category->getCategoryLayouts($this->request->get['service_category_id']); + } else { + $data['category_layout'] = array(); + } + + $this->load->model('design/layout'); + + $data['layouts'] = $this->model_design_layout->getLayouts(); + + $data['header'] = $this->load->controller('common/header'); + $data['column_left'] = $this->load->controller('common/column_left'); + $data['footer'] = $this->load->controller('common/footer'); + + $this->response->setOutput($this->load->view('service/category_form', $data)); + } + + protected function validateForm() { + if (!$this->user->hasPermission('modify', 'service/category')) { + $this->error['warning'] = $this->language->get('error_permission'); + } + + foreach ($this->request->post['category_description'] as $language_id => $value) { + if ((utf8_strlen($value['name']) < 2) || (utf8_strlen($value['name']) > 255)) { + $this->error['name'][$language_id] = $this->language->get('error_name'); + } + + if ((utf8_strlen($value['meta_title']) < 0) || (utf8_strlen($value['meta_title']) > 255)) { + $this->error['meta_title'][$language_id] = $this->language->get('error_meta_title'); + } + + if ((utf8_strlen($value['meta_h1']) < 0) || (utf8_strlen($value['meta_h1']) > 255)) { + $this->error['meta_h1'][$language_id] = $this->language->get('error_meta_h1'); + } + } + + if (isset($this->request->post['category_seo_url']) && is_array($this->request->post['category_seo_url'])) { + foreach ($this->request->post['category_seo_url'] as $store_id => &$languages) { + foreach ($languages as $language_id => &$keyword) { + if (!empty($keyword)) { + $keyword = translit($keyword); + } + } + } + } + + if (isset($this->request->post['category_description'])) { + foreach ($this->request->post['category_description'] as $language_id => $value) { + if (!empty($value['name'])) { + if (!isset($this->request->post['category_seo_url'][0][$language_id]) || trim($this->request->post['category_seo_url'][0][$language_id]) === '') { + $this->request->post['category_seo_url'][0][$language_id] = translit($value['name']); + } + } + } + } + + if ($this->request->post['category_seo_url']) { + $this->load->model('design/seo_url'); + + foreach ($this->request->post['category_seo_url'] as $store_id => $language) { + foreach ($language as $language_id => $keyword) { + if (!empty($keyword)) { + if (count(array_keys($language, $keyword)) > 1) { + $this->error['keyword'][$store_id][$language_id] = $this->language->get('error_unique'); + } + + $seo_urls = $this->model_design_seo_url->getSeoUrlsByKeyword($keyword); + + foreach ($seo_urls as $seo_url) { + if (($seo_url['store_id'] == $store_id) && (!isset($this->request->get['service_category_id']) || ($seo_url['query'] != 'service_category_id=' . $this->request->get['service_category_id']))) { + $this->error['keyword'][$store_id][$language_id] = $this->language->get('error_keyword'); + + break; + } + } + } + } + } + } + + if ($this->error && !isset($this->error['warning'])) { + $this->error['warning'] = $this->language->get('error_warning'); + } + + return !$this->error; + } + + public function enable() { + $this->load->language('service/category'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('service/category'); + + if (isset($this->request->post['selected'])) { + + foreach ($this->request->post['selected'] as $service_category_id) { + $this->model_service_category->editCategoryStatus($service_category_id, 1); + } + + $this->session->data['success'] = $this->language->get('text_success'); + + $url = ''; + + if (isset($this->request->get['page'])) { + $url .= '&page=' . $this->request->get['page']; + } + + if (isset($this->request->get['sort'])) { + $url .= '&sort=' . $this->request->get['sort']; + } + + if (isset($this->request->get['order'])) { + $url .= '&order=' . $this->request->get['order']; + } + + $this->response->redirect($this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true)); + } + + $this->getList(); + } + + public function disable() { + $this->load->language('service/category'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('service/category'); + + if (isset($this->request->post['selected'])) { + + foreach ($this->request->post['selected'] as $service_category_id) { + $this->model_service_category->editCategoryStatus($service_category_id, 0); + } + + $this->session->data['success'] = $this->language->get('text_success'); + + $url = ''; + + if (isset($this->request->get['page'])) { + $url .= '&page=' . $this->request->get['page']; + } + + if (isset($this->request->get['sort'])) { + $url .= '&sort=' . $this->request->get['sort']; + } + + if (isset($this->request->get['order'])) { + $url .= '&order=' . $this->request->get['order']; + } + + $this->response->redirect($this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . $url, true)); + } + + $this->getList(); + } + + protected function validateDelete() { + if (!$this->user->hasPermission('modify', 'service/category')) { + $this->error['warning'] = $this->language->get('error_permission'); + } + + foreach ($this->request->post['selected'] as $service_category_id) { + if ($this->model_service_category->getTotalServicesByCategoryId($service_category_id)) { + $this->error['warning'] = $this->language->get('error_service'); + } + + if ($this->model_service_category->getCategoriesByParentId($service_category_id)) { + $this->error['warning'] = $this->language->get('error_children'); + } + } + + return !$this->error; + } + + protected function validateRepair() { + if (!$this->user->hasPermission('modify', 'service/category')) { + $this->error['warning'] = $this->language->get('error_permission'); + } + + return !$this->error; + } + + public function autocomplete() { + $json = array(); + + if (isset($this->request->get['filter_name'])) { + $this->load->model('service/category'); + + $filter_data = array( + 'filter_name' => $this->request->get['filter_name'], + 'sort' => 'name', + 'order' => 'ASC', + 'start' => 0, + 'limit' => $this->config->get('config_limit_autocomplete') + ); + + $results = $this->model_service_category->getCategories($filter_data); + + foreach ($results as $result) { + $json[] = array( + 'service_category_id' => $result['service_category_id'], + 'name' => strip_tags(html_entity_decode($result['name'], ENT_QUOTES, 'UTF-8')) + ); + } + } + + $sort_order = array(); + + foreach ($json as $key => $value) { + $sort_order[$key] = $value['name']; + } + + array_multisort($sort_order, SORT_ASC, $json); + + $this->response->addHeader('Content-Type: application/json'); + $this->response->setOutput(json_encode($json)); + } + + private function getCategories($parent_id, $parent_path = '', $indent = '') { + $service_category_id = array_shift($this->path); + $output = array(); + static $href_category = null; + if ($href_category === null) { + $href_category = $this->url->link('service/category', 'user_token=' . $this->session->data['user_token'] . '&path=', true); + } + $results = $this->model_service_category->getCategoriesByParentId($parent_id); + foreach ($results as $result) { + $path = $parent_path . $result['service_category_id']; + $href = ($result['children']) ? $href_category . $path : ''; + $name = $result['name']; + if ($service_category_id == $result['service_category_id']) { + $name = '' . $name . ''; + $data['breadcrumbs'][] = array( + 'text' => $result['name'], + 'href' => $href, + 'separator' => ' :: ' + ); + $href = ''; + } + $selected = isset($this->request->post['selected']) && in_array($result['service_category_id'], $this->request->post['selected']); + $output[$result['service_category_id']] = array( + 'service_category_id' => $result['service_category_id'], + 'name' => $name, + 'sort_order' => $result['sort_order'], + 'noindex' => $result['noindex'], + 'edit' => $this->url->link('service/category/edit', 'user_token=' . $this->session->data['user_token'] . '&service_category_id=' . $result['service_category_id'], true), + 'selected' => $selected, + 'href' => $href, + 'href_shop' => HTTP_CATALOG . 'index.php?route=service/category&service_category_id=' . $path, + 'indent' => $indent + ); + if ($service_category_id == $result['service_category_id']) { + $output += $this->getCategories($result['service_category_id'], $path . '_', $indent . str_repeat(' ', 8)); + } + } + return $output; + } + private function getAllCategories($categories, $parent_id = 0, $parent_name = '') { + $output = array(); + if (array_key_exists($parent_id, $categories)) { + if ($parent_name != '') { + $parent_name .= $this->language->get('text_separator'); + } + foreach ($categories[$parent_id] as $category) { + $output[$category['service_category_id']] = array( + 'service_category_id' => $category['service_category_id'], + 'name' => $parent_name . $category['name'] + ); + $output += $this->getAllCategories($categories, $category['service_category_id'], $parent_name . $category['name']); + } + } + return $output; + } +} diff --git a/public/admin/controller/service/service.php b/public/admin/controller/service/service.php index 3fb876d..f1628c1 100644 --- a/public/admin/controller/service/service.php +++ b/public/admin/controller/service/service.php @@ -439,6 +439,12 @@ class ControllerServiceService extends Controller { $data['error_keyword'] = ''; } + if (isset($this->error['category'])) { + $data['error_category'] = $this->error['category']; + } else { + $data['error_category'] = ''; + } + $url = ''; if (isset($this->request->get['filter_name'])) { @@ -578,6 +584,19 @@ class ControllerServiceService extends Controller { $data['noindex'] = 1; } + $this->load->model('service/category'); + + $categories = $this->model_service_category->getAllCategories(); + $data['categories'] = $this->model_service_category->getCategories($categories); + + if (isset($this->request->post['service_category_id'])) { + $data['service_category_id'] = (int)$this->request->post['service_category_id']; + } elseif (isset($this->request->get['service_id'])) { + $data['service_category_id'] = $this->model_service_service->getServiceCategoryId($this->request->get['service_id']); + } else { + $data['service_category_id'] = 0; + } + // Images if (isset($this->request->post['service_image'])) { $service_images = $this->request->post['service_image']; @@ -718,6 +737,10 @@ class ControllerServiceService extends Controller { } } + if (empty($this->request->post['service_category_id'])) { + $this->error['category'] = $this->language->get('error_category'); + } + if (isset($this->request->post['service_seo_url']) && is_array($this->request->post['service_seo_url'])) { foreach ($this->request->post['service_seo_url'] as $store_id => &$languages) { foreach ($languages as $language_id => &$keyword) { diff --git a/public/admin/language/ru-ru/blog/article.php b/public/admin/language/ru-ru/blog/article.php index b01e073..9edd0bd 100644 --- a/public/admin/language/ru-ru/blog/article.php +++ b/public/admin/language/ru-ru/blog/article.php @@ -55,4 +55,5 @@ $_['error_permission'] = 'У вас недостаточно прав дл $_['error_name'] = 'Название должно содержать от 3 до 255 символов!'; $_['error_meta_title'] = 'Мета-тег Title должен содержать от 0 до 255 символов!'; $_['error_meta_h1'] = 'HTML-тег H1 должен содержать от 0 до 255 символов!'; -$_['error_keyword'] = 'Выбранный SEO URL уже используется!'; \ No newline at end of file +$_['error_category'] = 'Укажите хотя бы одну категорию статьи!'; +$_['error_keyword'] = 'Выбранный SEO URL уже используется!'; diff --git a/public/admin/language/ru-ru/blog/setting.php b/public/admin/language/ru-ru/blog/setting.php index 76b7dc4..c7d32c0 100644 --- a/public/admin/language/ru-ru/blog/setting.php +++ b/public/admin/language/ru-ru/blog/setting.php @@ -26,12 +26,6 @@ $_['entry_image_article'] = 'Размер изображения в $_['entry_image_related'] = 'Размер изображения аналогичных статей, товаров'; $_['entry_width'] = 'Ширина'; $_['entry_height'] = 'Высота'; -$_['entry_name'] = 'Название'; -$_['entry_meta_title'] = 'Мета-тег Title'; -$_['entry_html_h1'] = 'HTML-тег H1'; -$_['entry_meta_description'] = 'Мета-тег Description'; -$_['entry_meta_keyword'] = 'Мета-тег Keywords'; - // Help $_['help_article_limit'] = 'Количество статей на странице Список статей'; $_['help_article_description_length'] = 'Количество символов в кратком описании статьи на странице Список статей'; @@ -48,4 +42,4 @@ $_['error_permission'] = 'У вас недостаточно п $_['error_limit'] = 'Укажите количество!'; $_['error_image_article'] = 'Необходимо указать размер изображения в списке статей!'; $_['error_image_category'] = 'Необходимо указать размер изображения в описании категории блога!'; -$_['error_image_related'] = 'Необходимо указать размер изображения аналогичных статей, товаров!'; \ No newline at end of file +$_['error_image_related'] = 'Необходимо указать размер изображения аналогичных статей, товаров!'; diff --git a/public/admin/language/ru-ru/common/column_left.php b/public/admin/language/ru-ru/common/column_left.php index db91566..6cd6238 100644 --- a/public/admin/language/ru-ru/common/column_left.php +++ b/public/admin/language/ru-ru/common/column_left.php @@ -137,6 +137,7 @@ $_['text_blog_review'] = 'Отзывы блога'; $_['text_blog_setting'] = 'Настройки блога'; $_['text_service_title'] = 'Услуги'; $_['text_service'] = 'Список услуг'; -$_['text_complete_status'] = 'Завершенных заказов'; -$_['text_processing_status'] = 'Заказов в процессе'; -$_['text_other_status'] = 'Другие заказы'; \ No newline at end of file +$_['text_service_category'] = 'Категории услуг'; +$_['text_complete_status'] = 'Завершенных заказов'; +$_['text_processing_status'] = 'Заказов в процессе'; +$_['text_other_status'] = 'Другие заказы'; diff --git a/public/admin/language/ru-ru/service/category.php b/public/admin/language/ru-ru/service/category.php new file mode 100644 index 0000000..6d34821 --- /dev/null +++ b/public/admin/language/ru-ru/service/category.php @@ -0,0 +1,54 @@ +db->query("DELETE FROM " . DB_PREFIX . "category_to_layout WHERE layout_id = '" . (int)$layout_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "product_to_layout WHERE layout_id = '" . (int)$layout_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "information_to_layout WHERE layout_id = '" . (int)$layout_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_to_layout WHERE layout_id = '" . (int)$layout_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_layout WHERE layout_id = '" . (int)$layout_id . "'"); } public function getLayout($layout_id) { @@ -106,4 +108,4 @@ class ModelDesignLayout extends Model { return $query->row['total']; } -} \ No newline at end of file +} diff --git a/public/admin/model/service/category.php b/public/admin/model/service/category.php new file mode 100644 index 0000000..dee73a6 --- /dev/null +++ b/public/admin/model/service/category.php @@ -0,0 +1,279 @@ +db->query("INSERT INTO " . DB_PREFIX . "service_category SET parent_id = '" . (int)$data['parent_id'] . "', `top` = '" . (isset($data['top']) ? (int)$data['top'] : 0) . "', sort_order = '" . (int)$data['sort_order'] . "', status = '" . (int)$data['status'] . "', noindex = '" . (int)$data['noindex'] . "', date_modified = NOW(), date_added = NOW()"); + $service_category_id = $this->db->getLastId(); + if (isset($data['image'])) { + $this->db->query("UPDATE " . DB_PREFIX . "service_category SET image = '" . $this->db->escape($data['image']) . "' WHERE service_category_id = '" . (int)$service_category_id . "'"); + } + foreach ($data['category_description'] as $language_id => $value) { + $this->db->query("INSERT INTO " . DB_PREFIX . "service_category_description SET service_category_id = '" . (int)$service_category_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_h1 = '" . $this->db->escape($value['meta_h1']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "'"); + } + // MySQL Hierarchical Data Closure Table Pattern + $level = 0; + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$data['parent_id'] . "' ORDER BY `level` ASC"); + foreach ($query->rows as $result) { + $this->db->query("INSERT INTO `" . DB_PREFIX . "service_category_path` SET `service_category_id` = '" . (int)$service_category_id . "', `path_id` = '" . (int)$result['path_id'] . "', `level` = '" . (int)$level . "'"); + $level++; + } + $this->db->query("INSERT INTO `" . DB_PREFIX . "service_category_path` SET `service_category_id` = '" . (int)$service_category_id . "', `path_id` = '" . (int)$service_category_id . "', `level` = '" . (int)$level . "'"); + if (isset($data['category_store'])) { + foreach ($data['category_store'] as $store_id) { + $this->db->query("INSERT INTO " . DB_PREFIX . "service_category_to_store SET service_category_id = '" . (int)$service_category_id . "', store_id = '" . (int)$store_id . "'"); + } + } + + if (isset($data['category_seo_url'])) { + foreach ($data['category_seo_url'] as $store_id => $language) { + foreach ($language as $language_id => $keyword) { + if (!empty($keyword)) { + $this->db->query("INSERT INTO " . DB_PREFIX . "seo_url SET store_id = '" . (int)$store_id . "', language_id = '" . (int)$language_id . "', query = 'service_category_id=" . (int)$service_category_id . "', keyword = '" . $this->db->escape(trim($keyword)) . "'"); + } + } + } + } + // Set which layout to use with this category + if (isset($data['category_layout'])) { + foreach ($data['category_layout'] as $store_id => $layout_id) { + $this->db->query("INSERT INTO " . DB_PREFIX . "service_category_to_layout SET service_category_id = '" . (int)$service_category_id . "', store_id = '" . (int)$store_id . "', layout_id = '" . (int)$layout_id . "'"); + } + } + $this->cache->delete('service_category'); + + if($this->config->get('config_seo_pro')){ + $this->cache->delete('seopro'); + } + return $service_category_id; + } + public function editCategory($service_category_id, $data) { + $this->db->query("UPDATE " . DB_PREFIX . "service_category SET parent_id = '" . (int)$data['parent_id'] . "', `top` = '" . (isset($data['top']) ? (int)$data['top'] : 0) . "', sort_order = '" . (int)$data['sort_order'] . "', status = '" . (int)$data['status'] . "', noindex = '" . (int)$data['noindex'] . "', date_modified = NOW() WHERE service_category_id = '" . (int)$service_category_id . "'"); + if (isset($data['image'])) { + $this->db->query("UPDATE " . DB_PREFIX . "service_category SET image = '" . $this->db->escape($data['image']) . "' WHERE service_category_id = '" . (int)$service_category_id . "'"); + } + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_description WHERE service_category_id = '" . (int)$service_category_id . "'"); + foreach ($data['category_description'] as $language_id => $value) { + $this->db->query("INSERT INTO " . DB_PREFIX . "service_category_description SET service_category_id = '" . (int)$service_category_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_h1 = '" . $this->db->escape($value['meta_h1']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "'"); + } + // MySQL Hierarchical Data Closure Table Pattern + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "service_category_path` WHERE path_id = '" . (int)$service_category_id . "' ORDER BY level ASC"); + if ($query->rows) { + foreach ($query->rows as $category_path) { + // Delete the path below the current one + $this->db->query("DELETE FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$category_path['service_category_id'] . "' AND level < '" . (int)$category_path['level'] . "'"); + $path = array(); + // Get the nodes new parents + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$data['parent_id'] . "' ORDER BY level ASC"); + foreach ($query->rows as $result) { + $path[] = $result['path_id']; + } + // Get whats left of the nodes current path + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$category_path['service_category_id'] . "' ORDER BY level ASC"); + foreach ($query->rows as $result) { + $path[] = $result['path_id']; + } + // Combine the paths with a new level + $level = 0; + foreach ($path as $path_id) { + $this->db->query("REPLACE INTO `" . DB_PREFIX . "service_category_path` SET service_category_id = '" . (int)$category_path['service_category_id'] . "', `path_id` = '" . (int)$path_id . "', level = '" . (int)$level . "'"); + $level++; + } + } + } else { + // Delete the path below the current one + $this->db->query("DELETE FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$service_category_id . "'"); + // Fix for records with no paths + $level = 0; + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$data['parent_id'] . "' ORDER BY level ASC"); + foreach ($query->rows as $result) { + $this->db->query("INSERT INTO `" . DB_PREFIX . "service_category_path` SET service_category_id = '" . (int)$service_category_id . "', `path_id` = '" . (int)$result['path_id'] . "', level = '" . (int)$level . "'"); + $level++; + } + $this->db->query("REPLACE INTO `" . DB_PREFIX . "service_category_path` SET service_category_id = '" . (int)$service_category_id . "', `path_id` = '" . (int)$service_category_id . "', level = '" . (int)$level . "'"); + } + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_to_store WHERE service_category_id = '" . (int)$service_category_id . "'"); + if (isset($data['category_store'])) { + foreach ($data['category_store'] as $store_id) { + $this->db->query("INSERT INTO " . DB_PREFIX . "service_category_to_store SET service_category_id = '" . (int)$service_category_id . "', store_id = '" . (int)$store_id . "'"); + } + } + + // SEO URL + $this->db->query("DELETE FROM `" . DB_PREFIX . "seo_url` WHERE query = 'service_category_id=" . (int)$service_category_id . "'"); + if (isset($data['category_seo_url'])) { + foreach ($data['category_seo_url'] as $store_id => $language) { + foreach ($language as $language_id => $keyword) { + if (!empty($keyword)) { + $this->db->query("INSERT INTO " . DB_PREFIX . "seo_url SET store_id = '" . (int)$store_id . "', language_id = '" . (int)$language_id . "', query = 'service_category_id=" . (int)$service_category_id . "', keyword = '" . $this->db->escape(trim($keyword)) . "'"); + } + } + } + } + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_to_layout WHERE service_category_id = '" . (int)$service_category_id . "'"); + if (isset($data['category_layout'])) { + foreach ($data['category_layout'] as $store_id => $layout_id) { + $this->db->query("INSERT INTO " . DB_PREFIX . "service_category_to_layout SET service_category_id = '" . (int)$service_category_id . "', store_id = '" . (int)$store_id . "', layout_id = '" . (int)$layout_id . "'"); + } + } + $this->cache->delete('service_category'); + + if($this->config->get('config_seo_pro')){ + $this->cache->delete('seopro'); + } + } + + public function editCategoryStatus($service_category_id, $status) { + $this->db->query("UPDATE " . DB_PREFIX . "service_category SET status = '" . (int)$status . "', date_modified = NOW() WHERE service_category_id = '" . (int)$service_category_id . "'"); + + $this->cache->delete('service_category'); + } + public function deleteCategory($service_category_id) { + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_path WHERE service_category_id = '" . (int)$service_category_id . "'"); + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "service_category_path WHERE path_id = '" . (int)$service_category_id . "'"); + foreach ($query->rows as $result) { + $this->deleteCategory($result['service_category_id']); + } + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category WHERE service_category_id = '" . (int)$service_category_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_description WHERE service_category_id = '" . (int)$service_category_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_to_store WHERE service_category_id = '" . (int)$service_category_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_category_to_layout WHERE service_category_id = '" . (int)$service_category_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_category WHERE service_category_id = '" . (int)$service_category_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "seo_url WHERE query = 'service_category_id=" . (int)$service_category_id . "'"); + $this->cache->delete('service_category'); + + if($this->config->get('config_seo_pro')){ + $this->cache->delete('seopro'); + } + } + public function repairCategories($parent_id = 0) { + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "service_category WHERE parent_id = '" . (int)$parent_id . "'"); + foreach ($query->rows as $category) { + // Delete the path below the current one + $this->db->query("DELETE FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$category['service_category_id'] . "'"); + // Fix for records with no paths + $level = 0; + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "service_category_path` WHERE service_category_id = '" . (int)$parent_id . "' ORDER BY level ASC"); + foreach ($query->rows as $result) { + $this->db->query("INSERT INTO `" . DB_PREFIX . "service_category_path` SET service_category_id = '" . (int)$category['service_category_id'] . "', `path_id` = '" . (int)$result['path_id'] . "', level = '" . (int)$level . "'"); + $level++; + } + $this->db->query("REPLACE INTO `" . DB_PREFIX . "service_category_path` SET service_category_id = '" . (int)$category['service_category_id'] . "', `path_id` = '" . (int)$category['service_category_id'] . "', level = '" . (int)$level . "'"); + $this->repairCategories($category['service_category_id']); + } + } + public function getCategory($service_category_id) { + $query = $this->db->query("SELECT DISTINCT *, (SELECT GROUP_CONCAT(cd1.name ORDER BY level SEPARATOR ' > ') FROM " . DB_PREFIX . "service_category_path cp LEFT JOIN " . DB_PREFIX . "service_category_description cd1 ON (cp.path_id = cd1.service_category_id AND cp.service_category_id != cp.path_id) WHERE cp.service_category_id = c.service_category_id AND cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' GROUP BY cp.service_category_id) AS path FROM " . DB_PREFIX . "service_category c LEFT JOIN " . DB_PREFIX . "service_category_description cd2 ON (c.service_category_id = cd2.service_category_id) WHERE c.service_category_id = '" . (int)$service_category_id . "' AND cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'"); + return $query->row; + } + public function getCategories($data = array()) { + $sql = "SELECT cp.service_category_id AS service_category_id, GROUP_CONCAT(cd1.name ORDER BY cp.level SEPARATOR ' > ') AS name, c1.parent_id, c1.sort_order, c1.noindex FROM " . DB_PREFIX . "service_category_path cp LEFT JOIN " . DB_PREFIX . "service_category c1 ON (cp.service_category_id = c1.service_category_id) LEFT JOIN " . DB_PREFIX . "service_category c2 ON (cp.path_id = c2.service_category_id) LEFT JOIN " . DB_PREFIX . "service_category_description cd1 ON (cp.path_id = cd1.service_category_id) LEFT JOIN " . DB_PREFIX . "service_category_description cd2 ON (cp.service_category_id = cd2.service_category_id) WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' AND cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'"; + if (!empty($data['filter_name'])) { + $sql .= " AND cd2.name LIKE '" . $this->db->escape($data['filter_name']) . "%'"; + } + $sql .= " GROUP BY cp.service_category_id"; + $sort_data = array( + 'name', + 'sort_order', + 'noindex' + ); + if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { + $sql .= " ORDER BY " . $data['sort']; + } else { + $sql .= " ORDER BY sort_order"; + } + if (isset($data['order']) && ($data['order'] == 'DESC')) { + $sql .= " DESC"; + } else { + $sql .= " ASC"; + } + if (isset($data['start']) || isset($data['limit'])) { + if ($data['start'] < 0) { + $data['start'] = 0; + } + if ($data['limit'] < 1) { + $data['limit'] = 20; + } + $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit']; + } + $query = $this->db->query($sql); + return $query->rows; + } + public function getCategoryDescriptions($service_category_id) { + $category_description_data = array(); + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "service_category_description WHERE service_category_id = '" . (int)$service_category_id . "'"); + foreach ($query->rows as $result) { + $category_description_data[$result['language_id']] = array( + 'name' => $result['name'], + 'meta_title' => $result['meta_title'], + 'meta_h1' => $result['meta_h1'], + 'meta_description' => $result['meta_description'], + 'meta_keyword' => $result['meta_keyword'], + 'description' => $result['description'] + ); + } + return $category_description_data; + } + public function getCategoryStores($service_category_id) { + $category_store_data = array(); + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "service_category_to_store WHERE service_category_id = '" . (int)$service_category_id . "'"); + foreach ($query->rows as $result) { + $category_store_data[] = $result['store_id']; + } + return $category_store_data; + } + + public function getCategorySeoUrls($service_category_id) { + $category_seo_url_data = array(); + + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE query = 'service_category_id=" . (int)$service_category_id . "'"); + foreach ($query->rows as $result) { + $category_seo_url_data[$result['store_id']][$result['language_id']] = $result['keyword']; + } + return $category_seo_url_data; + } + public function getCategoryLayouts($service_category_id) { + $category_layout_data = array(); + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "service_category_to_layout WHERE service_category_id = '" . (int)$service_category_id . "'"); + foreach ($query->rows as $result) { + $category_layout_data[$result['store_id']] = $result['layout_id']; + } + return $category_layout_data; + } + public function getTotalCategories() { + $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "service_category"); + return $query->row['total']; + } + + public function getTotalCategoriesByLayoutId($layout_id) { + $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "service_category_to_layout WHERE layout_id = '" . (int)$layout_id . "'"); + return $query->row['total']; + } + + public function getTotalServicesByCategoryId($service_category_id) { + $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "service_to_category WHERE service_category_id = '" . (int)$service_category_id . "'"); + + return $query->row['total']; + } + + public function getCategoriesByParentId($parent_id = 0) { + $query = $this->db->query("SELECT *, (SELECT COUNT(parent_id) FROM " . DB_PREFIX . "service_category WHERE parent_id = c.service_category_id) AS children FROM " . DB_PREFIX . "service_category c LEFT JOIN " . DB_PREFIX . "service_category_description cd ON (c.service_category_id = cd.service_category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY c.sort_order, cd.name"); + return $query->rows; + } + + public function getAllCategories() { + $category_data = $this->cache->get('service_category.all.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id')); + if (!$category_data || !is_array($category_data)) { + + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "service_category c LEFT JOIN " . DB_PREFIX . "service_category_description cd ON (c.service_category_id = cd.service_category_id) LEFT JOIN " . DB_PREFIX . "service_category_to_store c2s ON (c.service_category_id = c2s.service_category_id) WHERE cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY c.parent_id, c.sort_order, cd.name"); + $category_data = array(); + + foreach ($query->rows as $row) { + $category_data[$row['parent_id']][$row['service_category_id']] = $row; + } + $this->cache->set('service_category.all.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'), $category_data); + } + + return $category_data; + } +} diff --git a/public/admin/model/service/service.php b/public/admin/model/service/service.php index 518ccad..70ebf92 100644 --- a/public/admin/model/service/service.php +++ b/public/admin/model/service/service.php @@ -13,6 +13,8 @@ class ModelServiceService extends Model { $this->db->query("INSERT INTO " . DB_PREFIX . "service_description SET service_id = '" . (int)$service_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_h1 = '" . $this->db->escape($value['meta_h1']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "'"); } + $this->db->query("INSERT INTO " . DB_PREFIX . "service_to_category SET service_id = '" . (int)$service_id . "', service_category_id = '" . (int)$data['service_category_id'] . "'"); + if (isset($data['service_store'])) { foreach ($data['service_store'] as $store_id) { $this->db->query("INSERT INTO " . DB_PREFIX . "service_to_store SET service_id = '" . (int)$service_id . "', store_id = '" . (int)$store_id . "'"); @@ -86,6 +88,9 @@ class ModelServiceService extends Model { $this->db->query("INSERT INTO " . DB_PREFIX . "service_description SET service_id = '" . (int)$service_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_h1 = '" . $this->db->escape($value['meta_h1']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "'"); } + $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_category WHERE service_id = '" . (int)$service_id . "'"); + $this->db->query("INSERT INTO " . DB_PREFIX . "service_to_category SET service_id = '" . (int)$service_id . "', service_category_id = '" . (int)$data['service_category_id'] . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_store WHERE service_id = '" . (int)$service_id . "'"); if (isset($data['service_store'])) { @@ -185,6 +190,7 @@ class ModelServiceService extends Model { $data['service_download'] = $this->getServiceDownloads($service_id); $data['service_layout'] = $this->getServiceLayouts($service_id); $data['service_store'] = $this->getServiceStores($service_id); + $data['service_category_id'] = $this->getServiceCategoryId($service_id); $this->addService($data); } @@ -201,6 +207,7 @@ class ModelServiceService extends Model { $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_download WHERE service_id = '" . (int)$service_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_layout WHERE service_id = '" . (int)$service_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_store WHERE service_id = '" . (int)$service_id . "'"); + $this->db->query("DELETE FROM " . DB_PREFIX . "service_to_category WHERE service_id = '" . (int)$service_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "seo_url WHERE query = 'service_id=" . (int)$service_id . "'"); $this->cache->delete('service'); @@ -315,6 +322,12 @@ class ModelServiceService extends Model { return $service_store_data; } + public function getServiceCategoryId($service_id) { + $query = $this->db->query("SELECT service_category_id FROM " . DB_PREFIX . "service_to_category WHERE service_id = '" . (int)$service_id . "' LIMIT 1"); + + return $query->num_rows ? (int)$query->row['service_category_id'] : 0; + } + public function getServiceSeoUrls($service_id) { $service_seo_url_data = array(); diff --git a/public/admin/view/template/blog/article_form.twig b/public/admin/view/template/blog/article_form.twig index b560c4e..d607e34 100644 --- a/public/admin/view/template/blog/article_form.twig +++ b/public/admin/view/template/blog/article_form.twig @@ -83,7 +83,7 @@ {% endfor %}
{{ article['description'] }}
- {% if configblog_review_status %} - {% if article.rating %} - - {% endif %} - {% endif %} -{{ text_empty }}
- - {% endif %} - {{ content_bottom }}{{ service.description }}
+{{ text_empty }}
+ {% endif %} + {{ pagination }} +{{ text_empty }}
- {% endif %} -