require_once 'Db/Mysql.php';
class Catalog
{
/**
* Коннектор базы данных
*/
protected $_db = null;
/**
* Параметры для соединения с базой данных
*/
protected static $params_db = array(
'host' => DB_SITE_HOST,
'user' => DB_SITE_USER,
'pass' => DB_SITE_PASS,
'base' => DB_SITE_BASE );
private $_refs = array();
public function __construct()
{
$this -> _db = new Db_Mysql( self::$params_db );
}
/**
* Построение дерева каталога
*
* @param number идентификатор родительского каталога
* @param number направление поиска ( 1 - искать потомков, 2 - искать ролителей )
* @param number уровень вложенности поиска
* @return void
*/
public function getCatalogTree( $catalog_id = 0, $direction = 1, $limit = 100 )
{
$this -> _refs = array();
switch ( $direction )
{
case 1: $this -> getCatalogChilds( $catalog_id, $limit ); break;
case 2: $this -> getCatalogParents( $catalog_id, $limit ); break;
default: $this -> getCatalogChilds( $catalog_id, $limit );
}
return $this -> _refs;
}
/**
* Рекурсивное получение потомков каталога
*
* @param number идентификатор каталога
* @param number уровень вложенности
* @return void
*/
private function getCatalogChilds( $catalog_id, $limit = 100, $level = 1 )
{
$sql = "SELECT *, " . intval( $level ) . " AS level FROM shop_catalog WHERE parent_id = '" . intval( $catalog_id ) . "' ";
$this -> _db -> setCommand( $sql );
$this -> _db -> execute();
$data = $this -> _db -> fetchAll();
if ( !empty( $data ) && $limit >= $level )
{
$level++;
$this -> _refs = array_merge( $this -> _refs, $data );
for ( $i = 0; $i < count( $data ); $i++ )
{
$this -> getCatalogChilds( $data[$i]['id'], $limit, $level );
}
}
}
/**
* Рекурсивное получение родителей каталога
*
* @param number идентификатор каталога
* @param number уровень вложенности
* @return void
*/
private function getCatalogParents( $catalog_id, $limit, $level = 1 )
{
$sql = "SELECT *, " . intval( $level ) . " AS level FROM shop_catalog WHERE id = '" . intval( $catalog_id ) . "' ";
$this -> _db -> setCommand( $sql );
$this -> _db -> execute();
$data = $this -> _db -> fetchAll();
if ( !empty( $data ) )
{
$level++;
$this -> _refs = array_merge( $this -> _refs, $data );
for ( $i = 0; $i < count( $data ); $i++ )
{
$this -> getCatalogParents( $data[$i]['parent_id'], $limit, $level );
}
}
}
/**
* Получение информации о каталоге по идентификатору
*
* @return number идентификатор категории
* @return array
*/
public function getCatalogById( $category_id )
{
$sql = "SELECT id, parent_id, name, description, sort, published FROM shop_catalog WHERE id = '" . intval( $category_id ) . "' ";
$this -> _db -> setCommand( $sql );
$this -> _db -> execute();
return $this -> _db -> fetchAll();
}
/**
* Сохранение каталога
*
* @param number идентификатор каталога ( 0 - если новый )
* @param number идентификатор родителя
* @param string название каталога
* @param string описание каталога
* @param number порядок сортировки
* @param number статус публикации ( 0 скрыта, 1 - видима )
* @return number идентификатор каталога
*/
function saveCatalog( $catalog_id, $parent_id, $name, $description = null, $sort = 1000, $published = 1 )
{
if ( $catalog_id == $parent_id )
{
return false;
}
$name = htmlspecialchars( $name );
$description = htmlspecialchars( $description );
if ( empty( $catalog_id ) )
{
$sql = "INSERT INTO shop_catalog ( parent_id, name, description, sort, published ) VALUES ('" . intval( $parent_id ) . "', '" . $name . "', '" . $description . "', '" . intval( $sort ) . "', '" . intval( $published ) . "') ";
$this -> _db -> setCommand( $sql );
$this -> _db -> execute();
}
else
{
$sql = "UPDATE shop_catalog SET parent_id = '" . intval( $parent_id ) . "', name = '" . $name . "', description = '" . $description . "', sort = '" . intval( $sort ) . "', published = '" . intval( $published ) . "' WHERE id = '" . intval( $catalog_id ) . "' ";
$this -> _db -> setCommand( $sql );
$this -> _db -> execute();
}
return !empty( $catalog_id ) ? $catalog_id : $this -> _db -> getLastId();
}
/**
* Удаление каталога, его подкаталогов и товаров привязанных к ним
*
* @param number идентификатор каталога
* @return void
*/
function deleteCatalog( $catalog_id )
{
$childs = $this -> getCatalogTree( $catalog_id );
if ( !empty( $childs ) )
{
foreach ( $childs AS $data )
{
$catalogs[] = $data['id'];
}
$ids = join( ',', $catalogs );
}
else
{
$ids = $catalog_id;
}
$sql = "DELETE FROM shop_catalog WHERE id IN (" . intval( $ids ) . ") ";
$this -> _db -> setCommand( $sql );
$this -> _db -> execute();
$sql = "DELETE FROM shop_goods WHERE catalog_id IN (" . intval( $ids ) . ") ";
$this -> _db -> setCommand( $sql );
$this -> _db -> execute();
}
}
?>
Fatal error: Uncaught exception 'Controller_Exception' in /var/www/sites/andrey.smirnov/jetstar.ru/library/Loader.php:64
Stack trace:
#0 /var/www/sites/andrey.smirnov/jetstar.ru/library/Controller/Controller_Base.php(115): Loader::loadClass('Catalog')
#1 /var/www/sites/andrey.smirnov/jetstar.ru/application/controllers/GlobalController.php(16): Controller_Base::getClassInstance('Catalog')
#2 /var/www/sites/andrey.smirnov/jetstar.ru/application/controllers/IndexController.php(11): GlobalController->__construct()
#3 /var/www/sites/andrey.smirnov/jetstar.ru/library/Controller/Controller_Dispatcher.php(339): IndexController->__construct()
#4 /var/www/sites/andrey.smirnov/jetstar.ru/library/Controller/Controller_Base.php(342): Controller_Dispatcher->dispatch()
#5 /var/www/sites/andrey.smirnov/jetstar.ru/library/Controller/Controller_Base.php(84): Controller_Base->dispatch()
#6 /var/www/sites/andrey.smirnov/jetstar.ru/index.php(16): Controller_Base::run('/var/www/sites/...')
#7 {main}
thrown in /var/www/sites/andrey.smirnov/jetstar.ru/library/Loader.php on line 64