Files
wyczarujprezent.pl/modules/anblog/classes/anblogcat.php
2025-07-03 20:56:08 +02:00

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) {
}
}
}
}