613 lines
20 KiB
PHP
613 lines
20 KiB
PHP
<?php
|
|
/**
|
|
* 2024 Anvanto
|
|
*
|
|
* NOTICE OF LICENSE
|
|
*
|
|
* This source file is subject to the Academic Free License (AFL 3.0)
|
|
*
|
|
* @author Anvanto <anvantoco@gmail.com>
|
|
* @copyright 2024 Anvanto
|
|
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
|
*/
|
|
|
|
if (!defined('_PS_VERSION_')) {
|
|
exit;
|
|
}
|
|
|
|
class Anblogcat extends ObjectModel
|
|
{
|
|
public $id;
|
|
public $id_anblogcat;
|
|
public $image;
|
|
public $icon_class;
|
|
public $id_parent = 1;
|
|
public $is_group = 0;
|
|
public $width;
|
|
public $submenu_width;
|
|
public $colum_width;
|
|
public $submenu_colum_width;
|
|
public $item;
|
|
public $colums = 1;
|
|
public $type;
|
|
public $is_content = 0;
|
|
public $show_title = 1;
|
|
public $type_submenu;
|
|
public $level_depth;
|
|
public $active = 1;
|
|
public $position;
|
|
public $show_sub;
|
|
public $url;
|
|
public $target;
|
|
public $privacy;
|
|
public $position_type;
|
|
public $menu_class;
|
|
public $content;
|
|
public $submenu_content;
|
|
public $level;
|
|
public $left;
|
|
public $right;
|
|
public $date_add;
|
|
public $date_upd;
|
|
// Lang
|
|
public $title;
|
|
public $description;
|
|
public $content_text;
|
|
public $submenu_content_text;
|
|
public $submenu_catids;
|
|
public $is_cattree = 1;
|
|
public $template = '';
|
|
public $meta_title;
|
|
public $meta_keywords;
|
|
public $meta_description;
|
|
public $link_rewrite;
|
|
private $anModule = null;
|
|
public $id_shop = '';
|
|
public $select_data = array();
|
|
public $randkey;
|
|
public $groups;
|
|
|
|
public function setModule($module)
|
|
{
|
|
$this->anModule = $module;
|
|
}
|
|
/**
|
|
* @see ObjectModel::$definition
|
|
*/
|
|
public static $definition = array(
|
|
'table' => 'anblogcat',
|
|
'primary' => 'id_anblogcat',
|
|
'multilang' => true,
|
|
'fields' => array(
|
|
'image' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'validate' => 'isCatalogName'
|
|
),
|
|
'id_parent' => array(
|
|
'type' => self::TYPE_INT,
|
|
'validate' => 'isUnsignedInt',
|
|
'required' => true
|
|
),
|
|
'level_depth' => array(
|
|
'type' => self::TYPE_INT,
|
|
'validate' => 'isUnsignedInt'
|
|
),
|
|
'active' => array(
|
|
'type' => self::TYPE_BOOL,
|
|
'validate' => 'isBool',
|
|
'required' => true
|
|
),
|
|
'show_title' => array(
|
|
'type' => self::TYPE_BOOL,
|
|
'validate' => 'isBool',
|
|
'required' => true
|
|
),
|
|
'position' => array(
|
|
'type' => self::TYPE_INT
|
|
),
|
|
'privacy' => array(
|
|
'type' => self::TYPE_INT,
|
|
'validate' => 'isUnsignedInt',
|
|
'size' => 6
|
|
),
|
|
'menu_class' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'validate' => 'isCatalogName',
|
|
'size' => 25
|
|
),
|
|
'icon_class' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'validate' => 'isCatalogName',
|
|
'size' => 125
|
|
),
|
|
'date_add' => array(
|
|
'type' => self::TYPE_DATE,
|
|
'validate' => 'isDate'
|
|
),
|
|
'date_upd' => array(
|
|
'type' => self::TYPE_DATE,
|
|
'validate' => 'isDate'
|
|
),
|
|
// Lang fields
|
|
'title' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'lang' => true,
|
|
'validate' => 'isGenericName',
|
|
'required' => true, 'size' => 255
|
|
),
|
|
'content_text' => array(
|
|
'type' => self::TYPE_HTML,
|
|
'lang' => true,
|
|
'validate' => 'isString',
|
|
'required' => false
|
|
),
|
|
'meta_title' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'lang' => true,
|
|
'validate' => 'isGenericName',
|
|
'size' => 255,
|
|
'required' => false
|
|
),
|
|
'meta_description' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'lang' => true,
|
|
'validate' => 'isGenericName',
|
|
'size' => 255,
|
|
'required' => false
|
|
),
|
|
'meta_keywords' => array('type' => self::TYPE_STRING,
|
|
'lang' => true,
|
|
'validate' => 'isGenericName',
|
|
'size' => 255,
|
|
'required' => false
|
|
),
|
|
'link_rewrite' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'lang' => true,
|
|
'validate' => 'isLinkRewrite',
|
|
'required' => true,
|
|
'size' => 128
|
|
),
|
|
'randkey' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'lang' => false,
|
|
'size' => 255
|
|
),
|
|
'groups' => array(
|
|
'type' => self::TYPE_STRING,
|
|
'lang' => false,
|
|
'size' => 255
|
|
),
|
|
),
|
|
);
|
|
|
|
public static function findByRewrite($parrams)
|
|
{
|
|
$id_lang = (int)Context::getContext()->language->id;
|
|
$id_shop = (int)Context::getContext()->shop->id;
|
|
$id = 0;
|
|
if (isset($parrams['link_rewrite']) && $parrams['link_rewrite']) {
|
|
$sql = 'SELECT cl.id_anblogcat FROM '._DB_PREFIX_.'anblogcat_lang cl INNER JOIN '._DB_PREFIX_.'anblogcat_shop cs on cl.id_anblogcat=cs.id_anblogcat AND id_shop='.(int) $id_shop.' INNER JOIN '._DB_PREFIX_.'anblogcat cc on cl.id_anblogcat=cc.id_anblogcat AND cl.id_anblogcat != cc.id_parent AND link_rewrite = "'.pSQL($parrams["link_rewrite"]).'"';
|
|
if ($row = Db::getInstance()->getRow($sql)) {
|
|
$id = $row['id_anblogcat'];
|
|
}
|
|
}
|
|
return new Anblogcat($id, $id_lang);
|
|
}
|
|
|
|
public static function getCategories($id_lang = false)
|
|
{
|
|
$context = Context::getContext();
|
|
|
|
if (!$id_lang){
|
|
$id_lang = $context->language->id;
|
|
}
|
|
|
|
$sql = 'SELECT * FROM `' . _DB_PREFIX_ . 'anblogcat` sw LEFT JOIN `' . _DB_PREFIX_ . 'anblogcat_lang` sl
|
|
ON (sw.`id_anblogcat` = sl.`id_anblogcat`
|
|
AND sl.`id_lang` = ' . (int) $id_lang . ')
|
|
WHERE sw.`active`=1';
|
|
|
|
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
|
|
}
|
|
|
|
public function add($autodate = true, $null_values = false)
|
|
{
|
|
$this->position = self::getLastPosition((int)$this->id_parent);
|
|
$this->level_depth = $this->calcLevelDepth();
|
|
$res = parent::add($autodate, $null_values);
|
|
$sql = 'INSERT INTO `'._DB_PREFIX_.'anblogcat_shop` (`id_shop`, `id_anblogcat`)
|
|
VALUES('.(int)AnblogHelper::getIDShop().', '.(int)$this->id.')';
|
|
$res &= Db::getInstance()->execute($sql);
|
|
$this->cleanPositions($this->id_parent);
|
|
return $res;
|
|
}
|
|
|
|
public function update($null_values = false)
|
|
{
|
|
$this->level_depth = $this->calcLevelDepth();
|
|
return parent::update($null_values);
|
|
}
|
|
|
|
protected function recursiveDelete(&$to_delete, $id_anblogcat)
|
|
{
|
|
if (!is_array($to_delete) || !$id_anblogcat) {
|
|
die(Tools::displayError());
|
|
}
|
|
|
|
$result = Db::getInstance()->executeS(
|
|
'
|
|
SELECT `id_anblogcat`
|
|
FROM `'._DB_PREFIX_.'anblogcat`
|
|
WHERE `id_parent` = '.(int)$id_anblogcat
|
|
);
|
|
foreach ($result as $row) {
|
|
$to_delete[] = (int)$row['id_anblogcat'];
|
|
$this->recursiveDelete($to_delete, (int)$row['id_anblogcat']);
|
|
}
|
|
}
|
|
|
|
public function delete()
|
|
{
|
|
if ($this->id == 1) {
|
|
return false;
|
|
}
|
|
$this->clearCache();
|
|
|
|
// Get children categories
|
|
$to_delete = array((int)$this->id);
|
|
$this->recursiveDelete($to_delete, (int)$this->id);
|
|
$to_delete = array_unique($to_delete);
|
|
|
|
// Delete CMS Category and its child from database
|
|
foreach ($to_delete as &$value) {
|
|
$value = pSQL($value);
|
|
}
|
|
$list = count($to_delete) > 1 ? implode(',', $to_delete) : (int)$this->id;
|
|
|
|
Db::getInstance()->execute(
|
|
'DELETE FROM `'._DB_PREFIX_.'anblogcat` WHERE `id_anblogcat` IN ('.$list.')'
|
|
);
|
|
Db::getInstance()->execute(
|
|
'DELETE FROM `'._DB_PREFIX_.'anblogcat_shop` WHERE `id_anblogcat` IN ('.$list.')'
|
|
);
|
|
Db::getInstance()->execute(
|
|
'DELETE FROM `'._DB_PREFIX_.'anblogcat_lang` WHERE `id_anblogcat` IN ('.$list.')'
|
|
);
|
|
anblogcat::cleanPositions($this->id_parent);
|
|
return true;
|
|
}
|
|
|
|
public static function countCats()
|
|
{
|
|
$row = Db::getInstance()->
|
|
executeS(
|
|
'SELECT COUNT(id_anblogcat) as total FROM `'._DB_PREFIX_.'anblogcat` WHERE id_anblogcat!=1 AND 1=1'
|
|
);
|
|
return $row[0]['total'];
|
|
}
|
|
|
|
public function deleteSelection($menus)
|
|
{
|
|
$return = 1;
|
|
foreach ($menus as $id_anblogcat) {
|
|
$obj_menu = new Anblogcat($id_anblogcat);
|
|
$return &= $obj_menu->delete();
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
public function calcLevelDepth()
|
|
{
|
|
$parentanblogcat = new Anblogcat($this->id_parent);
|
|
if (!$parentanblogcat) {
|
|
die('parent Menu does not exist');
|
|
}
|
|
return $parentanblogcat->level_depth + 1;
|
|
}
|
|
|
|
// public function updatePosition($way, $position)
|
|
// {
|
|
// $sql = 'SELECT cp.`id_anblogcat`, cp.`position`, cp.`id_parent`
|
|
// FROM `'._DB_PREFIX_.'anblogcat` cp
|
|
// WHERE cp.`id_parent` = '.(int)$this->id_parent.'
|
|
// ORDER BY cp.`position` ASC';
|
|
// $res = Db::getInstance()->executeS($sql);
|
|
// if (!$res) {
|
|
// return false;
|
|
// }
|
|
|
|
// foreach ($res as $menu) {
|
|
// if ((int)$menu['id_anblogcat'] == (int)$this->id) {
|
|
// $moved_menu = $menu;
|
|
// }
|
|
// }
|
|
|
|
// if (!isset($moved_menu) || !isset($position)) {
|
|
// return false;
|
|
// }
|
|
// // < and > statements rather than BETWEEN operator
|
|
// // since BETWEEN is treated differently according to databases
|
|
// return (Db::getInstance()->execute(
|
|
// '
|
|
// UPDATE `'._DB_PREFIX_.'anblogcat`
|
|
// SET `position`= `position` '.($way ? '- 1' : '+ 1').'
|
|
// WHERE `position`
|
|
// '.($way ? '> '.(int)$moved_menu['position'].' AND
|
|
// `position` <= '.(int)$position : '< '.(int)$moved_menu['position'].' AND `position` >= '.(int)$position).'
|
|
// AND `id_parent`='.(int)$moved_menu['id_parent']
|
|
// ) && Db::getInstance()->execute(
|
|
// '
|
|
// UPDATE `'._DB_PREFIX_.'anblogcat`
|
|
// SET `position` = '.(int)$position.'
|
|
// WHERE `id_parent` = '.(int)$moved_menu['id_parent'].'
|
|
// AND `id_anblogcat`='.(int)$moved_menu['id_anblogcat']
|
|
// ));
|
|
// }
|
|
|
|
public static function cleanPositions($id_parent)
|
|
{
|
|
$result = Db::getInstance()->executeS(
|
|
'
|
|
SELECT `id_anblogcat`
|
|
FROM `'._DB_PREFIX_.'anblogcat`
|
|
WHERE `id_parent` = '.(int)$id_parent.'
|
|
ORDER BY `position`'
|
|
);
|
|
$sizeof = count($result);
|
|
for ($i = 0; $i < $sizeof; ++$i) {
|
|
$sql = '
|
|
UPDATE `'._DB_PREFIX_.'anblogcat`
|
|
SET `position` = '.(int)$i.'
|
|
WHERE `id_parent` = '.(int)$id_parent.'
|
|
AND `id_anblogcat` = '.(int)$result[$i]['id_anblogcat'];
|
|
Db::getInstance()->execute($sql);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static function getLastPosition($id_parent)
|
|
{
|
|
return (
|
|
Db::getInstance()->
|
|
getValue(
|
|
'SELECT MAX(position)+1 FROM `'._DB_PREFIX_.'anblogcat` WHERE `id_parent` = '.(int)$id_parent
|
|
)
|
|
);
|
|
}
|
|
|
|
public function getInfo($id_anblogcat, $id_lang = null, $id_shop = null)
|
|
{
|
|
if (!$id_lang) {
|
|
$id_lang = Context::getContext()->language->id;
|
|
}
|
|
if (!$id_shop) {
|
|
$id_shop = Context::getContext()->shop->id;
|
|
}
|
|
$sql = 'SELECT m.*, md.title, md.description, md.content_text
|
|
FROM '._DB_PREFIX_.'megamenu m
|
|
LEFT JOIN '._DB_PREFIX_.'anblogcat_lang md
|
|
ON m.id_anblogcat = md.id_anblogcat AND md.id_lang = '.(int)$id_lang
|
|
.' JOIN '._DB_PREFIX_.'anblogcat_shop bs
|
|
ON m.id_anblogcat = bs.id_anblogcat AND bs.id_shop = '.(int)($id_shop);
|
|
$sql .= ' WHERE m.id_anblogcat='.(int)$id_anblogcat;
|
|
|
|
return Db::getInstance()->executeS($sql);
|
|
}
|
|
|
|
public function getChild($id_anblogcat = null, $id_lang = null, $id_shop = null, $active = false)
|
|
{
|
|
if (!$id_lang) {
|
|
$id_lang = Context::getContext()->language->id;
|
|
}
|
|
if (!$id_shop) {
|
|
$id_shop = Context::getContext()->shop->id;
|
|
}
|
|
|
|
$sql = ' SELECT m.*, md.*
|
|
FROM '._DB_PREFIX_.'anblogcat m
|
|
LEFT JOIN '._DB_PREFIX_.'anblogcat_lang md
|
|
ON m.id_anblogcat = md.id_anblogcat AND md.id_lang = '.(int)$id_lang
|
|
.' JOIN '._DB_PREFIX_.'anblogcat_shop bs
|
|
ON m.id_anblogcat = bs.id_anblogcat AND bs.id_shop = '.(int)($id_shop);
|
|
if ($active) {
|
|
$sql .= ' WHERE m.`active`=1 ';
|
|
}
|
|
|
|
if ($id_anblogcat != null) {
|
|
// validate module
|
|
$sql .= ' WHERE id_parent='.(int)$id_anblogcat;
|
|
}
|
|
$sql .= ' ORDER BY `position` ';
|
|
return Db::getInstance()->executeS($sql);
|
|
}
|
|
|
|
public function getAllChild($id_anblogcat = null, $id_lang = null, $id_shop = null, $active = false)
|
|
{
|
|
if (!$id_lang) {
|
|
$id_lang = Context::getContext()->language->id;
|
|
}
|
|
if (!$id_shop) {
|
|
$id_shop = Context::getContext()->shop->id;
|
|
}
|
|
|
|
$sql = ' SELECT m.id_anblogcat AS id_category, m.id_anblogcat AS id_anblogcat, m.level_depth AS level_depth,
|
|
md.title AS title, m.id_parent, md.title AS name, m.randkey AS randkey, md.link_rewrite, m.icon_class, m.menu_class
|
|
FROM '._DB_PREFIX_.'anblogcat m
|
|
LEFT JOIN '._DB_PREFIX_.'anblogcat_lang md
|
|
ON m.id_anblogcat = md.id_anblogcat AND md.id_lang = '.(int)$id_lang
|
|
.' JOIN '._DB_PREFIX_.'anblogcat_shop bs
|
|
ON m.id_anblogcat = bs.id_anblogcat AND bs.id_shop = '.(int)($id_shop);
|
|
if ($active) {
|
|
$sql .= ' WHERE m.`active`=1 ';
|
|
}
|
|
|
|
if ($id_anblogcat != null) {
|
|
// validate module
|
|
$sql .= ' WHERE id_parent='.(int)$id_anblogcat;
|
|
}
|
|
$sql .= ' ORDER BY `position` ';
|
|
return Db::getInstance()->executeS($sql);
|
|
}
|
|
|
|
public function hasChild($id)
|
|
{
|
|
return isset($this->children[$id]);
|
|
}
|
|
|
|
public function getNodes($id)
|
|
{
|
|
if (empty($this->children[$id])) {
|
|
return false;
|
|
}
|
|
return $this->children[$id];
|
|
}
|
|
|
|
public function getTree($id = null)
|
|
{
|
|
$childs = $this->getChild($id);
|
|
foreach ($childs as $child) {
|
|
// validate module
|
|
$this->children[$child['id_parent']][] = $child;
|
|
}
|
|
$data = $this->getNodes(1);
|
|
$tree = $this->genTree($data);
|
|
|
|
if (!$tree){
|
|
return false;
|
|
}
|
|
|
|
Context::getContext()->smarty->assign(
|
|
array(
|
|
'tree' => $tree,
|
|
'selected' => Tools::getValue('id_anblogcat')
|
|
)
|
|
);
|
|
return Context::getContext()->smarty->fetch(_PS_MODULE_DIR_ . 'anblog/views/templates/admin/prerender/tree.tpl');
|
|
}
|
|
|
|
public function getDropdown($id, $selected = 1)
|
|
{
|
|
$this->children = array();
|
|
$childs = $this->getChild($id);
|
|
foreach ($childs as $child) {
|
|
// validate module
|
|
$this->children[$child['id_parent']][] = $child;
|
|
}
|
|
$output = array(array('id' => '1', 'title' => 'Root', 'selected' => ''));
|
|
$output = $this->genOption(1, 1, $selected, $output);
|
|
|
|
return $output;
|
|
}
|
|
|
|
/**
|
|
* @param int $level (default 0 )
|
|
* @param type $output ( default array )
|
|
* @param type $output
|
|
*/
|
|
public function genOption($parent, $level, $selected, $output)
|
|
{
|
|
// module validation
|
|
!is_null($level) ? $level : $level = 0;
|
|
is_array($output) ? true : $output = array();
|
|
|
|
if ($this->hasChild($parent)) {
|
|
$data = $this->getNodes($parent);
|
|
foreach ($data as $menu) {
|
|
$output[] = array(
|
|
'id' => $menu['id_anblogcat'],
|
|
'title' => str_repeat('-', $level).' '.$menu['title'].' (ID:'.$menu['id_anblogcat'].')',
|
|
'selected' => $selected
|
|
);
|
|
if ($menu['id_anblogcat'] != $parent) {
|
|
$output = $this->genOption($menu['id_anblogcat'], $level + 1, $selected, $output);
|
|
}
|
|
}
|
|
}
|
|
return $output;
|
|
}
|
|
|
|
public function genTree(&$data)
|
|
{
|
|
if (!empty($data)) {
|
|
foreach ($data as $key => $item) {
|
|
$id = isset($item['id_anblogcat']) ? $item['id_anblogcat'] : $item['id_category'];
|
|
$children = $this->getAllChild($id);
|
|
if (!empty($children)) {
|
|
$data[$key]['children'] = $children;
|
|
$this->genTree($data[$key]['children']);
|
|
}
|
|
}
|
|
return $data;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function getFrontEndTree($id, $helper)
|
|
{
|
|
$childs = $this->getChild(null);
|
|
|
|
foreach ($childs as $child) {
|
|
// validate module
|
|
$this->children[$child['id_parent']][] = $child;
|
|
}
|
|
|
|
$data = $this->getNodes($id);
|
|
$tree = $this->genFrontEndTree($data, $helper);
|
|
|
|
if (!$data) {
|
|
return false;
|
|
}
|
|
|
|
Context::getContext()->smarty->assign(
|
|
array(
|
|
'tree' => $tree,
|
|
'selected' => Tools::getValue('id_anblogcat')
|
|
)
|
|
);
|
|
return Context::getContext()->smarty->fetch(_PS_MODULE_DIR_ . 'anblog/views/templates/front/category_menu.tpl');
|
|
}
|
|
|
|
public function genFrontEndTree(&$data, $helper)
|
|
{
|
|
if (!empty($data)) {
|
|
foreach ($data as $key => $item) {
|
|
$id = isset($item['id_anblogcat']) ? $item['id_anblogcat'] : $item['id_category'];
|
|
$params = array(
|
|
'rewrite' => $item['link_rewrite'],
|
|
'id' => $id
|
|
);
|
|
|
|
$category_link = $helper->getBlogCatLink($params);
|
|
$data[$key]['category_link'] = $category_link;
|
|
$children = $this->getAllChild($id);
|
|
if (!empty($children)) {
|
|
$data[$key]['children'] = $children;
|
|
$this->genFrontEndTree($data[$key]['children'], $helper);
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static function autoCreateKey()
|
|
{
|
|
$sql = 'SELECT '.self::$definition['primary'].' FROM '._DB_PREFIX_.self::$definition['table'].
|
|
' WHERE randkey IS NULL OR randkey = ""';
|
|
|
|
$rows = Db::getInstance()->executes($sql);
|
|
foreach ($rows as $row) {
|
|
$mod_group = new Anblogcat((int)$row[self::$definition['primary']]);
|
|
include_once _PS_MODULE_DIR_.'anblog/libs/Helper.php';
|
|
$mod_group->randkey = AnblogHelper::genKey();
|
|
try {
|
|
// Try caught to remove validate
|
|
$mod_group->update();
|
|
} catch (Exception $exc) {
|
|
}
|
|
}
|
|
}
|
|
}
|