Index: trunk/kernel/include/category.php =================================================================== diff -u -r642 -r667 --- trunk/kernel/include/category.php (.../category.php) (revision 642) +++ trunk/kernel/include/category.php (.../category.php) (revision 667) @@ -1,2318 +1,4635 @@ -clsItem(TRUE); - //$this->adodbConnection = &GetADODBConnection(); - $this->tablename = GetTablePrefix()."Category"; - $this->type=1; - $this->BasePermission ="CATEGORY"; - $this->id_field = "CategoryId"; - $this->TagPrefix = "cat"; - - $this->debuglevel=0; - /* keyword highlighting */ - $this->OpenTagVar = "Category_Highlight_OpenTag"; - $this->CloseTagVar = "Category_Highlight_CloseTag"; - - if($CategoryId!=NULL) - { - $this->LoadFromDatabase($CategoryId); - $this->Permissions = new clsPermList($CategoryId,$objSession->Get("GroupId")); - - } - else - { - $this->Permissions = new clsPermList(); - - } - } - - function ClearCacheData() - { - $env = "':m".$this->Get("CategoryId")."%'"; - DeleteTagCache("m_itemcount","Category%"); - DeleteTagCache("m_list_cats","",$env); - } - - - function Delete() - { - global $CatDeleteList; - - if(!is_array($CatDeleteList)) - $CatDeleteList = array(); - if($this->UsingTempTable()==FALSE) - { - $this->Permissions->Delete_CatPerms($this->Get("CategoryId")); - $sql = "DELETE FROM ".GetTablePrefix()."CountCache WHERE CategoryId=".$this->Get("CategoryId"); - $this->adodbConnection->Execute($sql); - $CatDeleteList[] = $this->Get("CategoryId"); - if($this->Get("CreatedById")>0) - $this->SendUserEventMail("CATEGORY.DELETE",$this->Get("CreatedById")); - $this->SendAdminEventMail("CATEGORY.DELETE"); - - parent::Delete(); - $this->ClearCacheData(); - } - else - { - parent::Delete(); - } - } - - - function Update($UpdatedBy=NULL) - { - parent::Update($UpdatedBy); - if($this->tablename==GetTablePrefix()."Category") - $this->ClearCacheData(); - } - - function Create() - { - if((int)$this->Get("CreatedOn")==0) - $this->Set("CreatedOn",date("U")); - parent::Create(); - if($this->tablename==GetTablePrefix()."Category") - $this->ClearCacheData(); - } - - function SetParentId($value) - { - //Before we set a parent verify that propsed parent is not our child. - //Otherwise it will cause recursion. - - $id = $this->Get("CategoryId"); - $path = $this->Get("ParentPath"); - $sql = sprintf("SELECT CategoryId From ".GetTablePrefix()."Category WHERE ParentPath LIKE '$path%' AND CategoryId = %d ORDER BY ParentPath",$value); - $rs = $this->adodbConnection->SelectLimit($sql,1,0); - if(!$rs->EOF) - { - return; - } - $this->Set("ParentId",$value); - } - - function Approve() - { - global $objSession; - - if($this->Get("CreatedById")>0) - $this->SendUserEventMail("CATEGORY.APPROVE",$this->Get("CreatedById")); - $this->SendAdminEventMail("CATEGORY.APPROVE"); - $this->Set("Status", 1); - $this->Update(); - } - - function Deny() - { - global $objSession; - - if($this->Get("CreatedById")>0) - $this->SendUserEventMail("CATEGORY.DENY",$this->Get("CreatedById")); - $this->SendAdminEventMail("CATEGORY.DENY"); - - $this->Set("Status", 0); - $this->Update(); - } - - - function IsEditorsPick() - { - return $this->Is("EditorsPick"); - } - - function SetEditorsPick($value) - { - $this->Set("EditorsPick", $value); - } - - function GetSubCats($limit=NULL, $target_template=NULL, $separator=NULL, $anchor=NULL, $ending=NULL, $class=NULL) - { - global $m_var_list, $m_var_list_update, $var_list, $var_list_update; - - $sql = "SELECT CategoryId, Name from ".GetTablePrefix()."Category where ParentId=".$this->Get("CategoryId")." AND Status=1 ORDER BY Priority"; - if(isset($limit)) - { - $rs = $this->adodbConnection->SelectLimit($sql, $limit, 0); - } - else - { - $rs = $this->adodbConnection->Execute($sql); - } - $count=1; - - $class_name = is_null($class)? "catsub" : $class; - - - while($rs && !$rs->EOF) - { - - if(!is_null($target_template)) - { - $var_list_update["t"] = $target_template; - } - $m_var_list_update["cat"] = $rs->fields["CategoryId"]; - $m_var_list_update["p"] = "1"; - $cat_name = $rs->fields['Name']; - if (!is_null($anchor)) - $ret .= "$cat_name"; - else - $ret .= "$cat_name"; - - $rs->MoveNext(); - if(!$rs->EOF) - { - $ret.= is_null($separator)? ", " : $separator; - } - } - if(strlen($ret)) - $ret .= is_null($ending)? " ..." : $ending; - - unset($var_list_update["t"], $m_var_list_update["cat"], $m_var_list_update["p"]); - - return $ret; - } - - function Validate() - { - global $objSession; - - $dataValid = true; - if(!isset($this->m_Type)) - { - $Errors->AddError("error.fieldIsRequired",'Type',"","","clsCategory","Validate"); - $dataValid = false; - } - - if(!isset($this->m_Name)) - { - $Errors->AddError("error.fieldIsRequired",'Name',"","","clsCategory","Validate"); - $dataValid = false; - } - - if(!isset($this->m_Description)) - { - $Errors->AddError("error.fieldIsRequired",'Description',"","","clsCategory","Validate"); - $dataValid = false; - } - - if(!isset($this->m_Visible)) - { - $Errors->AddError("error.fieldIsRequired",'Visible',"","","clsCategory","Validate"); - $dataValid = false; - } - - if(!isset($this->m_CreatedById)) - { - $Errors->AddError("error.fieldIsRequired",'CreatedBy',"","","clsCategory","Validate"); - $dataValid = false; - } - return $dataValid; - } - - function UpdateCachedPath() - { - if($this->UsingTempTable()==TRUE) - return; - $Id = $this->Get("CategoryId"); - $Id2 = $Id; - $NavPath = ""; - $path = array(); - do - { - $rs = $this->adodbConnection->Execute("SELECT ParentId,Name from ".$this->tablename." where CategoryId='$Id2'"); - $path[] = $Id2; - $nav[] = $rs->fields["Name"]; - if ($rs && !$rs->EOF) - { - //echo $path; - $Id2 = $rs->fields["ParentId"]; - - } - else - $Id2="0"; //to prevent infinite loop - } while ($Id2 != "0"); - $parentpath = "|".implode("|",array_reverse($path))."|"; - $NavBar = implode(">",array_reverse($nav)); - //echo "
\n"; - //$rs = $this->adodbConnection->Execute("update Category set ParentPath='$path' where CategoryId='$Id'"); - if($this->Get("ParentPath")!=$parentpath || $this->Get("CachedNavbar")!=$NavBar) - { - $this->Set("ParentPath",$parentpath); - $this->Set("CachedNavbar",$NavBar); - $this->Update(); - } - } - - function GetCachedNavBar() - { - $res = $this->Get("CachedNavbar"); - if(!strlen($res)) - { - $this->UpdateCachedPath(); - $res = $this->Get("CachedNavbar"); - } - return $res; - } - function Increment_Count() - { - $this->Increment("CachedDescendantCatsQty"); - } - - function Decrement_Count() - { - $this->Decrement("CachedDescendantCatsQty"); - $this->Update(); - } - - function LoadFromDatabase($Id) - { - global $objSession, $Errors, $objConfig; - if($Id==0) - return FALSE; - - if(!isset($Id)) - { - $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); - return false; - } - $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE CategoryId = '%s'",$Id); - $result = $this->adodbConnection->Execute($sql); - if ($result === false) - { - $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase"); - return false; - } - $data = $result->fields; - if(is_array($data)) - { - $this->SetFromArray($data); - $this->Clean(); - } - else - return false; - return true; - } - - function SetNewItem() - { - global $objConfig; - - $value = $this->Get("CreatedOn"); - - $cutoff = adodb_date("U") - ($objConfig->Get("Category_DaysNew") * 86400); - $this->IsNew = FALSE; - if($value>$cutoff) - $this->IsNew = TRUE; - return $this->IsNew; - } - - - function LoadFromResourceId($Id) - { - global $objSession, $Errors; - if(!isset($Id)) - { - $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromResourceId"); - return false; - } - $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ResourceId = '%s'",$Id); - $result = $this->adodbConnection->Execute($sql); - if ($result === false) - { - $Errors->AddError("error.DatabaseError",NULL,$adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromResourceId"); - return false; - } - $data = $result->fields; - if(is_array($data)) - $this->SetFromArray($data); - else - return false; - return true; - } - - function GetParentField($fieldname,$skipvalue,$default) - { - /* this function moves up the category tree until a value for $field other than - $skipvalue is returned. if no matches are made, then $default is returned */ - - $path = $this->Get("ParentPath"); - $path = substr($path,1,-1); //strip off the first & last tokens - $aPath = explode("|",$path); - $aPath = array_slice($aPath,0,-1); - $ParentPath = implode("|",$aPath); - $sql = "SELECT $fieldname FROM category WHERE $fieldname != '$skipvalue' AND ParentPath LIKE '$ParentPath' ORDER BY ParentPath DESC"; - $rs = $this->adodbConnection->execute($sql); - if($rs && !$rs->EOF) - { - $ret = $rs->fields[$fieldname]; - } - else - $ret = $default; - $update = "UPDATE ".$this->SourceTable." SET $fieldname='$ret' WHERE CategoryId=".$this->Get("CategoryId"); - $this->adodbConnection->execute($update); - return $ret; - } - - - - function GetCustomField($fieldName) - { - global $objSession, $Errors; - - if(!isset($this->m_CategoryId)) - { - $Errors->AddError("error.appError","Get field is required in order to set custom field values","","",get_class($this),"GetCustomField"); - return false; - } - - return GetCustomFieldValue($this->m_CategoryId,"category",$fieldName); - } - - function SetCustomField($fieldName, $value) - { - global $objSession, $Errors; - - if(!isset($this->m_CategoryId)) - { - $Errors->AddError("error.appError","Set field is required in order to set custom field values","","",get_class($this),"SetCustomField"); - return false; - } - return SetCustomFieldValue($this->m_CategoryId,"category",$fieldName,$value); - } - - function LoadPermissions($first=1) - { - /* load all permissions for group on this category */ - $this->Permissions->CatId=$this->Get("CategoryId"); - if($this->Permissions->NumItems()==0) - { - $cats = explode("|",substr($this->Get("ParentPath"),1,-1)); - if(is_array($cats)) - { - $cats = array_reverse($cats); - $cats[] = 0; - foreach($cats as $catid) - { - $this->Permissions->LoadCategory($catid); - } - } - } - if($this->Permissions->NumItems()==0) - { - if($first==1) - { - $this->Permissions->GroupId=NULL; - $this->LoadPermissions(0); - } - } - } - - function PermissionObject() - { - return $this->Permissions; - } - - function PermissionItemObject($PermissionName) - { - $p = $this->Permissions->GetPermByName($PermissionName); - return $p; - } - - function HasPermission($PermissionName,$GroupID) - { - global $objSession; - - $perm = $this->PermissionValue($PermissionName,$GroupID); -// echo "Permission $PermissionName for $GroupID is $perm in ".$this->Get("CategoryId")."
\n"; - if(!$perm) - { - $perm=$objSession->HasSystemPermission("ROOT"); - } - return ($perm==1); - } - - function PermissionValue($PermissionName,$GroupID) - { - //$this->LoadPermissions(); - $ret=NULL; - //echo "Looping though ".count($this->Permissions)." permissions Looking for $PermissionName of $GroupID
\n"; - if($this->Permissions->GroupId != $GroupID) - { - $this->Permissions->Clear(); - $this->Permissions->GroupId = $GroupID; - } - - $this->Permissions->CatId=$this->Get("CategoryId"); - $ret = $this->Permissions->GetPermissionValue($PermissionName); - if($ret == NULL) - { - $cats = explode("|",substr($this->Get("ParentPath"),1,-1)); - - if(is_array($cats)) - { - $cats = array_reverse($cats); - $cats[] = 0; - foreach($cats as $catid) - { - $this->Permissions->LoadCategory($catid); - $ret = $this->Permissions->GetPermissionValue($PermissionName); - if(is_numeric($ret)) - break; - } - } - } - return $ret; - } - - function SetPermission($PermName,$GroupID,$Value,$Type=0) - { - global $objSession, $objPermissions, $objGroups; - - if($this->Permissions->GroupId != $GroupID) - { - $this->Permissions->Clear(); - $this->Permissions->GroupId = $GroupID; - } - - if($objSession->HasSystemPermission("GRANT")) - { - $current = $this->PermissionValue($PermName,$GroupID); - - if($current == NULL) - { - $this->Permissions->Add_Permission($this->Get("CategoryId"),$GroupId,$PermName,$Value,$Type); - } - else - { - $p = $this->Permissions->GetPermByName($PermName); - if($p->Inherited==FALSE) - { - $p->Set("PermissionValue",$Value); - $p->Update(); - } - else - $this->Permissions->Add_Permission($this->Get("CategoryId"),$GroupId,$PermName,$Value,$Type); - } - if($PermName == "CATEGORY.VIEW") - { - $Groups = $objGroups->GetAllGroupList(); - $ViewList = $this->Permissions->GetGroupPermList($this,"CATEGORY.VIEW",$Groups); - $this->SetViewPerms("CATEGORY.VIEW",$ViewList,$Groups); - $this->Update(); - } - } - } - - function SetViewPerms($PermName,$acl,$allgroups) - { - global $objPermCache; - - $dacl = array(); - if(!is_array($allgroups)) - { - global $objGroups; - $allgroups = $objGroups->GetAllGroupList(); - } - - for($i=0;$iPermissions->GetPermId($PermName); - $pc = $objPermCache->GetPerm($this->Get("CategoryId"),$PermId); - if(is_object($pc)) - { - $pc->Set("ACL",$aval); - $pc->Set("DACL",$dval); - $pc->Update(); - } - else - $objPermCache->AddPermCache($this->Get("CategoryId"),$PermId,$aval,$dval); - - //$this->Update(); - } - - function GetACL($PermName) - { - global $objPermCache; - - $ret = ""; - $PermId = $this->Permissions->GetPermId($PermName); - $pc = $objPermCache->GetPerm($this->Get("CategoryId"),$PermId); - if(is_object($pc)) - { - $ret = $this->Get("ACL"); - } - return $ret; - } - - - function UpdateACL() - { - global $objGroups, $objPermCache; - - $glist = $objGroups->GetAllGroupList(); - - $ViewList = $this->Permissions->GetGroupPermList($this,"CATEGORY.VIEW",$glist); - $perms = $this->Permissions->GetAllViewPermGroups($this,$glist); - //echo "
";print_r($perms); echo "
"; - foreach($perms as $PermName => $l) - { - $this->SetViewPerms($PermName,$l,$glist); - } - } - - function Cat_Link() - { - global $m_var_list_update; - - $m_var_list_update["cat"] = $this->Get("CategoryId"); - $ret = GetIndexURL()."?env=".BuildEnv(); - unset($m_var_list_update["cat"]); - return $ret; - } - - function Parent_Link() - { - global $m_var_list_update; - - $m_var_list_update["cat"] = $this->Get("ParentId"); - $ret = GetIndexURL()."?env=".BuildEnv(); - unset($m_var_list_update["cat"]); - return $ret; - } - - function Admin_Parent_Link($page=NULL) - { - global $m_var_list_update; - - if(!strlen($page)) - $page = $_SERVER["PHP_SELF"]; - $m_var_list_update["cat"] = $this->Get("ParentId"); - $ret = $page."?env=".BuildEnv(); - unset($m_var_list_update["cat"]); - return $ret; - } - - function StatusIcon() - { - global $imagesURL; - - $ret = $imagesURL."/itemicons/"; - - switch($this->Get("Status")) - { - case STATUS_DISABLED: - $ret .= "icon16_cat_disabled.gif"; - break; - case STATUS_PENDING: - $ret .= "icon16_cat_pending.gif"; - break; - case STATUS_ACTIVE: - $img = "icon16_cat.gif"; - if($this->IsPopItem()) - $img = "icon16_cat_pop.gif"; - if($this->IsHotItem()) - $img = "icon16_cat_hot.gif"; - if($this->IsNewItem()) - $img = "icon16_cat_new.gif"; - if($this->Is("EditorsPick")) - $img = "icon16_car_pick.gif"; - $ret .= $img; - break; - } - return $ret; - } - - function SubCatCount() - { - $ret = $this->Get("CachedDescendantCatsQty"); - - $sql = "SELECT COUNT(*) as SubCount FROM ".$this->tablename." WHERE ParentPath LIKE '".$this->Get("ParentPath")."%' AND CategoryId !=".$this->Get("CategoryId"); - $rs = $this->adodbConnection->Execute($sql); - if($rs && !$rs->EOF) - { - $val = $rs->fields["SubCount"]; - if($val != $this->Get("CachedDescendantCatsQty")) - { - $this->Set("CachedDescendantCatsQty",$val); - $this->Update(); - } - $ret = $this->Get("CachedDescendantCatsQty"); - } - return $ret; - } - - function GetSubCatIds() - { - $sql = "SELECT CategoryId FROM ".$this->tablename." WHERE ParentPath LIKE '".$this->Get("ParentPath")."%' AND CategoryId !=".$this->Get("CategoryId"); - $rs = $this->adodbConnection->Execute($sql); - $ret = array(); - while($rs && !$rs->EOF) - { - $ret[] = $rs->fields["CategoryId"]; - $rs->MoveNext(); - } - return $ret; - } - - function GetParentIds() - { - $Parents = array(); - $ParentPath = $this->Get("ParentPath"); - if(strlen($ParentPath)) - { - $ParentPath = substr($ParentPath,1,-1); - $Parents = explode("|",$ParentPath); - } - return $Parents; - } - - function ItemCount($ItemType="") - { - global $objItemTypes,$objCatList,$objCountCache; - - if(!is_numeric($ItemType)) - { - $TypeId = $objItemTypes->GetItemTypeValue($ItemType); - } - else - $TypeId = (int)$ItemType; - - //$path = $this->Get("ParentPath"); - //$path = substr($path,1,-1); - //$path = str_replace("|",",",$path); - $path = implode(",",$this->GetSubCatIds()); - if(strlen($path)) - { - $path = $this->Get("CategoryId").",".$path; - } - else - $path = $this->Get("CategoryId"); - - $res = TableCount(GetTablePrefix()."CategoryItems","CategoryId IN ($path)",FALSE); - - return $res; - } - - function ParseObject($element) - { - global $objConfig, $objCatList, $rootURL, $var_list, $var_list_update, $m_var_list_update, $objItemTypes,$objCountCache; - $extra_attribs = ExtraAttributes($element->attributes); - - //print_r($element); - if(strtolower($element->name)==$this->TagPrefix) - { - $field = strtolower( $element->GetAttributeByName('_field') ); - switch($field) - { - case "name": - case "Name": - /* - @field:cat.name - @description:Category name - */ - $ret = $this->HighlightField("Name"); - break; - case "description": - /* - @field:cat.description - @description:Category Description - */ - $ret = ($this->Get("Description")); - $ret = $this->HighlightText($ret); - break; - case "cachednavbar": - /* - @field:cat.cachednavbar - @description: Category cached navbar - */ - $ret = $this->HighlightField("CachedNavbar"); - if(!strlen($ret)) - { - $this->UpdateCachedPath(); - $ret = $this->HighlightField("CachedNavbar"); - } - break; - case "image": - /* - @field:cat.image - @description:Return an image associated with the category - @attrib:_default:bool:If true, will return the default image if the requested image does not exist - @attrib:_name::Return the image with this name - @attrib:_thumbnail:bool:If true, return the thumbnail version of the image - @attrib:_imagetag:bool:If true, returns a complete image tag. exta html attributes are passed to the image tag - */ - $default = $element->GetAttributeByName('_primary'); - $name = $element->GetAttributeByName('_name'); - if(strlen($name)) - { - $img = $this->GetImageByName($name); - } - else - { - if($default) - $img = $this->GetDefaultImage(); - } - if($img) - { - if( $element->GetAttributeByName('_thumbnail') ) - { - $url = $img->parsetag("thumb_url"); - } - else - $url = $img->parsetag("image_url"); - - } - else - { - $url = $element->GetAttributeByName('_defaulturl'); - } - - if( $element->GetAttributeByName('_imagetag') ) - { - if(strlen($url)) - { - $ret = ""; - } - else - $ret = ""; - } - else - $ret = $url; - break; - case "createdby": - /* - @field:cat.createdby - @description:parse a user field of the user that created the category - @attrib:_usertag::User field to return (defaults to login ID) - */ - $field = $element->GetAttributeByName('_usertag'); - if(!strlen($field)) - { - $field = "user_login"; - } - $u = $objUsers->GetUser($this->Get("CreatedById")); - $ret = $u->parsetag($field); - break; - case "custom": - /* - @field:cat.custom - @description:Returns a custom field - @attrib:_customfield::field name to return - @attrib:_default::default value - */ - $field = $element->GetAttributeByName('_customfield'); - $default = $element->GetAttributeByName('_default'); - $ret = $this->GetCustomFieldValue($field,$default); - break; - - case "catsubcats": - /* - @field:cat.catsubcats - @description:Returns a list of subcats of current category - @attrib:_limit:int:Number of categories to return - @attrib:_separator::Separator between categories - @attrib:_anchor:bool:Make an anchor (only if template is not specified) - @attrib:_TargetTemplate:tpl:Target template - @attrib:_Ending::Add special text at the end of subcategory list - @attrib:_Class::Specify stly sheet class for anchors (if used) or "span" object - */ - $limit = ((int)$element->attributes["_limit"]>0)? $element->attributes["_limit"] : NULL; - $separator = $element->attributes["_separator"]; - $anchor = (int)($element->attributes["_anchor"])? 1 : NULL; - $template = strlen($element->attributes["_TargetTemplate"])? $element->attributes["_TargetTemplate"] : NULL; - $ending = strlen($element->attributes["_ending"])? $element->attributes["_ending"] : NULL; - $class = strlen($element->attributes["_class"])? $element->attributes["_class"] : NULL; - - $ret = $this->GetSubCats($limit, $template, $separator, $anchor, $ending, $class); - - break; - - case "date": - /* - @field:cat.date - @description:Returns the date/time the category was created - @attrib:_tz:bool:Convert the date to the user's local time - @attrib:_part::Returns part of the date. The following options are available: month,day,year,time_24hr,time_12hr - */ - $d = $this->Get("CreatedOn"); - - if( $element->GetAttributeByName('_tz') ) - { - $d = GetLocalTime($d,$objSession->Get("tz")); - } - - $part = strtolower( $element->GetAttributeByName('_part') ); - if(strlen($part)) - { - $ret = ExtractDatePart($part,$d); - } - else - { - if(!is_numeric($d)) - { - $ret = ""; - } - else - $ret = LangDate($d); - } - break; - case "link": - /* - @field:cat.link - @description:Returns a URL setting the category to the current category - @attrib:_template:tpl:Template URL should point to - @attrib:_mod_template:tpl:Template INSIDE a module to which the category belongs URL should point to - */ - if ( strlen( $element->GetAttributeByName('_mod_template') ) ){ - //will prefix the template with module template root path depending on category - $ids = $this->GetParentIds(); - $tpath = GetModuleArray("template"); - $roots = GetModuleArray("rootcat"); - - // get template path of module, by searching for moudle name - // in this categories first parent category - // and then using found moudle name as a key for module template paths array - $path = $tpath[array_search ($ids[0], $roots)]; - $t = $path . $element->GetAttributeByName('_mod_template'); - } - else - $t = $element->GetAttributeByName('_template'); - - - if(strlen($t)) - { - $var_list_update["t"] = $t; - } - else - $var_list_update["t"] = $var_list["t"]; - $m_var_list_update["cat"] = $this->Get("CategoryId"); - $ret = GetIndexURL()."?env=" . BuildEnv(); - unset($m_var_list_update["cat"], $var_list_update["t"]); - break; - case "adminlink": - $m_var_list_update["cat"] = $this->Get("CategoryId"); - $m_var_list_update["p"] = 1; - $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); - unset($m_var_list_update["cat"]); - unset($m_var_list_update["p"]); - return $ret; - break; - case "customlink": - $t = $this->GetCustomFieldValue("indextemplate",""); - if(strlen($t)) - { - $var_list_update["t"] = $t; - } - else - $var_list_update["t"] = $var_list["t"]; - $m_var_list_update["cat"] = $this->Get("CategoryId"); - $ret = GetIndexURL()."?env=" . BuildEnv(); - unset($m_var_list_update["cat"], $var_list_update["t"]); - break; - case "link_selector": - $m_var_list_update["cat"] = $this->Get("CategoryId"); - $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); - - // pass through selector - if( isset($_REQUEST['Selector']) ) $ret .= '&Selector='.$_REQUEST['Selector']; - - // pass new status - if( isset($_REQUEST['new']) ) $ret .= '&new='.$_REQUEST['new']; - - unset($m_var_list_update["cat"]); - return $ret; - break; - case "admin_icon": - if( $element->GetAttributeByName('fulltag') ) - { - $ret = "StatusIcon()."\">"; - } - else - $ret = $this->StatusIcon(); - break; - case "subcats": - /* - @field:cat.subcats - @description: Loads category's subcategories into a list and renders using the m_list_cats global tag - @attrib:_subcattemplate:tpl:Template used to render subcategory list elements - @attrib: _columns:int: Numver of columns to display the categories in (defaults to 1) - @attrib: _maxlistcount:int: Maximum number of categories to list - @attrib: _FirstItemTemplate:tpl: Template used for the first category listed - @attrib: _LastItemTemplate:tpl: Template used for the last category listed - @attrib: _NoTable:bool: If set to 1, the categories will not be listed in a table. If a table is used, all HTML attributes are passed to the TABLE tag - */ - $attr = array(); - $attr["_catid"] = $this->Get("CategoryId"); - $attr["_itemtemplate"] = $element->GetAttributeByName('_subcattemplate'); - if( $element->GetAttributeByName('_notable') ) - $attr["_notable"]=1; - $ret = m_list_cats($attr); - break; - case "subcatcount": - /* - @field:cat.subcatcount - @description:returns number of subcategories - */ - $GroupOnly = $element->GetAttributeByName('_grouponly') ? 1 : 0; - $txt = "Get("CategoryId")."\" _SubCats=\"1\" "; - $txt .="_CategoryCount=\"1\" _ItemType=\"1\" _GroupOnly=\"$GroupOnly\" />"; - $tag = new clsHtmlTag($txt); - $ret = $tag->Execute(); - break; - case "itemcount": - /* - @field:cat.itemcount - @description:returns the number of items in the category - @attrib:_itemtype::name of item type to count, or all items if not set - */ - $typestr = $element->GetAttributeByName('_itemtype'); - if(strlen($typestr)) - { - $type = $objItemTypes->GetTypeByName($typestr); - if(is_object($type)) - { - $TypeId = $type->Get("ItemType"); - $GroupOnly = $element->GetAttributeByName('_grouponly') ? 1 : 0; - $txt = "Get("CategoryId")."\" _SubCats=\"1\" "; - $txt .=" _ListType=\"category\" _CountCurrent=\"1\" _ItemType=\"$TypeId\" _GroupOnly=\"$GroupOnly\" />"; - $tag = new clsHtmlTag($txt); - $ret = $tag->Execute(); - } - else - $ret = ""; - } - else - { - $ret = (int)$objCountCache->GetCatListTotal($this->Get("CategoryId")); - } - break; - case "totalitems": - /* - @field:cat.totalitems - @description:returns the number of items in the category and all subcategories - */ - $ret = $this->ItemCount(); - break; - - case 'modified': - $ret = ''; - $date = $this->Get('Modified'); - if(!$date) $date = $this->Get('CreatedOn'); - if( $element->GetAttributeByName('_tz') ) - { - $date = GetLocalTime($date,$objSession->Get("tz")); - } - - $part = strtolower($element->GetAttributeByName('_part') ); - if(strlen($part)) - { - $ret = ExtractDatePart($part,$date); - } - else - { - $ret = ($date <= 0) ? '' : LangDate($date); - } - break; - - case "itemdate": - /* - @field:cat.itemdate - @description:Returns the date the cache count was last updated - @attrib:_itemtype:Item name to check - @attrib:_tz:bool:Convert the date to the user's local time - @attrib:_part::Returns part of the date. The following options are available: month,day,year,time_24hr,time_12hr - */ - $typestr = $element->GetAttributeByName('_itemtype'); - $type = $objItemTypes->GetTypeByName($typestr); - if(is_object($type)) - { - $TypeId = $type->Get("ItemType"); - $cc = $objCountCache->GetCountObject(1,$TypeId,$this->get("CategoryId"),0); - if(is_object($cc)) - { - $date = $cc->Get("LastUpdate"); - } - else - $date = ""; - - //$date = $this->GetCacheCountDate($TypeId); - if( $element->GetAttributeByName('_tz') ) - { - $date = GetLocalTime($date,$objSession->Get("tz")); - } - - $part = strtolower($element->GetAttributeByName('_part') ); - if(strlen($part)) - { - $ret = ExtractDatePart($part,$date); - } - else - { - if($date<=0) - { - $ret = ""; - } - else - $ret = LangDate($date); - } - } - else - $ret = ""; - break; - case "new": - /* - @field:cat.new - @description:returns text if category's status is "new" - @attrib:_label:lang: Text to return if status is new - */ - if($this->IsNewItem()) - { - $ret = $element->GetAttributeByName('_label'); - if(!strlen($ret)) - $ret = "lu_new"; - $ret = language($ret); - } - else - $ret = ""; - break; - case "pick": - /* - @field:cat.pick - @description:returns text if article's status is "hot" - @attrib:_label:lang: Text to return if status is "hot" - */ - if($this->Get("EditorsPick")==1) - { - $ret = $element->GetAttributeByName('_label'); - if(!strlen($ret)) - $ret = "lu_pick"; - $ret = language($ret); - } - else - $ret = ""; - break; - - case "parsetag": - /* - @field:cat.parsetag - @description:returns a tag output with this categoriy set as a current category - @attrib:_tag:: tag name - */ - - $tag = new clsHtmlTag(); - $tag->name = $element->GetAttributeByName('_tag'); - $tag->attributes = $element->attributes; - $tag->attributes["_catid"] = $this->Get("CategoryId"); - $ret = $tag->Execute(); - break; - - - /* - @field:cat.relevance - @description:Displays the category relevance in search results - @attrib:_displaymode:: How the relevance should be displayed
-
    -
  • "Numerical": Show the decimal value -
  • "Bar": Show the HTML representing the relevance. Returns two HTML cells ≶td< with specified background colors -
  • "Graphical":Show image representing the relevance -
- @attrib:_onimage::Zero relevance image shown in graphical display mode. Also used as prefix to build other images (i.e. prefix+"_"+percentage+".file_extension" - @attrib:_OffBackGroundColor::Off background color of HTML cell in bar display mode - @attrib:_OnBackGroundColor::On background color of HTML cell in bar display mode - */ - - } - if( !isset($ret) ) $ret = parent::ParseObject($element); - - } - return $ret; - } - - - function parsetag($tag) - { - global $objConfig,$objUsers, $m_var_list, $m_var_list_update; - if(is_object($tag)) - { - $tagname = $tag->name; - } - else - $tagname = $tag; - - switch($tagname) - { - case "cat_id": - return $this->Get("CategoryId"); - break; - case "cat_parent": - return $this->Get("ParentId"); - break; - case "cat_fullpath": - return $this->Get("CachedNavbar"); - break; - case "cat_name": - return $this->Get("Name"); - break; - case "cat_desc": - return $this->Get("Description"); - break; - case "cat_priority": - if($this->Get("Priority")!=0) - { - return (int)$this->Get("Priority"); - } - else - return ""; - break; - case "cat_pick": - if ($this->Get("EditorsPick")) - return "pick"; - break; - case "cat_status": - return $this->Get("Status"); - break; - case "cat_Pending": - return $this->Get("Name"); - break; - - case "cat_pop": - if($this->IsPopItem()) - return "pop"; - break; - case "cat_new": - if($this->IsNewItem()) - return "new"; - break; - case "cat_hot": - if($this->IsHotItem()) - return "hot"; - break; - case "cat_metakeywords": - return $this->Get("MetaKeywords"); - break; - case "cat_metadesc": - return $this->Get("MetaDescription"); - break; - case "cat_createdby": - return $objUsers->GetUserName($this->Get("CreatedById")); - break; - case "cat_resourceid": - return $this->Get("ResourceId"); - break; - case "cat_sub_cats": - return $this->GetSubCats($objConfig->Get("SubCat_ListCount")); - break; - case "cat_link": - return $this->Cat_Link(); - break; - case "subcat_count": - return $this->SubCatCount(); - break; - case "cat_itemcount": - return (int)$this->GetTotalItemCount(); - break; - case "cat_link_admin": - $m_var_list_update["cat"] = $this->Get("CategoryId"); - $m_var_list_update["p"] = 1; - $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); - unset($m_var_list_update["cat"]); - unset($m_var_list_update["p"]); - return $ret; - break; - case "cat_admin_icon": - $ret = $this->StatusIcon(); - return $ret; - break; - case "cat_link_selector": - $m_var_list_update["cat"] = $this->Get("CategoryId"); - $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); - unset($m_var_list_update["cat"]); - return $ret; - break; - - case "cat_link_edit": - $m_var_list_update["id"] = $this->Get("CategoryId"); - $ret = "addcategory.php?env=" . BuildEnv(); - unset($m_var_list_update["id"]); - return $ret; - break; - - case "cat_date": - return LangDate($this->Get("CreatedOn")); - break; - case "cat_num_cats": - return $this->Get("CachedDescendantCatsQty"); - break; - case "cell_back": - if ($m_var_list_update["cat_cell"]=="#cccccc") - { - $m_var_list_update["cat_cell"]="#ffffff"; - return "#ffffff"; - } - else - { - $m_var_list_update["cat_cell"]="#cccccc"; - return "#cccccc"; - } - break; - default: - return "Undefined:$tagname"; - } - } - - function ParentNames() - { - global $objCatList; - - if(strlen($this->Get("CachedNavbar"))==0) - { - $nav = ""; - //echo "Rebuilding Navbar..
\n"; - if(strlen($this->Get("ParentPath"))==0) - { - $this->UpdateCachedPath(); - } - $cats = explode("|",substr($this->Get("ParentPath"),1,-1)); - - foreach($cats as $catid) - { - $cat =& $objCatList->GetCategory($catid); - if(is_object($cat)) - { - if(strlen($cat->Get("Name"))) - $names[] = $cat->Get("Name"); - - } - } - $nav = implode(">", $names); - $this->Set("CachedNavbar",$nav); - $this->Update(); - } - $res = explode(">",$this->Get("CachedNavbar")); - return $res; - } - - function UpdateCacheCounts() - { - global $objItemTypes; - - $CatId = $this->Get("CategoryId"); - - if($CatId>0) - { - //echo "Updating count for ".$this->Get("CachedNavbar")."
\n"; - UpdateCategoryCount(0,$CatId); - } - } - - /** - * @return void - * @param int $date - * @desc Set Modified field for category & all it's parent categories - */ - function SetLastUpdate($date) - { - $parents = $this->Get('ParentPath'); - $parents = substr($parents, 1, strlen($parents) - 2 ); - $parents = explode('|', $parents); - - $db =&GetADODBConnection(); - $sql = 'UPDATE '.$this->tablename.' SET Modified = '.$date.' WHERE CategoryId IN ('.implode(',', $parents).')'; - $db->Execute($sql); - } - - -} - -class clsCatList extends clsItemList //clsItemCollection -{ - //var $Page; // no need because clsItemList class used instead of clsItemCollection - //var $PerPageVar; - - function clsCatList() - { - global $m_var_list; - $this->clsItemCollection(); - $this->classname="clsCategory"; - $this->AdminSearchFields = array("Name","Description"); - $this->Page = (int)$m_var_list["p"]; - $this->PerPageVar = "Perpage_Category"; - $this->SourceTable = GetTablePrefix()."Category"; - $this->BasePermission="CATEGORY"; - $this->DefaultPerPage = 20; - } - - function SaveNewPage() - { - global $m_var_list; - $m_var_list["p"] = $this->Page; - } - - function GetCountSQL($PermName,$CatId=NULL, $GroupId=NULL, $AdditonalWhere="") - { - global $objSession, $objPermissions, $objCatList; - - $ltable = $this->SourceTable; - $acl = $objSession->GetACLClause(); - $cattable = GetTablePrefix()."CategoryItems"; - $CategoryTable = GetTablePrefix()."Category"; - $ptable = GetTablePrefix()."PermCache"; - $VIEW = $objPermissions->GetPermId($PermName); - - $sql = "SELECT count(*) as CacheVal FROM $ltable "; - $sql .="INNER JOIN $ptable ON ($ltable.CategoryId=$ptable.CategoryId) "; - $sql .="WHERE ($acl AND PermId=$VIEW AND $ltable.Status=1) "; - - if(strlen($AdditonalWhere)>0) - { - $sql .= "AND (".$AdditonalWhere.")"; - } - return $sql; - } - - function CountCategories($attribs) - { - global $objSession; - - $cat = $attribs["_catid"]; - if(!is_numeric($cat)) - { - $cat = $this->CurrentCategoryID(); - } - if((int)$cat>0) - $c = $this->GetCategory($cat); - - if($attribs["_subcats"] && $cat>0) - { - $ParentWhere = "(ParentPath LIKE '".$c->Get("ParentPath")."%' AND ".$this->SourceTable.".CategoryId != $cat)"; - } - if($attribs["_today"]) - { - $today = mktime(0,0,0,date("m"),date("d"),date("Y")); - $TodayWhere = "(CreatedOn>=$today)"; - } - if($attribs["_grouponly"]) - { - $GroupList = $objSession->Get("GroupList"); - } - else - $GroupList = NULL; - - $where = ""; - if(strlen($ParentWhere)) - { - $where = $ParentWhere; - } - if(strlen($TodayWhere)) - { - if(strlen($where)) - $where .=" AND "; - $where .= $TodayWhere; - } - $sql = $this->GetCountSQL("CATEGORY.VIEW",$cat,$GroupList,$where); - -// echo "SQL: ".$sql."
"; - - $rs = $this->adodbConnection->Execute($sql); - if($rs && !$rs->EOF) - { - $ret = $rs->fields["CacheVal"]; - } - else - $ret = 0; - - return $ret; - } - - function CurrentCategoryID() - { - global $m_var_list; - return (int)$m_var_list["cat"]; - } - - function NumCategories() - { - return $this->NumItems(); - } - - function &CurrentCat() - { - //return $this->GetCategory($this->CurrentCategoryID()); - return $this->GetItem($this->CurrentCategoryID()); - } - - function &GetCategory($CatID) - { - return $this->GetItem($CatID); - } - - function GetByResource($ResId) - { - return $this->GetItemByField("ResourceId",$ResId); - } - - function QueryOrderByClause($EditorsPick=FALSE,$Priority=FALSE,$UseTableName=FALSE) - { - global $objSession; - - if($UseTableName) - { - $TableName = $this->SourceTable."."; - } - else - $TableName = ""; - - $Orders = array(); - - if($EditorsPick) - { - $Orders[] = $TableName."EditorsPick DESC"; - } - if($Priority) - { - $Orders[] = $TableName."Priority DESC"; - } - - $FieldVar = "Category_Sortfield"; - $OrderVar = "Category_Sortorder"; - - if(is_object($objSession)) - { - if(strlen($objSession->GetPersistantVariable($FieldVar))>0) - { - $Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". - $objSession->GetPersistantVariable($OrderVar)); - } - } - - $FieldVar = "Category_Sortfield2"; - $OrderVar = "Category_Sortorder2"; - - if(is_object($objSession)) - { - if(strlen($objSession->GetPersistantVariable($FieldVar))>0) - { - $Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". - $objSession->GetPersistantVariable($OrderVar)); - } - } - - - if(count($Orders)>0) - { - $OrderBy = "ORDER BY ".implode(", ",$Orders); - } - else - $OrderBy=""; - return $OrderBy; - } - - - function LoadCategories($where="", $orderBy = "", $no_limit = true, $fix_method = 'set_first') - { - // load category list using $where clause - // apply ordering specified in $orderBy - // show all cats ($no_limit = true) or only from current page ($no_limit = false) - // in case if stored page is greather then page count issue page_fixing with - // method specified (see "FixInvalidPage" method for details) - $PerPage = $this->GetPerPage(); - - $this->QueryItemCount = TableCount($this->SourceTable,$where,0); - if($no_limit == false) - { - $this->FixInvalidPage($fix_method); - $Start = ($this->Page-1) * $PerPage; - $limit = "LIMIT ".$Start.",".$PerPage; - } - else - $limit = NULL; - - return $this->Query_Category($where, $orderBy, $limit); - } - - function Query_Category($whereClause="",$orderByClause="",$limit=NULL) - { - global $m_var_list, $objSession, $Errors, $objPermissions; - $GroupID = $objSession->Get("GroupID"); - $resultset = array(); - - $table = $this->SourceTable; - $ptable = GetTablePrefix()."PermCache"; - $CAT_VIEW = $objPermissions->GetPermId("CATEGORY.VIEW"); - if(!$objSession->HasSystemPermission("ADMIN")) - { - $sql = "SELECT * FROM $table INNER JOIN $ptable ON ($ptable.CategoryId=$table.CategoryId)"; - $acl_where = $objSession->GetACLClause(); - if(strlen($whereClause)) - { - $sql .= " WHERE ($acl_where) AND PermId=$CAT_VIEW AND ".$whereClause; - } - else - $sql .= " WHERE ($acl_where) AND PermId=$CAT_VIEW "; - } - else - { - $sql ="SELECT * FROM $table ".($whereClause ? "WHERE $whereClause" : ''); - } - $sql .=" ".$orderByClause; - - if(isset($limit) && strlen(trim($limit))) - $sql .= " ".$limit; - if($objSession->HasSystemPermission("DEBUG.LIST")) - echo $sql; - - return $this->Query_item($sql); - } - - function CountPending() - { - return TableCount($this->SourceTable,"Status=".STATUS_PENDING,0); - } - - function GetPageLinkList($dest_template=NULL,$page="",$PagesToList=10,$HideEmpty=TRUE) - { - global $objConfig, $m_var_list_update, $var_list_update, $var_list; - - if(!strlen($page)) - $page = GetIndexURL(); - - $PerPage = $this->GetPerPage(); - $NumPages = ceil( $this->GetNumPages($PerPage) ); - - if($NumPages == 1 && $HideEmpty) return ''; - - if(strlen($dest_template)) - { - $var_list_update["t"] = $dest_template; - } - else - $var_list_update["t"] = $var_list["t"]; - - $o = ""; - if($this->Page>$NumPages) - $this->Page=$NumPages; - - $StartPage = (int)$this->Page - ($PagesToList/2); - if($StartPage<1) - $StartPage=1; - - $EndPage = $StartPage+($PagesToList-1); - if($EndPage>$NumPages) - { - $EndPage = $NumPages; - $StartPage = $EndPage-($PagesToList-1); - if($StartPage<1) - $StartPage=1; - } - - $o = ""; - if($StartPage>1) - { - $m_var_list_update["p"] = $this->Page-$PagesToList; - $prev_url = $page."?env=".BuildEnv(); - $o .= "<<"; - } - - - for($p=$StartPage;$p<=$EndPage;$p++) - { - if($p!=$this->Page) - { - $m_var_list_update["p"]=$p; - $href = $page."?env=".BuildEnv(); - $o .= " $p "; - } - else - { - $o .= "$p"; - } - } - if($EndPage<$NumPages && $EndPage>0) - { - $m_var_list_update["p"]=$this->Page+$PagesToList; - $next_url = $page."?env=".BuildEnv(); - $o .= " >>"; - } - unset($m_var_list_update,$var_list_update["t"] ); - return $o; - } - - function GetAdminPageLinkList($url) - { - global $objConfig, $m_var_list_update, $var_list_update, $var_list; - - $PerPage = $this->GetPerPage(); - $NumPages = ceil($this->GetNumPages($PerPage)); - $o = ""; - - if($this->Page>1) - { - $m_var_list_update["p"]=$this->Page-1; - $prev_url = $url."?env=".BuildEnv(); - unset($m_var_list_update["p"]); - $o .= "<<"; - } - - if($this->Page<$NumPages) - { - $m_var_list_update["p"]=$this->Page+1; - $next_url = $url."?env=".BuildEnv(); - unset($m_var_list_update["p"]); - } - - for($p=1;$p<=$NumPages;$p++) - { - if($p != $this->Page) - { - $m_var_list_update["p"]=$p; - $href = $url."?env=".BuildEnv(); - unset($m_var_list_update["p"]); - $o .= " $p "; - } - else - $o .= "$p"; - } - - if($this->Page < $NumPages) - $o .= ">>"; - - return $o; - } - - function Search_Category($orderByClause) - { - global $objSession, $objConfig, $Errors; - - $PerPage = $this->GetPerPage(); - $Start = ($this->Page-1) * $PerPage; - $objResults = new clsSearchResults("Category","clsCategory"); - $this->Clear(); - $this->Categories = $objResults->LoadSearchResults($Start,$PerPage); - - return $this->Categories; - } - - - function GetSubCats($ParentCat) - { - return $this->Query_Category("ParentId=".$ParentCat,""); - } - - function AllSubCats($ParentCat) - { - $c =& $this->GetCategory($ParentCat); - $sql = "SELECT * FROM ".$this->SourceTable." WHERE ParentPath LIKE '".$c->Get("ParentPath")."%'"; - $rs = $this->adodbConnection->Execute($sql); - $subcats = array(); - while($rs && !$rs->EOF) - { - if($rs->fields["CategoryId"]!=$ParentCat) - { - $subcats[] = $rs->fields["CategoryId"]; - } - $rs->MoveNext(); - } - if($ParentCat>0) - { - if($c->Get("CachedDescendantCatsQty")!=count($subcats)) - { - $c->Set("CachedDescendantCatsQty",count($subcats)); - } - } - return $subcats; - } - - function cat_navbar($admin=0, $cat, $target_template, $separator = " > ", $LinkLeaf = FALSE, - $root = 0,$RootTemplate="",$modcat=0, $ModTemplate="", $LinkRoot = FALSE) - { - // draw category navigation bar (at top) - global $Errors, $var_list_update, $var_list, $m_var_list_update, $m_var_list, $objConfig; - - $selector = isset($_REQUEST['Selector']) ? '&Selector='.$_REQUEST['Selector'] : ''; - $new = isset($_REQUEST['new']) ? '&new='.$_REQUEST['new'] : ''; - - $nav = ""; - $m_var_list_update["p"]=1; - if(strlen($target_template)==0) - $target_template = $var_list["t"]; - - - if($cat == 0) - { - $cat_name = language($objConfig->Get("Root_Name")); - if ($LinkRoot) - { - $var_list_update["t"] = strlen($RootTemplate)? $RootTemplate : $target_template; - $nav = "$cat_name"; } - else - $nav = "$cat_name"; - } - else - { - $nav = array(); - $c =& $this->GetCategory($cat); - $nav_unparsed = $c->Get("ParentPath"); - if(strlen($nav_unparsed)==0) - { - $c->UpdateCachedPath(); - $nav_unparsed = $c->Get("ParentPath"); - } - //echo " Before $nav_unparsed "; - if($root) - { - $r =& $this->GetCategory($root); - $rpath = $r->Get("ParentPath"); - $nav_unparsed = substr($nav_unparsed,strlen($rpath),-1); - $cat_name = $r->Get("Name"); - $m_var_list_update["cat"] = $root; - if($cat == $catid && !$LinkLeaf) - { - $nav[] = "".$cat_name.""; //href=\"browse.php?env=". BuildEnv() ."\" - } - else - { - if ($admin == 1) - { - $nav[] = "".$cat_name.""; - } - else - { - if(strlen($RootTemplate)) - { - $var_list_update["t"] = $RootTemplate; - } - else - { - $var_list_update["t"] = $target_template; - } - $nav[] = "".$cat_name.""; - } - } - } - else - { - $nav_unparsed = substr($nav_unparsed,1,-1); - $cat_name = language($objConfig->Get("Root_Name")); - $m_var_list_update["cat"] = 0; - if($cat == 0) - { - $nav[] = "".$cat_name.""; //href=\"browse.php?env=". BuildEnv() ."\" - } - else - { - if ($admin == 1) - { - $nav[] = "".$cat_name.""; - } - else - { - if(strlen($RootTemplate)) - { - $var_list_update["t"] = $RootTemplate; - } - else - $var_list_update["t"] = $target_template; - $nav[] = "".$cat_name.""; - } - } - - } - //echo " After $nav_unparsed
\n"; - if(strlen($target_template)==0) - $target_template = $var_list["t"]; - - $cats = explode("|", $nav_unparsed); - foreach($cats as $catid) - { - if($catid) - { - $c =& $this->GetCategory($catid); - if(is_object($c)) - { - $cat_name = $c->Get("Name"); - - $m_var_list_update["cat"] = $catid; - if($catid==$modcat && strlen($ModTemplate)>0) - { - $t = $ModTemplate; - } - else - $t = $target_template; - if($cat == $catid && !$LinkLeaf) - { - $nav[] = "".$cat_name.""; - } - else - { - if ($admin == 1) - { - $nav[] = "".$cat_name.""; - } - else - { - $var_list_update["t"] = $t; - $nav[] = "".$cat_name.""; - unset($var_list_update["t"]); - } - } - unset($m_var_list_update["cat"]); - } - } - } - $nav = implode($separator, $nav); - } - return $nav; - } - - function &Add($ParentId, $Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, $New, $Pop, - $Priority, $MetaKeywords,$MetaDesc) - { - global $objSession; - - $UserId = $objSession->Get("UserId"); - - $d = new clsCategory(NULL); - $d->tablename = $this->SourceTable; - if($d->UsingTempTable()) - $d->Set("CategoryId",-1); - $d->idfield = "CategoryId"; - $d->Set(array("ParentId", "Name", "Description", "CreatedOn", "EditorsPick", "Status", "HotItem", - "NewItem","PopItem", "Priority", "MetaKeywords", "MetaDescription", "CreatedById"), - array($ParentId, $Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, $New, - $Pop, $Priority, $MetaKeywords,$MetaDesc, $UserId)); - - $d->Create(); - if($Status==1) - { - $d->SendUserEventMail("CATEGORY.ADD",$objSession->Get("PortalUserId")); - $d->SendAdminEventMail("CATEGORY.ADD"); - } - else - { - $d->SendUserEventMail("CATEGORY.ADD.PENDING",$objSession->Get("PortalUserId")); - $d->SendAdminEventMail("CATEGORY.ADD.PENDING"); - } - $d->UpdateCachedPath(); - //RunUp($ParentId, "Increment_Count"); - - return $d; - } - - function &Edit_Category($CategoryId, $Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, - $NewItem, $Pop, $Priority, $MetaKeywords,$MetaDesc) - { - $d =& $this->GetCategory($CategoryId); - $d->Set(array("Name", "Description", "CreatedOn", "EditorsPick", "Status", "HotItem", - "NewItem", "PopItem", "Priority", "MetaKeywords","MetaDescription"), - array($Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, $NewItem, - $Pop, $Priority, $MetaKeywords,$MetaDesc)); - $d->Update(); - $d->UpdateCachedPath(); - return $d; - - } - - function Move_Category($Id, $ParentTo) - { - global $objCatList; - - $d =& $this->GetCategory($Id); - $oldparent = $d->Get("ParentId"); - $ChildList = $d->GetSubCatIds(); - - /* - echo "Target Parent Id: $ParentTo
\n"; - echo "
";print_r($ChildList); echo "
"; - echo "Old Parent: $oldparent
\n"; - echo "ID: $Id
\n"; - */ - /* sanity checks */ - - if(!in_array($ParentTo,$ChildList) && $oldparent != $ParentTo && $oldparent != $Id && - $Id != $ParentTo) - { - $d->Set("ParentId", $ParentTo); - $d->Update(); - $d->UpdateCachedPath(); - RunUp($oldparent, "Decrement_Count"); - RunUp($ParentTo, "Increment_Count"); - RunDown($ParentTo, "UpdateCachedPath"); - return TRUE; - } - else - { - global $Errors; - $Errors->AddAdminUserError("la_error_move_subcategory"); - return FALSE; - } - die(); - } - - function Copy_CategoryTree($Id, $ParentTo) - { - global $PastedCatIds; - - $new = $this->Copy_Category($Id, $ParentTo); - if($new) - { - $PastedCatIds[$Id] = $new; - $sql = "SELECT CategoryId from ".GetTablePrefix()."Category where ParentId=$Id"; - $result = $this->adodbConnection->Execute($sql); - if ($result && !$result->EOF) - { - while(!$result->EOF) - { - $this->Copy_CategoryTree($result->fields["CategoryId"], $new); - $result->MoveNext(); - } - } - } - return $new; - } - - function Copy_Category($Id, $ParentTo) - { - global $objGroups; - - - $src = $this->GetCategory($Id); - $Children = $src->GetSubCatIds(); - if($Id==$ParentTo || in_array($ParentTo,$Children)) - { - /* sanity error here */ - global $Errors; - $Errors->AddAdminUserError("la_error_copy_subcategory"); - return 0; - } - $dest = $src; - $dest->Set("ParentId", $ParentTo); - if ($src->get("ParentId") == $ParentTo) - { - $OldName = $src->Get("Name"); - if(substr($OldName,0,5)=="Copy ") - { - $parts = explode(" ",$OldName,4); - if($parts[2]=="of" && is_numeric($parts[1])) - { - $Name = $parts[3]; - } - else - if($parts[1]=="of") - { - $Name = $parts[2]." ".$parts[3]; - } - else - $Name = $OldName; - } - else - $Name = $OldName; - //echo "New Name: $Name
"; - $dest->Set("Name", $Name); - $Names = CategoryNameCount($ParentTo,$Name); - //echo "Names Count: ".count($Names)."
"; - if(count($Names)>0) - { - $NameCount = count($Names); - $found = FALSE; - $NewName = "Copy of $Name"; - - if(!in_array($NewName,$Names)) - { - //echo "Matched on $NewName in:
\n"; - $found = TRUE; - } - else - { - for($x=2;$x<$NameCount+2;$x++) - { - - $NewName = "Copy ".$x." of ".$Name; - if(!in_array($NewName,$Names)) - { - $found = TRUE; - break; - } - - } - } - if(!$found) - { - $NameCount++; - $NewName = "Copy $NameCount of $Name"; - } - //echo "New Name: $NewName
"; - $dest->Set("Name",$NewName); - } - - } - $dest->UnsetIdField(); - $dest->Set("CachedDescendantCatsQty",0); - $dest->Set("ResourceId",NULL); - $dest->Create(); - $dest->UpdateCachedPath(); - $p = new clsPermList(); - $p->Copy_Permissions($src->Get("CategoryId"),$dest->Get("CategoryId")); - $glist = $objGroups->GetAllGroupList(); - $view = $p->GetGroupPermList($dest, "CATEGORY.VIEW", $glist); - $dest->SetViewPerms("CATEGORY.VIEW",$view,$glist); - RunUp($ParentTo, "Increment_Count"); - return $dest->Get("CategoryId"); - } - - function Delete_Category($Id) - { - global $objSession; - - $d =& $this->GetCategory($Id); - - if(is_object($d)) - { - if($d->Get("CategoryId")==$Id) - { - $d->SendUserEventMail("CATEGORY.DELETE",$objSession->Get("PortalUserId")); - $d->SendAdminEventMail("CATEGORY.DELETE"); - $p =& $this->GetCategory($d->Get("ParentId")); - RunDown($d->Get("CategoryId"), "Delete"); - RunUp($p->Get("CategoryId"), "Decrement_Count"); - RunUp($d->Get("CategoryId"),"ClearCacheData"); - - } - } - } - - function PasteFromClipboard($TargetCat) - { - global $objSession; - - $clip = $objSession->GetVariable("ClipBoard"); - if(strlen($clip)) - { - $ClipBoard = ParseClipboard($clip); - $IsCopy = (substr($ClipBoard["command"],0,4)=="COPY") || ($ClipBoard["source"] == $TargetCat); - - $item_ids = explode(",",$ClipBoard["ids"]); - for($i=0;$iGetItem($item_ids[$i]); - if(!$IsCopy) - { - $this->Move_Category($ItemId, $TargetCat); - $clip = str_replace("CUT","COPY",$clip); - $objSession->SetVariable("ClipBoard",$clip); - } - else - { - $this->Copy_CategoryTree($ItemId,$TargetCat); - } - } - } - } - - - function NumChildren($ParentID) - { - $cat_filter = "m_cat_filter"; - global $$cat_filter; - - $filter = $$cat_filter; - $adodbConnection = &GetADODBConnection(); - - $sql = "SELECT COUNT(Name) as children from ".$this->SourceTable." where ParentId=" . $ParentID . $filter; - $result = $adodbConnection->Execute($sql); - return $result->fields["children"]; - } - - function UpdateMissingCacheData() - { - $rs = $this->adodbConnection->Execute("SELECT * FROM ".$this->SourceTable." WHERE ParentPath IS NULL or ParentPath=''"); - while($rs && !$rs->EOF) - { - $c = new clsCategory(NULL); - $data = $rs->fields; - $c->SetFromArray($data); - $c->UpdateCachedPath(); - $rs->MoveNext(); - } - - $rs = $this->adodbConnection->Execute("SELECT * FROM ".$this->SourceTable." WHERE CachedNavbar IS NULL or CachedNavBar=''"); - while($rs && !$rs->EOF) - { - $c = new clsCategory(NULL); - $data = $rs->fields; - $c->SetFromArray($data); - $c->UpdateCachedPath(); - $rs->MoveNext(); - } - } - - function CopyFromEditTable($idfield) - { - global $objGroups, $objSession, $objPermList; - - $objPermList = new clsPermList(); - $edit_table = $objSession->GetEditTable($this->SourceTable); - - $sql = "SELECT * FROM $edit_table"; - $rs = $this->adodbConnection->Execute($sql); - - while($rs && !$rs->EOF) - { - $data = $rs->fields; - $c = new $this->classname; - $c->SetFromArray($data); - $c->Dirty(); - - if($c->Get("CategoryId")>0) - { - $c->Update(); - } - else - { - $c->UnsetIdField(); - $c->Create(); - $sql = "UPDATE ".GetTablePrefix()."Permissions SET CatId=".$c->Get("CategoryId")." WHERE CatId=-1"; - $this->adodbConnection->Execute($sql); - } - $c->UpdateCachedPath(); - $c->UpdateACL(); - $c->SendUserEventMail("CATEGORY.MODIFY",$objSession->Get("PortalUserId")); - $c->SendAdminEventMail("CATEGORY.MODIFY"); - $c->Related = new clsRelationshipList(); - if(is_object($c->Related)) - { - $r = $c->Related; - $r->CopyFromEditTable($c->Get("ResourceId")); - } - - //RunDown($c->Get("CategoryId"),"UpdateCachedPath"); - //RunDown($c->Get("CategoryId"),"UpdateACL"); - unset($c); - unset($r); - $rs->MoveNext(); - } - @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); - - //$this->UpdateMissingCacheData(); - } - - function PurgeEditTable($idfield) - { - parent::PurgeEditTable($idfield); - $sql = "DELETE FROM ".GetTablePrefix()."Permissions WHERE CatId=-1"; - $this->adodbConnection->Execute($sql); - } - - function GetExclusiveType($CatId) - { - global $objItemTypes, $objConfig; - - $itemtype = NULL; - $c =& $this->GetItem($CatId); - $path = $c->Get("ParentPath"); - foreach($objItemTypes->Items as $Type) - { - $RootVar = $Type->Get("ItemName")."_Root"; - $RootId = $objConfig->Get($RootVar); - if((int)$RootId) - { - $rcat = $this->GetItem($RootId); - $rpath = $rcat->Get("ParentPath"); - $p = substr($path,0,strlen($rpath)); - //echo $rpath." vs. .$p [$path]
\n"; - if($rpath==$p) - { - $itemtype = $Type; - break; - } - } - } - return $itemtype; - } -} - -function RunUp($Id, $function, $Param=NULL) -{ - global $objCatList; - - $d = $objCatList->GetCategory($Id); - $ParentId = $d->Get("ParentId"); - if ($ParentId == 0) - { - if($Param == NULL) - { - $d->$function(); - } - else - { - $d->$function($Param); - } - } - else - { - RunUp($ParentId, $function, $Param); - if($Param == NULL) - { - $d->$function(); - } - else - { - $d->$function($Param); - } - - } - -} - -function RunDown($Id, $function, $Param=NULL) -{ - global $objCatList; - - $adodbConnection = &GetADODBConnection(); - $sql = "select CategoryId from ".GetTablePrefix()."Category where ParentId='$Id'"; - $rs = $adodbConnection->Execute($sql); - - while($rs && !$rs->EOF) - { - RunDown($rs->fields["CategoryId"], $function, $Param); - $rs->MoveNext(); - } - $d = $objCatList->GetCategory($Id); - if($Param == NULL) - { - $d->$function(); - } - else - $d->$function($Param); -} -?> +clsItem(TRUE); + + //$this->adodbConnection = &GetADODBConnection(); + + $this->tablename = GetTablePrefix()."Category"; + + $this->type=1; + + $this->BasePermission ="CATEGORY"; + + $this->id_field = "CategoryId"; + + $this->TagPrefix = "cat"; + + + + $this->debuglevel=0; + + /* keyword highlighting */ + + $this->OpenTagVar = "Category_Highlight_OpenTag"; + + $this->CloseTagVar = "Category_Highlight_CloseTag"; + + + + if($CategoryId!=NULL) + + { + + $this->LoadFromDatabase($CategoryId); + + $this->Permissions = new clsPermList($CategoryId,$objSession->Get("GroupId")); + + + + } + + else + + { + + $this->Permissions = new clsPermList(); + + + + } + + } + + + + function ClearCacheData() + + { + + $env = "':m".$this->Get("CategoryId")."%'"; + + DeleteTagCache("m_itemcount","Category%"); + + DeleteTagCache("m_list_cats","",$env); + + } + + + + + + function Delete() + + { + + global $CatDeleteList; + + + + if(!is_array($CatDeleteList)) + + $CatDeleteList = array(); + + if($this->UsingTempTable()==FALSE) + + { + + $this->Permissions->Delete_CatPerms($this->Get("CategoryId")); + + $sql = "DELETE FROM ".GetTablePrefix()."CountCache WHERE CategoryId=".$this->Get("CategoryId"); + + $this->adodbConnection->Execute($sql); + + $CatDeleteList[] = $this->Get("CategoryId"); + + if($this->Get("CreatedById")>0) + + $this->SendUserEventMail("CATEGORY.DELETE",$this->Get("CreatedById")); + + $this->SendAdminEventMail("CATEGORY.DELETE"); + + + + parent::Delete(); + + $this->ClearCacheData(); + + } + + else + + { + + parent::Delete(); + + } + + } + + + + + + function Update($UpdatedBy=NULL) + + { + + parent::Update($UpdatedBy); + + if($this->tablename==GetTablePrefix()."Category") + + $this->ClearCacheData(); + + } + + + + function Create() + + { + + if((int)$this->Get("CreatedOn")==0) + + $this->Set("CreatedOn",date("U")); + + parent::Create(); + + if($this->tablename==GetTablePrefix()."Category") + + $this->ClearCacheData(); + + } + + + + function SetParentId($value) + + { + + //Before we set a parent verify that propsed parent is not our child. + + //Otherwise it will cause recursion. + + + + $id = $this->Get("CategoryId"); + + $path = $this->Get("ParentPath"); + + $sql = sprintf("SELECT CategoryId From ".GetTablePrefix()."Category WHERE ParentPath LIKE '$path%' AND CategoryId = %d ORDER BY ParentPath",$value); + + $rs = $this->adodbConnection->SelectLimit($sql,1,0); + + if(!$rs->EOF) + + { + + return; + + } + + $this->Set("ParentId",$value); + + } + + + + function Approve() + + { + + global $objSession; + + + + if($this->Get("CreatedById")>0) + + $this->SendUserEventMail("CATEGORY.APPROVE",$this->Get("CreatedById")); + + $this->SendAdminEventMail("CATEGORY.APPROVE"); + + $this->Set("Status", 1); + + $this->Update(); + + } + + + + function Deny() + + { + + global $objSession; + + + + if($this->Get("CreatedById")>0) + + $this->SendUserEventMail("CATEGORY.DENY",$this->Get("CreatedById")); + + $this->SendAdminEventMail("CATEGORY.DENY"); + + + + $this->Set("Status", 0); + + $this->Update(); + + } + + + + + + function IsEditorsPick() + + { + + return $this->Is("EditorsPick"); + + } + + + + function SetEditorsPick($value) + + { + + $this->Set("EditorsPick", $value); + + } + + + + function GetSubCats($limit=NULL, $target_template=NULL, $separator=NULL, $anchor=NULL, $ending=NULL, $class=NULL) + + { + + global $m_var_list, $m_var_list_update, $var_list, $var_list_update; + + + + $sql = "SELECT CategoryId, Name from ".GetTablePrefix()."Category where ParentId=".$this->Get("CategoryId")." AND Status=1 ORDER BY Priority"; + + if(isset($limit)) + + { + + $rs = $this->adodbConnection->SelectLimit($sql, $limit, 0); + + } + + else + + { + + $rs = $this->adodbConnection->Execute($sql); + + } + + $count=1; + + + + $class_name = is_null($class)? "catsub" : $class; + + + + + + while($rs && !$rs->EOF) + + { + + + + if(!is_null($target_template)) + + { + + $var_list_update["t"] = $target_template; + + } + + $m_var_list_update["cat"] = $rs->fields["CategoryId"]; + + $m_var_list_update["p"] = "1"; + + $cat_name = $rs->fields['Name']; + + if (!is_null($anchor)) + + $ret .= "$cat_name"; + + else + + $ret .= "$cat_name"; + + + + $rs->MoveNext(); + + if(!$rs->EOF) + + { + + $ret.= is_null($separator)? ", " : $separator; + + } + + } + + if(strlen($ret)) + + $ret .= is_null($ending)? " ..." : $ending; + + + + unset($var_list_update["t"], $m_var_list_update["cat"], $m_var_list_update["p"]); + + + + return $ret; + + } + + + + function Validate() + + { + + global $objSession; + + + + $dataValid = true; + + if(!isset($this->m_Type)) + + { + + $Errors->AddError("error.fieldIsRequired",'Type',"","","clsCategory","Validate"); + + $dataValid = false; + + } + + + + if(!isset($this->m_Name)) + + { + + $Errors->AddError("error.fieldIsRequired",'Name',"","","clsCategory","Validate"); + + $dataValid = false; + + } + + + + if(!isset($this->m_Description)) + + { + + $Errors->AddError("error.fieldIsRequired",'Description',"","","clsCategory","Validate"); + + $dataValid = false; + + } + + + + if(!isset($this->m_Visible)) + + { + + $Errors->AddError("error.fieldIsRequired",'Visible',"","","clsCategory","Validate"); + + $dataValid = false; + + } + + + + if(!isset($this->m_CreatedById)) + + { + + $Errors->AddError("error.fieldIsRequired",'CreatedBy',"","","clsCategory","Validate"); + + $dataValid = false; + + } + + return $dataValid; + + } + + + + function UpdateCachedPath() + + { + + if($this->UsingTempTable()==TRUE) + + return; + + $Id = $this->Get("CategoryId"); + + $Id2 = $Id; + + $NavPath = ""; + + $path = array(); + + do + + { + + $rs = $this->adodbConnection->Execute("SELECT ParentId,Name from ".$this->tablename." where CategoryId='$Id2'"); + + $path[] = $Id2; + + $nav[] = $rs->fields["Name"]; + + if ($rs && !$rs->EOF) + + { + + //echo $path; + + $Id2 = $rs->fields["ParentId"]; + + + + } + + else + + $Id2="0"; //to prevent infinite loop + + } while ($Id2 != "0"); + + $parentpath = "|".implode("|",array_reverse($path))."|"; + + $NavBar = implode(">",array_reverse($nav)); + + //echo "
\n"; + + //$rs = $this->adodbConnection->Execute("update Category set ParentPath='$path' where CategoryId='$Id'"); + + if($this->Get("ParentPath")!=$parentpath || $this->Get("CachedNavbar")!=$NavBar) + + { + + $this->Set("ParentPath",$parentpath); + + $this->Set("CachedNavbar",$NavBar); + + $this->Update(); + + } + + } + + + + function GetCachedNavBar() + + { + + $res = $this->Get("CachedNavbar"); + + if(!strlen($res)) + + { + + $this->UpdateCachedPath(); + + $res = $this->Get("CachedNavbar"); + + } + + return $res; + + } + + function Increment_Count() + + { + + $this->Increment("CachedDescendantCatsQty"); + + } + + + + function Decrement_Count() + + { + + $this->Decrement("CachedDescendantCatsQty"); + + $this->Update(); + + } + + + + function LoadFromDatabase($Id) + + { + + global $objSession, $Errors, $objConfig; + + if($Id==0) + + return FALSE; + + + + if(!isset($Id)) + + { + + $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); + + return false; + + } + + $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE CategoryId = '%s'",$Id); + + $result = $this->adodbConnection->Execute($sql); + + if ($result === false) + + { + + $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase"); + + return false; + + } + + $data = $result->fields; + + if(is_array($data)) + + { + + $this->SetFromArray($data); + + $this->Clean(); + + } + + else + + return false; + + return true; + + } + + + + function SetNewItem() + + { + + global $objConfig; + + + + $value = $this->Get("CreatedOn"); + + + + $cutoff = adodb_date("U") - ($objConfig->Get("Category_DaysNew") * 86400); + + $this->IsNew = FALSE; + + if($value>$cutoff) + + $this->IsNew = TRUE; + + return $this->IsNew; + + } + + + + + + function LoadFromResourceId($Id) + + { + + global $objSession, $Errors; + + if(!isset($Id)) + + { + + $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromResourceId"); + + return false; + + } + + $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ResourceId = '%s'",$Id); + + $result = $this->adodbConnection->Execute($sql); + + if ($result === false) + + { + + $Errors->AddError("error.DatabaseError",NULL,$adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromResourceId"); + + return false; + + } + + $data = $result->fields; + + if(is_array($data)) + + $this->SetFromArray($data); + + else + + return false; + + return true; + + } + + + + function GetParentField($fieldname,$skipvalue,$default) + + { + + /* this function moves up the category tree until a value for $field other than + + $skipvalue is returned. if no matches are made, then $default is returned */ + + + + $path = $this->Get("ParentPath"); + + $path = substr($path,1,-1); //strip off the first & last tokens + + $aPath = explode("|",$path); + + $aPath = array_slice($aPath,0,-1); + + $ParentPath = implode("|",$aPath); + + $sql = "SELECT $fieldname FROM category WHERE $fieldname != '$skipvalue' AND ParentPath LIKE '$ParentPath' ORDER BY ParentPath DESC"; + + $rs = $this->adodbConnection->execute($sql); + + if($rs && !$rs->EOF) + + { + + $ret = $rs->fields[$fieldname]; + + } + + else + + $ret = $default; + + $update = "UPDATE ".$this->SourceTable." SET $fieldname='$ret' WHERE CategoryId=".$this->Get("CategoryId"); + + $this->adodbConnection->execute($update); + + return $ret; + + } + + + + + + + + function GetCustomField($fieldName) + + { + + global $objSession, $Errors; + + + + if(!isset($this->m_CategoryId)) + + { + + $Errors->AddError("error.appError","Get field is required in order to set custom field values","","",get_class($this),"GetCustomField"); + + return false; + + } + + + + return GetCustomFieldValue($this->m_CategoryId,"category",$fieldName); + + } + + + + function SetCustomField($fieldName, $value) + + { + + global $objSession, $Errors; + + + + if(!isset($this->m_CategoryId)) + + { + + $Errors->AddError("error.appError","Set field is required in order to set custom field values","","",get_class($this),"SetCustomField"); + + return false; + + } + + return SetCustomFieldValue($this->m_CategoryId,"category",$fieldName,$value); + + } + + + + function LoadPermissions($first=1) + + { + + /* load all permissions for group on this category */ + + $this->Permissions->CatId=$this->Get("CategoryId"); + + if($this->Permissions->NumItems()==0) + + { + + $cats = explode("|",substr($this->Get("ParentPath"),1,-1)); + + if(is_array($cats)) + + { + + $cats = array_reverse($cats); + + $cats[] = 0; + + foreach($cats as $catid) + + { + + $this->Permissions->LoadCategory($catid); + + } + + } + + } + + if($this->Permissions->NumItems()==0) + + { + + if($first==1) + + { + + $this->Permissions->GroupId=NULL; + + $this->LoadPermissions(0); + + } + + } + + } + + + + function PermissionObject() + + { + + return $this->Permissions; + + } + + + + function PermissionItemObject($PermissionName) + + { + + $p = $this->Permissions->GetPermByName($PermissionName); + + return $p; + + } + + + + function HasPermission($PermissionName,$GroupID) + + { + + global $objSession; + + + + $perm = $this->PermissionValue($PermissionName,$GroupID); + +// echo "Permission $PermissionName for $GroupID is $perm in ".$this->Get("CategoryId")."
\n"; + + if(!$perm) + + { + + $perm=$objSession->HasSystemPermission("ROOT"); + + } + + return ($perm==1); + + } + + + + function PermissionValue($PermissionName,$GroupID) + + { + + //$this->LoadPermissions(); + + $ret=NULL; + + //echo "Looping though ".count($this->Permissions)." permissions Looking for $PermissionName of $GroupID
\n"; + + if($this->Permissions->GroupId != $GroupID) + + { + + $this->Permissions->Clear(); + + $this->Permissions->GroupId = $GroupID; + + } + + + + $this->Permissions->CatId=$this->Get("CategoryId"); + + $ret = $this->Permissions->GetPermissionValue($PermissionName); + + if($ret == NULL) + + { + + $cats = explode("|",substr($this->Get("ParentPath"),1,-1)); + + + + if(is_array($cats)) + + { + + $cats = array_reverse($cats); + + $cats[] = 0; + + foreach($cats as $catid) + + { + + $this->Permissions->LoadCategory($catid); + + $ret = $this->Permissions->GetPermissionValue($PermissionName); + + if(is_numeric($ret)) + + break; + + } + + } + + } + + return $ret; + + } + + + + function SetPermission($PermName,$GroupID,$Value,$Type=0) + + { + + global $objSession, $objPermissions, $objGroups; + + + + if($this->Permissions->GroupId != $GroupID) + + { + + $this->Permissions->Clear(); + + $this->Permissions->GroupId = $GroupID; + + } + + + + if($objSession->HasSystemPermission("GRANT")) + + { + + $current = $this->PermissionValue($PermName,$GroupID); + + + + if($current == NULL) + + { + + $this->Permissions->Add_Permission($this->Get("CategoryId"),$GroupId,$PermName,$Value,$Type); + + } + + else + + { + + $p = $this->Permissions->GetPermByName($PermName); + + if($p->Inherited==FALSE) + + { + + $p->Set("PermissionValue",$Value); + + $p->Update(); + + } + + else + + $this->Permissions->Add_Permission($this->Get("CategoryId"),$GroupId,$PermName,$Value,$Type); + + } + + if($PermName == "CATEGORY.VIEW") + + { + + $Groups = $objGroups->GetAllGroupList(); + + $ViewList = $this->Permissions->GetGroupPermList($this,"CATEGORY.VIEW",$Groups); + + $this->SetViewPerms("CATEGORY.VIEW",$ViewList,$Groups); + + $this->Update(); + + } + + } + + } + + + + function SetViewPerms($PermName,$acl,$allgroups) + + { + + global $objPermCache; + + + + $dacl = array(); + + if(!is_array($allgroups)) + + { + + global $objGroups; + + $allgroups = $objGroups->GetAllGroupList(); + + } + + + + for($i=0;$iPermissions->GetPermId($PermName); + + $pc = $objPermCache->GetPerm($this->Get("CategoryId"),$PermId); + + if(is_object($pc)) + + { + + $pc->Set("ACL",$aval); + + $pc->Set("DACL",$dval); + + $pc->Update(); + + } + + else + + $objPermCache->AddPermCache($this->Get("CategoryId"),$PermId,$aval,$dval); + + + + //$this->Update(); + + } + + + + function GetACL($PermName) + + { + + global $objPermCache; + + + + $ret = ""; + + $PermId = $this->Permissions->GetPermId($PermName); + + $pc = $objPermCache->GetPerm($this->Get("CategoryId"),$PermId); + + if(is_object($pc)) + + { + + $ret = $this->Get("ACL"); + + } + + return $ret; + + } + + + + + + function UpdateACL() + + { + + global $objGroups, $objPermCache; + + + + $glist = $objGroups->GetAllGroupList(); + + + + $ViewList = $this->Permissions->GetGroupPermList($this,"CATEGORY.VIEW",$glist); + + $perms = $this->Permissions->GetAllViewPermGroups($this,$glist); + + //echo "
";print_r($perms); echo "
"; + + foreach($perms as $PermName => $l) + + { + + $this->SetViewPerms($PermName,$l,$glist); + + } + + } + + + + function Cat_Link() + + { + + global $m_var_list_update; + + + + $m_var_list_update["cat"] = $this->Get("CategoryId"); + + $ret = GetIndexURL()."?env=".BuildEnv(); + + unset($m_var_list_update["cat"]); + + return $ret; + + } + + + + function Parent_Link() + + { + + global $m_var_list_update; + + + + $m_var_list_update["cat"] = $this->Get("ParentId"); + + $ret = GetIndexURL()."?env=".BuildEnv(); + + unset($m_var_list_update["cat"]); + + return $ret; + + } + + + + function Admin_Parent_Link($page=NULL) + + { + + global $m_var_list_update; + + + + if(!strlen($page)) + + $page = $_SERVER["PHP_SELF"]; + + $m_var_list_update["cat"] = $this->Get("ParentId"); + + $ret = $page."?env=".BuildEnv(); + + unset($m_var_list_update["cat"]); + + return $ret; + + } + + + + function StatusIcon() + + { + + global $imagesURL; + + + + $ret = $imagesURL."/itemicons/"; + + + + switch($this->Get("Status")) + + { + + case STATUS_DISABLED: + + $ret .= "icon16_cat_disabled.gif"; + + break; + + case STATUS_PENDING: + + $ret .= "icon16_cat_pending.gif"; + + break; + + case STATUS_ACTIVE: + + $img = "icon16_cat.gif"; + + if($this->IsPopItem()) + + $img = "icon16_cat_pop.gif"; + + if($this->IsHotItem()) + + $img = "icon16_cat_hot.gif"; + + if($this->IsNewItem()) + + $img = "icon16_cat_new.gif"; + + if($this->Is("EditorsPick")) + + $img = "icon16_car_pick.gif"; + + $ret .= $img; + + break; + + } + + return $ret; + + } + + + + function SubCatCount() + + { + + $ret = $this->Get("CachedDescendantCatsQty"); + + + + $sql = "SELECT COUNT(*) as SubCount FROM ".$this->tablename." WHERE ParentPath LIKE '".$this->Get("ParentPath")."%' AND CategoryId !=".$this->Get("CategoryId"); + + $rs = $this->adodbConnection->Execute($sql); + + if($rs && !$rs->EOF) + + { + + $val = $rs->fields["SubCount"]; + + if($val != $this->Get("CachedDescendantCatsQty")) + + { + + $this->Set("CachedDescendantCatsQty",$val); + + $this->Update(); + + } + + $ret = $this->Get("CachedDescendantCatsQty"); + + } + + return $ret; + + } + + + + function GetSubCatIds() + + { + + $sql = "SELECT CategoryId FROM ".$this->tablename." WHERE ParentPath LIKE '".$this->Get("ParentPath")."%' AND CategoryId !=".$this->Get("CategoryId"); + + $rs = $this->adodbConnection->Execute($sql); + + $ret = array(); + + while($rs && !$rs->EOF) + + { + + $ret[] = $rs->fields["CategoryId"]; + + $rs->MoveNext(); + + } + + return $ret; + + } + + + + function GetParentIds() + + { + + $Parents = array(); + + $ParentPath = $this->Get("ParentPath"); + + if(strlen($ParentPath)) + + { + + $ParentPath = substr($ParentPath,1,-1); + + $Parents = explode("|",$ParentPath); + + } + + return $Parents; + + } + + + + function ItemCount($ItemType="") + + { + + global $objItemTypes,$objCatList,$objCountCache; + + + + if(!is_numeric($ItemType)) + + { + + $TypeId = $objItemTypes->GetItemTypeValue($ItemType); + + } + + else + + $TypeId = (int)$ItemType; + + + + //$path = $this->Get("ParentPath"); + + //$path = substr($path,1,-1); + + //$path = str_replace("|",",",$path); + + $path = implode(",",$this->GetSubCatIds()); + + if(strlen($path)) + + { + + $path = $this->Get("CategoryId").",".$path; + + } + + else + + $path = $this->Get("CategoryId"); + + + + $res = TableCount(GetTablePrefix()."CategoryItems","CategoryId IN ($path)",FALSE); + + + + return $res; + + } + + + + function ParseObject($element) + + { + + global $objConfig, $objCatList, $rootURL, $var_list, $var_list_update, $m_var_list_update, $objItemTypes,$objCountCache; + + $extra_attribs = ExtraAttributes($element->attributes); + + + + //print_r($element); + + if(strtolower($element->name)==$this->TagPrefix) + + { + + $field = strtolower( $element->GetAttributeByName('_field') ); + + switch($field) + + { + + case "name": + + case "Name": + + /* + + @field:cat.name + + @description:Category name + + */ + + $ret = $this->HighlightField("Name"); + + break; + + case "description": + + /* + + @field:cat.description + + @description:Category Description + + */ + + $ret = ($this->Get("Description")); + + $ret = $this->HighlightText($ret); + + break; + + case "cachednavbar": + + /* + + @field:cat.cachednavbar + + @description: Category cached navbar + + */ + + $ret = $this->HighlightField("CachedNavbar"); + + if(!strlen($ret)) + + { + + $this->UpdateCachedPath(); + + $ret = $this->HighlightField("CachedNavbar"); + + } + + break; + + case "image": + + /* + + @field:cat.image + + @description:Return an image associated with the category + + @attrib:_default:bool:If true, will return the default image if the requested image does not exist + + @attrib:_name::Return the image with this name + + @attrib:_thumbnail:bool:If true, return the thumbnail version of the image + + @attrib:_imagetag:bool:If true, returns a complete image tag. exta html attributes are passed to the image tag + + */ + + $default = $element->GetAttributeByName('_primary'); + + $name = $element->GetAttributeByName('_name'); + + if(strlen($name)) + + { + + $img = $this->GetImageByName($name); + + } + + else + + { + + if($default) + + $img = $this->GetDefaultImage(); + + } + + if($img) + + { + + if( $element->GetAttributeByName('_thumbnail') ) + + { + + $url = $img->parsetag("thumb_url"); + + } + + else + + $url = $img->parsetag("image_url"); + + + + } + + else + + { + + $url = $element->GetAttributeByName('_defaulturl'); + + } + + + + if( $element->GetAttributeByName('_imagetag') ) + + { + + if(strlen($url)) + + { + + $ret = ""; + + } + + else + + $ret = ""; + + } + + else + + $ret = $url; + + break; + + case "createdby": + + /* + + @field:cat.createdby + + @description:parse a user field of the user that created the category + + @attrib:_usertag::User field to return (defaults to login ID) + + */ + + $field = $element->GetAttributeByName('_usertag'); + + if(!strlen($field)) + + { + + $field = "user_login"; + + } + + $u = $objUsers->GetUser($this->Get("CreatedById")); + + $ret = $u->parsetag($field); + + break; + + case "custom": + + /* + + @field:cat.custom + + @description:Returns a custom field + + @attrib:_customfield::field name to return + + @attrib:_default::default value + + */ + + $field = $element->GetAttributeByName('_customfield'); + + $default = $element->GetAttributeByName('_default'); + + $ret = $this->GetCustomFieldValue($field,$default); + + break; + + + + case "catsubcats": + + /* + + @field:cat.catsubcats + + @description:Returns a list of subcats of current category + + @attrib:_limit:int:Number of categories to return + + @attrib:_separator::Separator between categories + + @attrib:_anchor:bool:Make an anchor (only if template is not specified) + + @attrib:_TargetTemplate:tpl:Target template + + @attrib:_Ending::Add special text at the end of subcategory list + + @attrib:_Class::Specify stly sheet class for anchors (if used) or "span" object + + */ + + $limit = ((int)$element->attributes["_limit"]>0)? $element->attributes["_limit"] : NULL; + + $separator = $element->attributes["_separator"]; + + $anchor = (int)($element->attributes["_anchor"])? 1 : NULL; + + $template = strlen($element->attributes["_TargetTemplate"])? $element->attributes["_TargetTemplate"] : NULL; + + $ending = strlen($element->attributes["_ending"])? $element->attributes["_ending"] : NULL; + + $class = strlen($element->attributes["_class"])? $element->attributes["_class"] : NULL; + + + + $ret = $this->GetSubCats($limit, $template, $separator, $anchor, $ending, $class); + + + + break; + + + + case "date": + + /* + + @field:cat.date + + @description:Returns the date/time the category was created + + @attrib:_tz:bool:Convert the date to the user's local time + + @attrib:_part::Returns part of the date. The following options are available: month,day,year,time_24hr,time_12hr + + */ + + $d = $this->Get("CreatedOn"); + + + + if( $element->GetAttributeByName('_tz') ) + + { + + $d = GetLocalTime($d,$objSession->Get("tz")); + + } + + + + $part = strtolower( $element->GetAttributeByName('_part') ); + + if(strlen($part)) + + { + + $ret = ExtractDatePart($part,$d); + + } + + else + + { + + if(!is_numeric($d)) + + { + + $ret = ""; + + } + + else + + $ret = LangDate($d); + + } + + break; + + case "link": + + /* + + @field:cat.link + + @description:Returns a URL setting the category to the current category + + @attrib:_template:tpl:Template URL should point to + + @attrib:_mod_template:tpl:Template INSIDE a module to which the category belongs URL should point to + + */ + + if ( strlen( $element->GetAttributeByName('_mod_template') ) ){ + + //will prefix the template with module template root path depending on category + + $ids = $this->GetParentIds(); + + $tpath = GetModuleArray("template"); + + $roots = GetModuleArray("rootcat"); + + + + // get template path of module, by searching for moudle name + + // in this categories first parent category + + // and then using found moudle name as a key for module template paths array + + $path = $tpath[array_search ($ids[0], $roots)]; + + $t = $path . $element->GetAttributeByName('_mod_template'); + + } + + else + + $t = $element->GetAttributeByName('_template'); + + + + + + if(strlen($t)) + + { + + $var_list_update["t"] = $t; + + } + + else + + $var_list_update["t"] = $var_list["t"]; + + $m_var_list_update["cat"] = $this->Get("CategoryId"); + + $ret = GetIndexURL()."?env=" . BuildEnv(); + + unset($m_var_list_update["cat"], $var_list_update["t"]); + + break; + + case "adminlink": + + $m_var_list_update["cat"] = $this->Get("CategoryId"); + + $m_var_list_update["p"] = 1; + + $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); + + unset($m_var_list_update["cat"]); + + unset($m_var_list_update["p"]); + + return $ret; + + break; + + case "customlink": + + $t = $this->GetCustomFieldValue("indextemplate",""); + + if(strlen($t)) + + { + + $var_list_update["t"] = $t; + + } + + else + + $var_list_update["t"] = $var_list["t"]; + + $m_var_list_update["cat"] = $this->Get("CategoryId"); + + $ret = GetIndexURL()."?env=" . BuildEnv(); + + unset($m_var_list_update["cat"], $var_list_update["t"]); + + break; + + case "link_selector": + + $m_var_list_update["cat"] = $this->Get("CategoryId"); + + $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); + + + + // pass through selector + + if( isset($_REQUEST['Selector']) ) $ret .= '&Selector='.$_REQUEST['Selector']; + + + + // pass new status + + if( isset($_REQUEST['new']) ) $ret .= '&new='.$_REQUEST['new']; + + + + unset($m_var_list_update["cat"]); + + return $ret; + + break; + + case "admin_icon": + + if( $element->GetAttributeByName('fulltag') ) + + { + + $ret = "StatusIcon()."\">"; + + } + + else + + $ret = $this->StatusIcon(); + + break; + + case "subcats": + + /* + + @field:cat.subcats + + @description: Loads category's subcategories into a list and renders using the m_list_cats global tag + + @attrib:_subcattemplate:tpl:Template used to render subcategory list elements + + @attrib: _columns:int: Numver of columns to display the categories in (defaults to 1) + + @attrib: _maxlistcount:int: Maximum number of categories to list + + @attrib: _FirstItemTemplate:tpl: Template used for the first category listed + + @attrib: _LastItemTemplate:tpl: Template used for the last category listed + + @attrib: _NoTable:bool: If set to 1, the categories will not be listed in a table. If a table is used, all HTML attributes are passed to the TABLE tag + + */ + + $attr = array(); + + $attr["_catid"] = $this->Get("CategoryId"); + + $attr["_itemtemplate"] = $element->GetAttributeByName('_subcattemplate'); + + if( $element->GetAttributeByName('_notable') ) + + $attr["_notable"]=1; + + $ret = m_list_cats($attr); + + break; + + case "subcatcount": + + /* + + @field:cat.subcatcount + + @description:returns number of subcategories + + */ + + $GroupOnly = $element->GetAttributeByName('_grouponly') ? 1 : 0; + + $txt = "Get("CategoryId")."\" _SubCats=\"1\" "; + + $txt .="_CategoryCount=\"1\" _ItemType=\"1\" _GroupOnly=\"$GroupOnly\" />"; + + $tag = new clsHtmlTag($txt); + + $ret = $tag->Execute(); + + break; + + case "itemcount": + + /* + + @field:cat.itemcount + + @description:returns the number of items in the category + + @attrib:_itemtype::name of item type to count, or all items if not set + + */ + + $typestr = $element->GetAttributeByName('_itemtype'); + + if(strlen($typestr)) + + { + + $type = $objItemTypes->GetTypeByName($typestr); + + if(is_object($type)) + + { + + $TypeId = $type->Get("ItemType"); + + $GroupOnly = $element->GetAttributeByName('_grouponly') ? 1 : 0; + + $txt = "Get("CategoryId")."\" _SubCats=\"1\" "; + + $txt .=" _ListType=\"category\" _CountCurrent=\"1\" _ItemType=\"$TypeId\" _GroupOnly=\"$GroupOnly\" />"; + + $tag = new clsHtmlTag($txt); + + $ret = $tag->Execute(); + + } + + else + + $ret = ""; + + } + + else + + { + + $ret = (int)$objCountCache->GetCatListTotal($this->Get("CategoryId")); + + } + + break; + + case "totalitems": + + /* + + @field:cat.totalitems + + @description:returns the number of items in the category and all subcategories + + */ + + $ret = $this->ItemCount(); + + break; + + + + case 'modified': + + $ret = ''; + + $date = $this->Get('Modified'); + + if(!$date) $date = $this->Get('CreatedOn'); + + if( $element->GetAttributeByName('_tz') ) + + { + + $date = GetLocalTime($date,$objSession->Get("tz")); + + } + + + + $part = strtolower($element->GetAttributeByName('_part') ); + + if(strlen($part)) + + { + + $ret = ExtractDatePart($part,$date); + + } + + else + + { + + $ret = ($date <= 0) ? '' : LangDate($date); + + } + + break; + + + + case "itemdate": + + /* + + @field:cat.itemdate + + @description:Returns the date the cache count was last updated + + @attrib:_itemtype:Item name to check + + @attrib:_tz:bool:Convert the date to the user's local time + + @attrib:_part::Returns part of the date. The following options are available: month,day,year,time_24hr,time_12hr + + */ + + $typestr = $element->GetAttributeByName('_itemtype'); + + $type = $objItemTypes->GetTypeByName($typestr); + + if(is_object($type)) + + { + + $TypeId = $type->Get("ItemType"); + + $cc = $objCountCache->GetCountObject(1,$TypeId,$this->get("CategoryId"),0); + + if(is_object($cc)) + + { + + $date = $cc->Get("LastUpdate"); + + } + + else + + $date = ""; + + + + //$date = $this->GetCacheCountDate($TypeId); + + if( $element->GetAttributeByName('_tz') ) + + { + + $date = GetLocalTime($date,$objSession->Get("tz")); + + } + + + + $part = strtolower($element->GetAttributeByName('_part') ); + + if(strlen($part)) + + { + + $ret = ExtractDatePart($part,$date); + + } + + else + + { + + if($date<=0) + + { + + $ret = ""; + + } + + else + + $ret = LangDate($date); + + } + + } + + else + + $ret = ""; + + break; + + case "new": + + /* + + @field:cat.new + + @description:returns text if category's status is "new" + + @attrib:_label:lang: Text to return if status is new + + */ + + if($this->IsNewItem()) + + { + + $ret = $element->GetAttributeByName('_label'); + + if(!strlen($ret)) + + $ret = "lu_new"; + + $ret = language($ret); + + } + + else + + $ret = ""; + + break; + + case "pick": + + /* + + @field:cat.pick + + @description:returns text if article's status is "hot" + + @attrib:_label:lang: Text to return if status is "hot" + + */ + + if($this->Get("EditorsPick")==1) + + { + + $ret = $element->GetAttributeByName('_label'); + + if(!strlen($ret)) + + $ret = "lu_pick"; + + $ret = language($ret); + + } + + else + + $ret = ""; + + break; + + + + case "parsetag": + + /* + + @field:cat.parsetag + + @description:returns a tag output with this categoriy set as a current category + + @attrib:_tag:: tag name + + */ + + + + $tag = new clsHtmlTag(); + + $tag->name = $element->GetAttributeByName('_tag'); + + $tag->attributes = $element->attributes; + + $tag->attributes["_catid"] = $this->Get("CategoryId"); + + $ret = $tag->Execute(); + + break; + + + + + + /* + + @field:cat.relevance + + @description:Displays the category relevance in search results + + @attrib:_displaymode:: How the relevance should be displayed
+ +
    + +
  • "Numerical": Show the decimal value + +
  • "Bar": Show the HTML representing the relevance. Returns two HTML cells ≶td< with specified background colors + +
  • "Graphical":Show image representing the relevance + +
+ + @attrib:_onimage::Zero relevance image shown in graphical display mode. Also used as prefix to build other images (i.e. prefix+"_"+percentage+".file_extension" + + @attrib:_OffBackGroundColor::Off background color of HTML cell in bar display mode + + @attrib:_OnBackGroundColor::On background color of HTML cell in bar display mode + + */ + + + + } + + if( !isset($ret) ) $ret = parent::ParseObject($element); + + + + } + + return $ret; + + } + + + + + + function parsetag($tag) + + { + + global $objConfig,$objUsers, $m_var_list, $m_var_list_update; + + if(is_object($tag)) + + { + + $tagname = $tag->name; + + } + + else + + $tagname = $tag; + + + + switch($tagname) + + { + + case "cat_id": + + return $this->Get("CategoryId"); + + break; + + case "cat_parent": + + return $this->Get("ParentId"); + + break; + + case "cat_fullpath": + + return $this->Get("CachedNavbar"); + + break; + + case "cat_name": + + return $this->Get("Name"); + + break; + + case "cat_desc": + + return $this->Get("Description"); + + break; + + case "cat_priority": + + if($this->Get("Priority")!=0) + + { + + return (int)$this->Get("Priority"); + + } + + else + + return ""; + + break; + + case "cat_pick": + + if ($this->Get("EditorsPick")) + + return "pick"; + + break; + + case "cat_status": + + return $this->Get("Status"); + + break; + + case "cat_Pending": + + return $this->Get("Name"); + + break; + + + + case "cat_pop": + + if($this->IsPopItem()) + + return "pop"; + + break; + + case "cat_new": + + if($this->IsNewItem()) + + return "new"; + + break; + + case "cat_hot": + + if($this->IsHotItem()) + + return "hot"; + + break; + + case "cat_metakeywords": + + return $this->Get("MetaKeywords"); + + break; + + case "cat_metadesc": + + return $this->Get("MetaDescription"); + + break; + + case "cat_createdby": + + return $objUsers->GetUserName($this->Get("CreatedById")); + + break; + + case "cat_resourceid": + + return $this->Get("ResourceId"); + + break; + + case "cat_sub_cats": + + return $this->GetSubCats($objConfig->Get("SubCat_ListCount")); + + break; + + case "cat_link": + + return $this->Cat_Link(); + + break; + + case "subcat_count": + + return $this->SubCatCount(); + + break; + + case "cat_itemcount": + + return (int)$this->GetTotalItemCount(); + + break; + + case "cat_link_admin": + + $m_var_list_update["cat"] = $this->Get("CategoryId"); + + $m_var_list_update["p"] = 1; + + $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); + + unset($m_var_list_update["cat"]); + + unset($m_var_list_update["p"]); + + return $ret; + + break; + + case "cat_admin_icon": + + $ret = $this->StatusIcon(); + + return $ret; + + break; + + case "cat_link_selector": + + $m_var_list_update["cat"] = $this->Get("CategoryId"); + + $ret = $_SERVER["PHP_SELF"]."?env=" . BuildEnv(); + + unset($m_var_list_update["cat"]); + + return $ret; + + break; + + + + case "cat_link_edit": + + $m_var_list_update["id"] = $this->Get("CategoryId"); + + $ret = "addcategory.php?env=" . BuildEnv(); + + unset($m_var_list_update["id"]); + + return $ret; + + break; + + + + case "cat_date": + + return LangDate($this->Get("CreatedOn")); + + break; + + case "cat_num_cats": + + return $this->Get("CachedDescendantCatsQty"); + + break; + + case "cell_back": + + if ($m_var_list_update["cat_cell"]=="#cccccc") + + { + + $m_var_list_update["cat_cell"]="#ffffff"; + + return "#ffffff"; + + } + + else + + { + + $m_var_list_update["cat_cell"]="#cccccc"; + + return "#cccccc"; + + } + + break; + + default: + + return "Undefined:$tagname"; + + } + + } + + + + function ParentNames() + + { + + global $objCatList; + + + + if(strlen($this->Get("CachedNavbar"))==0) + + { + + $nav = ""; + + //echo "Rebuilding Navbar..
\n"; + + if(strlen($this->Get("ParentPath"))==0) + + { + + $this->UpdateCachedPath(); + + } + + $cats = explode("|",substr($this->Get("ParentPath"),1,-1)); + + + + foreach($cats as $catid) + + { + + $cat =& $objCatList->GetCategory($catid); + + if(is_object($cat)) + + { + + if(strlen($cat->Get("Name"))) + + $names[] = $cat->Get("Name"); + + + + } + + } + + $nav = implode(">", $names); + + $this->Set("CachedNavbar",$nav); + + $this->Update(); + + } + + $res = explode(">",$this->Get("CachedNavbar")); + + return $res; + + } + + + + function UpdateCacheCounts() + + { + + global $objItemTypes; + + + + $CatId = $this->Get("CategoryId"); + + + + if($CatId>0) + + { + + //echo "Updating count for ".$this->Get("CachedNavbar")."
\n"; + + UpdateCategoryCount(0,$CatId); + + } + + } + + + + /** + + * @return void + + * @param int $date + + * @desc Set Modified field for category & all it's parent categories + + */ + + function SetLastUpdate($date) + + { + + $parents = $this->Get('ParentPath'); + + $parents = substr($parents, 1, strlen($parents) - 2 ); + + $parents = explode('|', $parents); + + + + $db =&GetADODBConnection(); + + $sql = 'UPDATE '.$this->tablename.' SET Modified = '.$date.' WHERE CategoryId IN ('.implode(',', $parents).')'; + + $db->Execute($sql); + + } + + + + + +} + + + +class clsCatList extends clsItemList //clsItemCollection + +{ + + //var $Page; // no need because clsItemList class used instead of clsItemCollection + + //var $PerPageVar; + + + + function clsCatList() + + { + + global $m_var_list; + + $this->clsItemCollection(); + + $this->classname="clsCategory"; + + $this->AdminSearchFields = array("Name","Description"); + + $this->Page = (int)$m_var_list["p"]; + + $this->PerPageVar = "Perpage_Category"; + + $this->SourceTable = GetTablePrefix()."Category"; + + $this->BasePermission="CATEGORY"; + + $this->DefaultPerPage = 20; + + } + + + + function SaveNewPage() + + { + + global $m_var_list; + + $m_var_list["p"] = $this->Page; + + } + + + + function GetCountSQL($PermName,$CatId=NULL, $GroupId=NULL, $AdditonalWhere="") + + { + + global $objSession, $objPermissions, $objCatList; + + + + $ltable = $this->SourceTable; + + $acl = $objSession->GetACLClause(); + + $cattable = GetTablePrefix()."CategoryItems"; + + $CategoryTable = GetTablePrefix()."Category"; + + $ptable = GetTablePrefix()."PermCache"; + + $VIEW = $objPermissions->GetPermId($PermName); + + + + $sql = "SELECT count(*) as CacheVal FROM $ltable "; + + $sql .="INNER JOIN $ptable ON ($ltable.CategoryId=$ptable.CategoryId) "; + + $sql .="WHERE ($acl AND PermId=$VIEW AND $ltable.Status=1) "; + + + + if(strlen($AdditonalWhere)>0) + + { + + $sql .= "AND (".$AdditonalWhere.")"; + + } + + return $sql; + + } + + + + function CountCategories($attribs) + + { + + global $objSession; + + + + $cat = $attribs["_catid"]; + + if(!is_numeric($cat)) + + { + + $cat = $this->CurrentCategoryID(); + + } + + if((int)$cat>0) + + $c = $this->GetCategory($cat); + + + + if($attribs["_subcats"] && $cat>0) + + { + + $ParentWhere = "(ParentPath LIKE '".$c->Get("ParentPath")."%' AND ".$this->SourceTable.".CategoryId != $cat)"; + + } + + if($attribs["_today"]) + + { + + $today = mktime(0,0,0,date("m"),date("d"),date("Y")); + + $TodayWhere = "(CreatedOn>=$today)"; + + } + + if($attribs["_grouponly"]) + + { + + $GroupList = $objSession->Get("GroupList"); + + } + + else + + $GroupList = NULL; + + + + $where = ""; + + if(strlen($ParentWhere)) + + { + + $where = $ParentWhere; + + } + + if(strlen($TodayWhere)) + + { + + if(strlen($where)) + + $where .=" AND "; + + $where .= $TodayWhere; + + } + + $sql = $this->GetCountSQL("CATEGORY.VIEW",$cat,$GroupList,$where); + + + +// echo "SQL: ".$sql."
"; + + + + $rs = $this->adodbConnection->Execute($sql); + + if($rs && !$rs->EOF) + + { + + $ret = $rs->fields["CacheVal"]; + + } + + else + + $ret = 0; + + + + return $ret; + + } + + + + function CurrentCategoryID() + + { + + global $m_var_list; + + return (int)$m_var_list["cat"]; + + } + + + + function NumCategories() + + { + + return $this->NumItems(); + + } + + + + function &CurrentCat() + + { + + //return $this->GetCategory($this->CurrentCategoryID()); + + return $this->GetItem($this->CurrentCategoryID()); + + } + + + + function &GetCategory($CatID) + + { + + return $this->GetItem($CatID); + + } + + + + function GetByResource($ResId) + + { + + return $this->GetItemByField("ResourceId",$ResId); + + } + + + + function QueryOrderByClause($EditorsPick=FALSE,$Priority=FALSE,$UseTableName=FALSE) + + { + + global $objSession; + + + + if($UseTableName) + + { + + $TableName = $this->SourceTable."."; + + } + + else + + $TableName = ""; + + + + $Orders = array(); + + + + if($EditorsPick) + + { + + $Orders[] = $TableName."EditorsPick DESC"; + + } + + if($Priority) + + { + + $Orders[] = $TableName."Priority DESC"; + + } + + + + $FieldVar = "Category_Sortfield"; + + $OrderVar = "Category_Sortorder"; + + + + if(is_object($objSession)) + + { + + if(strlen($objSession->GetPersistantVariable($FieldVar))>0) + + { + + $Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". + + $objSession->GetPersistantVariable($OrderVar)); + + } + + } + + + + $FieldVar = "Category_Sortfield2"; + + $OrderVar = "Category_Sortorder2"; + + + + if(is_object($objSession)) + + { + + if(strlen($objSession->GetPersistantVariable($FieldVar))>0) + + { + + $Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". + + $objSession->GetPersistantVariable($OrderVar)); + + } + + } + + + + + + if(count($Orders)>0) + + { + + $OrderBy = "ORDER BY ".implode(", ",$Orders); + + } + + else + + $OrderBy=""; + + return $OrderBy; + + } + + + + + + function LoadCategories($where="", $orderBy = "", $no_limit = true, $fix_method = 'set_first') + + { + + // load category list using $where clause + + // apply ordering specified in $orderBy + + // show all cats ($no_limit = true) or only from current page ($no_limit = false) + + // in case if stored page is greather then page count issue page_fixing with + + // method specified (see "FixInvalidPage" method for details) + + $PerPage = $this->GetPerPage(); + + + + $this->QueryItemCount = TableCount($this->SourceTable,$where,0); + + if($no_limit == false) + + { + + $this->FixInvalidPage($fix_method); + + $Start = ($this->Page-1) * $PerPage; + + $limit = "LIMIT ".$Start.",".$PerPage; + + } + + else + + $limit = NULL; + + + + return $this->Query_Category($where, $orderBy, $limit); + + } + + + + function Query_Category($whereClause="",$orderByClause="",$limit=NULL) + + { + + global $m_var_list, $objSession, $Errors, $objPermissions; + + $GroupID = $objSession->Get("GroupID"); + + $resultset = array(); + + + + $table = $this->SourceTable; + + $ptable = GetTablePrefix()."PermCache"; + + $CAT_VIEW = $objPermissions->GetPermId("CATEGORY.VIEW"); + + if(!$objSession->HasSystemPermission("ADMIN")) + + { + + $sql = "SELECT * FROM $table INNER JOIN $ptable ON ($ptable.CategoryId=$table.CategoryId)"; + + $acl_where = $objSession->GetACLClause(); + + if(strlen($whereClause)) + + { + + $sql .= " WHERE ($acl_where) AND PermId=$CAT_VIEW AND ".$whereClause; + + } + + else + + $sql .= " WHERE ($acl_where) AND PermId=$CAT_VIEW "; + + } + + else + + { + + $sql ="SELECT * FROM $table ".($whereClause ? "WHERE $whereClause" : ''); + + } + + $sql .=" ".$orderByClause; + + + + if(isset($limit) && strlen(trim($limit))) + + $sql .= " ".$limit; + + if($objSession->HasSystemPermission("DEBUG.LIST")) + + echo $sql; + + + + return $this->Query_item($sql); + + } + + + + function CountPending() + + { + + return TableCount($this->SourceTable,"Status=".STATUS_PENDING,0); + + } + + + + function GetPageLinkList($dest_template=NULL,$page="",$PagesToList=10,$HideEmpty=TRUE) + + { + + global $objConfig, $m_var_list_update, $var_list_update, $var_list; + + + + if(!strlen($page)) + + $page = GetIndexURL(); + + + + $PerPage = $this->GetPerPage(); + + $NumPages = ceil( $this->GetNumPages($PerPage) ); + + + + if($NumPages == 1 && $HideEmpty) return ''; + + + + if(strlen($dest_template)) + + { + + $var_list_update["t"] = $dest_template; + + } + + else + + $var_list_update["t"] = $var_list["t"]; + + + + $o = ""; + + if($this->Page>$NumPages) + + $this->Page=$NumPages; + + + + $StartPage = (int)$this->Page - ($PagesToList/2); + + if($StartPage<1) + + $StartPage=1; + + + + $EndPage = $StartPage+($PagesToList-1); + + if($EndPage>$NumPages) + + { + + $EndPage = $NumPages; + + $StartPage = $EndPage-($PagesToList-1); + + if($StartPage<1) + + $StartPage=1; + + } + + + + $o = ""; + + if($StartPage>1) + + { + + $m_var_list_update["p"] = $this->Page-$PagesToList; + + $prev_url = $page."?env=".BuildEnv(); + + $o .= "<<"; + + } + + + + + + for($p=$StartPage;$p<=$EndPage;$p++) + + { + + if($p!=$this->Page) + + { + + $m_var_list_update["p"]=$p; + + $href = $page."?env=".BuildEnv(); + + $o .= " $p "; + + } + + else + + { + + $o .= "$p"; + + } + + } + + if($EndPage<$NumPages && $EndPage>0) + + { + + $m_var_list_update["p"]=$this->Page+$PagesToList; + + $next_url = $page."?env=".BuildEnv(); + + $o .= " >>"; + + } + + unset($m_var_list_update,$var_list_update["t"] ); + + return $o; + + } + + + + function GetAdminPageLinkList($url) + + { + + global $objConfig, $m_var_list_update, $var_list_update, $var_list; + + + + $PerPage = $this->GetPerPage(); + + $NumPages = ceil($this->GetNumPages($PerPage)); + + $o = ""; + + + + if($this->Page>1) + + { + + $m_var_list_update["p"]=$this->Page-1; + + $prev_url = $url."?env=".BuildEnv(); + + unset($m_var_list_update["p"]); + + $o .= "<<"; + + } + + + + if($this->Page<$NumPages) + + { + + $m_var_list_update["p"]=$this->Page+1; + + $next_url = $url."?env=".BuildEnv(); + + unset($m_var_list_update["p"]); + + } + + + + for($p=1;$p<=$NumPages;$p++) + + { + + if($p != $this->Page) + + { + + $m_var_list_update["p"]=$p; + + $href = $url."?env=".BuildEnv(); + + unset($m_var_list_update["p"]); + + $o .= " $p "; + + } + + else + + $o .= "$p"; + + } + + + + if($this->Page < $NumPages) + + $o .= ">>"; + + + + return $o; + + } + + + + function Search_Category($orderByClause) + + { + + global $objSession, $objConfig, $Errors; + + + + $PerPage = $this->GetPerPage(); + + $Start = ($this->Page-1) * $PerPage; + + $objResults = new clsSearchResults("Category","clsCategory"); + + $this->Clear(); + + $this->Categories = $objResults->LoadSearchResults($Start,$PerPage); + + + + return $this->Categories; + + } + + + + + + function GetSubCats($ParentCat) + + { + + return $this->Query_Category("ParentId=".$ParentCat,""); + + } + + + + function AllSubCats($ParentCat) + + { + + $c =& $this->GetCategory($ParentCat); + + $sql = "SELECT * FROM ".$this->SourceTable." WHERE ParentPath LIKE '".$c->Get("ParentPath")."%'"; + + $rs = $this->adodbConnection->Execute($sql); + + $subcats = array(); + + while($rs && !$rs->EOF) + + { + + if($rs->fields["CategoryId"]!=$ParentCat) + + { + + $subcats[] = $rs->fields["CategoryId"]; + + } + + $rs->MoveNext(); + + } + + if($ParentCat>0) + + { + + if($c->Get("CachedDescendantCatsQty")!=count($subcats)) + + { + + $c->Set("CachedDescendantCatsQty",count($subcats)); + + } + + } + + return $subcats; + + } + + + + function cat_navbar($admin=0, $cat, $target_template, $separator = " > ", $LinkLeaf = FALSE, + + $root = 0,$RootTemplate="",$modcat=0, $ModTemplate="", $LinkRoot = FALSE) + + { + + // draw category navigation bar (at top) + + global $Errors, $var_list_update, $var_list, $m_var_list_update, $m_var_list, $objConfig; + + + + $selector = isset($_REQUEST['Selector']) ? '&Selector='.$_REQUEST['Selector'] : ''; + + $new = isset($_REQUEST['new']) ? '&new='.$_REQUEST['new'] : ''; + + + + $nav = ""; + + $m_var_list_update["p"]=1; + + if(strlen($target_template)==0) + + $target_template = $var_list["t"]; + + + + + + if($cat == 0) + + { + + $cat_name = language($objConfig->Get("Root_Name")); + + if ($LinkRoot) + + { + + $var_list_update["t"] = strlen($RootTemplate)? $RootTemplate : $target_template; + + $nav = "$cat_name"; } + + else + + $nav = "$cat_name"; + + } + + else + + { + + $nav = array(); + + $c =& $this->GetCategory($cat); + + $nav_unparsed = $c->Get("ParentPath"); + + if(strlen($nav_unparsed)==0) + + { + + $c->UpdateCachedPath(); + + $nav_unparsed = $c->Get("ParentPath"); + + } + + //echo " Before $nav_unparsed "; + + if($root) + + { + + $r =& $this->GetCategory($root); + + $rpath = $r->Get("ParentPath"); + + $nav_unparsed = substr($nav_unparsed,strlen($rpath),-1); + + $cat_name = $r->Get("Name"); + + $m_var_list_update["cat"] = $root; + + if($cat == $catid && !$LinkLeaf) + + { + + $nav[] = "".$cat_name.""; //href=\"browse.php?env=". BuildEnv() ."\" + + } + + else + + { + + if ($admin == 1) + + { + + $nav[] = "".$cat_name.""; + + } + + else + + { + + if(strlen($RootTemplate)) + + { + + $var_list_update["t"] = $RootTemplate; + + } + + else + + { + + $var_list_update["t"] = $target_template; + + } + + $nav[] = "".$cat_name.""; + + } + + } + + } + + else + + { + + $nav_unparsed = substr($nav_unparsed,1,-1); + + $cat_name = language($objConfig->Get("Root_Name")); + + $m_var_list_update["cat"] = 0; + + if($cat == 0) + + { + + $nav[] = "".$cat_name.""; //href=\"browse.php?env=". BuildEnv() ."\" + + } + + else + + { + + if ($admin == 1) + + { + + $nav[] = "".$cat_name.""; + + } + + else + + { + + if(strlen($RootTemplate)) + + { + + $var_list_update["t"] = $RootTemplate; + + } + + else + + $var_list_update["t"] = $target_template; + + $nav[] = "".$cat_name.""; + + } + + } + + + + } + + //echo " After $nav_unparsed
\n"; + + if(strlen($target_template)==0) + + $target_template = $var_list["t"]; + + + + $cats = explode("|", $nav_unparsed); + + foreach($cats as $catid) + + { + + if($catid) + + { + + $c =& $this->GetCategory($catid); + + if(is_object($c)) + + { + + $cat_name = $c->Get("Name"); + + + + $m_var_list_update["cat"] = $catid; + + if($catid==$modcat && strlen($ModTemplate)>0) + + { + + $t = $ModTemplate; + + } + + else + + $t = $target_template; + + if($cat == $catid && !$LinkLeaf) + + { + + $nav[] = "".$cat_name.""; + + } + + else + + { + + if ($admin == 1) + + { + + $nav[] = "".$cat_name.""; + + } + + else + + { + + $var_list_update["t"] = $t; + + $nav[] = "".$cat_name.""; + + unset($var_list_update["t"]); + + } + + } + + unset($m_var_list_update["cat"]); + + } + + } + + } + + $nav = implode($separator, $nav); + + } + + return $nav; + + } + + + + function &Add($ParentId, $Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, $New, $Pop, + + $Priority, $MetaKeywords,$MetaDesc) + + { + + global $objSession; + + + + $UserId = $objSession->Get("UserId"); + + + + $d = new clsCategory(NULL); + + $d->tablename = $this->SourceTable; + + if($d->UsingTempTable()) + + $d->Set("CategoryId",-1); + + $d->idfield = "CategoryId"; + + $d->Set(array("ParentId", "Name", "Description", "CreatedOn", "EditorsPick", "Status", "HotItem", + + "NewItem","PopItem", "Priority", "MetaKeywords", "MetaDescription", "CreatedById"), + + array($ParentId, $Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, $New, + + $Pop, $Priority, $MetaKeywords,$MetaDesc, $UserId)); + + + + $d->Create(); + + if($Status==1) + + { + + $d->SendUserEventMail("CATEGORY.ADD",$objSession->Get("PortalUserId")); + + $d->SendAdminEventMail("CATEGORY.ADD"); + + } + + else + + { + + $d->SendUserEventMail("CATEGORY.ADD.PENDING",$objSession->Get("PortalUserId")); + + $d->SendAdminEventMail("CATEGORY.ADD.PENDING"); + + } + + $d->UpdateCachedPath(); + + //RunUp($ParentId, "Increment_Count"); + + + + return $d; + + } + + + + function &Edit_Category($CategoryId, $Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, + + $NewItem, $Pop, $Priority, $MetaKeywords,$MetaDesc) + + { + + $d =& $this->GetCategory($CategoryId); + + $d->Set(array("Name", "Description", "CreatedOn", "EditorsPick", "Status", "HotItem", + + "NewItem", "PopItem", "Priority", "MetaKeywords","MetaDescription"), + + array($Name, $Description, $CreatedOn, $EditorsPick, $Status, $Hot, $NewItem, + + $Pop, $Priority, $MetaKeywords,$MetaDesc)); + + $d->Update(); + + $d->UpdateCachedPath(); + + return $d; + + + + } + + + + function Move_Category($Id, $ParentTo) + + { + + global $objCatList; + + + + $d =& $this->GetCategory($Id); + + $oldparent = $d->Get("ParentId"); + + $ChildList = $d->GetSubCatIds(); + + + + /* + + echo "Target Parent Id: $ParentTo
\n"; + + echo "
";print_r($ChildList); echo "
"; + + echo "Old Parent: $oldparent
\n"; + + echo "ID: $Id
\n"; + + */ + + /* sanity checks */ + + + + if(!in_array($ParentTo,$ChildList) && $oldparent != $ParentTo && $oldparent != $Id && + + $Id != $ParentTo) + + { + + $d->Set("ParentId", $ParentTo); + + $d->Update(); + + $d->UpdateCachedPath(); + + RunUp($oldparent, "Decrement_Count"); + + RunUp($ParentTo, "Increment_Count"); + + RunDown($ParentTo, "UpdateCachedPath"); + + return TRUE; + + } + + else + + { + + global $Errors; + + $Errors->AddAdminUserError("la_error_move_subcategory"); + + return FALSE; + + } + + die(); + + } + + + + function Copy_CategoryTree($Id, $ParentTo) + + { + + global $PastedCatIds; + + + + $new = $this->Copy_Category($Id, $ParentTo); + + if($new) + + { + + $PastedCatIds[$Id] = $new; + + $sql = "SELECT CategoryId from ".GetTablePrefix()."Category where ParentId=$Id"; + + $result = $this->adodbConnection->Execute($sql); + + if ($result && !$result->EOF) + + { + + while(!$result->EOF) + + { + + $this->Copy_CategoryTree($result->fields["CategoryId"], $new); + + $result->MoveNext(); + + } + + } + + } + + return $new; + + } + + + + function Copy_Category($Id, $ParentTo) + + { + + global $objGroups; + + + + + + $src = $this->GetCategory($Id); + + $Children = $src->GetSubCatIds(); + + if($Id==$ParentTo || in_array($ParentTo,$Children)) + + { + + /* sanity error here */ + + global $Errors; + + $Errors->AddAdminUserError("la_error_copy_subcategory"); + + return 0; + + } + + $dest = $src; + + $dest->Set("ParentId", $ParentTo); + + if ($src->get("ParentId") == $ParentTo) + + { + + $OldName = $src->Get("Name"); + + if(substr($OldName,0,5)=="Copy ") + + { + + $parts = explode(" ",$OldName,4); + + if($parts[2]=="of" && is_numeric($parts[1])) + + { + + $Name = $parts[3]; + + } + + else + + if($parts[1]=="of") + + { + + $Name = $parts[2]." ".$parts[3]; + + } + + else + + $Name = $OldName; + + } + + else + + $Name = $OldName; + + //echo "New Name: $Name
"; + + $dest->Set("Name", $Name); + + $Names = CategoryNameCount($ParentTo,$Name); + + //echo "Names Count: ".count($Names)."
"; + + if(count($Names)>0) + + { + + $NameCount = count($Names); + + $found = FALSE; + + $NewName = "Copy of $Name"; + + + + if(!in_array($NewName,$Names)) + + { + + //echo "Matched on $NewName in:
\n"; + + $found = TRUE; + + } + + else + + { + + for($x=2;$x<$NameCount+2;$x++) + + { + + + + $NewName = "Copy ".$x." of ".$Name; + + if(!in_array($NewName,$Names)) + + { + + $found = TRUE; + + break; + + } + + + + } + + } + + if(!$found) + + { + + $NameCount++; + + $NewName = "Copy $NameCount of $Name"; + + } + + //echo "New Name: $NewName
"; + + $dest->Set("Name",$NewName); + + } + + + + } + + $dest->UnsetIdField(); + + $dest->Set("CachedDescendantCatsQty",0); + + $dest->Set("ResourceId",NULL); + + $dest->Create(); + + $dest->UpdateCachedPath(); + + $p = new clsPermList(); + + $p->Copy_Permissions($src->Get("CategoryId"),$dest->Get("CategoryId")); + + $glist = $objGroups->GetAllGroupList(); + + $view = $p->GetGroupPermList($dest, "CATEGORY.VIEW", $glist); + + $dest->SetViewPerms("CATEGORY.VIEW",$view,$glist); + + RunUp($ParentTo, "Increment_Count"); + + return $dest->Get("CategoryId"); + + } + + + + function Delete_Category($Id) + + { + + global $objSession; + + + + $d =& $this->GetCategory($Id); + + + + if(is_object($d)) + + { + + if($d->Get("CategoryId")==$Id) + + { + + $d->SendUserEventMail("CATEGORY.DELETE",$objSession->Get("PortalUserId")); + + $d->SendAdminEventMail("CATEGORY.DELETE"); + + $p =& $this->GetCategory($d->Get("ParentId")); + + RunDown($d->Get("CategoryId"), "Delete"); + + RunUp($p->Get("CategoryId"), "Decrement_Count"); + + RunUp($d->Get("CategoryId"),"ClearCacheData"); + + + + } + + } + + } + + + + function PasteFromClipboard($TargetCat) + + { + + global $objSession; + + + + $clip = $objSession->GetVariable("ClipBoard"); + + if(strlen($clip)) + + { + + $ClipBoard = ParseClipboard($clip); + + $IsCopy = (substr($ClipBoard["command"],0,4)=="COPY") || ($ClipBoard["source"] == $TargetCat); + + + + $item_ids = explode(",",$ClipBoard["ids"]); + + for($i=0;$iGetItem($item_ids[$i]); + + if(!$IsCopy) + + { + + $this->Move_Category($ItemId, $TargetCat); + + $clip = str_replace("CUT","COPY",$clip); + + $objSession->SetVariable("ClipBoard",$clip); + + } + + else + + { + + $this->Copy_CategoryTree($ItemId,$TargetCat); + + } + + } + + } + + } + + + + + + function NumChildren($ParentID) + + { + + $cat_filter = "m_cat_filter"; + + global $$cat_filter; + + + + $filter = $$cat_filter; + + $adodbConnection = &GetADODBConnection(); + + + + $sql = "SELECT COUNT(Name) as children from ".$this->SourceTable." where ParentId=" . $ParentID . $filter; + + $result = $adodbConnection->Execute($sql); + + return $result->fields["children"]; + + } + + + + function UpdateMissingCacheData() + + { + + $rs = $this->adodbConnection->Execute("SELECT * FROM ".$this->SourceTable." WHERE ParentPath IS NULL or ParentPath=''"); + + while($rs && !$rs->EOF) + + { + + $c = new clsCategory(NULL); + + $data = $rs->fields; + + $c->SetFromArray($data); + + $c->UpdateCachedPath(); + + $rs->MoveNext(); + + } + + + + $rs = $this->adodbConnection->Execute("SELECT * FROM ".$this->SourceTable." WHERE CachedNavbar IS NULL or CachedNavBar=''"); + + while($rs && !$rs->EOF) + + { + + $c = new clsCategory(NULL); + + $data = $rs->fields; + + $c->SetFromArray($data); + + $c->UpdateCachedPath(); + + $rs->MoveNext(); + + } + + } + + + + function CopyFromEditTable($idfield) + + { + + global $objGroups, $objSession, $objPermList; + + + + $objPermList = new clsPermList(); + + $edit_table = $objSession->GetEditTable($this->SourceTable); + + + + $sql = "SELECT * FROM $edit_table"; + + $rs = $this->adodbConnection->Execute($sql); + + + + while($rs && !$rs->EOF) + + { + + $data = $rs->fields; + + $c = new $this->classname; + + $c->SetFromArray($data); + + $c->Dirty(); + + + + if($c->Get("CategoryId")>0) + + { + + $c->Update(); + + } + + else + + { + + $c->UnsetIdField(); + + $c->Create(); + + $sql = "UPDATE ".GetTablePrefix()."Permissions SET CatId=".$c->Get("CategoryId")." WHERE CatId=-1"; + + $this->adodbConnection->Execute($sql); + + } + + $c->UpdateCachedPath(); + + $c->UpdateACL(); + + $c->SendUserEventMail("CATEGORY.MODIFY",$objSession->Get("PortalUserId")); + + $c->SendAdminEventMail("CATEGORY.MODIFY"); + + $c->Related = new clsRelationshipList(); + + if(is_object($c->Related)) + + { + + $r = $c->Related; + + $r->CopyFromEditTable($c->Get("ResourceId")); + + } + + + + //RunDown($c->Get("CategoryId"),"UpdateCachedPath"); + + //RunDown($c->Get("CategoryId"),"UpdateACL"); + + unset($c); + + unset($r); + + $rs->MoveNext(); + + } + + @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); + + + + //$this->UpdateMissingCacheData(); + + } + + + + function PurgeEditTable($idfield) + + { + + parent::PurgeEditTable($idfield); + + $sql = "DELETE FROM ".GetTablePrefix()."Permissions WHERE CatId=-1"; + + $this->adodbConnection->Execute($sql); + + } + + + + function GetExclusiveType($CatId) + + { + + global $objItemTypes, $objConfig; + + + + $itemtype = NULL; + + $c =& $this->GetItem($CatId); + + $path = $c->Get("ParentPath"); + + foreach($objItemTypes->Items as $Type) + + { + + $RootVar = $Type->Get("ItemName")."_Root"; + + $RootId = $objConfig->Get($RootVar); + + if((int)$RootId) + + { + + $rcat = $this->GetItem($RootId); + + $rpath = $rcat->Get("ParentPath"); + + $p = substr($path,0,strlen($rpath)); + + //echo $rpath." vs. .$p [$path]
\n"; + + if($rpath==$p) + + { + + $itemtype = $Type; + + break; + + } + + } + + } + + return $itemtype; + + } + +} + + + +function RunUp($Id, $function, $Param=NULL) + +{ + + global $objCatList; + + + + $d = $objCatList->GetCategory($Id); + + $ParentId = $d->Get("ParentId"); + + if ($ParentId == 0) + + { + + if($Param == NULL) + + { + + $d->$function(); + + } + + else + + { + + $d->$function($Param); + + } + + } + + else + + { + + RunUp($ParentId, $function, $Param); + + if($Param == NULL) + + { + + $d->$function(); + + } + + else + + { + + $d->$function($Param); + + } + + + + } + + + +} + + + +function RunDown($Id, $function, $Param=NULL) + +{ + + global $objCatList; + + + + $adodbConnection = &GetADODBConnection(); + + $sql = "select CategoryId from ".GetTablePrefix()."Category where ParentId='$Id'"; + + $rs = $adodbConnection->Execute($sql); + + + + while($rs && !$rs->EOF) + + { + + RunDown($rs->fields["CategoryId"], $function, $Param); + + $rs->MoveNext(); + + } + + $d = $objCatList->GetCategory($Id); + + if($Param == NULL) + + { + + $d->$function(); + + } + + else + + $d->$function($Param); + +} + +?> \ No newline at end of file