PHP Classes
Icontem

File: php_cat.class.php


  Search   All class groups All class groups   Latest entries Latest entries   Top 10 charts Top 10 charts   Newsletter Newsletter   Blog Blog   Forums Forums   Help FAQ Help FAQ  
  Login   Register  
Recommend this page to a friend! ReTweet ReTweet Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Ersin Güvenç  >  PHP Cat Nested Model Category Class  >  php_cat.class.php  
File: php_cat.class.php
Role: Class source
Content type: text/plain
Description: main class
Class: PHP Cat Nested Model Category Class
Manage an hierarchy of categories stored in MySQL
 

Contents

Class file image Download
<?php
if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) {exit('No direct access!');}
/*
    Php_Cat Mysql Nested Category Software.
    Copyright (C) 2008  Ersin GÜVENÇ.

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

  ***********************************************************************************************************
  *
  *  @filename: php_cat.class.php
  *  Php version PHP5.
  *  Mysql version 4 and Newer
  *  @author Ersin Güvenç <eguvenc@gmail.com>
  *  @license: GPL
  *  @Revision: 48
  *  @version $Id: php_cat.class.php  2008-07-13 11:24:27
  *  @version: v.0.0.3 @alpha 2
  *
  ************************************************************************************************************
*/
require "config.inc.php";
/*
  #	Constant: Standard Table Definitions
*/
if (!defined ('TABLE_NAME')) define ('TABLE_NAME', 'category');
if (!defined ('CAT_ID')) define ('CAT_ID', 'cat_id');
if (!defined ('PARENT_ID')) define ('PARENT_ID', 'parent_id');
if (!defined ('CAT_NAME')) define ('CAT_NAME', 'cat_name');
if (!defined ('DSC')) define ('DSC', 'dsc');
if (!defined ('CAT_LINK')) define ('CAT_LINK', 'cat_link');
if (!defined ('LEFT')) define ('LEFT', 'lft');
if (!defined ('RIGHT')) define ('RIGHT', 'rgt');
//if (!defined ('TOP')) define ('TOP', 'tp'); //deprecated !

//catch errors.. you can customize exception classes.look at php5 manual.
Class cat_Exception extends Exception {
    function __toString(){
    $msg = "<center>";
    $msg.= "<div style=\"padding:4px;width:400px;background-color:#FFFFCC;border:1px solid #CCFF66;text-align:left;\">";
    $msg.= "<b>".__CLASS__ . ": [Error]:</b>&nbsp;". $this->getMessage()."<br /><b>[Line]:</b>&nbsp;".$this->getLine()."\n";
    $msg.="</div>";
    $msg.="</center>";
    return $msg;
    }
}
//feedback for php_cat actions..
Class feedback {
    static function add($feedback){
    $msg = "<center>";
    $msg.= "<div style=\"padding:4px;width:400px;background-color:#FFFFCC;border:1px solid #CCFF66;text-align:left;\">";
    $msg.= "<b>Info:</b>&nbsp;". $feedback."<br />";
    $msg.="</div>";
    $msg.="</center>";
    echo $msg;
    }
}

