429 lines
12 KiB
PHP
429 lines
12 KiB
PHP
<?php
|
|
|
|
class CmsPsPost extends ObjectModel {
|
|
|
|
public $id_post;
|
|
public $id_category;
|
|
public $date_add;
|
|
public $date_upd;
|
|
public $active;
|
|
public $show_home;
|
|
public $trick;
|
|
public $is_video;
|
|
public $note;
|
|
|
|
public $video;
|
|
public $amazon;
|
|
|
|
public $title;
|
|
public $slug;
|
|
public $intro;
|
|
public $content;
|
|
public $meta_title;
|
|
public $meta_desc;
|
|
|
|
public $img_size = array(
|
|
array(
|
|
'name' => 'small',
|
|
'width' => 400,
|
|
'height' => 260
|
|
),
|
|
array(
|
|
'name' => 'big',
|
|
'width' => 770,
|
|
'height' => 500
|
|
)
|
|
);
|
|
|
|
/**
|
|
* @see ObjectModel::$definition
|
|
*/
|
|
public static $definition = array(
|
|
'table' => 'cmsps_posts',
|
|
'primary' => 'id_post',
|
|
'multilang' => TRUE,
|
|
'multilang_shop' => TRUE,
|
|
'fields' => array(
|
|
'id_category' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => TRUE),
|
|
'active' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
|
'show_home' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
|
'trick' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
|
'is_video' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
|
'note' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
|
'video' => array('type' => self::TYPE_HTML, 'validate' => 'isCleanPerso'),
|
|
'amazon' => array('type' => self::TYPE_HTML, 'validate' => 'isCleanPerso'),
|
|
|
|
// Lang fields
|
|
'title' => array('type' => self::TYPE_STRING, 'lang' => TRUE, 'validate' => 'isGenericName', 'required' => TRUE),
|
|
'slug' => array('type' => self::TYPE_STRING, 'lang' => TRUE, 'validate' => 'isGenericName'),
|
|
'intro' => array('type' => self::TYPE_HTML, 'lang' => TRUE, 'validate' => 'isCleanHtml'),
|
|
'content' => array('type' => self::TYPE_HTML, 'lang' => TRUE, 'validate' => 'isCleanHtml'),
|
|
'meta_title' => array('type' => self::TYPE_STRING, 'lang' => TRUE, 'validate' => 'isGenericName'),
|
|
'meta_desc' => array('type' => self::TYPE_STRING, 'lang' => TRUE, 'validate' => 'isGenericName'),
|
|
|
|
'date_add' => array('type' => self::TYPE_DATE),
|
|
'date_upd' => array('type' => self::TYPE_DATE)
|
|
),
|
|
);
|
|
|
|
public function __construct($id = NULL, $id_lang = NULL, $id_shop = NULL) {
|
|
parent::__construct($id, $id_lang, $id_shop);
|
|
}
|
|
|
|
public static function getPostHome($id_lang, $limit = 14) {
|
|
$collection_post = new Collection('CmsPsPost', $id_lang);
|
|
$collection_post->where('show_home', '=', 1);
|
|
$collection_post->where('active', '=', 1);
|
|
$collection_post->orderBy('date_add', 'DESC');
|
|
$collection_post->setPageSize(14);
|
|
$posts = $collection_post->getResults();
|
|
return self::injectsData($posts);
|
|
}
|
|
|
|
|
|
public static function getVideoPost($id_lang, $limit = 10) {
|
|
$collection_post = new Collection('CmsPsPost', $id_lang);
|
|
$collection_post->where('is_video', '=', 1);
|
|
$collection_post->where('active', '=', 1);
|
|
$collection_post->orderBy('date_add', 'DESC');
|
|
$collection_post->setPageSize($limit);
|
|
$posts = $collection_post->getResults();
|
|
return self::injectsData($posts);
|
|
}
|
|
|
|
/**
|
|
* Associated data for each obj Post before display on Front
|
|
*
|
|
* @param array Array of CmsPsPost Object
|
|
* @return array array of post object with data associated
|
|
*/
|
|
public static function injectsData($articles, $full = FALSE) {
|
|
$array = TRUE;
|
|
if(!is_array($articles)) {
|
|
$array = FALSE;
|
|
$articles = array($articles);
|
|
}
|
|
|
|
foreach ($articles as $key => $article) {
|
|
$article->new = $article->isNew();
|
|
$article->id = $article->id_post;
|
|
if (file_exists(_PS_ROOT_DIR_.'/img/cms_post/'.$article->id_post.'/small.jpg')) {
|
|
$article->have_image = true;
|
|
} else {
|
|
$article->have_image = false;
|
|
}
|
|
|
|
if ($full) {
|
|
$article->products = $article->loadProductRelation();
|
|
}
|
|
}
|
|
|
|
if(!$array) {
|
|
return $articles[0];
|
|
}
|
|
|
|
return $articles;
|
|
}
|
|
|
|
/**
|
|
* Load Product relation for display
|
|
*/
|
|
public function loadProductRelation() {
|
|
$id_lang = Context::getContext()->language->id;
|
|
$relation_product = $this->getRelations('postcms_product');
|
|
$products = array();
|
|
if(!empty($relation_product)) {
|
|
$collection_product = new Collection('Product', $id_lang, Context::getContext()->shop->id);
|
|
$collection_product->where('id_product', 'IN', $relation_product);
|
|
$collection_product->where('active', '=', 1);
|
|
$products = $collection_product->getResults();
|
|
}
|
|
|
|
foreach ($products as $key => $product) {
|
|
$products[$key] = $product->loadReductionInfo();
|
|
}
|
|
return $products;
|
|
}
|
|
|
|
/**
|
|
* Load PostCms relation for display
|
|
*/
|
|
public function loadPostCmsRelation() {
|
|
$id_lang = Context::getContext()->language->id;
|
|
$relation_post = $this->getRelations('postcms');
|
|
$articles = array();
|
|
if(!empty($relation_post)) {
|
|
$collection_product = new Collection('CmsPsPost', $id_lang);
|
|
$collection_product->where('id_post', 'IN', $relation_post);
|
|
$collection_product->where('active', '=', 1);
|
|
$articles = $collection_product->getResults();
|
|
}
|
|
return $articles;
|
|
}
|
|
|
|
public function isNew() {
|
|
$date = new DateTime();
|
|
$date->modify('-15 days');
|
|
$date_post = new DateTime($this->date_add);
|
|
|
|
if ($date_post > $date) {
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
public function deleteRelations($type_relation, $id_group = NULL) {
|
|
if(empty($type_relation)) {
|
|
return FALSE;
|
|
}
|
|
|
|
if ($type_relation == 'cms_extrafields_'.$id_group) {
|
|
if (!Validate::IsInt($id_group))
|
|
return false;
|
|
return (bool) Db::getInstance()->delete('cmsps_posts_relation_extrafields', 'id_post = '. $this->id . ' and id_group = '.(int)$id_group);
|
|
}
|
|
elseif ($type_relation == 'postcms') {
|
|
return (bool) Db::getInstance()->delete('cmsps_posts_relation', 'id_post = '. $this->id);
|
|
} elseif ($type_relation == 'postcms_product') {
|
|
return (bool) Db::getInstance()->delete('cmsps_posts_relation_product', 'id_post = '. $this->id);
|
|
} elseif ($type_relation == 'postcms_pack') {
|
|
return (bool) Db::getInstance()->delete('cmsps_posts_relation_pack', 'id_post = '. $this->id);
|
|
}
|
|
}
|
|
|
|
public function addRelation($id_relation, $type_relation, $id_group = NULL) {
|
|
if(empty($type_relation)) {
|
|
return FALSE;
|
|
}
|
|
|
|
if ($type_relation == 'postcms') {
|
|
return Db::getInstance()->execute('
|
|
INSERT INTO
|
|
`'._DB_PREFIX_.'cmsps_posts_relation`
|
|
VALUES (
|
|
'.(int)$this->id.',
|
|
'.(int)$id_relation.'
|
|
)
|
|
');
|
|
} elseif ($type_relation == 'postcms_product') {
|
|
return Db::getInstance()->execute('
|
|
INSERT INTO
|
|
`'._DB_PREFIX_.'cmsps_posts_relation_product`
|
|
VALUES (
|
|
'.(int)$this->id.',
|
|
'.(int)$id_relation.'
|
|
)
|
|
');
|
|
} elseif ($type_relation == 'postcms_pack') {
|
|
return Db::getInstance()->execute('
|
|
INSERT INTO
|
|
`'._DB_PREFIX_.'cmsps_posts_relation_pack`
|
|
VALUES (
|
|
'.(int)$this->id.',
|
|
'.(int)$id_relation.'
|
|
)
|
|
');
|
|
} elseif ($type_relation == 'cms_extrafields_'.$id_group) {
|
|
if (!Validate::IsInt($id_group))
|
|
return false;
|
|
return Db::getInstance()->execute('
|
|
INSERT INTO
|
|
`'._DB_PREFIX_.'cmsps_posts_relation_extrafields`
|
|
VALUES (
|
|
'.(int)$this->id.',
|
|
'.(int)$id_group.',
|
|
'.(int)$id_relation.'
|
|
)
|
|
');
|
|
}
|
|
}
|
|
|
|
public function getRelations($page_name = null) {
|
|
if(!Validate::isLoadedObject($this))
|
|
return array();
|
|
|
|
$array_tmp = array();
|
|
|
|
if($page_name == 'postcms') {
|
|
$sql = 'SELECT `id_relation`
|
|
FROM '._DB_PREFIX_.'cmsps_posts_relation
|
|
WHERE id_post = '.(int)$this->id.'';
|
|
|
|
$infos = Db::getInstance()->executeS($sql);
|
|
foreach($infos as $info) {
|
|
$array_tmp[$info['id_relation']] = $info['id_relation'];
|
|
}
|
|
} elseif ($page_name == 'postcms_product') {
|
|
$sql = 'SELECT `id_product`
|
|
FROM '._DB_PREFIX_.'cmsps_posts_relation_product
|
|
WHERE id_post = '.(int)$this->id.'';
|
|
|
|
$infos = Db::getInstance()->executeS($sql);
|
|
|
|
foreach($infos as $info) {
|
|
$array_tmp[$info['id_product']] = $info['id_product'];
|
|
}
|
|
} elseif ($page_name == 'postcms_pack') {
|
|
$sql = 'SELECT `id_pack`
|
|
FROM '._DB_PREFIX_.'cmsps_posts_relation_pack
|
|
WHERE id_post = '.(int)$this->id.'';
|
|
|
|
$infos = Db::getInstance()->executeS($sql);
|
|
|
|
foreach($infos as $info) {
|
|
$array_tmp[$info['id_pack']] = $info['id_pack'];
|
|
}
|
|
}
|
|
return $array_tmp;
|
|
}
|
|
|
|
public function getInfosWithValues($page_name) {
|
|
$infos = $this->getRelations($page_name);
|
|
|
|
if(count($infos) == 0)
|
|
return array();
|
|
|
|
$id_lang = Context::getContext()->language->id;
|
|
if($page_name == 'postcms')
|
|
{
|
|
$sql = '
|
|
SELECT c.id_post as id, lc.title as content
|
|
FROM `'._DB_PREFIX_.'cmsps_posts` c
|
|
LEFT JOIN `'._DB_PREFIX_.'cmsps_posts_lang` lc
|
|
ON c.`id_post` = lc.`id_post`
|
|
AND lc.id_lang = '.$id_lang.'
|
|
WHERE c.id_post IN ('.implode(',', $infos).')';
|
|
} else if ($page_name == 'postcms_product') {
|
|
$sql = '
|
|
SELECT p.id_product as id, pl.name as content
|
|
FROM `'._DB_PREFIX_.'product` p
|
|
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
|
|
ON p.`id_product` = pl.`id_product`
|
|
AND pl.id_lang = '.$id_lang.'
|
|
WHERE p.id_product IN ('.implode(',', $infos).')';
|
|
} else if ($page_name == 'postcms_pack') {
|
|
$sql = '
|
|
SELECT p.id_pack as id, p.title as content
|
|
FROM `'._DB_PREFIX_.'cms_pack` p
|
|
WHERE p.id_pack IN ('.implode(',', $infos).')';
|
|
}
|
|
|
|
$res = Db::getInstance()->executeS($sql);
|
|
return $res;
|
|
}
|
|
|
|
|
|
|
|
// EXTRAFIELDS CMS
|
|
public function getRelationsExtra($id_group) {
|
|
$array_tmp = array();
|
|
|
|
$sql = 'SELECT `id_value`
|
|
FROM '._DB_PREFIX_.'cmsps_posts_relation_extrafields
|
|
WHERE id_post = '.(int)$this->id.'
|
|
AND id_group = '.(int)$id_group;
|
|
|
|
$infos = Db::getInstance()->executeS($sql);
|
|
foreach($infos as $info) {
|
|
$array_tmp[$info['id_value']] = $info['id_value'];
|
|
}
|
|
return $array_tmp;
|
|
}
|
|
|
|
public function getInfosWithValuesExtra($page_name) {
|
|
$id_group = str_replace('cms_extrafields_', '', $page_name);
|
|
|
|
if(!Validate::isInt($id_group))
|
|
return array();
|
|
|
|
$infos = $this->getRelationsExtra($id_group);
|
|
|
|
if ($infos) {
|
|
return Db::getInstance()->executeS('
|
|
SELECT p.id_cmsps_extrafields_value as id, p.value as content
|
|
FROM `'._DB_PREFIX_.'cmsps_extrafields_value_lang` p
|
|
WHERE p.id_cmsps_extrafields_value IN ('.implode(',', $infos).')'
|
|
);
|
|
} else {
|
|
return array();
|
|
}
|
|
}
|
|
|
|
public static function search($query, $limit, $id_lang)
|
|
{
|
|
$result = array();
|
|
$query_posts = '
|
|
SELECT p.`id_post`
|
|
FROM `'._DB_PREFIX_.'cmsps_posts` p
|
|
LEFT JOIN `'._DB_PREFIX_.'cmsps_posts_lang` pl ON(p.`id_post` = pl.`id_post`)
|
|
WHERE p.`active` = 1
|
|
AND (
|
|
pl.`title` LIKE "%'.pSql($query).'%"
|
|
OR pl.`content` LIKE "%'.pSql($query).'%"
|
|
)
|
|
ORDER BY p.`note` DESC
|
|
LIMIT '.(int)$limit
|
|
;
|
|
$ids = Db::getInstance()->executeS($query_posts);
|
|
|
|
if ($ids) {
|
|
foreach ($ids as $key => $id) {
|
|
$result[] = new CmsPsPost($id['id_post'], $id_lang);
|
|
}
|
|
}
|
|
|
|
if ($result)
|
|
return self::injectsData($result);
|
|
|
|
return $result;
|
|
}
|
|
|
|
public static function specificSearch($tags, $id_lang, $id_category = 1, $limit = 1)
|
|
{
|
|
$result = false;
|
|
$query_posts = '
|
|
SELECT p.`id_post`
|
|
FROM `'._DB_PREFIX_.'cmsps_posts` p
|
|
LEFT JOIN `'._DB_PREFIX_.'cmsps_posts_lang` pl ON(p.`id_post` = pl.`id_post`)
|
|
WHERE p.`active` = 1 AND p.`id_category`='.(int)$id_category;
|
|
foreach ($tags as $key => $value) {
|
|
$query_posts .= ' AND p.`id_post` IN (
|
|
SELECT prx.`id_post`
|
|
FROM `'._DB_PREFIX_.'cmsps_posts_relation_extrafields` prx
|
|
WHERE prx.`id_value` = '.(int)$value.')';
|
|
}
|
|
$query_posts .= ' GROUP BY p.`id_post` ORDER BY p.`note` DESC LIMIT '.(int)$limit;
|
|
$bestPost = Db::getInstance()->executeS($query_posts);
|
|
if ($bestPost) {
|
|
$result = new CmsPsPost($bestPost[0]['id_post'], $id_lang);
|
|
}
|
|
|
|
if ($result)
|
|
return self::injectsData($result);
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
public static function getPostRelationWithProduct($id_product, $limit = 3, $id_lang)
|
|
{
|
|
$relations = array();
|
|
$ids = Db::getInstance()->executeS('
|
|
SELECT r.`id_post`
|
|
FROM `'._DB_PREFIX_.'cmsps_posts_relation_product` r
|
|
LEFT JOIN `'._DB_PREFIX_.'cmsps_posts` c ON(r.`id_post` = c.`id_post`)
|
|
WHERE r.`id_product` ='.(int)$id_product.'
|
|
ORDER BY c.`note` DESC
|
|
LIMIT '.(int)$limit
|
|
|
|
);
|
|
foreach ($ids as $key => $id) {
|
|
$relations[] = new CmsPsPost($id['id_post'], $id_lang);
|
|
}
|
|
return self::injectsData($relations);
|
|
}
|
|
|
|
}
|