Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Description of Category
- *
- * @author Ivaylo Ivanov
- */
- namespace Models;
- class Category {
- /**
- * Summary
- *
- * @var object \Model\Database
- */
- private $_databaseInstance;
- /**
- * Изисква инстанция към база данни.
- * @param type $databaseInstance
- */
- public function __construct($databaseInstance) {
- $this->_databaseInstance = $databaseInstance;
- }
- /**
- * Връща масив с всички категории и броя на дискусиите като ключа е id-то на категорията
- *
- * @return array() description
- */
- public function getCategoryTree() {
- // Инициализиране на масив който ще бъде върнат по късно.
- $result = array();
- // SQL - Взима всички категории и броя на постовете в тях
- $sql = "
- SELECT category_id, category_name, category_parent, category_depth, discussion_count
- FROM categories
- LEFT JOIN discussions
- ON discussion_category = category_id
- ORDER BY category_left";
- // Заявка към базата данни
- $this->_databaseInstance->query($sql, array(), 2);
- // Пълни масива
- foreach ($this->_databaseInstance->getResult() as $value) {
- $result[(int) $value['category_id']]['category_parent'] = (int) $value['category_parent'];
- $result[(int) $value['category_id']]['category_name'] = (string) $value['category_name'];
- $result[(int) $value['category_id']]['category_posts'] = (int) $value['discussion_count'];
- $result[(int) $value['category_id']]['category_depth'] = (int) $value['category_depth'];
- }
- // Връща масива
- return $result;
- }
- /**
- * Промяна името на категорията. Връща масив от грешки ако има такива.
- * @param type $category_id
- * @param type $newName
- * @return type
- */
- public function renameCategory($category_id, $newName) {
- // SQL - преименуване на категория
- $sql = "UPDATE categories SET category_name = :name WHERE category_id = :id;";
- // Подготовка на параметрите подавани към базата данни.
- $params = array(
- ':name' => array(
- 'param' => (string) $newName,
- 'type' => 2
- ),
- ':id' => array(
- 'param' => (int) $category_id,
- 'type' => 1
- )
- );
- // Заявка към базата данни
- $this->_databaseInstance->query($sql, $params);
- // Връща метода getErrors()
- return $this->_databaseInstance->getErrors();
- }
- /**
- * Изтрива категория и нейните под категории по зададено id.
- * @param type $category_id
- * @return type
- */
- public function deleteCategory($category_id) {
- // SQL - Изтрива категория и нейните под категории по зададено id.
- $sql = "
- LOCK TABLE categories WRITE;
- SELECT @myLeft := category_left, @myRight := category_right, @myWidth := category_right - category_left + 1
- FROM categories WHERE category_id = :id;
- DELETE FROM categories WHERE category_left BETWEEN @myLeft AND @myRight;
- UPDATE categories SET category_right = category_right - @myWidth WHERE category_right > @myRight;
- UPDATE categories SET category_left = category_left - @myWidth WHERE category_left > @myRight;
- UNLOCK TABLES;";
- // Подготовка на параметрите подавани към базата данни.
- $params = array(
- ':id' => array(
- 'param' => (int) $category_id,
- 'type' => 1
- )
- );
- // Заявка към базата данни
- $this->_databaseInstance->query($sql, $params);
- // Връща резултата
- return $this->_databaseInstance->getResult();
- }
- /**
- * Създава под категория. Изиска id на бащата.
- * @param type $cateogry_parent
- * @param type $category_name
- * @return type
- */
- public function createCategory($cateogry_parent, $category_name, $category_description) {
- //SQL - Създава под категория.
- $sql = "
- LOCK TABLE categories WRITE;
- SELECT @parentDepth := category_depth FROM categories WHERE category_id = :parent;
- SELECT @myLeft := category_left FROM categories WHERE category_id = :parent;
- UPDATE categories SET category_right = category_right + 2 WHERE category_right > @myLeft;
- UPDATE categories SET category_left = category_left + 2 WHERE category_left > @myLeft;
- INSERT INTO categories(category_name, category_left, category_right,
- category_parent,category_depth, category_desc, category_date)
- VALUES(:name, @myLeft + 1, @myLeft + 2, :parent, @parentDepth+1, :desc, :time);
- UNLOCK TABLES;";
- // Подготовка на параметрите подавани към базата данни.
- $params = array(
- ':parent' => array(
- 'param' => (int) $cateogry_parent,
- 'type' => 1
- ),
- ':name' => array(
- 'param' => (string) $category_name,
- 'type' => 2
- ),
- ':desc' => array(
- 'param' => (string) $category_description,
- 'type' => 2
- ),
- ':time' => array(
- 'param' => (int) time(),
- 'type' => 1
- )
- );
- // Заявка към базата данни
- $this->_databaseInstance->query($sql, $params);
- echo "<pre>" . print_r($this->_databaseInstance->getErrors(), TRUE) . "</pre>";
- // Връща грешките
- return $this->_databaseInstance->getErrors();
- }
- /**
- * Създава главна категория.
- * @param type $category_name
- * @param type $category_desc
- * @return \Models\Category
- */
- public function createRootCategory($category_name, $category_desc) {
- // Създава главна категория
- $sql = "
- LOCK TABLE categories WRITE;
- SELECT @myRight := MAX(category_right) FROM categories;
- INSERT INTO categories(category_name, category_left, category_right, category_desc, category_date)
- VALUES(:name, IFNULL(@myRight + 1,1), IFNULL(@myRight + 2,2), :desc, :time);
- UNLOCK TABLES";
- // Подготовка на параметрите
- $params = array(
- ':name' => array(
- 'param' => (string) $category_name,
- 'type' => 2
- ),
- ':desc' => array(
- 'param' => (string) $category_desc,
- 'type' => 2
- ),
- ':time' => array(
- 'param' => (int) time(),
- 'type' => 1
- )
- );
- // Заявка към базата данни
- $this->_databaseInstance->query($sql, $params);
- // Връща грешките
- return $this->_databaseInstance->getErrors();
- }
- /**
- * Записва новата подредба на категориите.
- * @param type $data
- */
- public function organizeCategories($data) {
- // Извърта масива подаден от AJAX
- foreach ($data as $value) {
- // SQL - заявката.
- $sql = "UPDATE categories SET category_parent = :parent, category_depth = :depth, "
- . "category_left = :left, category_right = :right "
- . "WHERE category_id = :itemID;";
- // Подготовка на параметрите
- $params = array(
- ':parent' => array(
- 'param' => (int) $value['parent_id'],
- 'type' => 1
- ),
- ':itemID' => array(
- 'param' => (int) $value['item_id'],
- 'type' => 1
- ),
- ':depth' => array(
- 'param' => ((int) $value['depth']) - 1,
- 'type' => 1
- ),
- ':left' => array(
- 'param' => ((int) $value['left']) - 1,
- 'type' => 1
- ),
- ':right' => array(
- 'param' => ((int) $value['right']) - 1,
- 'type' => 1
- )
- );
- // Заявка към базата данни
- $this->_databaseInstance->query($sql, $params);
- }
- }
- /**
- * Превръща едномерен масив в многомерен като изискава ид на бащата
- */
- public function buildTree(array $elements, $parentId = 0) {
- $branch = array();
- foreach ($elements as $element) {
- if ($element['category_parent'] == $parentId) {
- $children = $this->buildTree($elements, $element['category_id']);
- if ($children) {
- $element['child'] = $children;
- }
- $branch[] = $element;
- }
- }
- return $branch;
- }
- /**
- * Връща последното вкарано ID.
- * @return type
- */
- public function lastInsertedID() {
- return $this->_databaseInstance->lastID();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment