* @copyright 2007-2015 Leotheme * @license http://leotheme.com - prestashop template provider */ include_once(_PS_MODULE_DIR_ . 'leoblog/loader.php'); 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 LeoblogblogModuleFrontController extends ModuleFrontController { public $php_self; protected $template_path = ''; // public $rewrite; public function __construct() { parent::__construct(); $this->context = Context::getContext(); $this->template_path = _PS_MODULE_DIR_ . 'leoblog/views/templates/front/'; // $this->rewrite = 'aaaa'; } public function captcha() { include_once(_PS_MODULE_DIR_ . 'leoblog/classes/captcha.php'); $captcha = new LeoCaptcha(); $this->context->cookie->leocaptch = $captcha->getCode(); $captcha->showImage(); } /** * @param object &$object Object * @param string $table Object table * @ DONE */ protected function copyFromPost(&$object, $table, $post = array()) { /* Classical fields */ foreach ($post as $key => $value) { if (key_exists($key, $object) && $key != 'id_' . $table) { /* Do not take care of password field if empty */ if ($key == 'passwd' && Tools::getValue('id_' . $table) && empty($value)) { continue; } if ($key == 'passwd' && !empty($value)) { /* Automatically encrypt password in MD5 */ $value = Tools::encrypt($value); } $object->{$key} = $value; } } /* Multilingual fields */ $rules = call_user_func(array(get_class($object), 'getValidationRules'), get_class($object)); if (count($rules['validateLang'])) { $languages = Language::getLanguages(false); foreach ($languages as $language) { foreach (array_keys($rules['validateLang']) as $field) { $field_name = $field . '_' . (int)($language['id_lang']); $value = Tools::getValue($field_name); if (isset($value)) { # validate module $object->{$field}[(int)($language['id_lang'])] = $value; } } } } } /** * Save user comment */ protected function comment() { $post = array(); $post['user'] = Tools::getValue('user'); $post['email'] = Tools::getValue('email'); $post['comment'] = Tools::getValue('comment'); $post['captcha'] = Tools::getValue('captcha'); $post['id_leoblog_blog'] = Tools::getValue('id_leoblog_blog'); $post['submitcomment'] = Tools::getValue('submitcomment'); if (!empty($post)) { $comment = new LeoBlogComment(); $captcha = Tools::getValue('captcha'); $this->copyFromPost($comment, 'comment', $post); $error = new stdClass(); $error->error = true; if (isset($this->context->cookie->leocaptch) && $captcha && $captcha == $this->context->cookie->leocaptch) { if ($comment->validateFields(false) && $comment->validateFieldsLang(false)) { $comment->save(); $error->message = $this->l('Thanks for your comment, it will be published soon!!!', 'blog'); $error->error = false; } else { # validate module $error->message = $this->l('An error occurred while sending the comment. Please recorrect data in fields!!!', 'blog'); } } else { # validate module $error->message = $this->l('An error with captcha code, please try to recorrect!!!', 'blog'); } die(Tools::jsonEncode($error)); } } public function returnProduct($id_product) { $x = (array)new Product($id_product, true, $this->context->language->id); if (is_int($x['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'); } 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); if (is_int($x['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'); } public static function psversion($part = 1) { $version = _PS_VERSION_; $exp = explode('.', $version); if ($part == 0) { return $exp[0]; } if ($part == 1) { if ($exp[0] >= 8) { return 7; } return $exp[1]; } if ($part == 2) { return $exp[2]; } if ($part == 3) { return $exp[3]; } } /** * @see FrontController::initContent() */ public function initContent() { $this->php_self = 'blog'; // $this->php_self = 'module-leoblog-blog'; if (Tools::getValue('captchaimage')) { $this->captcha(); exit(); } $config = LeoBlogConfig::getInstance(); /* Load Css and JS File */ LeoBlogHelper::loadMedia($this->context, $this); parent::initContent(); if (Tools::isSubmit('submitcomment')) { # validate module $this->comment(); } $helper = LeoBlogHelper::getInstance(); if ($config->get('url_use_id', 1)) { // URL HAVE ID $blog = new LeoBlogBlog(Tools::getValue('id'), $this->context->language->id); } else { // REMOVE ID FROM URL $url_rewrite = explode('/', $_SERVER['REQUEST_URI']); $url_last_item = count($url_rewrite) - 1; $url_rewrite = rtrim($url_rewrite[$url_last_item], 'html'); $url_rewrite = rtrim($url_rewrite, '\.'); // result : product.html -> product. $blog = LeoBlogBlog::findByRewrite(array('link_rewrite' => $url_rewrite)); // echo '
';
      // print_r($url_rewrite);die();
    }

    if (!$blog->id_leoblog_blog)
    {
      $full_path = '' . htmlentities($config->get('blog_link_title_' . $this->context->language->id, 'Blog'), ENT_NOQUOTES, 'UTF-8') . '';
      $vars = array(
        'error' => true,
        'path' => $full_path
      );
      $this->context->smarty->assign($vars);

      return $this->setTemplate('module:leoblog/views/templates/front/' . $config->get('template', 'default') . '/blog.tpl');
    }

    $category = new leoblogcat($blog->id_leoblogcat, $this->context->language->id);


    $image_w = $config->get('item_img_width', 690);
    $image_h = $config->get('item_img_height', 300);

    $template = !empty($category->template) ? $category->template : 'default'; // have to have a value ( not empty )
    $this->template_path .= $template . '/';
    $module_tpl = $this->template_path;

    $url = _PS_BASE_URL_;
    if (Tools::usingSecureMode())
    {
      # validate module
      $url = _PS_BASE_URL_SSL_;
    }

    $id_shop = $this->context->shop->id;
    $blog->preview_url = '';
    if ($blog->image)
    {
      $blog->image_url = $url . _THEME_DIR_ . 'assets/img/modules/leoblog/' . $id_shop . '/b/' . $blog->image;
      if (!file_exists(_LEOBLOG_CACHE_IMG_DIR_ . 'b/' . $id_shop . '/' . $blog->id . '/lg-' . $blog->image))
      {
        @mkdir(_LEOBLOG_CACHE_IMG_DIR_ . 'b/' . $id_shop, 0777);
        @mkdir(_LEOBLOG_CACHE_IMG_DIR_ . 'b/' . $id_shop . '/' . $blog->id, 0777);

        if (ImageManager::resize(_PS_THEME_DIR_ . 'assets/img/modules/leoblog/' . $id_shop . '/b/' . $blog->image, _LEOBLOG_CACHE_IMG_DIR_ . 'b/' . $id_shop . '/' . $blog->id . '/lg-' . $blog->image, $image_w, $image_h))
        {
          # validate module
          $blog->preview_url = $url . _LEOBLOG_CACHE_IMG_URI_ . 'b/' . $id_shop . '/' . $blog->id . '/lg-' . $blog->image;
        }
      }

      $blog->preview_url = $url . _LEOBLOG_CACHE_IMG_URI_ . 'b/' . $id_shop . '/' . $blog->id . '/lg-' . $blog->image;
    }

    $captcha_image = $helper->getBlogLink(get_object_vars($blog), array('captchaimage' => 1));
    $blog_link = $helper->getBlogLink(get_object_vars($blog));
    // print_r($blog_link);
    $params = array(
      'rewrite' => $category->link_rewrite,
      'id' => $category->id_leoblogcat
    );

    $blog->category_link = $helper->getBlogCatLink($params);
    $blog->category_title = $category->title;

    //DONGND:: author name
    if ($blog->author_name != '')
    {
      $blog->author = $blog->author_name;
      $blog->author_link = $helper->getBlogAuthorLink($blog->author_name);
    }
    else
    {
      $employee = new Employee($blog->id_employee);
      $blog->author = $employee->firstname . ' ' . $employee->lastname;
      $blog->author_link = $helper->getBlogAuthorLink($employee->id);
    }

    $tags = array();
    if ($blog->tags && $tmp = explode(',', $blog->tags))
    {
      foreach ($tmp as $tag)
      {
        $tags[] = array(
          'tag' => $tag,
          'link' => $helper->getBlogTagLink($tag)
        );
      }
    }

    $blog->hits = $blog->hits + 1;
    //$blog->save();
    $blog->updateField($blog->id, array('hits' => $blog->hits));

    /* breadscrumb */
    $params = array(
      'rewrite' => $category->link_rewrite,
      'id' => $category->id_leoblogcat
    );

    $category_link = $helper->getBlogCatLink($params);
    $full_path = '' . htmlentities($config->get('blog_link_title_' . $this->context->language->id, 'Blog'), ENT_NOQUOTES, 'UTF-8')
      . '' . Configuration::get('PS_NAVIGATION_PIPE') . '';
    $full_path .= '' . htmlentities($category->title, ENT_NOQUOTES, 'UTF-8') . '' . Configuration::get('PS_NAVIGATION_PIPE') . '' . $blog->meta_title;
    $limit = 5;

    $samecats = LeoBlogBlog::getListBlogs($category->id_leoblogcat, $this->context->language->id, 0, $limit, 'date_add', 'DESC', array('type' => 'samecat', 'id_leoblog_blog' => $blog->id_leoblog_blog), true);
    foreach ($samecats as $key => $sblog)
    {
      $sblog['link'] = $helper->getBlogLink($sblog);
      $samecats[$key] = $sblog;
    }

    $tagrelated = array();

    if ($blog->tags)
    {
      $tagrelated = LeoBlogBlog::getListBlogs($category->id_leoblogcat, $this->context->language->id, 0, $limit, 'id_leoblog_blog', 'DESC', array('type' => 'tag', 'tag' => $blog->tags), true);
      foreach ($tagrelated as $key => $tblog)
      {
        $tblog['link'] = $helper->getBlogLink($tblog);
        $tagrelated[$key] = $tblog;
      }
    }

    /* Comments */
    $evars = array();
    if ($config->get('item_comment_engine', 'local') == 'local')
    {
      $count_comment = 0;
      if ($config->get('comment_engine', 'local') == 'local')
      {
        # validate module
        $count_comment = LeoBlogComment::countComments($blog->id_leoblog_blog, true);
      }

      $blog_link = $helper->getBlogLink(get_object_vars($blog));
      $limit = (int)$config->get('item_limit_comments', 10);
      $n = $limit;
      $p = abs((int)(Tools::getValue('p', 1)));

      $comment = new LeoBlogComment();
      $comments = $comment->getList($blog->id_leoblog_blog, $this->context->language->id, $p, $limit);

      $nb_blogs = $count_comment;
      $range = 2; /* how many pages around page selected */
      if ($p > (($nb_blogs / $n) + 1))
      {
        Tools::redirect(preg_replace('/[&?]p=\d+/', '', $_SERVER['REQUEST_URI']));
      }
      $pages_nb = ceil($nb_blogs / (int)($n));
      $start = (int)($p - $range);
      if ($start < 1)
      {
        $start = 1;
      }
      $stop = (int)($p + $range);
      if ($stop > $pages_nb)
      {
        $stop = (int)($pages_nb);
      }

      $evars = array(
        'pages_nb' => $pages_nb,
        'nb_items' => $count_comment,
        'p' => (int)$p,
        'n' => (int)$n,
        'requestPage' => $blog_link,
        'requestNb' => $blog_link,
        'start' => $start,
        'comments' => $comments,
        'range' => $range,
        'blog_count_comment' => $count_comment,
        'stop' => $stop
      );
    }
    if ((bool)Module::isEnabled('smartshortcode'))
    {
      if (context::getcontext()->controller->controller_type == 'front')
      {
        $smartshortcode = Module::getInstanceByName('smartshortcode');
        $blog->content = $smartshortcode->parse($blog->content);
      }
    }

    $content = $blog->content;

    preg_match_all('/\{product\:[(0-9\,)]+\}/i', $content, $matches);
    foreach ($matches[0] as $index => $match) {
        $explode = explode(":", $match);
        $content = str_replace($match, $this->returnProduct(str_replace("}", "", $explode[1])), $content);
    }

    preg_match_all('/\{products\:[(0-9\,)]+\}/i', $content, $matches);
    foreach ($matches[0] as $index => $match) {
        $explode = explode(":", $match);
        $content = str_replace($match, $this->returnProducts(str_replace("}", "", $explode[1])), $content);
    }

    $blog->content = $content;

    // $page = parent::getTemplateVarPage();
    // echo '
