* @copyright 2007-2017 Amazzing * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ use PrestaShop\PrestaShop\Adapter\Image\ImageRetriever; use PrestaShop\PrestaShop\Adapter\Product\PriceFormatter; use PrestaShop\PrestaShop\Core\Product\ProductListingPresenter; use PrestaShop\PrestaShop\Adapter\Product\ProductColorsRetriever; class AmazzingBlogBlogModuleFrontController extends ModuleFrontControllerCore { public $breadcrumb_items = array(); public function init() { $this->display_column_left = true; $this->display_column_right = true; parent::init(); } /* * module: cmsproducts * date: 2019-03-28 19:14:34 * version: 1.5.5 */ public static function psversion($part = 1) { $version = _PS_VERSION_; $exp = explode('.', $version); if ($part == 1) { return $exp[1]; } if ($part == 2) { return $exp[2]; } if ($part == 3) { return $exp[3]; } } public function initContent() { $this->context = Context::getContext(); $this->id_lang = $this->context->language->id; $this->id_shop = $this->context->shop->id; if (Tools::isSubmit('ajax') && Tools::isSubmit('action')) { $action_method = 'ajax'.Tools::getValue('action'); $this->$action_method(); } $this->defineCurrentPage(); parent::initContent(); } /* * module: cmsproducts * date: 2019-03-28 19:14:34 * version: 1.5.5 */ public function returnProduct($id_product) { $x = (array)new Product($id_product, true, $this->context->language->id); $productss[$id_product] = $x; $productss[$id_product]['id_product'] = $id_product; $products = Product::getProductsProperties($this->context->language->id, $productss); $assembler = new ProductAssembler($this->context); $presenterFactory = new ProductPresenterFactory($this->context); $presentationSettings = $presenterFactory->getPresentationSettings(); $presenter = new ProductListingPresenter( new ImageRetriever( $this->context->link ), $this->context->link, new PriceFormatter(), new ProductColorsRetriever(), $this->context->getTranslator() ); $products_for_template = []; foreach ($products as $rawProduct) { $products_for_template[] = $presenter->present( $presentationSettings, $assembler->assembleProduct($rawProduct), $this->context->language ); } $this->context->smarty->assign('products', $products_for_template); $this->context->smarty->assign('feedtype', "cmsSingleProductFeed"); return $this->context->smarty->fetch('module:cmsproducts/products.tpl'); } /* * module: cmsproducts * date: 2019-03-28 19:14:34 * version: 1.5.5 */ public function returnProducts($id_product) { $explode_products = explode(",", $id_product); foreach ($explode_products AS $idp) { $explode[] = $idp; foreach ($explode as $tproduct) { if ($tproduct != '') { $x = (array)new Product($tproduct, true, $this->context->language->id); $productss[$tproduct] = $x; $productss[$tproduct]['id_product'] = $tproduct; } } } $products = Product::getProductsProperties($this->context->language->id, $productss); $assembler = new ProductAssembler($this->context); $presenterFactory = new ProductPresenterFactory($this->context); $presentationSettings = $presenterFactory->getPresentationSettings(); $presenter = new ProductListingPresenter( new ImageRetriever( $this->context->link ), $this->context->link, new PriceFormatter(), new ProductColorsRetriever(), $this->context->getTranslator() ); $products_for_template = []; foreach ($products as $rawProduct) { $products_for_template[] = $presenter->present( $presentationSettings, $assembler->assembleProduct($rawProduct), $this->context->language ); } $this->context->smarty->assign('products', ($this->psversion()==7 ? $products_for_template:$products)); $this->context->smarty->assign('feedtype', "cmsProductsFeed"); return $this->context->smarty->fetch('module:cmsproducts/products.tpl'); } /* * module: cmsproducts * date: 2019-03-28 19:14:34 * version: 1.5.5 */ public function returnContent($contents) { preg_match_all('/\{products\:[(0-9\,)]+\}/i', $contents, $matches); foreach ($matches[0] as $index => $match) { $explode = explode(":", $match); $contents = str_replace($match, $this->returnProducts(str_replace("}", "", $explode[1])), $contents); } preg_match_all('/\{product\:[(0-9\,)]+\}/i', $contents, $matches); foreach ($matches[0] as $index => $match) { $explode = explode(":", $match); $contents = str_replace($match, $this->returnProduct(str_replace("}", "", $explode[1])), $contents); } preg_match_all('/\{hpp\:[(0-9)]+\}/i', $contents, $matches); foreach ($matches[0] as $index => $match) { $explode = explode(":", $match); $contents = str_replace($match, $this->returnProductsHpp(str_replace("}", "", $explode[1])), $contents); } preg_match_all('/\{rpp\:[(0-9)]+\}/i', $contents, $matches); foreach ($matches[0] as $index => $match) { $explode = explode(":", $match); $contents = str_replace($match, $this->returnProductsRpp(str_replace("}", "", $explode[1])), $contents); } preg_match_all('/\{lastreviews\}/i', $contents, $matches); foreach ($matches[0] as $index => $match) { $contents = str_replace($match, $this->returnlastReviews(str_replace("}", "")), $contents); } return $contents; preg_match_all('/\{diff\:[(0-9)]+\}/i', $contents, $matches); foreach ($matches[0] as $index => $match) { $explode = explode(":", $match); $contents = str_replace($match, $this->returnProductsDiffTool(str_replace("}", "", $explode[1])), $contents); } } public function defineCurrentPage() { $id_post = Tools::getValue('id_post'); $id_category = Tools::getValue('id_category'); $page = Tools::getValue('page', 1); if ($this->module->friendly_url) { $link_rewrite = $request_uri = ''; if (isset($_SERVER['REQUEST_URI'])) { $request_uri = $_SERVER['REQUEST_URI']; } elseif (isset($_SERVER['HTTP_X_REWRITE_URL'])) { $request_uri = $_SERVER['HTTP_X_REWRITE_URL']; } $request_uri = parse_url($request_uri); $request_params = !empty($request_uri['query']) ? $request_uri['query'] : ''; $request_uri = rawurldecode($request_uri['path']); $exploded_request = explode('/'.$this->module->slug.'/', $request_uri); if (count($exploded_request) > 1) { $link_rewrite = rtrim(array_pop($exploded_request), '/'); $link_rewrite = explode('/', $link_rewrite); $possible_page = array_pop($link_rewrite); if ((int)$possible_page) { $page = $possible_page; } else { $link_rewrite[] = $possible_page; } $link_rewrite = implode('/', $link_rewrite); } if (!$link_rewrite) { // redirect to canonical url if ($id_category) { if ($link_rewrite = $this->module->getLinkRewriteById('category', $id_category)) { Tools::redirect($this->module->getCategoryLink($id_category, $link_rewrite, $page)); } else { $this->displayCategory($id_category, $page); } } elseif ($id_post) { if ($link_rewrite = $this->module->getLinkRewriteById('post', $id_post)) { Tools::redirect($this->module->getPostLink($id_post, $link_rewrite)); } else { $this->displayPost($id_post); } } elseif (strpos($request_params, 'module='.$this->module->name) !== false || Tools::getValue('page')) { Tools::redirect($this->module->getCategoryLink($this->module->root_id, '', $page)); } else { $this->displayCategory($this->module->root_id, $page); } } elseif (Tools::substr($link_rewrite, 0, 5) === 'tags/') { $tag_urls = explode('+', str_replace('tags/', '', $link_rewrite)); $this->displayCategory($this->module->root_id, $page, array('tag_urls' => $tag_urls)); } elseif ($id_category = $this->module->getIdByLinkRewrite('category', $link_rewrite)) { $this->displayCategory($id_category, $page); } elseif ($id_post = $this->module->getIdByLinkRewrite('post', $link_rewrite)) { $this->displayPost($id_post); } else { Tools::redirect('page-not-found'); } } elseif ($id_post) { $this->displayPost($id_post); } elseif ($tag_urls = Tools::getValue('tags')) { $tag_urls = explode(' ', $tag_urls); $this->displayCategory($this->module->root_id, $page, array('tag_urls' => $tag_urls)); } else { $id_category = $id_category ? $id_category : $this->module->root_id; $this->displayCategory($id_category, $page); } } public function getBreadcrumbLinks() { $breadcrumb = parent::getBreadcrumbLinks(); foreach ($this->breadcrumb_items as $item) { $breadcrumb['links'][] = $item; } return $breadcrumb; } public function getChildCategories($id_category) { $children = $this->module->db->executeS(' SELECT id_category FROM '._DB_PREFIX_.'a_blog_category WHERE id_parent = '.(int)$id_category.' '); $cat_ids = array(); foreach ($children as $child) { $cat_ids[$child['id_category']] = $child['id_category']; if ($sub_children = $this->getChildCategories($child['id_category'])) { foreach ($sub_children as $cat_id) { $cat_ids[$cat_id] = $cat_id; } } } return array_values($cat_ids); } public function getCategoryData($id_category, $id_lang, $id_shop) { $category = $this->module->db->getRow(' SELECT * FROM '._DB_PREFIX_.'a_blog_category c LEFT JOIN '._DB_PREFIX_.'a_blog_category_lang cl ON c.id_category = cl.id_category AND cl.id_lang = '.(int)$id_lang.' WHERE c.id_category = '.(int)$id_category.' AND cl.id_shop = '.(int)$id_shop.' '); return $category; } public function displayCategory($id_category, $page = 1, $additional_params = array()) { $category = $this->getCategoryData($id_category, $this->id_lang, $this->id_shop); $category_settings = $this->module->getSettings('category'); $post_list_settings = $this->module->getSettings('postlist'); $additional_filters = array('active' => 1); if (!empty($additional_params['tag_urls'])) { $tag_ids = $tag_names = array(); foreach ($additional_params['tag_urls'] as $tag_url) { $tag_data = $this->module->db->getRow(' SELECT id_tag, tag_name FROM '._DB_PREFIX_.'a_blog_tag WHERE tag_url = \''.pSQL($tag_url).'\' '); if ($tag_data) { $tag_ids[$tag_data['id_tag']] = $tag_data['id_tag']; } $tag_names[] = $tag_data ? $tag_data['tag_name'] : $tag_url; } $additional_filters['id_tag'] = !empty($tag_ids) ? $tag_ids : array(0); $category['title'] = $this->module->l('Search by tags').': '. implode(', ', $tag_names); $category_settings['show_subcategories'] = false; $category_settings['ignore_category'] = true; $first_page_url = $this->module->getTagLink($additional_params['tag_urls']); } else { $this->id_category = $id_category; $first_page_url = $this->module->getCategoryLink($id_category, $category['link_rewrite']); } if (!empty($category_settings['show_subcategories'])) { $subcategories = $this->module->db->executeS(' SELECT * FROM '._DB_PREFIX_.'a_blog_category c LEFT JOIN '._DB_PREFIX_.'a_blog_category_lang cl ON c.id_category = cl.id_category AND cl.id_lang = '.(int)$this->id_lang.' WHERE c.id_parent = '.(int)$id_category.' AND cl.id_shop = '.(int)$this->context->shop->id.' '); foreach ($subcategories as $i => &$s) { $cat_ids = array($s['id_category']); if (!empty($category_settings['include_all'])) { $cat_ids = array_merge($cat_ids, $this->getChildCategories($s['id_category'])); } $subcat_additional_filters = array('id_category' => $cat_ids, 'active' => 1); $posts_num = $this->module->getTotal('post', $subcat_additional_filters); if (!$posts_num && $category_settings['show_subcategories'] == 1) { unset($subcategories[$i]); } $s['posts_num'] = $posts_num; $s['url'] = $this->module->getCategoryLink($s['id_category'], $s['link_rewrite']); } } else { $subcategories = array(); } if (empty($category_settings['ignore_category'])) { $cat_ids = array($id_category); if (!empty($category_settings['include_all'])) { $cat_ids = array_merge($cat_ids, $this->getChildCategories($id_category)); } $additional_filters['id_category'] = $cat_ids; $parent_categories = $this->getCategoryParents($id_category, array(), true); } else { $parent_categories = $this->getCategoryParents($id_category); } $this->breadcrumb_items[] = array('title' => $category['title'], 'url' => ''); $pagination_settings = $this->module->getPaginationSettings('post', $additional_filters, $page); if (!Tools::getValue('npp') && empty($this->context->cookie->ab_user_npp) && !empty($post_list_settings['posts_per_page'])) { $pagination_settings['npp'] = $post_list_settings['posts_per_page']; } $posts = $this->module->getPostListInfos( $pagination_settings, $post_list_settings['order_by'], 'DESC', $additional_filters ); if (!$posts && $page > 1) { Tools::redirect($first_page_url); } else { $this->module->prepareHeaderData('category', $id_category); Media::addJsDef(array('ab_first_page_url' => $first_page_url)); $meta_title = !empty($category['meta_title']) ? $category['meta_title'] : $category['title']; $this->context->smarty->assign(array( // ab_prefix is required to avoid possible var name interference 'ab_category' => $category, 'ab_category_settings' => $category_settings, 'ab_post_list_settings' => $post_list_settings, 'ab_additional_filters' => $additional_filters, 'ab_cat_parents' => $parent_categories, 'ab_subcategories' => $subcategories, 'ab_posts' => $posts, 'ab_pagination_settings' => $pagination_settings, 'ab_first_page_url' => $first_page_url, 'blog' => $this->module, 'hide_left_column' => !$category_settings['display_column_left'], 'hide_right_column' => !$category_settings['display_column_right'], 'meta_title' => Configuration::get('PS_SHOP_NAME').' | '.$meta_title, 'meta_description' => $category['meta_description'], 'meta_keywords' => $category['meta_keywords'], )); $this->setCurrentTemplate('category.tpl', $category_settings); } } public function setCurrentTemplate($tpl_name, $settings) { if ($this->module->is_17) { $this->context->smarty->assign(array( 'html' => $this->displayTemplate($tpl_name), )); $page = 'module-'.$this->module->name.'-blog'; $this->context->controller->php_self = $page; if (!empty($settings['display_column_left']) && !empty($settings['display_column_right'])) { $layout = 'both-columns'; } elseif (!empty($settings['display_column_left'])) { $layout = 'left-column'; } elseif (!empty($settings['display_column_right'])) { $layout = 'right-column'; } else { $layout = 'full-width'; } $this->context->shop->theme->setPageLayouts(array($page => 'layout-'.$layout)); $this->setTemplate('module:amazzingblog/views/templates/front/content-17.tpl'); return $this->context->smarty->fetch('module:cmsproducts/products.tpl'); } else { $this->setTemplate($tpl_name); } } public function displayTemplate($tpl_name) { $local_path = _PS_MODULE_DIR_.$this->module->name.'/'.$this->module->name.'.php'; return $this->module->display($local_path, 'views/templates/front/'.$tpl_name); } public function getCategoryParents($id_category, $parents = array(), $current = false) { $parent = $this->module->db->getRow(' SELECT c.id_category, c.id_parent, cl.title, cl.link_rewrite FROM '._DB_PREFIX_.'a_blog_category c LEFT JOIN '._DB_PREFIX_.'a_blog_category_lang cl ON c.id_category = cl.id_category WHERE c.id_category ='.(int)$id_category.' AND cl.id_lang = '.$this->context->language->id.' '); if ($parent) { if (!$current) { $parents[] = $parent; } return $this->getCategoryParents($parent['id_parent'], $parents); } else { $parents = array_reverse($parents); if ($this->module->is_17) { foreach ($parents as $p) { $this->breadcrumb_items[] = array( 'title' => $p['title'], 'url' => $this->module->getCategoryLink($p['id_category'], $p['link_rewrite']), ); } } return $parents; } } public function displayPost($id_post) { $query = new DbQuery(); $query->select('p.*, pl.*, s.views, s.comments, s.likes'); $query->from('a_blog_post', 'p'); $lang_join_on = 'pl.id_post = p.id_post AND pl.id_lang = '.(int)$this->id_lang. ' AND pl.id_shop = '.(int)$this->id_shop; $query->innerJoin('a_blog_post_lang', 'pl', $lang_join_on); $query->leftJoin('a_blog_post_stats', 's', 's.id_post = p.id_post'); $query->where('p.id_post = '.(int)$id_post); $query->where('p.active = 1'); $this->module->onlyPublishedAssociation($query); $post = $this->module->db->getRow($query); $settings = $this->module->getSettings('post'); $comment_settings = $this->module->getSettings('comment'); $comments = $this->module->db->executeS(' SELECT * FROM '._DB_PREFIX_.'a_blog_comment c LEFT JOIN '._DB_PREFIX_.'a_blog_user bu ON bu.id_user = c.id_user WHERE c.id_post = '.(int)$id_post.' AND id_shop = '.(int)$this->context->shop->id.' AND c.active = 1 '.(empty($comment_settings['instant_publish']) ? ' AND approved_by <> 0' : '').' ORDER BY date_add ASC '); $id_category_default = $this->module->root_id; if ($post) { $this->id_post = $id_post; $this->module->addPostStats($id_post, 'views'); $post['views'] += 1; $this->module->prepareHeaderData('post', $id_post); $img_type = $settings['main_img_type']; $main_path = 'posts/'.$post['id_post'].'/'.$img_type.'/'.$post['main_img']; if (is_file($this->module->img_dir_local.$main_path)) { $post['main_img'] = $this->module->img_dir.$main_path; $this->og_image = Tools::getHttpHost(true).$post['main_img']; } else { $post['main_img'] = ''; } $id_category_default = $post['id_category_default']; if (!empty($settings['show_tags'])) { $post['tags'] = $this->module->getPostTags($id_post, $this->id_lang, false); } $category_parents = $this->getCategoryParents($id_category_default); // some breadcrumb items are defined in getCategoryParents() $this->breadcrumb_items[] = array('title' => $post['title'], 'url' => ''); } $meta_title = !empty($post['meta_title']) ? $post['meta_title'] : $post['title']; $this->context->smarty->assign(array( 'ab_post' => $post, 'ab_post_settings' => $settings, 'ab_cat_parents' => $category_parents, 'ab_user_data' => $this->module->getUserData($this->context->customer->id_guest), 'ab_comments' => $comments, 'avatars_dir' => $this->module->img_dir.'avatars/', 'blog' => $this->module, 'hide_left_column' => !$settings['display_column_left'], 'hide_right_column' => !$settings['display_column_right'], 'meta_title' => Configuration::get('PS_SHOP_NAME').' | '.$meta_title, 'meta_description' => $post['meta_description'], 'meta_keywords' => $post['meta_keywords'], )); $this->setCurrentTemplate('post.tpl', $settings); return $this->context->smarty->fetch('module:cmsproducts/products.tpl'); } public function ajaxSubmitComment() { $this->module->ajaxSubmitComment(); } public function ajaxSendNotification() { $this->module->ajaxSendNotification(); } public function ajaxLoadPosts() { $post_list_settings = $this->module->getSettings('postlist'); $additional_filters = $this->module->unserialize(Tools::getValue('additional_filters')); foreach ($additional_filters as &$f) { $f = explode(',', $f); } $additional_filters['active'] = 1; $pagination_settings = $this->module->getPaginationSettings('post', $additional_filters); $posts = $this->module->getPostListInfos( $pagination_settings, $post_list_settings['order_by'], 'DESC', $additional_filters ); $this->context->smarty->assign(array( 'settings' => $post_list_settings, 'ab_pagination_settings' => $pagination_settings, 'ab_first_page_url' => Tools::getValue('ab_first_page_url'), 'posts' => $posts, 'blog' => $this->module, )); $ret = array( 'html' => utf8_encode($this->displayTemplate('post-list.tpl')), ); exit(Tools::jsonEncode($ret)); } }