fabi0

Untitled

May 26th, 2014
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.05 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Description of Category
  5.  *
  6.  * @author Ivaylo Ivanov
  7.  */
  8.  
  9. namespace Models;
  10.  
  11. class Category {
  12.  
  13.     /**
  14.      * Summary
  15.      *
  16.      * @var object \Model\Database
  17.      */
  18.     private $_databaseInstance;
  19.  
  20.     /**
  21.      * Изисква инстанция към база данни.
  22.      * @param type $databaseInstance
  23.      */
  24.     public function __construct($databaseInstance) {
  25.         $this->_databaseInstance = $databaseInstance;
  26.     }
  27.  
  28.     /**
  29.      * Връща масив с всички категории и броя на дискусиите като ключа е id-то на категорията
  30.      *
  31.      * @return array() description
  32.      */
  33.     public function getCategoryTree() {
  34.         // Инициализиране на масив който ще бъде върнат по късно.
  35.         $result = array();
  36.  
  37.         // SQL - Взима всички категории и броя на постовете в тях
  38.         $sql = "
  39.            SELECT category_id, category_name, category_parent, category_depth, discussion_count
  40.            FROM categories
  41.            LEFT JOIN discussions
  42.            ON discussion_category = category_id
  43.            ORDER BY category_left";
  44.  
  45.         // Заявка към базата данни
  46.         $this->_databaseInstance->query($sql, array(), 2);
  47.  
  48.         // Пълни масива
  49.         foreach ($this->_databaseInstance->getResult() as $value) {
  50.             $result[(int) $value['category_id']]['category_parent'] = (int) $value['category_parent'];
  51.             $result[(int) $value['category_id']]['category_name'] = (string) $value['category_name'];
  52.             $result[(int) $value['category_id']]['category_posts'] = (int) $value['discussion_count'];
  53.             $result[(int) $value['category_id']]['category_depth'] = (int) $value['category_depth'];
  54.         }
  55.  
  56.         // Връща масива
  57.         return $result;
  58.     }
  59.  
  60.     /**
  61.      * Промяна името на категорията. Връща масив от грешки ако има такива.
  62.      * @param type $category_id
  63.      * @param type $newName
  64.      * @return type
  65.      */
  66.     public function renameCategory($category_id, $newName) {
  67.  
  68.         // SQL - преименуване на категория
  69.         $sql = "UPDATE categories SET category_name = :name WHERE category_id = :id;";
  70.  
  71.         // Подготовка на параметрите подавани към базата данни.
  72.         $params = array(
  73.             ':name' => array(
  74.                 'param' => (string) $newName,
  75.                 'type' => 2
  76.             ),
  77.             ':id' => array(
  78.                 'param' => (int) $category_id,
  79.                 'type' => 1
  80.             )
  81.         );
  82.  
  83.         // Заявка към базата данни
  84.         $this->_databaseInstance->query($sql, $params);
  85.  
  86.         // Връща метода getErrors()
  87.         return $this->_databaseInstance->getErrors();
  88.     }
  89.  
  90.     /**
  91.      * Изтрива категория и нейните под категории по зададено id.
  92.      * @param type $category_id
  93.      * @return type
  94.      */
  95.     public function deleteCategory($category_id) {
  96.  
  97.         // SQL - Изтрива категория и нейните под категории по зададено id.
  98.         $sql = "
  99.            LOCK TABLE categories WRITE;
  100.            SELECT @myLeft := category_left, @myRight := category_right, @myWidth := category_right - category_left + 1
  101.            FROM categories WHERE category_id = :id;
  102.            DELETE FROM categories WHERE category_left BETWEEN @myLeft AND @myRight;
  103.            UPDATE categories SET category_right = category_right - @myWidth WHERE category_right > @myRight;
  104.            UPDATE categories SET category_left = category_left - @myWidth WHERE category_left > @myRight;
  105.            UNLOCK TABLES;";
  106.  
  107.         // Подготовка на параметрите подавани към базата данни.
  108.         $params = array(
  109.             ':id' => array(
  110.                 'param' => (int) $category_id,
  111.                 'type' => 1
  112.             )
  113.         );
  114.  
  115.         // Заявка към базата данни
  116.         $this->_databaseInstance->query($sql, $params);
  117.  
  118.         // Връща резултата
  119.         return $this->_databaseInstance->getResult();
  120.     }
  121.  
  122.     /**
  123.      * Създава под категория. Изиска id на бащата.
  124.      * @param type $cateogry_parent
  125.      * @param type $category_name
  126.      * @return type
  127.      */
  128.     public function createCategory($cateogry_parent, $category_name, $category_description) {
  129.  
  130.         //SQL - Създава под категория.
  131.         $sql = "
  132.            LOCK TABLE categories WRITE;
  133.            SELECT @parentDepth := category_depth FROM categories WHERE category_id = :parent;
  134.            SELECT @myLeft := category_left FROM categories WHERE category_id = :parent;
  135.            UPDATE categories SET category_right = category_right + 2 WHERE category_right > @myLeft;
  136.            UPDATE categories SET category_left = category_left + 2 WHERE category_left > @myLeft;
  137.            INSERT INTO categories(category_name, category_left, category_right,
  138.            category_parent,category_depth, category_desc, category_date)
  139.            VALUES(:name, @myLeft + 1, @myLeft + 2, :parent, @parentDepth+1, :desc, :time);
  140.            UNLOCK TABLES;";
  141.  
  142.         // Подготовка на параметрите подавани към базата данни.
  143.         $params = array(
  144.             ':parent' => array(
  145.                 'param' => (int) $cateogry_parent,
  146.                 'type' => 1
  147.             ),
  148.             ':name' => array(
  149.                 'param' => (string) $category_name,
  150.                 'type' => 2
  151.             ),
  152.             ':desc' => array(
  153.                 'param' => (string) $category_description,
  154.                 'type' => 2
  155.             ),
  156.             ':time' => array(
  157.                 'param' => (int) time(),
  158.                 'type' => 1
  159.             )
  160.         );
  161.  
  162.         // Заявка към базата данни
  163.         $this->_databaseInstance->query($sql, $params);
  164.  
  165.         echo "<pre>" . print_r($this->_databaseInstance->getErrors(), TRUE) . "</pre>";
  166.         // Връща грешките
  167.         return $this->_databaseInstance->getErrors();
  168.     }
  169.  
  170.     /**
  171.      * Създава главна категория.
  172.      * @param type $category_name
  173.      * @param type $category_desc
  174.      * @return \Models\Category
  175.      */
  176.     public function createRootCategory($category_name, $category_desc) {
  177.  
  178.         // Създава главна категория
  179.         $sql = "
  180.            LOCK TABLE categories WRITE;
  181.            SELECT @myRight := MAX(category_right) FROM categories;
  182.            INSERT INTO categories(category_name, category_left, category_right, category_desc, category_date)
  183.            VALUES(:name, IFNULL(@myRight + 1,1), IFNULL(@myRight + 2,2), :desc, :time);
  184.            UNLOCK TABLES";
  185.  
  186.         // Подготовка на параметрите
  187.         $params = array(
  188.             ':name' => array(
  189.                 'param' => (string) $category_name,
  190.                 'type' => 2
  191.             ),
  192.             ':desc' => array(
  193.                 'param' => (string) $category_desc,
  194.                 'type' => 2
  195.             ),
  196.             ':time' => array(
  197.                 'param' => (int) time(),
  198.                 'type' => 1
  199.             )
  200.         );
  201.  
  202.         // Заявка към базата данни
  203.         $this->_databaseInstance->query($sql, $params);
  204.  
  205.         // Връща грешките
  206.         return $this->_databaseInstance->getErrors();
  207.     }
  208.  
  209.     /**
  210.      * Записва новата подредба на категориите.
  211.      * @param type $data
  212.      */
  213.     public function organizeCategories($data) {
  214.  
  215.         // Извърта масива подаден от AJAX
  216.         foreach ($data as $value) {
  217.  
  218.             // SQL - заявката.
  219.             $sql = "UPDATE categories SET category_parent = :parent, category_depth = :depth, "
  220.                     . "category_left = :left, category_right = :right "
  221.                     . "WHERE category_id = :itemID;";
  222.  
  223.             // Подготовка на параметрите
  224.             $params = array(
  225.                 ':parent' => array(
  226.                     'param' => (int) $value['parent_id'],
  227.                     'type' => 1
  228.                 ),
  229.                 ':itemID' => array(
  230.                     'param' => (int) $value['item_id'],
  231.                     'type' => 1
  232.                 ),
  233.                 ':depth' => array(
  234.                     'param' => ((int) $value['depth']) - 1,
  235.                     'type' => 1
  236.                 ),
  237.                 ':left' => array(
  238.                     'param' => ((int) $value['left']) - 1,
  239.                     'type' => 1
  240.                 ),
  241.                 ':right' => array(
  242.                     'param' => ((int) $value['right']) - 1,
  243.                     'type' => 1
  244.                 )
  245.             );
  246.  
  247.             // Заявка към базата данни
  248.             $this->_databaseInstance->query($sql, $params);
  249.         }
  250.     }
  251.  
  252.     /**
  253.      * Превръща едномерен масив в многомерен като изискава ид на бащата
  254.      */
  255.     public function buildTree(array $elements, $parentId = 0) {
  256.         $branch = array();
  257.  
  258.         foreach ($elements as $element) {
  259.             if ($element['category_parent'] == $parentId) {
  260.                 $children = $this->buildTree($elements, $element['category_id']);
  261.                 if ($children) {
  262.                     $element['child'] = $children;
  263.                 }
  264.                 $branch[] = $element;
  265.             }
  266.         }
  267.         return $branch;
  268.     }
  269.  
  270.     /**
  271.      * Връща последното вкарано ID.
  272.      * @return type
  273.      */
  274.     public function lastInsertedID() {
  275.         return $this->_databaseInstance->lastID();
  276.     }
  277.  
  278. }
Advertisement
Add Comment
Please, Sign In to add comment