';
    // print_r($page);die();
    //DONGND:: add meta
    // $this->getTemplateVarPage($blog);
    // $this->blog_obj = $blog;
    // echo '
';
    // print_r($this->blog_obj);die();
    // $page = parent::getTemplateVarPage();
    // $page['meta']['title'] = Tools::ucfirst($blog->meta_title).' - '.Configuration::get('PS_SHOP_NAME');
    // $page['meta']['keywords'] = $blog->meta_keywords;
    // $page['meta']['description'] = $blog->meta_description;

    $vars = array(
      'tags' => $tags,
      'meta_title' => Tools::ucfirst($blog->meta_title) . ' - ' . Configuration::get('PS_SHOP_NAME'),
      'meta_keywords' => $blog->meta_keywords,
      'meta_description' => $blog->meta_description,
      'blog' => $blog,
      'samecats' => $samecats,
      'tagrelated' => $tagrelated,
      'path' => $full_path,
      'config' => $config,
      'id_leoblog_blog' => $blog->id_leoblog_blog,
      'is_active' => $blog->active,
      'productrelated' => array(),
      'module_tpl' => $module_tpl,
      'captcha_image' => $captcha_image,
      'blog_link' => $blog_link,
      'id_shop' => (int)Context::getContext()->shop->id,
    );

    $vars = array_merge($vars, $evars);

    $this->context->smarty->assign($vars);

    // $this->setTemplate($template.'/blog.tpl');
    $this->setTemplate('module:leoblog/views/templates/front/' . $template . '/blog.tpl');
  }

  // DONGND:: add meta
  public function getTemplateVarPage()
  {
    $page = parent::getTemplateVarPage();
    $config = LeoBlogConfig::getInstance();
    if ($config->get('url_use_id', 1))
    {
      $blog = new LeoBlogBlog(Tools::getValue('id'), $this->context->language->id);
    }
    else
    {
      $url_rewrite = explode('/', $_SERVER['REQUEST_URI']);
      $url_last_item = count($url_rewrite) - 1;
      $url_rewrite = rtrim($url_rewrite[$url_last_item], '.html');
      $blog = LeoBlogBlog::findByRewrite(array('link_rewrite' => $url_rewrite));
    }
    $page['meta']['title'] = Tools::ucfirst($blog->meta_title) . ' - ' . Configuration::get('PS_SHOP_NAME');
    $page['meta']['keywords'] = $blog->meta_keywords;
    $page['meta']['description'] = $blog->meta_description;
    // echo '
';
    // print_r($page);die();
    return $page;
  }
  //DONGND:: add breadcrumb
  public function getBreadcrumbLinks()
  {
    $breadcrumb = parent::getBreadcrumbLinks();
    $helper = LeoBlogHelper::getInstance();
    $link = $helper->getFontBlogLink();
    $config = LeoBlogConfig::getInstance();
    $breadcrumb['links'][] = array(
      'title' => $config->get('blog_link_title_' . $this->context->language->id, $this->l('Blog', 'blog')),
      'url' => $link,
    );

    if ($config->get('url_use_id', 1))
    {
      $blog = new LeoBlogBlog(Tools::getValue('id'), $this->context->language->id);
    }
    else
    {
      $url_rewrite = explode('/', $_SERVER['REQUEST_URI']);
      $url_last_item = count($url_rewrite) - 1;
      $url_rewrite = rtrim($url_rewrite[$url_last_item], '.html');
      $blog = LeoBlogBlog::findByRewrite(array('link_rewrite' => $url_rewrite));
    }

    $category = new leoblogcat($blog->id_leoblogcat, $this->context->language->id);
    $params = array(
      'rewrite' => $category->link_rewrite,
      'id' => $category->id_leoblogcat
    );

    $category_link = $helper->getBlogCatLink($params);

    $breadcrumb['links'][] = array(
      'title' => $category->title,
      'url' => $category_link,
    );


    $breadcrumb['links'][] = array(
      'title' => Tools::ucfirst($blog->meta_title),
      'url' => $helper->getBlogLink(get_object_vars($blog)),
    );

    return $breadcrumb;
  }

  //DONGND:: get layout
  public function getLayout()
  {
    $entity = 'module-leoblog-' . $this->php_self;

    $layout = $this->context->shop->theme->getLayoutRelativePathForPage($entity);

    if ($overridden_layout = Hook::exec(
      'overrideLayoutTemplate',
      array(
        'default_layout' => $layout,
        'entity' => $entity,
        'locale' => $this->context->language->locale,
        'controller' => $this,
      )
    ))
    {
      return $overridden_layout;
    }

    if ((int) Tools::getValue('content_only'))
    {
      $layout = 'layouts/layout-content-only.tpl';
    }

    return $layout;
  }
}