clsItem(TRUE); $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; $GLOBALS['_CopyFromEditTable']=1; $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"); unset($GLOBALS['_CopyFromEditTable']); //$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); } ?>