Class php_cat
{
     /**
	 *	Define your path separator style.
     *  home > forum > member
	 */
    public $separator = "&nbsp; / &nbsp;";
     /**
	 *  list_cat() method returns to associative array.
     *  @access: private.
     */
    private $list_cat_row = array();
    /**
	 *  path() method returns to associative array.
     *  @access: private.
     */
    private $path_row = array();
    /**
	 *  top_cat() method returns to associative array.
     *  @access: private.
     */
    private $top_row = array();
    /**
	 *  map() method returns to associative array.
     *  @access: private.
     */
    private $map_row = array();
    /**
	 *  children() method returns to associative array.
     *  @access: private.
     */
    private $child_row = array();
     /**
	 *  Create Search Engine friendly links from cat_names..
     *  example : ..?cat=portable-devices-2
     */
    public $seo = false;  //boolean
     /**
	 *  Allowed options variables.. option - default value.
     *  @access: private.
     */
    private $allowed_options = array(
        'separator',
        'area',
        'seo'
        //'menu'
        );
    /**
	 *  if params value not set default values will be set.
     *  @access: private.
     */
    private $default_parameters = array(
        'separator'=>'&nbsp; / &nbsp;',
        'area'=>'admin',
        'seo'=>true
        );

     /**
	 *  Choose working area administrator or client.
     *  @access: private.
     */
    private $area = "client"; //or admin

    /**
	*
	*	@Method:		__construct
    *	@Access:	    public
	*	@Parameters:	1
	*	@Param-1:		Array().
	*	@Description:   Set variables if key exists in allowed options.
	*/
    public function __construct($params = array())
    {
      //Auto set variables & factory...
      $this->factory($params);
    }
    /**
	*
	*	@Method:	    factory.
    *	@Access:	    public
	*	@Parameters:	1
	*	@Param-1:		Array().
	*	@Description:   Auto Set variables if key exists in allowed options.
	*/
    public function factory($params)
    {
    try{
      //Auto set variables...
      if(empty($params))
      $params = $this->default_parameters;
      foreach ($params as $key => $value) {
        if (in_array(strtolower($key), $this->allowed_options,true) && (!is_null($value))):
            $this->{strtolower($key)} = $value;
            else:
                throw new cat_Exception("
                You supply a wrong parameter or
                null value please check
                parameters
                or look
                at the
                documentation.".__FUNCTION__.'error!');
            endif;
        }

      switch ($this->area) {
        case 'client':
            if($this->seo)
            //blabla...
            break;

        case 'admin':
            if($this->seo){
            require_once "seo.class.inc.php";
            require_once "actions.class.php";
            }else{
            //require_once "seo.class.inc.php";
            require_once "actions.class.php";
            }
            break;
        }

    }catch(Exception $e) {echo $e;}
    } //end function

    /**
	*	@Method:        version
	*/
	public function version()
	{
		return 'Php Cat 0.0.3 @alpha 2';
	}
    /**
	*
	*	@Method:		add_cat
    *	@Access:	    public
	*	@Parameters:    1
	*	@Param-1:		data - array() - pointer .. WHERE = 'cat_name' or WHERE = 'parent_id'
	*	@Description:   Add New Category (add a not existing category).
	*/
    public function add_cat($data){
    try{
      if (empty($data['new_name'])) throw new cat_Exception("New category name empty!");
      $params['seo'] = $this->seo;
      Actions::getInstance()->set_params($params);
      Actions::getInstance()->{__FUNCTION__}($data);
    }catch(Exception $e) {echo $e;}
    }
    /**
	*
	*	@Method:		add_subcat
    *	@Access:	    public
	*	@Parameters:	1
	*	@Param-1:		data - array() - pointer .. WHERE = 'cat_name' or WHERE = 'parent_id'
	*	@Description:   Add New Category (add a not existing category).
	*/
    public function add_subcat($data){
    try{
      if (empty($data['new_name'])) throw new cat_Exception("New category name empty!");
      $params['seo'] = $this->seo;
      Actions::getInstance()->set_params($params);
      Actions::getInstance()->{__FUNCTION__}($data);
    }catch(Exception $e) {echo $e;}
    }
    /**
	*
	*	@Method:		del_cat
    *	@Access:	    public
	*	@Parameters:	1
    *   @Param-1:		data - array()
	*	@Description:   Delete current category and all children.
	*/
    public function del_cat($data){
    try{
      Actions::getInstance()->{__FUNCTION__}($data);
    }catch(Exception $e) {echo $e;}
    }
    /**
	*
	*	@Method:		update_cat
    *	@Access:	    public
	*	@Parameters:	1
    *   @Param-1:		data - array()
	*	@Description:   Delete one category not their children.
	*/
    public function update_cat($data){
    try{
      if (empty($data['new_name'])) throw new cat_Exception("Category name empty!");
      $params['seo'] = $this->seo;
      Actions::getInstance()->set_params($params);
      Actions::getInstance()->{__FUNCTION__}($data);
    }catch(Exception $e) {echo $e;}
    }

    ######################
    # LIST CATEGORY SQL
    # You can create data store procudure from original sql.
    ######################
    /*
    SELECT node.cat_name, node.cat_link, node.cat_id, node.dsc, (COUNT( parent.cat_name ) - ( sub_tree.depth +1 )) AS depth
    FROM category AS node, category AS parent, category AS sub_parent,
    (SELECT node.cat_name, (COUNT( parent.cat_name ) -1) AS depth
    FROM category AS node, category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.cat_name = '$parent'
    GROUP BY node.cat_name
    ORDER BY node.lft) AS sub_tree WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.lft
    BETWEEN sub_parent.lft AND sub_parent.rgt AND sub_parent.cat_name = sub_tree.cat_name
    GROUP BY node.cat_name
    HAVING depth >=0
    ORDER BY node.lft
    */
     /**
	*
	*	@Method:		list_cat
    *	@Access:	    public
    *   @param-1:       data -  array()
	*	@Description:   List children in associative arrays with action.
	*/
    public function list_cat($data)
    {
    try{ //exception start
      if($this->seo): $node_cat_link = ',node.'.CAT_LINK; else: $node_cat_link = ""; endif;
      $depth = 1; //category level..

      if(array_key_exists('cat_id',$data)) {
          $parent = $data['cat_id'];
          $index = sprintf("AND node.%s = '%d'",CAT_ID,$parent);  //"AND node.cat_id = '$parent'"
          //$having_depth = ">= 1";
          if($data['cat_id'] == "" || $data['cat_id'] == 0){
          $index = sprintf("AND node.%s = '%d'",PARENT_ID,0);           //"AND node.parent_id = '0'"; //Get top categories...
          //$index = "AND node.lft = '1'";
          //$index = "AND node.rgt=(SELECT MAX(rgt) FROM category)";
          $having_depth = "< 1";
          }else{
          $having_depth = "= ".$depth;
          }
      }elseif(array_key_exists('cat_name',$data)){
          $parent = $data['cat_name'];
          $index = sprintf("AND node.%s = '%s'",CAT_NAME,$parent);
          //...
          if($data['cat_name'] == "") {
          $index = sprintf("AND node.%s = '%d'",PARENT_ID,0);           //"AND node.parent_id = '0'"; //Get top categories...
          //$index = "AND node.lft = '1'";
          //$index = "AND node.rgt=(SELECT MAX(rgt) FROM category)";
          $having_depth = "< 1";
          }else{
          $having_depth = "= ".$depth;  //">=1"
          }
      }elseif(array_key_exists('cat_link',$data)){
          $parent = $data['cat_link'];
          $index = sprintf("AND node.%s = '$parent'",CAT_LINK,$parent);
          //...
          if($data['cat_link'] == ""){
          $index = sprintf("AND node.%s = '%d'",PARENT_ID,0);           //"AND node.parent_id = '0'"; //Get top categories...
          //$index = "AND node.lft = '1'";
          //$index = "AND node.rgt=(SELECT MAX(rgt) FROM category)";
          $having_depth = "< 1";
          }else{
          $having_depth = "= ".$depth;
          }
      }
      $sql = sprintf("SELECT node.%s %s,node.%s, node.%s, (COUNT( parent.%s ) - ( sub_tree.depth +1 )) AS depth
      FROM %s AS node, %s AS parent, %s AS sub_parent,
      (SELECT node.%s, (COUNT( parent.%s ) -1) AS depth
      FROM %s AS node, %s AS parent
      WHERE node.%s BETWEEN parent.%s AND parent.%s
      %s
      GROUP BY node.%s
      ORDER BY node.%s) AS sub_tree WHERE node.%s BETWEEN parent.%s AND parent.%s AND node.%s
      BETWEEN sub_parent.%s AND sub_parent.%s AND sub_parent.%s = sub_tree.%s
      GROUP BY node.%s
      HAVING depth %s
      ORDER BY node.%s",
      CAT_NAME,$node_cat_link,CAT_ID,DSC,CAT_NAME,TABLE_NAME,TABLE_NAME,TABLE_NAME,CAT_ID,
                                                           //group by cat_name problem fixed.
      CAT_ID,TABLE_NAME,TABLE_NAME,LEFT,LEFT,RIGHT,$index,CAT_ID,LEFT,LEFT,LEFT,RIGHT,LEFT,
      LEFT,RIGHT,CAT_ID,CAT_ID,
      //group by cat_name problem fixed.
      CAT_ID,$having_depth,LEFT);
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());
      while($row = mysql_fetch_assoc($query)){
      $this->list_cat_row[] = $row;
      }
      return $this->list_cat_row;
      //exception end
      }catch(Exception $e) {echo $e;}
    }

    ######################
    # CHILDREN SQL
    ######################
    /*
    SELECT node.cat_name, (COUNT(parent.cat_name) - (sub_tree.depth + 1)) AS depth
    FROM category AS node,
    category AS parent,
    category AS sub_parent,
    (SELECT node.cat_name, (COUNT(parent.cat_name) - 1) AS depth
    FROM category AS node,
    category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.cat_name = 'PORTABLE ELECTRONICS'
    GROUP BY node.cat_name
    ORDER BY node.lft) AS sub_tree
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
        AND sub_parent.cat_name = sub_tree.cat_name
    GROUP BY node.cat_name
    HAVING depth = 1  // for show current cat <=1
    ORDER BY node.lft;
    */
     /**
	*
	*	@Method:		children
    *	@Access:	    public
    *   @param-1:       data -  array()
	*	@Description:   Get children of the requested category.
	*/
    public function children($data)
    {
    try{
      if(array_key_exists('cat_id',$data)) {
      $parent = $data['cat_id'];
      $constant = "CAT_ID";
      }elseif(array_key_exists('cat_name',$data)){
      $parent = $data['cat_name'];
      $constant = "CAT_NAME";
      }elseif(array_key_exists('cat_link',$data)){
      $parent = $data['cat_link'];
      $constant = "CAT_LINK";
      }
      $sql = sprintf("SELECT node.%s,node.%s,node.%s, (COUNT(parent.%s) - (sub_tree.depth + 1)) AS depth
      FROM %s AS node,
      %s AS parent,
      %s AS sub_parent,
      (SELECT node.%s, (COUNT(parent.%s) - 1) AS depth
      FROM %s AS node,
      %s AS parent
      WHERE node.%s BETWEEN parent.%s AND parent.%s
      AND node.%s = '%s'
      GROUP BY node.%s
      ORDER BY node.%s) AS sub_tree
      WHERE node.%s BETWEEN parent.%s AND parent.%s
          AND node.%s BETWEEN sub_parent.%s AND sub_parent.%s
          AND sub_parent.%s = sub_tree.%s
      GROUP BY node.%s
      HAVING depth = 1
      ORDER BY node.lft",CAT_NAME,CAT_LINK,CAT_ID,CAT_ID,TABLE_NAME,TABLE_NAME,TABLE_NAME,
      CAT_ID,CAT_ID,TABLE_NAME,TABLE_NAME,LEFT,LEFT,RIGHT,constant($constant),$parent,
      CAT_ID,LEFT,LEFT,LEFT,RIGHT,LEFT,LEFT,RIGHT,CAT_ID,CAT_ID,CAT_ID,LEFT);
       /* return associative array*/
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());
      while($row = mysql_fetch_assoc($query)){
      $this->child_row[] = $row;
      }
      return $this->child_row;
      //exception end
      }catch(Exception $e) {echo $e;}
    }

    ######################
    # PATH SQL
    ######################
    /*
    SELECT parent.cat_name
    FROM category AS node,
    category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.cat_name = 'FLASH'
    ORDER BY parent.lft;
    */
    /**
	*
	*	@Method:		path
    *	@Access:	    public
    *   @param-1:       data - array()
	*	@Description:   Get current single path.
	*/
    public function path($data)
    {
    try{
      if(array_key_exists('cat_id',$data)) {
      $node = $data['cat_id'];
      $constant = "CAT_ID";
      }elseif(array_key_exists('cat_name',$data)){
      $node = $data['cat_name'];
      $constant = "CAT_NAME";
      }elseif(array_key_exists('cat_link',$data)){
      $node = $data['cat_link'];
      $constant = "CAT_LINK";
      }
      $sql = sprintf("SELECT parent.%s,parent.%s,parent.%s
      FROM %s AS node,
      %s AS parent
      WHERE node.%s BETWEEN parent.%s AND parent.%s
      AND node.%s = '%s'
      ORDER BY parent.%s",CAT_NAME,CAT_LINK,CAT_ID,TABLE_NAME,TABLE_NAME,
      LEFT,LEFT,RIGHT,constant($constant),$node,LEFT);
      /* return associative array*/
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());
      while($row = mysql_fetch_assoc($query)){
      $this->path_row[] = $row;
      }
      return $this->path_row;
      //exception end
      }catch(Exception $e) {echo $e;}
    }
    ######################
    # TOP CATEGORY SQL
    ######################
    /*
    SELECT * FROM category WHERE parent_id='-1';
    */
    /**
	*
	*	@Method:		top_cat
    *	@Access:	    public
    *   @param-1:       data - array()
	*	@Description:   Get top categories  - with (0).
	*/
    public function top_cat($data)
    {
    try{
      $sql = sprintf("SELECT * FROM %s WHERE %s='%d'",TABLE_NAME,PARENT_ID,0);
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());
      while($row = mysql_fetch_assoc($query)){
        $this->top_row[] = $row;
      }
      return $this->top_row;
      //exception end
      }catch(Exception $e) {echo $e;}
    }
     /**
	*
	*	@Method:		top_cat
    *	@Access:	    public
    *   @param-1:       data - array()
	*	@Description:   return the last biggest category id.
	*/
    ######################
    # MAX CATEGORY SQL
    ######################
    /*
    SELECT cat_id,cat_link,cat_name, MAX(rgt) AS max_c FROM category
    WHERE parent_id='-1' GROUP BY cat_name ORDER BY max_c DESC LIMIT 1
    */
    public function max_cat()
    {
    try{
      $sql = sprintf("SELECT %s,%s,%s, MAX(%s) AS max_c FROM %s
      WHERE %s='%d' GROUP BY %s ORDER BY max_c DESC LIMIT 1",CAT_ID,
      CAT_LINK,CAT_NAME,RIGHT,TABLE_NAME,PARENT_ID,0,CAT_NAME);
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());
      $row = mysql_fetch_assoc($query);
      return $row;
    //exception end
    }catch(Exception $e) {echo $e;}
    }
    ######################
    # MAP CATEGORY SQL
    ######################
    /*
    SELECT node.cat_name, node.cat_link, node.cat_id, node.dsc,
    (COUNT(parent.cat_name) - 1) AS depth
    FROM category AS node,
    category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    GROUP BY node.cat_name
    ORDER BY node.lft
    */
     /**
	*
	*	@Method:		map
    *	@Access:	    public
	*	@Description:   index all categories into array.
	*/
    public function map()
    {
    try{
      $sql = sprintf("SELECT node.%s, node.%s, node.%s, node.%s,
      (COUNT(parent.%s) - 1) AS depth
      FROM %s AS node,
      %s AS parent
      WHERE node.%s BETWEEN parent.%s AND parent.%s
      GROUP BY node.%s
      ORDER BY node.%s",CAT_NAME,CAT_LINK,CAT_ID,DSC,CAT_NAME,TABLE_NAME,
      TABLE_NAME,LEFT,LEFT,RIGHT,CAT_NAME,LEFT);
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());

      while($row = mysql_fetch_assoc($query)){
      $this->map_row[] = $row;
      }
      return $this->map_row;
      //exception end
      }catch(Exception $e) {echo $e;}
    }
    ######################
    # DEPTH CATEGORY SQL
    ######################
    /*
    SELECT node.cat_name, node.cat_link, node.cat_id,
    (COUNT(parent.cat_name) - 1) AS depth
    FROM category AS node,
    category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.cat_name = 'FLASH'
    GROUP BY node.cat_name
    ORDER BY node.lft
    */
     /**
	*
	*	@Method:		depth
    *	@Access:	    public
	*	@Description:   get depth of the current category.
	*/
    public function depth($data)
    {
    try{
      if(array_key_exists('cat_id',$data)) {
      $node = $data['cat_id'];
      $constant = "CAT_ID";
      }elseif(array_key_exists('cat_name',$data)){
      $node = $data['cat_name'];
      $constant = "CAT_NAME";
      }elseif(array_key_exists('cat_link',$data)){
      $node = $data['cat_link'];
      $constant = "CAT_LINK";
      }
      $sql = sprintf("SELECT node.%s, node.%s, node.%s,
      (COUNT(parent.%s) - 1) AS depth
      FROM %s AS node,
      %s AS parent
      WHERE node.%s BETWEEN parent.%s AND parent.%s
      AND node.%s = '%s'
      GROUP BY node.%s
      ORDER BY node.%s",CAT_NAME,CAT_LINK,CAT_ID,CAT_NAME,TABLE_NAME,
      TABLE_NAME,LEFT,LEFT,RIGHT,constant($constant),$node,CAT_NAME,LEFT);
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());
      $row = mysql_fetch_assoc($query);
      return $row;
      //exception end
      }catch(Exception $e) {echo $e;}
    }

    /**
	*
	*	@Method:		fetch_num
    *	@Access:	    public
	*	@Description:   check database have any record or not
	*/
    public function fetch_num(){
    try{
      $sql = sprintf("SELECT * FROM %s",TABLE_NAME);
      $query = mysql_query($sql); if(!$query) throw new cat_Exception(mysql_error());
      return mysql_num_rows($query);
      }catch(Exception $e) {echo $e;}
    }

} // end of the php_cat class...

?>

 
  Advertise on this site Advertise on this site   Site map Site map   Statistics Statistics   Site tips Site tips   Privacy policy Privacy policy   Contact Contact  

For more information send a message to :
info at phpclasses dot org.
Copyright (c) Icontem 1999-2009 PHP Classes - PHP Class Scripts
  PHP Book Reviews - Reviews of books and other products