Index: trunk/kernel/include/parseditem.php =================================================================== --- trunk/kernel/include/parseditem.php (revision 3906) +++ trunk/kernel/include/parseditem.php (revision 3907) @@ -1,3117 +1,3137 @@ <?php global $ItemTypePrefixes; $ItemTypePrefixes = array(); $ItemTagFiles = array(); function RegisterPrefix($class,$prefix,$file) { global $ItemTypePrefixes, $ItemTagFiles; $ItemTypePrefixes[$class] = $prefix; $ItemTagFiles[$prefix] = $file; } class clsParsedItem extends clsItemDB { var $TagPrefix; var $Parser; var $AdminParser; function clsParsedItem($id=NULL) { global $TemplateRoot; $this->clsItemDB(); $this->Parser = new clsTemplateList($TemplateRoot); $this->AdminParser = new clsAdminTemplateList(); } /* function ParseObject($element) { $extra_attribs = ExtraAttributes($element->attributes); if(strtolower($element->name)==$this->TagPrefix) { $field = strtolower($element->attributes["_field"]); $tag = $this->TagPrefix."_".$field; $ret = $this->parsetag($tag); } return $ret; } */ function ParseTimeStamp($d,$attribs=array()) { global $objSession; if (isset($attribs['_tz'])) { $timezone = $attribs['_tz'] == 'auto' ? null : $objSession->Get('tz'); $d = GetLocalTime($d, $timezone); } $part = isset($attribs['_part']) ? strtolower($attribs['_part']) : ''; if ($part) { $ret = ExtractDatePart($part,$d); } else { $ret = $d <= 0 ? '' : LangDate($d); } return $ret; } function ParseObject($element) { global $objConfig, $objCatList, $var_list_update, $var_list, $n_var_list_update, $m_var_list_update; $extra_attribs = ExtraAttributes($element->attributes); $ret = ""; if ($this->TagPrefix == "email" && strtolower($element->name) == "touser") { $this->TagPrefix = "touser"; } if(strtolower($element->name)==$this->TagPrefix) { $field = strtolower($element->attributes["_field"]); switch($field) { case 'primarycategorylink': $m_var_list_update['cat'] = (int)$this->GetPrimaryCategory(); $m_var_list_update['p'] = 1; $ret = str_replace('advanced_view.php','browse.php',$_SERVER['PHP_SELF']).'?env='.BuildEnv(); unset($m_var_list_update['cat']); unset($m_var_list_update['p']); return $ret; break; case 'primarycategory': $db =& GetADODBConnection(); $sql = 'SELECT CachedNavbar FROM '.$objCatList->SourceTable.' WHERE CategoryId = '.(int)$this->GetPrimaryCategory(); $ret = prompt_language($objConfig->Get("Root_Name")); if( $this->GetPrimaryCategory() ) $ret .= '>'.$db->GetOne($sql); break; case "id": $ret = $this->Get($this->id_field); break; case "resourceid": if(!$this->NoResourceId) $ret = $this->Get("ResourceId"); break; case "category": $c = $objCatList->GetItem($this->Get("CategoryId")); if(is_object($c)) { $ret = $c->parsetag($element->attributes["_cattag"]); } break; case "priority": if($this->Get("Priority")!=0) { $ret = (int)$this->Get("Priority"); } else $ret = ""; break; case "link": /* if(method_exists($this,"ItemURL")) { $ret = $this->ItemURL($element->attributes["_template"],FALSE,""); } break; */ case "cat_link": if(method_exists($this,"ItemURL")) { $ret = $this->ItemURL($element->attributes["_template"],TRUE,""); } break; case "fullpath": $ret = $this->Get("CachedNavbar"); if(!strlen($ret)) { if(is_numeric($this->Get("CategoryId"))) { $c = $objCatList->GetItem($this->Get("CategoryId")); if(is_object($c)) $ret = $c->Get("CachedNavbar"); } else { if(method_exists($this,"GetPrimaryCategory")) { $cat = $this->GetPrimaryCategory(); $c = $objCatList->GetItem($cat); if(is_object($c)) $ret = $c->Get("CachedNavbar"); } } } // $ret = $this->HighlightText($ret); break; case "relevance": $style = $element->attributes["_displaymode"]; if(!strlen($style)) $style = "numerical"; switch ($style) { case "numerical": $ret = (100 * LangNumber($this->Get("Relevance"),1))."%"; break; case "bar": $OffColor = $element->attributes["_offbackgroundcolor"]; $OnColor = $element->attributes["_onbackgroundcolor"]; $percentsOff = (int)(100 - (100 * $this->Get("Relevance"))); if ($percentsOff) { $percentsOn = 100 - $percentsOff; $ret = "<td width=\"$percentsOn%\" bgcolor=\"$OnColor\"><img src=\"img/s.gif\"></td><td width=\"$percentsOff%\" bgcolor=\"$OffColor\"><img src=\"img/s.gif\"></td>"; } else $ret = "<td width=\"100%\" bgcolor=\"$OnColor\"><img src=\"img/s.gif\"></td>"; break; case "graphical": $OnImage = $element->attributes["_onimage"]; if (!strlen($OnImage)) break; // Get image extension $image_data = explode(".", $OnImage); $image_ext = $image_data[count($image_data)-1]; unset($image_data[count($image_data)-1]); $rel = (10 * LangNumber($this->Get("Relevance"),1)); $OnImage1 = join(".", $image_data); if ($rel) $img_src = $OnImage1."_".$rel.".".$image_ext; else $img_src = $OnImage; $ret = "<img src=\"$img_src\" border=\"0\" alt=\"".(10*$rel)."\">"; break; } break; case "rating": $style = $element->GetAttributeByName("_displaymode"); if(!strlen($style)) $style = "numerical"; switch($style) { case "numerical": $ret = LangNumber($this->Get("CachedRating"),1); break; case "text": $ret = RatingText($this->Get("CachedRating")); break; case "graphical": $OnImage = $element->attributes["_onimage"]; $OffImage = $element->attributes["_offimage"]; $images = RatingTickImage($this->Get("CachedRating"),$OnImage,$OffImage); for($i=1;$i<=count($images);$i++) { $url = $images[$i]; if(strlen($url)) { $ret .= "<IMG src=\"$url\" $extra_attribs >"; $ret .= $element->GetAttributeByName('_separator'); } } break; } break; case "reviews": $today = FALSE; if(method_exists($this,"ReviewCount")) { if($element->GetAttributeByName("_today")) $today = TRUE; $ret = $this->ReviewCount($today); $ret = ($element->GetAttributeByName("_dataexists") && empty($ret))? "" : $ret; } else $ret = ""; break; case "votes": $ret = (int)$this->Get("CachedVotesQty"); break; case "favorite": if(method_exists($this,"IsFavorite")) { if($this->IsFavorite()) { $ret = $element->attributes["_label"]; if(!strlen($ret)) $ret = "lu_favorite"; $ret = language($ret); } else $ret = ""; } break; case "new": if(method_exists($this,"IsNewItem")) { if($this->IsNewItem()) { $ret = $element->GetAttributeByName('_label'); if(!strlen($ret)) $ret = "lu_new"; $ret = language($ret); } else $ret = ""; } break; case "pop": if(method_exists($this,"IsPopItem")) { if($this->IsPopItem()) { $ret = $element->GetAttributeByName('_label'); if(!strlen($ret)) $ret = "lu_pop"; $ret = language($ret); } else $ret = ""; } break; case "hot": if(method_exists($this,"IsHotItem")) { if($this->IsHotItem()) { $ret = $element->GetAttributeByName("_label"); if(!strlen($ret)) $ret = "lu_hot"; $ret = language($ret); } else $ret = ""; } break; case "pick": if($this->Get("EditorsPick")==1) { $ret = $element->GetAttributeByName('_label'); if(!strlen($ret)) $ret = "lu_pick"; $ret = language($ret); } else $ret = ""; break; case "admin_icon": if(method_exists($this,"StatusIcon")) { if($element->GetAttributeByName("fulltag")) { $ret = "<IMG $extra_attribs SRC=\"".$this->StatusIcon()."\">"; } else $ret = $this->StatusIcon(); } break; case "custom": if(method_exists($this,"GetCustomFieldValue")) { $field = $element->attributes["_customfield"]; $listvalue = $element->attributes["_listvalue"]; $default = $element->attributes["_default"]; if (strlen($field)) $ret = $this->GetCustomFieldValue($field, $default, $listvalue); } break; case "image": $default = $element->attributes["_primary"]; $name = $element->attributes["_name"]; if(strlen($name)) { $img = $this->GetImageByName($name); } else { if($default) $img = $this->GetDefaultImage(); } if(is_object($img)) { if(strlen($element->attributes["_imagetemplate"])) { $ret = $img->ParseTemplate($element->attributes["_imagetemplate"]); break; } else { if($element->attributes["_thumbnail"]) { $url = $img->parsetag("thumb_url"); } else { if(!$element->attributes["_nothumbnail"]) { $url = $img->parsetag("image_url"); } else { $url = $img->FullURL(TRUE,""); } } } } else { $url = $element->attributes["_defaulturl"]; } if($element->attributes["_imagetag"]) { if(strlen($url)) { $ret = "<IMG src=\"$url\" $extra_attribs >"; } else $ret = ""; } else $ret = $url; break; case 'perm': $cat_id = $this->GetPrimaryCategory(); $element->attributes['_category'] = $cat_id; $ret = m_perm_text($element->attributes); break; default: $ret = "Undefined:".$element->name; break; } } else if ($this->TagPrefix == 'email'){ $ret = "Undefined:".$element->name; } return $ret; } function ParseString($name) { $el = new clsHtmlTag(); $el->Clear(); $el->prefix = "inp"; $el->name = $name; $numargs = func_num_args(); $arg_list = func_get_args(); for ($i = 1; $i < $numargs; $i++) { $attr = $arg_list[$i]; $parts = explode("=",$attr,2); $name = $parts[0]; $val = $parts[1]; $el->attributes[$name] = $val; } return $this->ParseObject($el); } /* pass attributes as strings ie: ParseStringEcho('tagname','_field="something" _data="somethingelse"'); */ function ParseStringEcho($name) { $el = new clsHtmlTag(); $el->Clear(); $el->prefix = "inp"; $el->name = $name; $numargs = func_num_args(); $arg_list = func_get_args(); for ($i = 1; $i < $numargs; $i++) { $attr = $arg_list[$i]; $parts = explode("=",$attr,2); $name = $parts[0]; $val = $parts[1]; $el->attributes[$name] = $val; } echo $this->ParseObject($el); } function ParseElement($raw, $inner_html ="") { $tag = new clsHtmlTag($raw); $tag->inner_html = $inner_html; if($tag->parsed) { if($tag->name=="include" || $tag->name=="perm_include" || $tag->name=="lang_include") { $output = $this->Parser->IncludeTemplate($tag); } else { $output = $this->ParseObject($tag); //echo $output."<br>"; if(substr($output,0,9)=="Undefined") { $output = $tag->Execute(); // if(substr($output,0,8)="{Unknown") // $output = $raw; } return $output; } } else return ""; } function AdminParseTemplate($file) { $html = ""; $t = $this->AdminParser->GetTemplate($file); if(is_object($t)) { array_push($this->AdminParser->stack,$file); $html = $t->source; $next_tag = strpos($html,"<inp:"); while($next_tag) { $end_tag = strpos($html,"/>",$next_tag); $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+2); $pre = substr($html,0,$next_tag); $post = substr($html,$end_tag+2); $inner = $this->ParseElement($tagtext); $html = $pre.$inner.$post; $next_tag = strpos($html,"<inp:"); } array_pop($this->AdminParser->stack); } return $html; } function ParseTemplateText($text) { $html = $text; $search = "<inp:".$this->TagPrefix; //$next_tag = strpos($html,"<inp:"); $next_tag = strpos($html,$search); while($next_tag) { $closer = strpos(strtolower($html),">",$next_tag); $end_tag = strpos($html,"/>",$next_tag); if($end_tag < $closer || $closer == 0) { $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+2); $pre = substr($html,0,$next_tag); $post = substr($html,$end_tag+2); $inner = $this->ParseElement($tagtext); $html = $pre.$inner.$post; } else { $OldTagStyle = "</inp>"; ## Try to find end of TagName $TagNameEnd = strpos($html, " ", $next_tag); ## Support Old version // $closer = strpos(strtolower($html),"</inp>",$next_tag); if ($TagNameEnd) { $Tag = strtolower(substr($html, $next_tag, $TagNameEnd-$next_tag)); $TagName = explode(":", $Tag); if (strlen($TagName[1])) $CloserTag = "</inp:".$TagName[1].">"; } else { $CloserTag = $OldTagStyle; } $closer = strpos(strtolower($html), $CloserTag, $next_tag); ## Try to find old tag closer if (!$closer && ($CloserTag != $OldTagStyle)) { $CloserTag = $OldTagStyle; $closer = strpos(strtolower($html), $CloserTag, $next_tag); } $end_tag = strpos($html,">",$next_tag); $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+1); $pre = substr($html,0,$next_tag); $inner = substr($html,$end_tag+1,$closer-($end_tag+1)); $post = substr($html,$end_tag+1+strlen($inner) + strlen($CloserTag)); //echo "PRE:". htmlentities($pre,ENT_NOQUOTES); //echo "INNER:". htmlentities($inner,ENT_NOQUOTES); //echo "POST:". htmlentities($post,ENT_NOQUOTES); $parsed = $this->ParseElement($tagtext); if(strlen($parsed)) { $html = $pre.$this->ParseTemplateText($inner).$post; } else $html = $pre.$post; } $next_tag = strpos($html,$search); } return $html; } function ParseTemplate($tname) { global $objTemplate, $LogLevel,$ptime,$timestart; //echo 'Saving ID'.$this->UniqueId().' in Main parseTempalate<br>'; //$GLOBALS[$this->TagPrefix.'_ID'] = $this->UniqueId(); LogEntry("Parsing $tname\n"); $LogLevel++; $html = ""; $t = $objTemplate->GetTemplate($tname); //$t = $this->Parser->GetTemplate($tname); if( is_array($this->Parser->stack) ) $this->Parser->stack = Array(); if(is_object($t)) { array_push($this->Parser->stack,$tname); $html = $t->source; $html = $this->ParseTemplateText($html); array_pop($this->Parser->stack); } $LogLevel--; LogEntry("Finished Parsing $tname\n"); $ptime = round(getmicrotime() - $timestart,6); $xf = 867530; //Download ID if($xf != 0) { $x2 = substr($ptime,-6); $ptime .= $xf ^ $x2; //(1/1000); } return $html; } function SendUserEventMail($EventName,$ToUserId,$LangId=NULL,$RecptName=NULL) { global $objMessageList,$FrontEnd; $Event =& $objMessageList->GetEmailEventObject($EventName,0,$LangId); if(is_object($Event)) { if($Event->Get("Enabled")=="1" || ($Event->Get("Enabled")==2 && $FrontEnd)) { $Event->Item = $this; if(is_numeric($ToUserId)) { return $Event->SendToUser($ToUserId); } else return $Event->SendToAddress($ToUserId,$RecptName); } } } function SendAdminEventMail($EventName,$LangId=NULL) { global $objMessageList,$FrontEnd; //echo "Firing Admin Event $EventName <br>\n"; $Event =& $objMessageList->GetEmailEventObject($EventName,1,$LangId); if(is_object($Event)) { if($Event->Get("Enabled")=="1" || ($Event->Get("Enabled")==2 && $FrontEnd)) { $Event->Item = $this; //echo "Admin Event $EventName Enabled <br>\n"; return $Event->SendAdmin($ToUserId); } } } function parse_template($t) { } } class clsItemCollection { var $Items; var $CurrentItem; var $adodbConnection; var $classname; var $SourceTable; var $LiveTable; var $QueryItemCount; var $AdminSearchFields = array(); var $SortField; var $debuglevel; var $id_field = null; // id field for list item var $BasePermission; var $Dummy = null; // enshure that same sql won't be queried twice var $QueryDone = false; var $LastQuerySQL = ''; + + /** + * Application object + * + * @var kApplication + */ + var $Application = null; + + /** + * Connection to database + * + * @var kDBConnection + */ + var $Conn = null; + function SetTable($action, $table_name = null) // new by Alex { // $action = {'live', 'restore','edit'} switch($action) { case 'live': $this->LiveTable = $table_name; $this->SourceTable = $this->LiveTable; break; case 'restore': $this->SourceTable = $this->LiveTable; break; case 'edit': global $objSession; $this->SourceTable = $objSession->GetEditTable($this->LiveTable); break; } } function &GetDummy() // new by Alex { if( !isset($this->Dummy) ) $this->Dummy =& new $this->classname(); $this->Dummy->tablename = $this->SourceTable; return $this->Dummy; } function clsItemCollection() { - - $this->adodbConnection = &GetADODBConnection(); - - $this->Clear(); - $this->BasePermission=""; + if (class_exists('kApplication')) { + // just in case when aplication is not found + $this->Application =& kApplication::Instance(); + $this->Conn =& $this->Application->GetADODBConnection(); + } + + $this->adodbConnection =& GetADODBConnection(); + + $this->Clear(); + $this->BasePermission = ''; } function GetIDField() // new by Alex { // returns id field for list item if( !isset($this->id_field) ) { $dummy =& $this->GetDummy(); $this->id_field = $dummy->IdField(); } return $this->id_field; } function &GetNewItemClass() { return new $this->classname(); } function Clear() { unset($this->Items); $this->Items = array(); $this->CurrentItem=0; } function &SetCurrentItem($id) { $this->CurrentItem=$id; return $this->GetItem($id); } function &GetCurrentItem() { if($this->CurrentItem>0) { return $this->GetItem($this->CurrentItem); } else return FALSE; } function NumItems() { if(is_array($this->Items)) { // echo "TEST COUNT: ".count($this->Items)."<BR>"; return count($this->Items); } else return 0; } function ItemLike($index, $string) { // check if any of the item field // even partially matches $string $found = false; $string = strtolower($string); $item_data = $this->Items[$index]->GetData(); foreach($item_data as $field => $value) if( in_array($field, $this->AdminSearchFields) ) if( strpos(strtolower($value), $string) !== false) { $found = true; break; } return $found; } function DeleteItem($index) // by Alex { // deletes item with specific index from list $i = $index; $item_count = $this->NumItems(); while($i < $item_count - 1) { $this->Items[$i] = $this->Items[$i + 1]; $i++; } unset($this->Items[$i]); } function ShowItems() { $i = 0; $item_count = $this->NumItems(); while($i < $item_count) { echo "Item No <b>$i</b>:<br>"; $this->Items[$i]->PrintVars(); $i++; } } function SwapItems($Index,$Index2) { $temp = $this->Items[$Index]->GetData(); $this->Items[$Index]->SetData($this->Items[$Index2]->GetData()); $this->Items[$Index2]->SetData($temp); } function CopyResource($OldId,$NewId) { $this->Clear(); $sql = "SELECT * FROM ".$this->SourceTable." WHERE ResourceId=$OldId"; $this->Query_Item($sql); // echo $sql."<br>\n"; if($this->NumItems()>0) { foreach($this->Items as $item) { $item->UnsetIdField(); $item->Set("ResourceId",$NewId); $item->Create(); } } } function ItemsOnClipboard() { global $objSession; $clip = $objSession->GetPersistantVariable("ClipBoard"); $count = 0; $table = $this->SourceTable; $prefix = GetTablePrefix(); if(substr($table,0,strlen($prefix))==$prefix) $table = substr($table,strlen($prefix)); if(strlen($clip)) { $clipboard = ParseClipboard($clip); if($clipboard["table"] == $table) { $count = count(explode(",",$clipboard["ids"])); } else $count = 0; } else $count = 0; return $count; } function CopyToClipboard($command,$idfield, $idlist) { global $objSession,$objCatList; if(is_array($idlist)) { $list = implode(",",$idlist); } else $list = $idlist; $clip = $command."-".$objCatList->CurrentCategoryID().".".$this->SourceTable.".$idfield=".$list; $objSession->SetVariable("ClipBoard",$clip); } function SortItems($asc=TRUE) { $done = FALSE; $field = $this->SortField; $ItemCount = $this->NumItems(); while(!$done) { $done=TRUE; for($i=1;$i<$this->NumItems();$i++) { $doswap = FALSE; if($asc) { $val1 = $this->Items[$i-1]->Get($field); $val2 = $this->Items[$i]->Get($field); $doswap = ($val1 > $val2); } else { $val1 = $this->Items[$i-1]->Get($field); $val2 = $this->Items[$i]->Get($field); $doswap = ($val1 < $val2); } if($doswap) { $this->SwapItems($i-1,$i); $done = FALSE; } } } } function &GetItem($ID,$LoadFromDB=TRUE) { $found=FALSE; if(is_array($this->Items) && count($this->Items) ) { for($x=0;$x<count($this->Items);$x++) { $i =& $this->GetItemRefByIndex($x); if($i->UniqueID()==$ID) { $found=TRUE; break; } } } if(!$found) { if($LoadFromDB) { $n = NULL; $n = new $this->classname(); $n->tablename = $this->SourceTable; $n->LoadFromDatabase($ID); $n->Set( $n->IdField(), $ID ); // in case if no loaded set ID anyway $index = array_push($this->Items, $n); $i =& $this->Items[count($this->Items)-1]; } else $i = FALSE; } return $i; } function GetItemByIndex($index) { return $this->Items[$index]; } function &GetItemRefByIndex($index) { return $this->Items[$index]; } function &GetItemByField($Field, $Value, $LoadFromDB = true) { if( !is_array($Field) ) $Field = Array($Field); if( !is_array($Value) ) $Value = Array($Value); $found = false; if( is_array($this->Items) ) { foreach($this->Items as $i) { $sub_found = true; foreach($Field as $key_index => $field_name) { $sub_found = $sub_found && ( $i->Get($field_name) == $Value[$key_index] ); } if($sub_found) { $found = true; break; } } } if( !$found && $LoadFromDB == true ) { $sql = 'SELECT * FROM '.$this->SourceTable.' WHERE '; foreach($Field as $key_index => $field_name) { $sql .= '(`'.$field_name.'` = '.$this->adodbConnection->qstr($Value[$key_index]).') AND '; } $sql = preg_replace('/(.*) AND $/', '\\1', $sql); $res = $this->adodbConnection->Execute($sql); if($res && !$res->EOF) { $i = $this->AddItemFromArray($res->fields); $i->tablename = $this->SourceTable; $i->Clean(); } else { $i = false; } } return $i; } function GetPage($Page, $ItemsPerPage) { $result = array_slice($this->Items, ($Page * $ItemsPerPage) - $ItemsPerPage, $ItemsPerPage); return $result; } function GetNumPages($ItemsPerPage) { if( isset($_GET['reset']) && $_GET['reset'] == 1) $this->Page = 1; return GetPageCount($ItemsPerPage,$this->QueryItemCount); } function &AddItemFromArray($data, $clean=FALSE) { $class = new $this->classname; $class->SetFromArray($data); $class->tablename = $this->SourceTable; if($clean==TRUE) $class->Clean(); //array_push($this->Items,$class); $this->Items[] =& $class; return $class; } function Query_Item($sql, $offset=-1,$rows=-1) { global $Errors, $objConfig; //echo "Method QItem [<b>".get_class($this).'</b>], sql: ['.$sql.']<br>'; $dummy =& $this->GetDummy(); if( !$dummy->TableExists() ) { if($this->debuglevel) echo "ERROR: table <b>".$dummy->tablename."</b> missing.<br>"; $this->Clear(); return false; } //echo "<b>".get_class($this)."</b><br>"; //echo "Rows = $rows && Offset = $offset<br>"; if($rows>-1 && $offset>-1) { //print_pre(debug_backtrace()); //echo "<b>Executing SelectLimit</b> $sql <b>Offset:</b> $offset,$rows<br>\n"; $result = $this->adodbConnection->SelectLimit($sql, $rows,$offset); } else { $result = $this->adodbConnection->Execute($sql); } if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Query_Item"); if($this->debuglevel) { echo '<br><br>'.$sql.'<br><br>'; echo "Error: ".$this->adodbConnection->ErrorMsg()."<br>"; } $this->Clear(); return false; } $this->Clear(); if($this->debuglevel > 0) { echo "This SQL: $sql<br><br>"; if( ($this->debuglevel > 1) && ($result->RecordCount() > 0) ) { echo '<pre>'.print_r($result->GetRows(), true).'</pre>'; $result->MoveFirst(); } } //echo "SQL: $sql<br><br>"; LogEntry("SQL Loop Start\n"); $count = 0; while ($result && !$result->EOF) { $count++; $data = $result->fields; $this->AddItemFromArray($data,TRUE); if( defined('ADODB_EXTENSION') && constant('ADODB_EXTENSION') > 0 ) adodb_movenext($result); else $result->MoveNext(); } LogEntry("SQL Loop End ($count iterations)\n"); $result->Free(); return $this->Items; } function GetOrderClause($FieldVar,$OrderVar,$DefaultField,$DefaultVar,$Priority=TRUE,$UseTableName=FALSE) { global $objConfig, $objSession; if($UseTableName) { $TableName = $this->SourceTable."."; } else $TableName = ""; $PriorityClause = $TableName."EditorsPick DESC, ".$TableName."Priority DESC"; if(strlen(trim($FieldVar))>0) { if(is_object($objSession)) { if(strlen($objSession->GetPersistantVariable($FieldVar))>0) { $OrderBy = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". $objSession->GetPersistantVariable($OrderVar)); $FieldUsed = $objSession->GetPersistantVariable($FieldVar); } } $OrderBy = trim($OrderBy); if (strlen(trim($OrderBy))==0) { if(!$UseTableName) { $OrderBy = trim($DefaultField." ".$DefaultVar); } else { if(strlen(trim($DefaultField))>0) { $OrderBy = $this->SourceTable.".".$DefaultField.".".$DefaultVar; } $FieldUsed=$DefaultField; } } } if(($FieldUsed != "Priority" || strlen($OrderBy)==0) && $Priority==TRUE) { if(strlen($OrderBy)==0) { $OrderBy = $PriorityClause; } else $OrderBy = $PriorityClause.", ".$OrderBy; } return $OrderBy; } function GetResourceIDList() { $ret = array(); foreach($this->Items as $i) array_push($ret,$i->Get("ResourceId")); return $ret; } function GetFieldList($field) { $ret = array(); foreach($this->Items as $i) array_push($ret,$i->Get($field)); return $ret; } function SetCommonField($FieldName,$FieldValue) { for($i=0;$i<$this->NumItems();$i++) { $this->Items[$i]->Set($FieldName,$fieldValue); $this->Items[$i]->Update(); } } function ClearCategoryItems($CatId,$CatTable = "CategoryItems") { $CatTable = AddTablePrefix($CatTable); $sql = "SELECT * FROM ".$this->SourceTable." INNER JOIN $CatTable ". " ON (".$this->SourceTable.".ResourceId=$CatTable.ItemResourceId) WHERE CategoryId=$CatId"; $this->Clear(); $this->Query_Item($sql); if($this->NumItems()>0) { foreach($this->Items as $i) { $i->DeleteCategoryItems($CatId,$CatTable); } } } function CopyToEditTable($idfield = null, $idlist = 0) { global $objSession; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); if(is_array($idlist)) { $list = implode(",",$idlist); } else $list = $idlist; $query = "SELECT * FROM ".$this->SourceTable." WHERE $idfield IN ($list)"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); } function CreateEmptyEditTable($idfield = null) { global $objSession; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); $query = "SELECT * FROM ".$this->SourceTable." WHERE $idfield = -1"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); //echo $insert."<br>"; } function CopyFromEditTable($idfield = null) { global $objSession; $GLOBALS['_CopyFromEditTable']=1; $dropRelTableFlag = false; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); $sql = "SELECT * FROM $edit_table"; $rs = $this->adodbConnection->Execute($sql); //echo "In Main <b>CopyFromEditTable</b> in class <b>".get_class($this).'</b><br>'; //echo $sql."<BR>"; while($rs && !$rs->EOF) { $data = $rs->fields; $c = new $this->classname; $c->SetFromArray($data); $c->idfield = $idfield; $c->Dirty(); if($c->Get($idfield) < 1) { $old_id = $c->Get($idfield); $c->UnsetIdField(); if(!is_numeric($c->Get("OrgId")) || $c->Get("OrgId")==0) { $c->Clean(array("OrgId")); } else { if($c->Get("Status") != -2) { $org = new $this->classname(); $org->LoadFromDatabase($c->Get("OrgId")); $org->DeleteCustomData(); $org->Delete(TRUE); $c->Set("OrgId",0); } } $c->Create(); } $item_ids[]=$c->UniqueId(); // save item id for future use if(is_numeric($c->Get("ResourceId"))) { if( isset($c->Related) && is_object($c->Related) ) { $r = $c->Related; $r->CopyFromEditTable($c->Get("ResourceId")); $dropRelTableFlag = true; } unset($r); if( isset($c->Reviews) && is_object($c->Reviews) ) { $r = $c->Reviews; $r->CopyFromEditTable($c->Get("ResourceId"),true); } } if(!is_numeric($c->Get("OrgId")) || $c->Get("OrgId")==0) { $c->Clean(array("OrgId")); } else { if($c->Get("Status") != -2) { $org = new $this->classname(); $org->LoadFromDatabase($c->Get("OrgId")); $org->DeleteCustomData(); $org->Delete(TRUE); $c->Set("OrgId",0); } } $GLOBALS['_CopyFromEditTable']=1; if(method_exists($c,"CategoryMemberList")) { $cats = $c->CategoryMemberList($objSession->GetEditTable("CategoryItems")); $ci_table = $objSession->GetEditTable('CategoryItems'); $primary_cat = $c->GetPrimaryCategory($ci_table); $c->Update(); UpdateCategoryItems($c,$cats,$primary_cat); } else $c->Update(); unset($c); unset($r); $rs->MoveNext(); } $objReviews = new clsItemReviewList(); $objReviews->PurgeEditTable(); if ($dropRelTableFlag) { $objRelGlobal = new clsRelationshipList(); $objRelGlobal->PurgeEditTable(); } if($edit_table) @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$objSession->GetEditTable("CategoryItems")); unset($GLOBALS['_CopyFromEditTable']); return $item_ids; } function GetNextTempID() { // get next temporary id (lower then zero) from temp table $db =& $this->adodbConnection; $sql = 'SELECT MIN(%s) AS MinValue FROM %s'; return $db->GetOne( sprintf($sql, $this->GetIDField(), $this->SourceTable) ) - 1; } function PurgeEditTable($idfield = null) { global $objSession; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); /* $rs = $this->adodbConnection->Execute("SELECT * FROM $edit_table"); while($rs && !$rs->EOF) { $data = $rs->fields; $c = new $this->classname; $c->SetFromArray($data); $c->id_field = $idfield; $c->tablename = $edit_table; $c->Delete(); $rs->MoveNext(); }*/ @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$objSession->GetEditTable("CategoryItems")); } function CopyCatListToEditTable($idfield, $idlist) { global $objSession; $edit_table = $objSession->GetEditTable("CategoryItems"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); if(is_array($idlist)) { $list = implode(",",$idlist); } else $list = $idlist; $query = "SELECT * FROM ".GetTablePrefix()."CategoryItems WHERE $idfield IN ($list)"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); } function CreateEmptyCatListTable($idfield) { global $objSession; $edit_table = $objSession->GetEditTable("CategoryItems"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); $query = "SELECT * FROM ".GetTablePrefix()."CategoryItems WHERE $idfield = -1"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); } function RefreshPage($page_var, $total_items) { global $objConfig, $objSession; $this->QueryItemCount = $total_items; if ( (int)GetVar('lpn') > 0) { $this->Page = $_GET['lpn']; } elseif ($objConfig->Get($page_var)) { $this->Page = $objConfig->Get($page_var); } if ( ($this->Page > $this->GetNumPages($this->PerPage) || $this->Page == 0) && ($this->PerPage != -1) ) { $this->Page = 1; } $objSession->SetVariable($page_var, $this->Page); } function PurgeCatListEditTable() { global $objSession; $edit_table = $objSession->GetEditTable("CategoryItems"); $this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); } function AdminSearchWhereClause($SearchList) { $sql = ""; if( !is_array($SearchList) ) $SearchList = explode(",",$SearchList); // remove empty elements $SearchListTmp=Array(); for($f = 0; $f < count($SearchList); $f++) if($SearchList[$f]) $SearchListTmp[]=$SearchList[$f]; $SearchList=$SearchListTmp; if( !count($SearchList) || !count($this->AdminSearchFields) ) return ''; for($f = 0; $f < count($SearchList); $f++) { $value = $SearchList[$f]; if( strlen($value) ) { $inner_sql = ""; for($i = 0; $i < count($this->AdminSearchFields); $i++) { $field = $this->AdminSearchFields[$i]; if( strlen( trim($value) ) ) { if( strlen($inner_sql) ) $inner_sql .= " OR "; $inner_sql .= $field." LIKE '%".$value."%'"; } } if( strlen($inner_sql) ) { $sql .= '('.$inner_sql.') '; if($f < count($SearchList) - 1) $sql .= " AND "; } } } return $sql; } function BackupData($OutFileName,$Start,$Limit) { $fp=fopen($Outfile,"a"); if($fp) { if($Start==1) { $sql = "DELETE FROM ".$this->SourceTable; fputs($fp,$sql); } $this->Query_Item("SELECT * FROM ".$this->SourceTable." LIMIT $Start, $Limit"); foreach($this->Items as $i) { $sql = $i->CreateSQL(); fputs($fp,$sql); } fclose($fp); $this->Clear(); } } function RestoreData($InFileName,$Start,$Limit) { $res = -1; $fp=fopen($InFileName,"r"); if($fp) { fseek($fp,$Start); $Line = 0; while($Line < $Limit) { $sql = fgets($fp,16384); $this->adodbConnection->Execute($sql); $Line++; } $res = ftell($fp); fclose($fp); } return $res; } function Delete_Item($Id, $DetectCategories = false) { global $objCatList; $l =& $this->GetItem($Id); $l->BasePermission=$this->BasePermission; if (!$DetectCategories) { $l->DeleteCategoryItems($objCatList->CurrentCategoryID()); } else { $l->RemoveFromAllCategories(); $l->Delete(); } } function Move_Item($Id, $OldCat, $ParentTo) { global $objCatList; $l = $this->GetItem($Id); $l->BasePermission=$this->BasePermission; $l->AddtoCategory($ParentTo); $l->RemoveFromCategory($OldCat); } function Copy_Item($Id, $ParentTo) { $l = $this->GetItem($Id); $l->BasePermission=$this->BasePermission; $l->AddtoCategory($ParentTo); } }/* clsItemCollection */ class clsItemList extends clsItemCollection { var $Page; var $PerPageVar; var $DefaultPerPage; // use this perpage value in case if no found in config var $EnablePaging; var $MaxListCount = 0; var $PageEnvar; var $PageEnvarIndex; var $ListType; var $LastLimitClause = ''; // used to store last limit cluse used in query function setPageFromENV() { $this->Page=$GLOBALS[$this->PageEnvar][$this->PageEnvarIndex]; } function clsItemList() { $this->clsItemCollection(); $this->EnablePaging = TRUE; $this->PageEnvarIndex = "p"; } function GetPageLimitSQL() { global $objConfig; $limit = NULL; if($this->EnablePaging) { if($this->Page<1) $this->Page=1; //echo "Limited to ".$objConfig->Get($this->PerPageVar)." items per page<br>\n"; if(is_numeric($objConfig->Get($this->PerPageVar))) { $Start = ($this->Page-1)*$objConfig->Get($this->PerPageVar); $limit = "LIMIT ".$Start.",".$objConfig->Get($this->PerPageVar); } else $limit = NULL; } else { if($this->MaxListCount) { $limit = 'LIMIT 0, '.$this->MaxListCount; } } return $limit; } function GetPageOffset() { $Start = 0; if($this->EnablePaging) { if($this->Page < 1) $this->Page = 1; $PerPage = $this->GetPerPage(); $Start = ($this->Page - 1) * $PerPage; } else { if((int)$this->MaxListCount == 0) $Start = -1; } return $Start; } function GetPageRowCount() { if($this->EnablePaging) { if($this->Page < 1) $this->Page = 1; //echo "Got PerPage: ".$this->GetPerPage()."<br>"; return $this->GetPerPage(); } else return (int)$this->MaxListCount; } function Query_Item($sql,$limit = null, $fix_method = 'set_first') { // query itemlist (module items) using $sql specified // apply direct limit clause ($limit) or calculate it if not specified // fix invalid page in case if needed by method specified in $fix_method if(strlen($limit)) { $sql .= " ".$limit; return parent::Query_Item($sql); } else { //echo "page fix pre (class: ".get_class($this).")<br>"; $this->QueryItemCount = QueryCount($sql); // must get total item count before fixing $this->FixInvalidPage($fix_method); // specially made for cats delete if ( GetVar('Action', true) != 'm_cat_delete') { return parent::Query_Item($sql,$this->GetPageOffset(),$this->GetPageRowCount()); } else { return parent::Query_Item($sql); } } } function Query_List($whereClause,$orderByClause=NULL,$JoinCats=TRUE,$fix_method='set_first') { global $objSession, $Errors; if($JoinCats) { $cattable = GetTablePrefix()."CategoryItems"; $t = $this->SourceTable; $sql = "SELECT *,CategoryId FROM $t INNER JOIN $cattable ON $cattable.ItemResourceId=$t.ResourceId"; } else $sql = "SELECT * FROM ". $this->SourceTable; if(trim($whereClause)!="") { if(isset($whereClause)) $sql = sprintf('%s WHERE %s',$sql,$whereClause); } if(strlen($orderByClause)>0) { if(substr($orderByClause,0,8)=="ORDER BY") { $sql .= " ".$orderByClause; } else { $sql .= " ORDER BY $orderByClause"; } } if($objSession->HasSystemPermission("DEBUG.LIST")) echo $sql."<br>\n"; return $this->Query_Item($sql, null, $fix_method); } function GetPerPage() { //echo "Getting Per Page ".get_class($this)."<br>"; // return category perpage global $objConfig; $PerPage = $objConfig->Get( $this->PerPageVar ); if( !is_numeric($PerPage) ) $PerPage = $this->DefaultPerPage ? $this->DefaultPerPage : 10; //print_pre(debug_backtrace()); //echo "Returning: $PerPage<br>"; return $PerPage; } /** * Returns current page from env var * * @return int */ function getEnvPage() { $var_name = preg_replace('/(.*)_update$/', '\\1', $this->PageEnvar); return $GLOBALS[$var_name]['p']; } function FixInvalidPage($fix_method = 'set_first') { // in case if current page > total page count, // then set current page to last possible "set_last" // or first possible "set_first" $PerPage = $this->GetPerPage(); $NumPages = ceil( $this->GetNumPages($PerPage) ); /* echo "=====<br>"; echo "Class <b>".get_class($this)."</b>: Page ".$this->Page." of $NumPages<br>"; echo "PerPage: $PerPage<br>"; echo "Items Queries: ".$this->QueryItemCount."<br>"; echo "=====<br>"; */ // if ( $this->getEnvPage() ) $fix_method = 'set_current'; if( ($this->Page > $NumPages || $this->Page == 0) && $PerPage != -1) { switch($fix_method) { case 'set_first': $this->Page = 1; //echo "Move 2 First (class <b>".get_class($this)."</b>)<br>"; break; case 'set_last': $this->Page = $NumPages; //echo "Move 2 Last (class <b>".get_class($this)."</b>)<br>"; break; case 'set_current': $this->Page = $this->getEnvPage(); //echo "Move 2 Page reflected in env (class <b>".get_class($this)."</b>)<br>"; break; } $this->SaveNewPage(); } } function SaveNewPage() { // redefine in each list, should save to env array new page value } function GetPageLinkList($dest_template=NULL,$page = "",$PagesToList=10, $HideEmpty=TRUE,$EnvSuffix = '', $extra_attributes = '') { global $objConfig, $var_list_update, $var_list; $url_params = $EnvSuffix ? ExtractParams($EnvSuffix) : Array(); $v= $this->PageEnvar; global ${$v}; // if(!strlen($page)) $page = GetIndexURL(2); $PerPage = $objConfig->Get($this->PerPageVar); if($PerPage < 1) $PerPage = 20; $NumPages = ceil( $this->GetNumPages($PerPage) ); if($NumPages == 1 && $HideEmpty) return ''; $var_list_update['t'] = isset($dest_template) && $dest_template ? $dest_template : $var_list['t']; $o = ''; if( $this->Page == 0 || !is_numeric($this->Page) ) $this->Page = 1; 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) { ${$v}[$this->PageEnvarIndex] = $this->Page - $PagesToList; $prev_url = HREF_Wrapper('', $url_params); $o .= '<a href="'.$prev_url.'" '.$extra_attributes.'><<</a>'; } for($p = $StartPage; $p <= $EndPage; $p++) { if($p != $this->Page) { ${$v}[$this->PageEnvarIndex] = $p; $href = HREF_Wrapper('', $url_params); $o .= ' <a href="'.$href.'"'.$extra_attributes.'>'.$p.'</a> '; } else { $o .= ' <span class="current-page">'.$p.'</span>'; } } if($EndPage < $NumPages && $EndPage > 0) { ${$v}[$this->PageEnvarIndex] = $this->Page + $PagesToList; $next_url = HREF_Wrapper('', $url_params); $o .= '<a href="'.$next_url.'"'.$extra_attributes.'> >></a>'; } unset(${$v}[$this->PageEnvarIndex],$var_list_update["t"] ); return $o; } function GetAdminPageLinkList($url) { global $objConfig; $update =& $GLOBALS[$this->PageEnvar]; // env_var_update $page_backup = $update[$this->PageEnvarIndex]; // insteresting stuff :) if(!$this->PerPageVar) $this->PerPageVar = "Perpage_Links"; $PerPage = $objConfig->Get($this->PerPageVar); if($PerPage < 1) $PerPage = 20; $NumPages = ceil($this->GetNumPages($PerPage)); //echo $this->CurrentPage." of ".$NumPages." Pages"; if($this->Page > $NumPages) $this->Page = $NumPages; $StartPage = $this->Page - 5; if($StartPage < 1) $StartPage = 1; $EndPage = $StartPage + 9; if($EndPage > $NumPages) { $EndPage = $NumPages; $StartPage = $EndPage-9; if($StartPage < 1) $StartPage = 1; } $o = ''; if($StartPage > 1) { $update[$this->PageEnvarIndex]= $this->Page - 10; $prev_url = $url.'?env='.BuildEnv(); $o .= '<a href="'.$prev_url.'"><<</a>'; } for($p = $StartPage; $p <= $EndPage; $p++) { if($p != $this->Page) { $update[$this->PageEnvarIndex] = $p; $href = $url.'?env='.BuildEnv(); $o .= ' <a href="'.$href.'" class="NAV_URL">'.$p.'</a> '; } else { $o .= '<SPAN class="CURRENT_PAGE">'.$p.'</SPAN>'; } } if($EndPage < $NumPages) { $update[$this->PageEnvarIndex] = $this->Page + 10; $next_url = $url.'?env='.BuildEnv(); $o .= '<a href="'.$next_url.'"> >></a>'; } $update[$this->PageEnvarIndex] = $page_backup; return $o; } } function ParseClipboard($clip) { $ret = array(); $parts = explode(".",$clip,3); $command = $parts[0]; $table = $parts[1]; $prefix = GetTablePrefix(); if(substr($table,0,strlen($prefix))==$prefix) $table = substr($table,strlen($prefix)); $subparts = explode("=",$parts[2],2); $idfield = $subparts[0]; $idlist = $subparts[1]; $cmd = explode("-",$command); $ret["command"] = $cmd[0]; $ret["source"] = $cmd[1]; $ret["table"] = $table; $ret["idfield"] = $idfield; $ret["ids"] = $idlist; //print_pre($ret); return $ret; } function UpdateCategoryItems($item,$NewCatList,$PrimaryCatId = false) { global $objCatList; $CurrentList = explode(",",$item->CategoryMemberList()); $del_list = array(); $ins_list = array(); if(!is_array($NewCatList)) { if(strlen(trim($NewCatList))==0) $NewCatList = $objCatList->CurrentCategoryID(); $NewCatList = explode(",",$NewCatList); } //print_r($NewCatList); for($i=0;$i<count($NewCatList);$i++) { $cat = $NewCatList[$i]; if(!in_array($cat,$CurrentList)) $ins_list[] = $cat; } for($i=0;$i<count($CurrentList);$i++) { $cat = $CurrentList[$i]; if(!in_array($cat,$NewCatList)) $del_list[] = $cat; } for($i=0;$i<count($ins_list);$i++) { $cat = $ins_list[$i]; $item->AddToCategory($cat); } for($i=0;$i<count($del_list);$i++) { $cat = $del_list[$i]; $item->RemoveFromCategory($cat); } if($PrimaryCatId !== false) $item->SetPrimaryCategory($PrimaryCatId); } class clsCatItemList extends clsItemList { var $PerPageVarLong; var $PerPageShortVar; var $Query_SortField; var $Query_SortOrder; var $ItemType; function clsCatItemList() { $this->ClsItemList(); $this->Query_SortField = array(); $this->Query_SortOrder = array(); } 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"; } if(count($this->Query_SortField)>0) { for($x = 0; $x < count($this->Query_SortField); $x++) { $FieldVar = $this->Query_SortField[$x]; $OrderVar = $this->Query_SortOrder[$x]; if(is_object($objSession)) { $FieldVarData = $objSession->GetPersistantVariable($FieldVar); //echo "FieldVar: $FieldVar<br>"; if(strlen($FieldVarData)>0) { $Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". $objSession->GetPersistantVariable($OrderVar)); } } } } if(count($Orders)>0) { $OrderBy = "ORDER BY ".implode(", ",$Orders); } else $OrderBy=""; //echo "ORDER BY: $OrderBy<br>"; return $OrderBy; } function AddSortField($SortField, $SortOrder) { if(strlen($SortField)) { $this->Query_SortField[] = $SortField; $this->Query_SortOrder[] = $SortOrder; } } function ClearSortFields() { $this->Query_SortField = array(); $this->Query_SortOrder = array(); } /* skeletons in this closet */ function GetNewValue($CatId=NULL) { return 0; } function GetPopValue($CategoryId=NULL) { return 0; } /* end of skeletons */ 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 $cattable ON ($cattable.ItemResourceId=$ltable.ResourceId) "; $sql .="INNER JOIN $CategoryTable ON ($CategoryTable.CategoryId=$cattable.CategoryId) "; $sql .="INNER JOIN $ptable ON ($cattable.CategoryId=$ptable.CategoryId) "; $sql .="WHERE ($acl AND PermId=$VIEW AND $cattable.PrimaryCat=1 AND $CategoryTable.Status=1) "; if(strlen($AdditonalWhere)>0) { $sql .= "AND (".$AdditonalWhere.")"; } return $sql; } function SqlCategoryList($attribs = array()) { $CatTable = GetTablePrefix()."CategoryItems"; $t = $this->SourceTable; $sql = "SELECT *,$CatTable.CategoryId FROM $t INNER JOIN $CatTable ON $CatTable.ItemResourceId=$t.ResourceId "; $sql .="WHERE ($CatTable.CategoryId=".$catid." AND $t.Status=1)"; return $sql; } function CategoryCount($attribs=array()) { global $objCatList, $objCountCache; $cat = $attribs["_catid"]; if(!is_numeric($cat)) { $cat = $objCatList->CurrentCategoryID(); } if((int)$cat>0) $c = $objCatList->GetCategory($cat); $CatTable = GetTablePrefix()."CategoryItems"; $t = $this->SourceTable; $sql = "SELECT count(*) as MyCount FROM $t INNER JOIN $CatTable ON ($CatTable.ItemResourceId=$t.ResourceId) "; if($attribs["_subcats"]) { $ctable = $objCatList->SourceTable; $sql .= "INNER JOIN $ctable ON ($CatTable.CategoryId=$ctable.CategoryId) "; $sql .= "WHERE (ParentPath LIKE '".$c->Get("ParentPath")."%' "; if(!$attribs["_countcurrent"]) { $sql .=" AND $ctable.CategoryId != $cat) AND ($t.Status=1)"; } else $sql .=") AND ($t.Status=1)"; } else $sql .="WHERE ($CatTable.CategoryId=".$cat." AND $t.Status=1) "; if($attribs["_today"]) { $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $sql .= "AND ($t.CreatedOn>=$today) "; } //echo $sql."<br><br>\n"; $rs = $this->adodbConnection->Execute($sql); $ret = ""; if($rs && !$rs->EOF) $ret = (int)$rs->fields["MyCount"]; return $ret; } function SqlGlobalCount($attribs=array()) { global $objSession; $where = ''; $p = $this->BasePermission.'.VIEW'; $t = $this->SourceTable; if( getArrayValue($attribs,'_today') ) { $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $where = "($t.CreatedOn>=$today)"; } $GroupList = getArrayValue($attribs,'_grouponly') ? $objSession->Get('GroupList') : null; $sql = $this->GetCountSQL($p,NULL,$GroupList,$where); return $sql; } function DoGlobalCount($attribs) { global $objCountCache; $cc = $objCountCache->GetValue($this->CacheListType("_"),$this->ItemType,$this->CacheListExtraId("_"),(int)getArrayValue($attribs,'_today'), 3600); if(!is_numeric($cc)) { $sql = $this->SqlGlobalCount($attribs); $ret = QueryCount($sql); $objCountCache->SetValue($this->CacheListType("_"),$this->ItemType,$this->CacheListExtraId("_"),(int)getArrayValue($attribs,'_today'),$ret); } else $ret = $cc; return $ret; } function CacheListExtraId($ListType) { global $objSession; if(!strlen($ListType)) $ListType="_"; switch($ListType) { case "_": $ExtraId = $objSession->Get("GroupList"); break; case "category": $ExtraId = $objSession->Get("GroupList"); break; case "myitems": $ExtraId = $objSession->Get("PortalUserId"); break; case "hot": $ExtraId = $objSession->Get("GroupList"); break; case "pop": $ExtraId = $objSession->Get("GroupList"); break; case "pick": $ExtraId = $objSession->Get("GroupList"); break; case "favorites": $ExtraId = $objSession->Get("PortalUserId"); break; case "new": $ExtraId = $objSession->Get("GroupList"); break; } return $ExtraId; } /** * Return all listype (from tags) to id mappings * * @return Array * @access private */ function GetListTypes() { return Array('_' => 0, 'category' => 1, 'myitems' => 2, 'hot' => 3, 'pop' => 4, 'pick' => 5, 'favorites' => 6, 'new' => 8); } function CacheListType($ListType) { if(empty($ListType)) $ListType='_'; $mapping = $this->GetListTypes(); return $mapping[$ListType]; } function PerformItemCount($attribs=array()) { global $objCountCache, $objSession; $ret = ""; $sql = ""; $ListType = getArrayValue($attribs,'_listtype'); if(!strlen($ListType)) $ListType="_"; $ListTypeId = $this->CacheListType($ListType); //echo "ListType: $ListType ($ListTypeId)<br>\n"; $ExtraId = $this->CacheListExtraId($ListType); switch($ListType) { case "_": $ret = $this->DoGlobalCount($attribs); break; case "category": $ret = $this->CategoryCount($attribs); break; case "myitems": $sql = $this->SqlMyItems($attribs); break; case "hot": $sql = $this->SqlHotItems($attribs); break; case "pop": $sql = $this->SqlPopItems($attribs); break; case "pick": $sql = $this->SqlPickItems($attribs); break; case "favorites": $sql = $this->SqlFavorites($attribs); break; case "search": $sql = $this->SqlSearchItems($attribs); break; case "new": $sql = $this->SqlNewItems($attribs); break; } //echo "SQL: $sql<br>"; if(!empty($sql) && $ListType != "_") { if(is_numeric($ListTypeId) && $ListTypeId) { $cc = $objCountCache->GetValue($ListTypeId,$this->ItemType,$ExtraId,(int)getArrayValue($attribs,'_today'), 3600); if(!is_numeric($cc) || $attribs['_nocache'] == 1) { $ret = QueryCount($sql); $objCountCache->SetValue($ListTypeId,$this->ItemType,$ExtraId,(int)getArrayValue($attribs,'_today'),$ret); } else $ret = $cc; } else $ret = QueryCount($sql); } return $ret; } function GetJoinedSQL($PermName, $CatId=NULL, $AdditionalWhere="", $LoadOnlyPrimary = true) { global $objSession, $objPermissions; $ltable = $this->SourceTable; $acl = $objSession->GetACLClause(); $cattable = GetTablePrefix()."CategoryItems"; $CategoryTable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $VIEW = $objPermissions->GetPermId($PermName); $sql ="INNER JOIN $cattable ON ($cattable.ItemResourceId=$ltable.ResourceId) "; $sql .="INNER JOIN $CategoryTable ON ($CategoryTable.CategoryId=$cattable.CategoryId) "; $sql .= "INNER JOIN $ptable ON ($cattable.CategoryId=$ptable.CategoryId) "; // here will come checking for PrimaryCat on search if ($LoadOnlyPrimary) { $sql .="WHERE ($acl AND PermId=$VIEW AND PrimaryCat=1 AND $CategoryTable.Status=1) "; } else { $sql .="WHERE ($acl AND PermId=$VIEW AND $CategoryTable.Status=1) "; } if(is_numeric($CatId) && $CatId > 0) { $sql .= " AND ($CategoryTable.CategoryId=$CatId) "; } if(strlen($AdditionalWhere)>0) { $sql .= "AND (".$AdditionalWhere.")"; } return $sql; } function CountFavorites($attribs) { if($attribs["_today"]) { global $objSession, $objConfig, $objPermissions; $acl = $objSession->GetACLClause(); $favtable = GetTablePrefix()."Favorites"; $ltable = $this->SourceTable; $cattable = GetTablePrefix()."CategoryItems"; $CategoryTable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $where = "PortalUserId=".$objSession->Get("PortalUserId")." AND $ltable.Status=1"; $where .= " AND $favtable.Modified >= $today AND ItemTypeId=".$this->ItemType; $p = $this->BasePermission.".VIEW"; $sql = "SELECT $ltable.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $favtable INNER JOIN $ltable ON ($favtable.ResourceId=$ltable.ResourceId) "; $sql .= $this->GetJoinedSQL($p,NULL,$where); $ret = QueryCount($sql); } else { if (!$this->ListType == "favorites") { $this->ListType = "favorites"; $this->LoadFavorites($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; } return $ret; } function CountPickItems($attribs) { if (!$this->ListType == "pick") { $this->ListType = "pick"; $this->LoadPickItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountMyItems($attribs) { if (!$this->ListType == "myitems") { $this->ListType = "myitems"; $this->LoadMyItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountHotItems($attribs) { if (!$this->ListType == "hotitems") { $this->ListType = "hotitems"; $this->LoadHotItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountNewItems($attribs) { if (!$this->ListType == "newitems") { $this->ListType = "newitems"; $this->LoadNewItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountPopItems($attribs) { if (!$this->ListType == "popitems") { $this->ListType = "popitems"; $this->LoadPopItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountSearchItems($attribs) { if (!$this->ListType == "search") { $this->ListType = "search"; $this->LoadSearchItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function SqlFavorites($attribs) { global $objSession, $objConfig, $objPermissions; $acl = $objSession->GetACLClause(); $favtable = GetTablePrefix()."Favorites"; $ltable = $this->SourceTable; $cattable = GetTablePrefix()."CategoryItems"; $CategoryTable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $where = "PortalUserId=".$objSession->Get("PortalUserId")." AND $ltable.Status=1"; if($attribs["_today"]) { $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $where .= " AND $favtable.Modified >= $today AND ItemTypeId=".$this->ItemType; } $p = $this->BasePermission.".VIEW"; $sql = "SELECT $ltable.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $favtable INNER JOIN $ltable ON ($favtable.ResourceId=$ltable.ResourceId) "; $sql .= $this->GetJoinedSQL($p,NULL,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadFavorites($attribs) { global $objSession, $objCountCache, $objConfig; $sql = $this->SqlFavorites($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { if ($objConfig->Get($this->PerPageShortVar) > 0) { $this->PerPageVar = $this->PerPageShortVar; } else { $this->PerPageVar = $this->PerPageVarLong; } } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("favorites"),$this->ItemType,$this->CacheListExtraId("favorites"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount = QueryCount($sql); $objCountCache->SetValue($this->CacheListType("favorites"),$this->ItemType,$this->CacheListExtraId("favorites"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount = (int)$CachedCount; return $this->Query_Item($sql); } function SqlPickItems($attribs) { global $objSession, $objCatList; $catid = (int)getArrayValue($attribs,'_catid'); $scope = (int)getArrayValue($attribs,'_scope'); //$JoinCats = (int)$attribs["_catinfo"] || $scope; $TableName = $this->SourceTable; if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $where = GetTablePrefix()."CategoryItems.CategoryId =".$catid." AND ".$TableName.".EditorsPick=1 AND ".$TableName.".Status=1"; } else { $where = $TableName.".EditorsPick=1 AND ".$TableName.".Status=1 "; $catid=NULL; } if(getArrayValue($attribs,'_today')) { $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,$catid,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; //echo "SQL: $sql<br>"; return $sql; } function LoadPickItems($attribs) { global $objSession, $objCountCache, $objConfig; $sql = $this->SqlPickItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { if ($objConfig->Get($this->PerPageShortVar) > 0) { $this->PerPageVar = $this->PerPageShortVar; } else { $this->PerPageVar = $this->PerPageVarLong; } } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)getArrayValue($attribs,'_today'),3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)getArrayValue($attribs,'_today'),$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlMyItems($attribs= array()) { global $objSession; $TableName = $this->SourceTable; $where = " ".$TableName.".Status>-1 AND ".$TableName.".CreatedById=".$objSession->Get("PortalUserId"); if(getArrayValue($attribs,'_today')) { $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,null,$where); // maybe null should be replaced by some CategoryId $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadMyItems($attribs=array()) { global $objSession,$objCountCache; $sql = $this->SqlMyItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { if ($objConfig->Get($this->PerPageShortVar) > 0) { $this->PerPageVar = $this->PerPageShortVar; } else { $this->PerPageVar = $this->PerPageVarLong; } } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("myitems"),$this->ItemType,$this->CacheListExtraId("myitems"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("myitems"),$this->ItemType,$this->CacheListExtraId("myitems"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlNewItems($attribs = array()) { global $objSession, $objCatList; $catid = (int)getArrayValue($attribs,'_catid'); $scope = (int)getArrayValue($attribs,'_scope'); $show_since_last = (int)getArrayValue($attribs,'_show_since_last'); //$JoinCats = (int)$attribs["_catinfo"] || $scope; //echo "Last: $scope<br><br>"; $TableName = $this->SourceTable; if(getArrayValue($attribs,'_today')) { $cutoff = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); } else { if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } if (!$show_since_last) { $cutoff = $this->GetNewValue($catid); } else { $cutoff = $scope; } } else $cutoff = $this->GetNewValue(); } if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } if (!$show_since_last) { $where = "CategoryId =".$catid." AND ((".$TableName.".CreatedOn >=".$cutoff." AND ".$TableName.".NewItem != 0) OR ".$TableName.".NewItem=1 ) AND ".$TableName.".Status=1 "; } else { $where = $TableName.".CreatedOn >=".$cutoff." AND ".$TableName.".Status=1 "; } } else { $where = "((".$TableName.".CreatedOn >=".$this->GetNewValue()." AND ".$TableName.".NewItem != 0) OR ".$TableName.".NewItem=1 ) AND ".$TableName.".Status=1 "; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,$catid,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; //echo "SQL: $sql<br><br>"; return $sql; } function LoadNewItems($attribs) { global $objSession,$objCountCache,$objConfig; $sql = $this->SqlNewItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if( getArrayValue($attribs,'_shortlist') ) { if ($objConfig->Get($this->PerPageShortVar) > 0) { $this->PerPageVar = $this->PerPageShortVar; } else { $this->PerPageVar = $this->PerPageVarLong; } } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)getArrayValue($attribs,'_today'),3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)getArrayValue($attribs,'_today'),$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; $ret = $this->Query_Item($sql); return $ret; } function SqlPopItems($attribs) { global $objSession, $objCatList; $catid = (int)$attribs["_catid"]; $scope = (int)$attribs["_scope"]; //$JoinCats = (int)$attribs["_catinfo"] || $scope; $TableName = $this->SourceTable; if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $where = "CategoryId =".$catid." AND ((".$TableName.".Hits >=".$this->GetLinkPopValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1"; } else { $where = "((".$TableName.".CachedRating >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0 ) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 "; $where = "((".$TableName.".Hits >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 "; } if($attribs["_today"]) { $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,$catid,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadPopItems($attribs) { global $objSession,$objCountCache; $sql = $this->SqlPopItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { if ($objConfig->Get($this->PerPageShortVar) > 0) { $this->PerPageVar = $this->PerPageShortVar; } else { $this->PerPageVar = $this->PerPageVarLong; } } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("pop"),$this->ItemType,$this->CacheListExtraId("pop"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("pop"),$this->ItemType,$this->CacheListExtraId("pop"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlHotItems($attribs) { global $objSession, $objCatList; $catid = (int)$attribs["_catid"]; $scope = (int)$attribs["_scope"]; // $JoinCats = (int)$attribs["_catinfo"] || $scope; $TableName = $this->SourceTable; $OrderBy = $TableName.".CachedRating DESC"; if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $where = "CategoryId =".$catid." AND ((".$TableName.".CachedRating >=".$this->GetHotValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1"; } else { $where = "((".$TableName.".CachedRating >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0 ) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 "; } if($attribs["_today"]) { $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $CatId = !$scope? NULL : $catid; $sql .= $this->GetJoinedSQL($p,$CatId,$where); if(strlen($OrderBy)) $sql .= " ORDER BY $OrderBy "; return $sql; } function LoadHotItems($attribs) { global $objSession,$objCountCache; $sql = $this->SqlHotItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { if ($objConfig->Get($this->PerPageShortVar) > 0) { $this->PerPageVar = $this->PerPageShortVar; } else { $this->PerPageVar = $this->PerPageVarLong; } } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("hot"),$this->ItemType,$this->CacheListExtraId("hot"),(int)$attribs["_today"], 0); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("hot"),$this->ItemType,$this->CacheListExtraId("hot"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlSearchItems($attribs = array()) { global $objConfig, $objItemTypes, $objSession, $objPermissions, $CountVal; $acl = $objSession->GetACLClause(); $this->Clear(); //$stable = "ses_".$objSession->GetSessionKey()."_Search"; $stable = $objSession->GetSearchTable(); $ltable = $this->SourceTable; $catitems = GetTablePrefix()."CategoryItems"; $cattable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $p = $this->BasePermission.".VIEW"; $i = new $this->classname(); $sql = "SELECT $cattable.CategoryId,$cattable.CachedNavbar,$ltable.*, Relevance FROM $stable "; $sql .= "INNER JOIN $ltable ON ($stable.ItemId=$ltable.".$i->id_field.") "; $where = "ItemType=".$this->ItemType." AND $ltable.Status=1"; $load_multiple = $objConfig->Get("Search_ShowMultiple_".$attribs['multiple']); $LoadOnlyPrimary = true; if ($load_multiple == 1) { $LoadOnlyPrimary = false; } $sql .= $this->GetJoinedSQL($p,NULL,$where, $LoadOnlyPrimary); $tmp = $this->QueryOrderByClause(FALSE,TRUE,TRUE); //echo "TMP: $tmp<br>"; //$tmp = substr($tmp,9); if(strlen($tmp)) { $sql .= $tmp.", "; } $sql .= " EdPick DESC,Relevance DESC "; //echo "SQL Search Items: $sql<br><br>"; return $sql; } function LoadSearchItems($attribs = array()) { global $CountVal, $objSession; //echo "Loading <b>".get_class($this)."</b> Search Items<br>"; $sql = $this->SqlSearchItems($attribs); //echo "$sql<br>"; $this->Query_Item($sql); $Keywords = GetKeywords($objSession->GetVariable("Search_Keywords")); //echo "SQL Loaded ItemCount (<b>".get_class($this).'</b>): '.$this->NumItems().'<br>'; for($i = 0; $i < $this->NumItems(); $i++) { $this->Items[$i]->Keywords = $Keywords; } if(is_numeric($CountVal[$this->ItemType])) { $this->QueryItemCount = $CountVal[$this->ItemType]; //echo "CACHE: <pre>"; print_r($CountVal); echo "</pre><BR>"; } else { $this->QueryItemCount = QueryCount($sql); //echo "<b>SQL</b>: ".$sql."<br><br>"; $CountVal[$this->ItemType] = $this->QueryItemCount; } } /** * Updates count cache for selected ids in list * * @param Array $item_ids * @access protected */ function FlushCache($item_ids) { $db =& GetADODBConnection(); if(is_array($item_ids)) $item_ids=implode(',',$item_ids); $sql = 'SELECT ResourceId FROM '.$this->SourceTable.' WHERE '.$this->GetIDField().' IN ('.$item_ids.')'; $resource_ids=$db->GetCol($sql); $sql='SELECT CategoryId FROM '.GetTablePrefix().'CategoryItems WHERE ItemResourceId IN ('.implode(',',$resource_ids).')'; $cat_ids=$db->GetCol($sql); UpdateCategoryCount($this->ItemType, $cat_ids, $this->GetListTypes()); } function PasteFromClipboard($TargetCat,$NameField="") { global $objSession,$objCatList; $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;$i<count($item_ids);$i++) { $item = $this->GetItem($item_ids[$i]); if(!$IsCopy) // paste to other category then current { $item->MoveToCategory($ClipBoard["source"],$TargetCat); $clip = str_replace("CUT","COPY",$clip); $objSession->SetVariable("ClipBoard",$clip); } else { $item->CopyToNewResource($TargetCat,$NameField); // create item copy, but with new ResourceId $item->AddToCategory($TargetCat); UpdateCategoryCount($item->type,$TargetCat, $this->GetListTypes() ); } } } } function AdminPrintItems($template) { // prints item listing for admin (browse/advanced view) tabs $o = '<table border="0" cellspacing="2" width="100%"><tbody><tr>'; $i = 1; $topleft = 0; $topright = 0; $rightcount = 0; $total_items = $this->NumItems(); $topleft = ceil($total_items / 2); $topright = $total_items - $topleft; for($x = 0; $x < $topleft; $x++) { //printingleft $item = $this->Items[$x]; if ($i > 2) { $o .= "</tr>\n<tr>"; $i = 1; } $o .= $item->AdminParseTemplate($template); $i++; //printingright if ($rightcount < $topright && ( ($x + $topleft) < $total_items) ) { $item = $this->Items[ $x + $topleft ]; if ($i > 2) { $o.="</tr>\n<tr>"; $i = 1; } $o .= $item->AdminParseTemplate($template); $i++; $rightcount++; } } $o .= "\n</tr></tbody></table>\n"; return $o; } } // -------------- NEW CLASSES ----------------------- class DBList { // table related attributes var $db = null; var $table_name = ''; var $LiveTable = ''; var $EditTable = ''; // record related attributes var $records = Array(); var $record_count = 0; var $cur_rec = -1; // "-1" means no records, or record index otherwise // query related attributes var $SelectSQL = "SELECT * FROM %s"; function DBList() { // use $this->SetTable('live', 'table name'); // in inherited constructors to set table for list $this->db =&GetADODBConnection(); } function SetTable($action, $table_name = null) { // $action = {'live', 'restore','edit'} switch($action) { case 'live': $this->LiveTable = $table_name; $this->table_name = $this->LiveTable; break; case 'restore': $this->table_name = $this->LiveTable; break; case 'edit': global $objSession; $this->table_name = $objSession->GetEditTable($this->LiveTable); break; } } function Clear() { // no use of this method at a time :) $this->records = Array(); $this->record_count = 0; $this->cur_rec = -1; } function Query() { // query list $sql = sprintf($this->SelectSQL, $this->table_name); // echo "SQL: $sql<br>"; $rs =& $this->db->Execute($sql); if( $this->db->ErrorNo() == 0 ) { $this->records = $rs->GetRows(); $this->record_count = count($this->records); //$this->cur_rec = $this->record_count ? 0 : -1; } else return false; } function ProcessList($callback_method) { // process list using user-defined method called // with one parameter - current record fields // (associative array) if($this->record_count > 0) { $this->cur_rec = 0; while($this->cur_rec < $this->record_count) { if( method_exists($this, $callback_method) ) $this->$callback_method( $this->GetCurrent() ); $this->cur_rec++; } } } function &GetCurrent() { // return currently processed record (with change ability) return ($this->cur_rec != -1) ? $this->records[$this->cur_rec] : false; } function GetDBField($field_name) { $rec =& $this->GetCurrent(); return is_array($rec) && isset($rec[$field_name]) ? $rec[$field_name] : false; } } ?> \ No newline at end of file Property changes on: trunk/kernel/include/parseditem.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.86 \ No newline at end of property +1.87 \ No newline at end of property Index: trunk/kernel/include/portaluser.php =================================================================== --- trunk/kernel/include/portaluser.php (revision 3906) +++ trunk/kernel/include/portaluser.php (revision 3907) @@ -1,1126 +1,1134 @@ <?php RegisterPrefix("clsPortalUser","user","kernel/include/portaluser.php"); class clsPortalUser extends clsItem { var $Vars; //contains the PersistantSessionData for the user var $VarsLoaded; var $PrimeGroup; function clsPortalUser($UserId=NULL) { // $this->clsParsedItem(); $this->clsItem(); $this->tablename=GetTablePrefix()."PortalUser"; $this->type=6; $this->BasePermission="USER"; $this->id_field = "PortalUserId"; $this->TagPrefix="user"; $this->Vars = Array(); $this->VarsLoaded = FALSE; $this->debuglevel = 0; if(isset($UserId)) $this->LoadFromDatabase($UserId); } function Create() { $ret = parent::Create(); if ($ret && $this->isLiveTable()) { $application =& kApplication::Instance(); $sync_manager =& $application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('createUser', $this->Data); } return $ret; } function Update($UpdatedBy = null, $modificationDate = null) { $ret = parent::Update($UpdatedBy, $modificationDate); if ($ret && $this->isLiveTable()) { $application =& kApplication::Instance(); $sync_manager =& $application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('updateUser', $this->Data); } return $ret; } function Delete() { global $objGroups, $objFavorites; $g = $objGroups->GetPersonalGroup($this->Get("Login")); if (is_object($g)) $g->Delete(); $objFavorites->DeleteUser($this->Get("PortalUserId")); //delete favorites $ret = parent::Delete(); if($ret && $this->isLiveTable()) { $application =& kApplication::Instance(); $sync_manager =& $application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('deleteUser', $this->Data); } return $ret; } function RemoveFromAllGroups() { $sql = "DELETE FROM ".GetTablePrefix()."UserGroup WHERE PortaluserId=".$this->Get("PortalUserId"); $this->adodbConnection->Execute($sql); } function RemoveFromGroup($GroupId) { $sql = "DELETE FROM ".GetTablePrefix()."UserGroup WHERE PortaluserId=".$this->Get("PortalUserId"); $sql .= " AND GroupId=$GroupId"; $this->adodbConnection->Execute($sql); } function PrimaryGroup($ReturnField = "GroupId") { global $objGroups; $ret = ""; if(!is_object($this->PrimeGroup)) { if((int)$this->Get("GroupId")>0) { $this->PrimeGroup =& $objGroups->GetItem($this->Get("GroupId")); } else { $this->PrimeGroup = new clsPortalGroup(); $sql = "SELECT * FROM ".GetTablePrefix()."UserGroup INNER JOIN ".GetTablePrefix()."PortalGroup ON (".GetTablePrefix()."UserGroup.GroupId=".GetTablePrefix()."PortalGroup.GroupId) WHERE PrimaryGroup = 1 AND PortalUserId=".$this->Get("PortalUserId"); //echo $sql; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) $this->PrimeGroup->SetFromArray($rs->fields); } } $ret = $this->PrimeGroup->Get($ReturnField); return $ret; } function SetPrimaryGroup($GroupId) { if($this->IsInGroup($GroupId)) { $sql = "UPDATE ".GetTablePrefix()."UserGroup SET PrimaryGroup=0 WHERE PortalUserId=".$this->Get("PortalUserId"); $this->adodbConnection->Execute($sql); $sql = "UPDATE ".GetTablePrefix()."UserGroup SET PrimaryGroup=1 WHERE GroupId=$GroupId AND PortalUserId=".$this->Get("PortalUserId"); $this->adodbConnection->Execute($sql); } } function GetGroupList() { $ret = array(); $sql = "SELECT GroupId FROM %sUserGroup WHERE PortalUserId = %s ORDER BY PrimaryGroup"; $sql = sprintf($sql, GetTablePrefix(), $this->Get("PortalUserId")); $ret = $this->adodbConnection->GetCol($sql); return $ret; } function IsInGroup($GroupId) { $groups = $this->GetGroupList(); if( $groups === false ) return false; return in_array($GroupId, $groups) ? true : false; } function GetPersonalGroup($CreateIfMissing = FALSE) { global $objGroups; $n = "_".$this->Get("Login"); $g = $objGroups->GetItemByField("Name",$n); if(!is_object($g) && $CreateIfMissing) $g = $this->CreatePersonalGroup(); return $g; } function CreatePersonalGroup() { global $objGroups; $Description = $this->Get("FirstName")." ".$this->Get("LastName"); $CreatedOn = adodb_mktime(); $n = "_".$this->Get("Login"); $g = $objGroups->Add_Group($n, $Description, $CreatedOn, 1, 0); $g->Set("Personal",1); $g->Set("System",0); $g->Set("Enabled",1); $g->Update(); if(is_object($g)) $g->AddUser($this->Get("PortalUserId")); return $g; } function Validate() { global $Errors; $dataValid = true; if(!strlen($this->Get("Login"))) { $Errors->AddError("error.fieldIsRequired",'Login',"","",get_class($this),"Validate"); $dataValid = false; } if(!strlen($this->Get("Email"))) { $Errors->AddError("error.fieldIsRequired",'Email',"","",get_class($this),"Validate"); $dataValid = false; } return $dataValid; } function Approve() { $this->Set("Status", 1); $this->Update(); $this->SendUserEventMail("USER.APPROVE",$this->Get("PortalUserId")); $this->SendAdminEventMail("USER.APPROVE"); } function Deny($IsBanned = 0) { $this->Set( Array('Status','IsBanned'), Array(0,$IsBanned) ); $this->Update(); $this->SendUserEventMail("USER.DENY",$this->Get("PortalUserId")); $this->SendAdminEventMail("USER.DENY"); } function HasSystemPermission($PermissionName) { global $objGroups; $GroupList = $this->GetGroupList(); for($i=0;$i<count($GroupList);$i++) { $g = $objGroups->GetItem($GroupList[$i]); $value = $g->HasSystemPermission($PermissionName); if($value != -1) break; } return $value; } function LoadPersistantVars() { global $objConfig; unset($this->Vars); $this->Vars = Array(); $user_id = $this->HasField('PortalUserId') ? $this->Get('PortalUserId') : 0; $sql = "SELECT VariableName, VariableValue FROM ".GetTablePrefix()."PersistantSessionData WHERE PortalUserId = ".(int)$user_id." ORDER BY PortalUserId ASC"; $result = $this->adodbConnection->Execute($sql); while ($result && !$result->EOF) { $data = $result->fields; $this->Vars[$data["VariableName"]] = $data["VariableValue"]; if( basename($_SERVER['PHP_SELF']) != 'edit_config.php' ) { $objConfig->Set($data["VariableName"], $data["VariableValue"], 1, 1); } $result->MoveNext(); } $this->VarsLoaded = TRUE; } function SetPersistantVariable($variableName, $variableValue) { global $objConfig; if(!$this->VarsLoaded) $this->LoadPersistantVars(); $userid = $this->Get("PortalUserId"); $objConfig->Set($variableName,$variableValue,1); $fields = array_keys($this->Vars); if(strlen($variableValue)>0) { if(in_array($variableName,$fields)) { $sql = "UPDATE ".GetTablePrefix()."PersistantSessionData SET VariableValue='$variableValue' WHERE VariableName='$variableName' AND PortalUserId=$userid"; } else $sql = "INSERT INTO ".GetTablePrefix()."PersistantSessionData (VariableName,VariableValue,PortalUserId) VALUES ('$variableName','$variableValue',$userid)"; } else $sql = "DELETE FROM ".GetTablePrefix()."PersistantSessionData WHERE VariableName='$variableName' AND PortalUserId=$userid"; $this->Vars[$variableName] = $variableValue; // echo "<BR>SQL: $sql<BR>"; $this->adodbConnection->Execute($sql); } function GetPersistantVariable($variableName) { global $objConfig, $objSession; if(!$this->VarsLoaded) { $this->LoadPersistantVars(); } $fields = array_keys($this->Vars); if(in_array($variableName,$fields)) { $val = $this->Vars[$variableName]; } else { if( $this->UniqueId() == $objSession->Get('PortalUserId') ) { $val = $objConfig->Get($variableName); } else { $val = ''; } } return $val; } function GetAllPersistantVars() { if(!$this->VarsLoaded) { $this->LoadPersistantVars(); } return $this->Vars; } function GetIcon() { } function StatusIcon() { global $imagesURL; $url = $imagesURL."/itemicons/icon16_user"; if($this->Get("Status")==0) { $url .= "_disabled"; } else if($this->Get("Status")==2) { $url .= "_pending"; } $url .= ".gif"; return $url; } function IsFriend($UserId) { $ftable = GetTablePrefix()."Favorites"; $sql = "SELECT count(*) as FriendCount FROM $ftable WHERE PortalUserId=$UserId AND ResourceId="; $sql .=$this->Get("ResourceId")." AND ItemTypeId=6"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) return ($rs->fields["FriendCount"]>0); return FALSE; } function GetUserTime($timestamp) { if(is_numeric($this->Get("tz"))) { return GetLocalTime($timestamp,$this->Get("tz")); } else return GetLocalTime($timestamp); } function ParseObject($element) { global $objConfig, $objUsers, $objCatList,$objSession, $var_list_update, $var_list, $m_var_list_update; //echo "<PRE>"; print_r($element); echo "</pre>"; //echo "Tag Prefix: ".$this->TagPrefix." Element: ".$element->name."<br>"; $this->clsPortalUser(); if (strtolower($element->name) == 'touser') { $this->TagPrefix = "touser"; } $extra_attribs = ExtraAttributes($element->attributes); if(strtolower($element->name)==$this->TagPrefix) { $field = strtolower($element->attributes["_field"]); if(substr($field,0,3)=="pp_") { $perm = $objSession->GetPersistantVariable($field); if($perm) { $field = substr($field,3); } else $field = ""; } switch($field) { /* @field:user.login @description:User's login name */ case "username": case "login": $ret = $this->Get("Login"); break; case "firstname": $ret = $this->Get("FirstName"); break; case "lastname": $ret = $this->Get("LastName"); break; case "password": /* @field:user.password @description:User password */ /*$ret = $objSession->Get("password"); $objSession->Set("password", '');*/ $ret = GetVar('user_password'); break; case "email": $ret = $this->Get("Email"); break; case "street": $ret = $this->Get("Street"); break; case "city": $ret = $this->Get("City"); break; case "state": $ret = $this->Get("State"); break; case "zip": $ret = $this->Get("Zip"); break; case "phone": $ret = $this->Get("Phone"); break; case "country": $ret = $this->Get("Country"); break; case "primarygroup": /* @field:user.primarygroup @description:Parses a field from the user's primary group @attrib:_groupfield::group field name to parse, defaults to group name */ $groupfield = $element->attributes["_groupfield"]; if(!strlen($groupfield)) $groupfield="Name"; $ret = $this->PrimaryGroup($groupfield); break; case "date": /* @field:user.date @description:Returns the date/time the user 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->attributes["_tz"]) { $d = GetLocalTime($d,$objSession->Get("tz")); } $part = strtolower($element->attributes["_part"]); if(strlen($part)) { $ret = ExtractDatePart($part,$d); } else { if($d<=0) { $ret = ""; } else $ret = LangDate($d); } break; case "dob": /* @field:user.dob @description:Returns the date/time of the users date of birth @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("dob"); if($element->attributes["_tz"]) { $d = GetLocalTime($d,$objSession->Get("tz")); } $part = strtolower($element->attributes["_part"]); if(strlen($part)) { $ret = ExtractDatePart($part,$d); } else { // if($d<=0) // { // $ret = ""; // } // else $ret = LangDate($d); } break; case "modified": /* @field:user.modified @description:Returns the date/time the user was last modified @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("Modified"); if($d<=0) $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($d<=0) { $ret = ""; } else $ret = LangDate($d); } break; case 'send_pm_link': $var_list_update['t'] = $element->GetAttributeByName('_Template'); $ret = HREF_Wrapper('', Array('ToUser' => $this->Get('Login') ) ); break; case "profile_link": /* @field:user.profile_link @description:Create a link to the user's profile @attrib:_template:tpl:template the link should point to */ $t = $element->attributes["_template"]; if(strlen($t)) { $var_list_update["t"] = $t; } else { $var_list_update["t"] = $var_list["t"]; } $ret = HREF_Wrapper('', Array('UserId' => $this->Get('PortalUserId') ) ); break; case "add_friend_link": /* @field:user.add_friend_link @description:link to add a user to the friends list @attrib:_template:tpl:Template link shoukd point to */ if($element->attributes["_force"] || !$this->IsFriend($objSession->Get("PortalUserId")) && $this->Get("PortalUserId") != $objSession->Get("PortalUserId")) { $t = $element->attributes["_template"]; if(strlen($t)) { $var_list_update["t"] = $t; } else { $var_list_update["t"] = $var_list["t"]; } $ret = HREF_Wrapper('', Array('Action' => 'm_add_friend', 'UserId' => $this->Get('PortalUserId') ) ); } else $ret = ""; break; case "del_friend_link": /* @field:user.del_friend_link @description:link to remove a user from the friends list @attrib:_template:tpl:Template link shoukd point to */ if($element->attributes["_force"] || $this->IsFriend($objSession->Get("PortalUserId")) && $this->Get("PortalUserId") != $objSession->Get("PortalUserId")) { $t = $element->attributes["_template"]; if(strlen($t)) { $var_list_update["t"] = $t; } else { $var_list_update["t"] = $var_list["t"]; } $ret = HREF_Wrapper('', Array('Action' => 'm_del_friend', 'UserId' => $this->Get('PortalUserId') ) ); } else $ret = ""; break; case "icon": $ret = $this->GetIcon(); break; case "image": /* @field:user.image @description:Return an image associated with the user @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 */ $avatar = $element->attributes["_avatar"]; $default = $element->attributes["_primary"]; $name = $element->attributes["_name"]; if ($avatar) { $img = $this->GetAvatarImage(); } elseif(strlen($name)) { $img = $this->GetImageByName($name); // echo "<PRE>";print_r($img); echo "</PRE>"; } elseif ($default) { $img = $this->GetDefaultImage(); } if($img) { if($element->attributes["_thumbnail"]) { $url = $img->parsetag("thumb_url"); } else $url = $img->parsetag("image_url"); } else { $url = $element->attributes["_defaulturl"]; } if($element->attributes["_imagetag"]) { if(strlen($url)) { $ret = "<IMG src=\"$url\" $extra_attribs >"; } else $ret = ""; } else $ret = $url; break; case "custom": /* @field:cat.custom @description:Returns a custom field @attrib:_customfield::field name to return @attrib:_default::default value */ $field = $element->attributes["_customfield"]; $default = $element->attributes[" "]; $ret = $this->GetPersistantVariable($field); if(!strlen($ret)) $ret = $this->GetCustomFieldValue($field,$default); break; default: $ret = "Undefined:".$element->name; break; } } else { $ret = $this->parsetag($element->name); } return $ret; } function parsetag($tag) { global $m_var_list_update, $var_list_update, $var_list, $objConfig; if(is_object($tag)) { $tagname = $tag->name; } else $tagname = $tag; switch($tagname) { case "user_id": return $this->Get("ResourceId"); break; case "user_login": return $this->Get("Login"); break; case "user_group": return $this->Get("PrimaryGroupName"); break; case "user_firstname": return $this->Get("FirstName"); break; case "user_lastname": return $this->Get("LastName"); break; case "user_email": return $this->Get("Email"); break; case "user_date": return LangDate($this->Get("CreatedOn")); break; case "user_time": return LangTime($this->Get("CreatedOn")); break; case "user_dob": return LangDate($this->Get("dob")); break; case "user_password": return $this->Get("Password"); break; case "user_phone": return $this->Get("Phone"); break; case "user_street": return $this->Get("Street"); break; case "user_city": return $this->Get("City"); break; case "user_state": return $this->Get("State"); break; case "user_zip": return $this->Get("Zip"); break; case "user_country": return $this->Get("Country"); break; case "user_resourceid": return $this->Get("ResourceId"); break; case "user_icon": return $this->GetIcon(); break; case "user_profile_link": $var_list_update["t"] = "user_profile"; $m_var_list_update["action"] = $this->Get("UserId"); $ret = HREF_Wrapper(); unset($m_var_list_update["action"], $var_list_update["t"]); return $ret; break; case "user_messages": return $this->NewMessages(); break; case "user_messages_link": $var_list_update["t"] = "inbulletin/bb_private_msg_list"; return HREF_Wrapper(); unset($var_list_update); break; default: return "Undefined:$tagname"; break; } } } /* class clsPortalUser*/ class clsUserManager extends clsItemList //clsItemCollection { /*this class wraps common user-related functions */ // var $Page; function clsUserManager() { $this->clsItemCollection(); // clsItemList() // need to use this, but double limit clause being created (normal+default 0,100) $this->classname = "clsPortalUser"; $this->SetTable('live', GetTablePrefix().'PortalUser'); $this->Page = isset($_GET['lpn']) ? $_GET['lpn'] : 1; $this->EnablePaging = true; $this->PerPageVar = "Perpage_User"; $this->AdminSearchFields = array("Login","FirstName","LastName","Email","Street","City", "State","Zip","Country","Phone"); } function GetPageLinkList($dest_template=NULL,$link_template=NULL,$page = "") { global $objConfig, $m_var_list_update, $var_list_update, $var_list; // if(!strlen($page)) $page = GetIndexURL(2); $NumPages = $this->GetNumPages($objConfig->Get("Perpage_Topics")); if(strlen($dest_template)>0) { $var_list_update["t"]=$dest_template; } else { $var_list_update["t"] = $var_list["t"]; } $o = ""; if($this->Page>1) { $m_var_list_update["p"]=$this->Page-1; $prev_url = HREF_Wrapper(); } if($this->Page<$NumPages) { $m_var_list_update["p"]=$this->Page+1; $next_url = HREF_Wrapper(); } for($p=1;$p<=$NumPages;$p++) { $t = template($link_template); if($p!=$this->Page) { $m_var_list_update["p"]=$p; $href = HREF_Wrapper(); $t = str_replace("<%page_link%>", $href, $t); $t = str_replace("<%page_number%>",$p,$t); $t = str_replace("<%prev_url%>",$prev_url,$t); $t = str_replace("<%next_url%>",$next_url,$t); $o .= $t; } else { $o .= "<SPAN class=\"CURRENT_PAGE\">$p</SPAN>"; } } return $o; } function GetUser($ID) { $u = $this->GetItem($ID); return $u; } function GetUserName($Id) { $rs = $this->adodbConnection->Execute("SELECT Login from ".$this->SourceTable." where PortalUserId=$Id"); return $rs->fields["Login"]; } function GetUserId($Login) { $rs = $this->adodbConnection->Execute("SELECT PortalUserId from ".$this->SourceTable." where Login LIKE '$Login'"); return $rs->fields["PortalUserId"]; } function GetTotalUsers() { return $this->UserCount("1"); } function GetLatestUser() { global $Errors; $sql = "SELECT max(CreatedOn) as LastDate FROM ".$this->SourceTable; $result = $this->adodbConnection->Execute($sql); if ($result === false || !is_object($result)) { $Errors->AddError("error.DatabaseError",NULL,$adodbConnection->ErrorMsg(),"",get_class($this),"GetLatestUser"); return false; } $sql = "SELECT PortalUserId FROM ".$this->SourceTable." WHERE CreatedOn >= ".$result->fields["LastDate"]; $result = $this->adodbConnection->Execute($sql); if (!rs || $rs->EOF) { $Errors->AddError("error.DatabaseError",NULL,$adodbConnection->ErrorMsg(),"",get_class($this),"GetLatestUser"); return false; } $u = $this->GetUser($result->fields["PortalUserId"]); return $u; } function &Add_User($Login, $Password, $Email, $CreatedOn, $FirstName="", $LastName="", $Status=2, $Phone="", $Street="", $City="", $State="", $Zip="", $Country="", $dob=0, $ip="", $CheckBanned=FALSE) { $u = new clsPortalUser(NULL); $u->tablename = $this->SourceTable; //echo "Creating User..<br>\n"; $u->Set(array("Login", "Password", "FirstName", "LastName", "Email", "Status", "Phone","Street", "City", "State", "Zip", "Country", "CreatedOn","dob"), array($Login, $Password, $FirstName, $LastName, $Email, $Status, $Phone, $Street, $City, $State, $Zip, $Country, $CreatedOn, $dob)); $BrokenRule = $CheckBanned ? $u->CheckBanned() : false; if(!$BrokenRule) { $u->Create(); return $u; } return $BrokenRule; /*md5($Password)*/ } function &Add_User_NEW($fields_hash, $check_banned = false) { $user = new clsPortalUser(NULL); $user->tablename = $this->SourceTable; foreach ($fields_hash as $field_name => $field_value) { $user->Set($field_name, $field_value); } $broken_rule = $check_banned ? $user->CheckBanned() : false; if (!$BrokenRule) { $user->Create(); return $user; } return $BrokenRule; } function &Edit_User_NEW($id, $fields_hash) { $user =& $this->GetItem($id); if (!is_object($user)) { return $user; } $fields_hash['IsBanned'] = $user->Get('IsBanned'); if ($fields_hash['Status'] == 1) { $fields_hash['IsBanned'] = 0; } - if (getArrayValue($fields_hash['Password'])) { - $user->Set('Password', $fields_hash['Password']); + if (isset($fields_hash['Password']) && !$fields_hash['Password']) { unset($fields_hash['Password']); } foreach ($fields_hash as $field_name => $field_value) { $user->Set($field_name, $field_value); } $user->Update(); return $user; } function &Edit_User($UserId, $Login, $Password, $Email, $CreatedOn, $FirstName="", $LastName="", $Status=2, $Phone="", $Street="", $City="", $State="", $Zip="", $Country="", $dob=0, $MinPwResetDelay=300) { //echo "<font color=\"red\">Editing User: [$UserId]</font><br>"; $u =& $this->GetItem($UserId); if(!$CreatedOn) $CreatedOn = $u->Get("CreatedOn"); // $u->debuglevel=1; if (is_object($u)) { $IsBanned = $u->Get('IsBanned'); if($Status == 1) $IsBanned = 0; $u->Set(array("Login", "FirstName", "LastName", "Email", "Status", "Phone", "Street", "City", "State", "Zip", "Country", "CreatedOn","dob","IsBanned", "MinPwResetDelay"), array($Login, $FirstName, $LastName, $Email, $Status, $Phone, $Street, $City, $State, $Zip, $Country, $CreatedOn,$dob,$IsBanned,$MinPwResetDelay)); if(strlen($Password)) $u->Set("Password",$Password); $u->Update(); } return $u; } function Delete_User($UserId) { $u = $this->GetItemByField("ResourceId",$UserId); if(is_object($u)) { $u->RemoveFromAllGroups(); $u->Delete(); } } function LoadUsers($where = "",$orderBy = "") { global $objConfig; $this->Clear(); if($this->Page<1) $this->Page=1; if(is_numeric($objConfig->Get("Perpage_Users"))) { $Start = ($this->Page-1)*$objConfig->Get("Perpage_Users"); $limit = "LIMIT ".$Start.",".$objConfig->Get("Perpage_Users"); } else $limit = NULL; $where = trim($where); $orderBy = trim($orderBy); if(!strlen($where)) $where = "1"; $this->QueryItemCount=TableCount($this->SourceTable,$where,0); if($this->QueryItemCount>0) { if ($orderBy!="") { $this->Query_PortalUser($where,$orderBy,$limit); } else { $this->Query_PortalUser($where,"Login DESC",$limit); } } } function Query_PortalUser($whereClause,$orderByClause="", $limitClause="") { global $m_var_list,$Errors, $objSession; $resultSet = array(); $utable = $this->SourceTable; $gtable = GetTablePrefix()."UserGroup"; $sql = "SELECT * FROM $utable LEFT JOIN $gtable ON ($utable.PortalUserId=$gtable.PortalUserId)"; if(isset($whereClause)) $sql = sprintf('%s WHERE %s',$sql,$whereClause); if(isset($orderByClause)) if(strlen(trim($orderByClause))>0) $sql = sprintf('%s ORDER BY %s',$sql,$orderByClause); if(isset($limitClause)) $sql = sprintf('%s %s',$sql,$limitClause); return $this->Query_Item($sql); } function Query_GroupPortalUser($whereClause,$orderByClause) { global $m_var_list,$objSession,$Errors; $resultSet = array(); $table = $this->SourceTable; $sql = "SELECT * FROM $table LEFT JOIN ".GetTablePrefix()."UserGroup USING (PortalUserId) "; if(isset($whereClause)) $sql = sprintf('%s WHERE %s',$sql,$whereClause); if(isset($orderByClause)) $sql = sprintf('%s ORDER BY %s',$sql,$orderByClause); return $this->query_item($sql); } function UserCount($whereClause) { $count = TableCount($this->SourceTable,$whereClause,0); return $count; } function CountActive() { return $this->UserCount("Status=1"); } function CountPending() { return $this->UserCount("Status=2"); } function CountDisabled() { return $this->UserCount("Status=0"); } function CopyFromEditTable($idfield) { global $objSession; $GLOBALS['_CopyFromEditTable']=1; $edit_table = $objSession->GetEditTable($this->SourceTable); $sql = "SELECT * FROM $edit_table"; $rs = $this->adodbConnection->Execute($sql); + $user_dummy =& $this->Application->recallObject('u.-item', null, Array('skip_autoload' => true)); - //echo $sql."<BR>"; $item_ids = Array(); - while($rs && !$rs->EOF) - { + while ($rs && !$rs->EOF) { $data = $rs->fields; $c = new $this->classname; $c->SetFromArray($data); $c->idfield = $idfield; $c->Dirty(); - if($c->Get($idfield)<1) - { - $old_id = $c->Get($idfield); - $c->UnsetIdField(); - $c->Create(); - $sql = "UPDATE ".GetTablePrefix()."UserGroup SET PortalUserId=".$c->Get("PortalUserId"); - $sql .=" WHERE PortalUserId=0"; - $this->adodbConnection->Execute($sql); + $user_dummy->SetDBFieldsFromHash($data); + + if ($c->Get($idfield) < 1) { + $old_id = $c->Get($idfield); + $c->UnsetIdField(); + $c->Create(); + $sql = "UPDATE ".GetTablePrefix()."UserGroup SET PortalUserId=".$c->Get("PortalUserId"); + $sql .=" WHERE PortalUserId=0"; + $this->adodbConnection->Execute($sql); + $event_name = 'OnAfterItemCreate'; } - else - { - $c->Update(); + else { + $c->Update(); + $event_name = 'OnAfterItemUpdate'; } + $user_dummy->setID($c->UniqueId()); + + // process after hooks: begin + $event = new kEvent('u.-item:'.$event_name); + $event->setEventParam('id', $user_dummy->GetID() ); + $this->Application->HandleEvent($event); + // process after hooks: end + $item_ids[] = $c->UniqueId(); unset($c); $rs->MoveNext(); } @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); unset($GLOBALS['_CopyFromEditTable']); return $item_ids; } function PurgeEditTable() { parent::PurgeEditTable(); $sql = "DELETE FROM ".GetTablePrefix()."UserGroup WHERE PortalUserId=0"; $this->adodbConnection->Execute($sql); } } /*clsUserManager*/ ?> Property changes on: trunk/kernel/include/portaluser.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.32 \ No newline at end of property +1.33 \ No newline at end of property Index: trunk/kernel/include/itemdb.php =================================================================== --- trunk/kernel/include/itemdb.php (revision 3906) +++ trunk/kernel/include/itemdb.php (revision 3907) @@ -1,640 +1,684 @@ <?php define('FT_OPTION', 1); // option formatter class clsItemDB { - var $Formatters = Array(); // by Alex - var $m_dirtyFieldsMap = array(); - var $Data = array(); - var $adodbConnection; - var $tablename; - var $BasePermission; - var $id_field; - var $NoResourceId; - var $debuglevel; - - var $SelectSQL = 'SELECT * FROM %s WHERE %s'; + var $Formatters = Array(); // by Alex + var $m_dirtyFieldsMap = array(); + var $Data = array(); + var $adodbConnection; + var $tablename; + var $BasePermission; + var $id_field; + var $NoResourceId; + var $debuglevel; + + var $SelectSQL = 'SELECT * FROM %s WHERE %s'; + + /** + * Application object + * + * @var kApplication + */ + var $Application = null; + + /** + * Connection to database + * + * @var kDBConnection + */ + var $Conn = null; function clsItemDB() { - $this->adodbConnection = &GetADODBConnection(); - $this->tablename=""; - $this->NoResourceId=0; - $this->debuglevel=0; + if (class_exists('kApplication')) { + // just in case when aplication is not found + $this->Application =& kApplication::Instance(); + $this->Conn =& $this->Application->GetADODBConnection(); + } + + $this->adodbConnection = &GetADODBConnection(); + $this->tablename=""; + $this->NoResourceId=0; + $this->debuglevel=0; } // ============================================================================================ function GetFormatter($field) { return $this->HasFormatter($field) ? $this->Formatters[$field] : false; } function isLiveTable() { global $objSession; return !preg_match('/'.GetTablePrefix().'ses_'.$objSession->GetSessionKey().'_edit_(.*)/', $this->tablename); } function SetFormatter($field, $type, $params) { // by Alex // all params after 2nd are formmater type specific $this->Formatters[$field]['type'] = $type; switch($type) { case FT_OPTION: $this->Formatters[$field]['options'] = $params; break; } } /* function FormatFields() { // format item in list data before printing foreach($this->Formatters as $field => $formatter) $this->Data[$field] = $this->FormatField($field); } */ function FormatField($field) { // formats single field if it has formatter if( $this->HasFormatter($field) ) { $fmt = $this->Formatters[$field]; switch($fmt['type']) { case FT_OPTION: return $fmt['options'][ $this->Data[$field] ]; break; } } else return $this->Get($field); } function HasFormatter($field) { // checks if formatter is set for field return isset($this->Formatters[$field]) ? 1 : 0; } // ============================================================================================ function UnsetIdField() { $f = $this->IdField(); unset($this->Data[$f]); unset($this->m_dirtyFieldsMap[$f]); } function UnsetField($field) { unset($this->Data[$field]); unset($this->m_dirtyFieldsMap[$field]); } function IdField() { if(!strlen($this->id_field)) { return $this->tablename."Id"; } else return $this->id_field; } function UniqueId() { return $this->Get($this->IdField()); } function SetUniqueId($value) { $var = $this->IdField(); if( $this->UsingTempTable() ) $value = $this->UniqueId(); $this->Set($var, $value); } function SetModified($UserId=NULL,$modificationDate=null) { global $objSession; $keys = array_keys($this->Data); if(in_array("Modified",$keys)) { $this->Set("Modified", isset($modificationDate) ? $modificationDate : adodb_date("U") ); } if(in_array("ModifiedById",$keys)) { if(!$UserId) $UserId = $objSession->Get("PortalUserId"); $this->Set("ModifiedById",$UserId); } } function PrintVars() { echo '<pre>'.print_r($this->Data, true).'</pre>'; } // ================================================================= function GetFormatted($name) { // get formatted field value return $this->FormatField($name); } function Get($name) { // get un-formatted field value //if( !isset($this->Data[$name]) ) print_pre( debug_backtrace() ); return $this->HasField($name) ? $this->Data[$name] : ''; } // ================================================================= function HasField($name) { // checks if field exists in item return isset($this->Data[$name]) ? 1 : 0; } /** * Set's value(-s) of field(-s) specified. * Modifies HasChanges flag automatically. * * @param string/array $name * @param string/array $value * @access public */ function Set($name, $value) { //echo "Setting Field <b>$name</b>: = [$value]<br>"; if( is_array($name) ) { for ($i=0; $i < sizeof($name); $i++) { $this->_Set($name[$i],$value[$i]); } } else { $this->_Set($name,$value); } } /** * Set's value(-s) of field(-s) specified. * Modifies HasChanges flag automatically. * * @param string $name * @param string $value * @access private */ function _Set($name,$value) { $var = 'm_'.$name; if( !$this->HasField($name) || $this->Data[$name] != $value ) { if( !(isset($_GET['new']) && $_GET['new']) ) { $this->DetectChanges($name, $value); } $this->Data[$name] = $value; $this->m_dirtyFieldsMap[$name] = $value; } } function Dirty($list=NULL) { if($list==NULL) { foreach($this->Data as $field => $value) { $this->m_dirtyFieldsMap[$field] = $value; } } else { foreach($list as $field) { $this->m_dirtyFieldsMap[$field] = $this->Data[$field]; } } } function Clean($list=NULL) { if($list == NULL) { unset($this->m_dirtyFieldsMap); $this->m_dirtyFieldsMap=array(); } else { foreach($list as $value) { $varname = "m_" . $value; unset($this->m_dirtyFieldsMap[$value]); } } } function SetDebugLevel($value) { $this->debuglevel = $value; } function SetFromArray($data, $dirty = false) { if(is_array($data)) { $this->Data = $data; if($dirty) $this->m_dirtyFieldsMap = $data; } } function GetData() { return $this->Data; } function SetData($data, $dirty = false) { $this->SetFromArray($data, $dirty); } function Delete() { global $Errors; if($this->Get($this->IdField())==0) { $Errors->AddError("error.AppError",NULL,'Internal error: Delete requires set id',"",get_class($this),"Delete"); return false; } $sql = sprintf('DELETE FROM %s WHERE %s = %s', $this->tablename, $this->IdField(), $this->UniqueId()); if($this->debuglevel>0) echo $sql."<br>"; if ($this->adodbConnection->Execute($sql) === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Delete"); return false; } return true; } function Update($UpdatedBy=NULL,$modificationDate = null) { global $Errors, $objSession; + if( !$this->raiseEvent('OnBeforeItemUpdate') ) return false; + if( count($this->m_dirtyFieldsMap) == 0 ) return true; $this->SetModified($UpdatedBy, $modificationDate); $sql = 'UPDATE '.$this->tablename .' SET '; foreach ($this->m_dirtyFieldsMap as $key => $value) { if(!is_numeric($key) && $key != $this->IdField() && $key!='ResourceId') { if( is_null($value) ) { $value = 'NULL'; } else { $value = $this->adodbConnection->qstr( isset($GLOBALS['_CopyFromEditTable']) ? $value : stripslashes($value) ); } $sql .= '`'.$key.'` = '.$value.', '; } } $sql = preg_replace('/(.*), $/','\\1',$sql); $sql .= ' WHERE '.$this->IdField().' = '.$this->adodbConnection->qstr( $this->UniqueId() ); if( $this->debuglevel > 0 ) echo $sql.'<br>'; if( $this->adodbConnection->Execute($sql) === false ) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Update"); return false; } if( $objSession->GetVariable('HasChanges') == 2 ) $objSession->SetVariable('HasChanges', 1); + + $this->raiseEvent('OnAfterItemUpdate'); + return true; } function ReplaceID($new_id) { // replace item's id, because Update method // is too dummy to do this autommatically // USED in temporary table editing stuff $db =& $this->adodbConnection; $sql = "UPDATE %1\$s SET `%2\$s` = %3\$s WHERE `%2\$s` = %4\$s"; $sql = sprintf($sql, $this->tablename, $this->IdField(), $new_id, (int)$this->UniqueId() ); if($this->debuglevel > 0) echo $sql.'<br>'; $db->Execute($sql); } function CreateSQL() { global $Errors; $sql = "INSERT IGNORE INTO ".$this->tablename." ("; $first = 1; foreach ($this->Data as $key => $value) { if($first) { $sql = sprintf("%s %s",$sql,$key); $first = 0; } else { $sql = sprintf("%s, %s",$sql,$key); } } $sql = sprintf('%s ) VALUES (',$sql); $first = 1; foreach ($this->Data as $key => $value) { if( is_array($value) ) { global $debugger; $debugger->dumpVars($value); $debugger->appendTrace(); trigger_error('Value of array type not allowed in method <b>CreateSQL</b> of <b>clsItemDB</b> class', E_USER_ERROR); } if($first) { if(isset($GLOBALS['_CopyFromEditTable'])) $sql = sprintf("%s %s",$sql,$this->adodbConnection->qstr(($value))); else $sql = sprintf("%s %s",$sql,$this->adodbConnection->qstr(stripslashes($value))); $first = 0; } else { if(isset($GLOBALS['_CopyFromEditTable'])) $sql = sprintf("%s, %s",$sql,$this->adodbConnection->qstr(($value))); else $sql = sprintf("%s, %s",$sql,$this->adodbConnection->qstr(stripslashes($value))); } } $sql = sprintf('%s)',$sql); return $sql; } /** * Set's HasChanges flag based on new field * with $name with value $value. * * @param string $name * @param string $value * @access private */ function DetectChanges($name, $value) { global $objSession; if( !is_object($objSession) ) return false; //echo "<b>class: ".get_class($this)."</b><br>"; if (!isset($this->Data[$name]) ) return false; if ( getArrayValue($this->Data, $name) != $value && $value != '') { //echo "$name Modified tt ".$this->Data[$name]." tt $value<br>"; if ($objSession->GetVariable("HasChanges") != 1) { $objSession->SetVariable("HasChanges", 2); } } } function Create() { global $Errors, $objSession; - + + if( !$this->raiseEvent('OnBeforeItemCreate') ) return false; + if($this->debuglevel) echo "Creating Item: ".get_class($this)."<br>"; if($this->NoResourceId!=1 && (int)$this->Get("ResourceId")==0) { $this->Set("ResourceId", GetNextResourceId()); } $sql = $this->CreateSql(); if($this->debuglevel>0) echo $sql."<br>\n"; if ($this->adodbConnection->Execute($sql) === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Create"); return false; } $this->SetUniqueId($this->adodbConnection->Insert_ID()); if ($objSession->GetVariable("HasChanges") == 2) { $objSession->SetVariable("HasChanges", 1); } /*if ($this->adodbConnection->Affected_Rows() > 0) { $objSession->SetVariable("HasChanges", 1); } */ + $this->raiseEvent('OnAfterItemCreate'); + return true; } function Increment($field, $calculate_hot = false) { global $Errors; if ($calculate_hot) { $sql = "SELECT $field FROM ".$this->tablename." WHERE ".$this->IdField()." = ".$this->UniqueId(); $rs = $this->adodbConnection->Execute($sql); $sql = "SELECT MAX($field) AS max_value FROM ".$this->tablename." WHERE ROUND($field) = ".round($rs->fields[$field]); $rs = $this->adodbConnection->Execute($sql); //echo "MAX VALUE: ".$rs->fields['max_value']."<br>"; //echo "MAX SQL: $sql<br>"; $new_val = $rs->fields['max_value'] + 1; $sql = "SELECT count($field) AS count FROM ".$this->tablename." WHERE $field = $new_val"; $rsc = $this->adodbConnection->Execute($sql); while ($rsc->fields['count'] != 0) { $sql = "SELECT count($field) AS count FROM ".$this->tablename." WHERE $field = $new_val"; $rsc = $this->adodbConnection->Execute($sql); //echo "New Value:$new_val<br>"; if ($rsc->fields['count'] > 0) { $new_val = $new_val + 0.000001; } } $sql = "Update ".$this->tablename." set $field=$new_val where ".$this->IdField()."=" . $this->UniqueId(); } else { $sql = "Update ".$this->tablename." set $field=$field+1 where ".$this->IdField()."=" . $this->UniqueId(); } if($this->debuglevel>0) echo $sql."<br>"; $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Increment"); return false; } if ($calculate_hot) { $this->Set($field,$new_val); } else { $this->Set($field, $this->Get($field) + 1); } } function Decrement($field) { global $Errors; $sql = "Update ".$this->tablename." set $field=$field-1 where ".$this->IdField()."=" .(int)$this->UniqueId(); if($this->debuglevel>0) echo $sql; $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Decrement"); return false; } $this->Set($field,$this->Get($field)-1); } function GetFieldList($UseLoadedData=FALSE) { if(count($this->Data) && $UseLoadedData==TRUE) { $res = array_keys($this->Data); } else { $res = $this->adodbConnection->MetaColumnNames($this->tablename); } return $res; } function UsingTempTable() { global $objSession; $temp = $objSession->GetEditTable($this->tablename); $p = GetTablePrefix()."ses"; $t = substr($temp,0,strlen($p)); $ThisTable = substr($this->tablename,0,strlen($p)); if($t==$ThisTable) { return TRUE; } else return FALSE; } function LoadFromDatabase($Id, $IdField = null) // custom IdField by Alex { global $objSession,$Errors; if(!isset($Id)) { $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); return false; } // --------- multiple ids allowed: begin ----------------- $id_field = isset($IdField) ? $IdField : $this->IdField(); if( !is_array($id_field) ) $id_field = Array($id_field); if( !is_array($Id) ) $Id = Array($Id); $i = 0; $id_count = count($id_field); $conditions = Array(); while($i < $id_count) { $conditions[] = "(`".$id_field[$i]."` = '".$Id[$i]."')"; $i++; } $sql = sprintf($this->SelectSQL, $this->tablename, implode(' AND ', $conditions) ); // --------- multiple ids allowed: end -------------------- if($this->debuglevel) echo "Load SQL: $sql<br>"; $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($this->debuglevel) print_pre($data); if(is_array($data)) $this->SetFromArray($data); $this->Clean(); return TRUE; } function FieldExists($field) { $res = array_key_exists($field,$this->Data); return $res; } function ValueExists($Field,$Value) { $sql = "SELECT $Field FROM ".$this->tablename." WHERE $Field='$Value'"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { return TRUE; } else return FALSE; } function FieldMax($Field) { $sql = "SELECT Max($Field) as m FROM ".$this->tablename; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $ret = $rs->fields["m"]; } else $ret = 0; } function FieldMin($Field) { $sql = "SELECT Min($Field) as m FROM ".$this->tablename; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $ret = $rs->fields["m"]; } else $ret = 0; } function TableExists($table = null) { // checks if table specified in item exists in db $db =& GetADODBConnection(); $sql = "SHOW TABLES LIKE '%s'"; if($table == null) $table = $this->tablename; $rs = $db->Execute( sprintf($sql, $table) ); if( $rs->RecordCount() == 1 ) // table exists in normal case return 1; else // check if table exists in lowercase $rs = $db->Execute( sprintf($sql, strtolower($table) ) ); return ($rs->RecordCount() == 1) ? 1 : 0; - } + } + + function raiseEvent($name, $id = null) + { + return true; + + /*if (!getArrayValue($GLOBALS, '_CopyFromEditTable')) { + return true; + } + + if( !isset($id) ) $id = $this->GetID(); + $event = new kEvent( Array('name'=>$name,'prefix'=>$this->Prefix,'special'=>$this->Special) ); + $event->setEventParam('id', $id); + $this->Application->HandleEvent($event); + return $event->status == erSUCCESS ? true : false;*/ + } } ?> Property changes on: trunk/kernel/include/itemdb.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.33 \ No newline at end of property +1.34 \ No newline at end of property Index: trunk/kernel/units/users/users_item.php =================================================================== --- trunk/kernel/units/users/users_item.php (revision 3906) +++ trunk/kernel/units/users/users_item.php (revision 3907) @@ -1,234 +1,251 @@ <?php class UsersItem extends kDBItem { var $CustomFields = Array(); var $persistantVars = Array(); function Init($prefix, $special, $event_params = null) { parent::Init($prefix, $special, $event_params); $item_type = $this->Application->getUnitOption($this->Prefix, 'ItemType'); $sql = 'SELECT CustomFieldId, FieldName FROM '.TABLE_PREFIX.'CustomField WHERE Type = %s'; $this->CustomFields = $this->Conn->GetCol( sprintf($sql, $item_type), 'FieldName' ); } function defineFields() { parent::defineFields(); // add custom fields definitions (as virtual fields) $add_fields = Array(); $custom_field_options = Array('default' => '', 'not_null' => 1); foreach ($this->CustomFields as $custom_field => $custom_id) { $add_fields[$custom_field] = $custom_field_options; } if($add_fields) { $add_fields = array_merge_recursive2($add_fields, $this->VirtualFields); $this->setVirtualFields($add_fields); } } /** * Load custom fields values as virtual fields for dbitem * * @return bool */ function LoadCustomFields() { if (!$this->CustomFields) return false; $custom_ids = implode(',', $this->CustomFields); $sql = 'SELECT Value, CustomFieldId FROM '.TABLE_PREFIX.'CustomMetaData WHERE ResourceId = '.$this->GetDBField('ResourceId').' AND CustomFieldId IN ('.$custom_ids.')'; $custom_values = $this->Conn->GetCol($sql, 'CustomFieldId'); if (!$custom_values) return false; $custom_fields = array_flip($this->CustomFields); foreach ($custom_values as $custom_id => $custom_value) { $this->SetDBField($custom_fields[$custom_id], $custom_value); } return true; } function LoadPersistantVars() { $sql = 'SELECT VariableValue, VariableName FROM '.TABLE_PREFIX.'PersistantSessionData WHERE PortalUserId = '.$this->GetID(); $this->persistantVars = $this->Conn->GetCol($sql, 'VariableName'); } function setPersistantVar($var_name, $var_value) { $this->persistantVars[$var_name] = $var_value; $replace_hash = Array( 'PortalUserId' => $this->GetID(), 'VariableName' => $var_name, 'VariableValue' => $var_value ); $this->Conn->doInsert($replace_hash, TABLE_PREFIX.'PersistantSessionData', 'REPLACE'); } function getPersistantVar($var_name) { return getArrayValue($this->persistantVars, $var_name); } function UpdateCustomFields() { $data_table = TABLE_PREFIX.'CustomMetaData'; // get values already written, to find their ids $sql = 'SELECT CustomDataId, CustomFieldId FROM '.$data_table.' WHERE ResourceId = '.$this->GetDBField('ResourceId'); $custom_value_ids = $this->Conn->GetCol($sql, 'CustomFieldId'); $sql = 'REPLACE INTO '.$data_table.'(CustomDataId,ResourceId,CustomFieldId,Value) VALUES (%1$s,%2$s,%3$s,%4$s)'; foreach ($this->CustomFields as $custom_field => $custom_id) { $data_id = isset($custom_value_ids[$custom_id]) ? $custom_value_ids[$custom_id] : 0; $custom_value = $this->GetDBField($custom_field); if (!$custom_value && $data_id) { $temp_sql = 'DELETE FROM '.$data_table.' WHERE CustomDataId = '.$data_id; $this->Conn->Query($temp_sql); } elseif($custom_value) { $temp_sql = sprintf($sql, $data_id, $this->GetDBField('ResourceId'), $custom_id, $this->Conn->qstr( $this->GetDBField($custom_field) ) ); $this->Conn->Query($temp_sql); } } } function Load($id, $id_field_name = null) { $ret = parent::Load($id, $id_field_name); if($ret) { $this->LoadCustomFields(); $this->LoadPersistantVars(); } return $ret; } /** * Returns IDs of groups to which user belongs and membership is not expired * * @return Array * @access public */ function getMembershipGroups($force_reload = false) { $user_groups = $this->Application->RecallVar('UserGroups'); if($user_groups === false || $force_reload) { $sql = 'SELECT GroupId FROM %s WHERE (PortalUserId = %s) AND ( (MembershipExpires IS NULL) OR ( MembershipExpires >= UNIX_TIMESTAMP() ) )'; $sql = sprintf($sql, TABLE_PREFIX.'UserGroup', $this->GetID() ); return $this->Conn->GetCol($sql); } else { return explode(',', $user_groups); } } /** * Set's Login from Email if required by configuration settings * */ function setLogin() { if( $this->Application->ConfigValue('Email_As_Login') ) { $this->SetDBField('Login', $this->GetDBField('Email') ); } } function SendEmailEvents() { switch( $this->GetDBField('Status') ) { case 1: $this->Application->EmailEventAdmin('USER.ADD', $this->GetID() ); $this->Application->EmailEventUser('USER.ADD', $this->GetID() ); break; case 2: $this->Application->EmailEventAdmin('USER.ADD.PENDING', $this->GetID() ); $this->Application->EmailEventUser('USER.ADD.PENDING', $this->GetID() ); break; } } function isSubscriberOnly() { $subscribers_group_id = $this->Application->ConfigValue('User_SubscriberGroup'); $sql = 'SELECT PortalUserId FROM '.TABLE_PREFIX.'UserGroup WHERE GroupId = '.$subscribers_group_id.' AND PortalUserId = '.$this->GetDBField('PortalUserId').' AND PrimaryGroup = 1'; return $this->Conn->GetOne($sql) == $this->GetDBField('PortalUserId'); } function Create($force_id=false, $system_create=false) { $ret = parent::Create($force_id, $system_create); if ($ret) { $this->UpdateCustomFields(); // find out how to syncronize user only when it's copied to live table $sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('createUser', $this->FieldValues); } return $ret; } function Update($id=null, $system_update=false) { $ret = parent::Update($id, $system_update); if ($ret) { $this->UpdateCustomFields(); // find out how to syncronize user only when it's copied to live table $sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('updateUser', $this->FieldValues); } return $ret; } /** * Deletes the record from databse * * @access public * @return bool */ function Delete($id = null) { $ret = parent::Delete($id); if ($ret) { $sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('deleteUser', $this->FieldValues); } return $ret; } + function setName($full_name) + { + $full_name = explode(' ', $full_name); + + if (count($full_name) > 2) { + $last_name = array_pop($full_name); + $first_name = implode(' ', $full_name); + } + else { + $last_name = $full_name[1]; + $first_name = $full_name[0]; + } + + $this->SetDBField('FirstName', $first_name); + $this->SetDBField('LastName', $last_name); + } + } ?> \ No newline at end of file Property changes on: trunk/kernel/units/users/users_item.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.7 \ No newline at end of property +1.8 \ No newline at end of property Index: trunk/kernel/units/users/users_config.php =================================================================== --- trunk/kernel/units/users/users_config.php (revision 3906) +++ trunk/kernel/units/users/users_config.php (revision 3907) @@ -1,116 +1,119 @@ <?php $config = Array( 'Prefix' => 'u', 'ItemClass' => Array('class'=>'UsersItem','file'=>'users_item.php','build_event'=>'OnItemBuild'), 'ListClass' => Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'), 'EventHandlerClass' => Array('class'=>'UsersEventHandler','file'=>'users_event_handler.php','build_event'=>'OnBuild'), 'TagProcessorClass' => Array('class'=>'UsersTagProcessor','file'=>'users_tag_processor.php','build_event'=>'OnBuild'), 'RegisterClasses' => Array( Array('pseudo' => 'UsersSyncronizeManager', 'class' => 'UsersSyncronizeManager', 'file' => 'users_syncronize.php', 'build_event' => ''), ), 'AutoLoad' => true, 'Hooks' => Array( Array( 'Mode' => hAFTER, 'Conditional' => false, 'HookToPrefix' => 'u', 'HookToSpecial' => '', 'HookToEvent' => Array('OnAfterItemLoad', 'OnBeforeItemCreate', 'OnBeforeItemUpdate', 'OnUpdateAddress'), 'DoPrefix' => '', 'DoSpecial' => '', 'DoEvent' => 'OnPrepareStates', ), Array( 'Mode' => hBEFORE, 'Conditional' => false, 'HookToPrefix' => 'affil', 'HookToSpecial' => '', 'HookToEvent' => Array('OnCheckAffiliateAgreement'), 'DoPrefix' => '', 'DoSpecial' => '', 'DoEvent' => 'OnSubstituteSubscriber', ), ), 'QueryString' => Array( 1 => 'id', 2 => 'page', 3 => 'event', ), 'RegularEvents' => Array( 'membership_expiration' => Array('EventName' => 'OnCheckExpiredMembership', 'RunInterval' => 1800, 'Type' => reAFTER), ), 'IDField' => 'PortalUserId', 'ItemType' => 6, // used for custom fields only (on user's case) 'TableName' => TABLE_PREFIX.'PortalUser', 'ListSQLs' => Array( ''=>'SELECT * FROM %s', ), // key - special, value - list select sql 'ItemSQLs' => Array( ''=>'SELECT * FROM %s', ), 'ListSortings' => Array( '' => Array( 'Sorting' => Array('Login' => 'asc'), ) ), 'SubItems' => Array('addr'), 'Fields' => Array ( 'PortalUserId' => Array(), 'Login' => Array('type' => 'string', 'unique'=>Array('Login'), 'default' => '','required'=>1, 'error_msgs' => Array('unique'=>'!lu_user_already_exist!')), 'Password' => Array('type' => 'string', 'formatter' => 'kPasswordFormatter', 'encryption_method' => 'md5', 'verify_field' => 'VerifyPassword', 'skip_empty' => 1, 'default' => md5('') ), 'FirstName' => Array('type' => 'string','default' => ''), 'LastName' => Array('type' => 'string','default' => ''), + 'Company' => Array('type' => 'string','not_null' => '1','default' => ''), 'Email' => Array('type' => 'string', 'formatter'=>'kFormatter', 'regexp'=>'/^[_a-zA-Z0-9-\.]+@[a-zA-Z0-9-\.]+\.[a-z]{2,4}$/', 'unique'=>Array('Email'), 'not_null' => '1', 'required'=>1, 'default' => '', 'error_msgs' => Array('invalid_format'=>'!la_invalid_email!', 'unique'=>'!lu_email_already_exist!') ), 'CreatedOn' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'default' => '#NOW#', 'not_null' => '1' ), 'Phone' => Array('type' => 'string','default' => ''), + 'Fax' => Array('type' => 'string','not_null' => '1','default' => ''), 'Street' => Array('type' => 'string','default' => ''), + 'Street2' => Array('type' => 'string', 'not_null' => '1', 'default' => ''), 'City' => Array('type' => 'string','default' => ''), 'State' => Array('formatter'=>'kOptionsFormatter', 'options' => Array(), 'option_key_field'=>'DestAbbr','option_title_field'=>'Translation', 'not_null' => '1','default' => ''), 'Zip' => Array('type' => 'string','default' => ''), 'Country' => Array('formatter'=>'kOptionsFormatter', 'options_sql'=>'SELECT %1$s FROM '.TABLE_PREFIX.'StdDestinations LEFT JOIN '.TABLE_PREFIX.'Phrase ON '.TABLE_PREFIX.'Phrase.Phrase = '.TABLE_PREFIX.'StdDestinations.DestName WHERE DestType=1 AND LanguageId = %2$s ORDER BY Translation', 'option_key_field'=>'DestAbbr','option_title_field'=>'Translation', 'not_null' => '1','default' => ''), 'ResourceId' => Array('type' => 'int','not_null' => '1','default' => '0'), 'Status' => Array('type' => 'int', 'formatter'=>'kOptionsFormatter', 'options'=>Array(1=>'la_Enabled', 0=>'la_Disabled', 2=>'la_Pending'), 'use_phrases'=>1, 'not_null' => '1','default' => 2), 'Modified' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'not_null' => '1', 'default' => '#NOW#' ), 'dob' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'not_null' => '1', 'default' => '', 'required'=>1), 'tz' => Array('type' => 'int','default' => ''), 'ip' => Array('type' => 'string','default' => ''), 'IsBanned' => Array('type' => 'int','not_null' => '1','default' => '0'), 'PassResetTime' => Array('type' => 'int','default' => ''), 'PwResetConfirm' => Array('type' => 'string','default' => ''), 'PwRequestTime' => Array('type' => 'int','default' => ''), 'MinPwResetDelay' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array('300' => '5', '600' => '10', '900' => '15', '1800' => '30', '3600' => '60'), 'use_phrases' => 0, 'not_null' => '1', 'default' => 30), ), 'VirtualFields' => Array( 'ValidateLogin' => Array('type'=>'string','default'=>''), 'SubscribeEmail' => Array('type'=>'string','default'=>''), ), 'Grids' => Array(), ); ?> \ No newline at end of file Property changes on: trunk/kernel/units/users/users_config.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.11 \ No newline at end of property +1.12 \ No newline at end of property Index: trunk/admin/include/mainscript.php =================================================================== --- trunk/admin/include/mainscript.php (revision 3906) +++ trunk/admin/include/mainscript.php (revision 3907) @@ -1,574 +1,581 @@ <?php global $imagesURL,$objConfig,$adminURL,$rootURL, $en; $group_select = $adminURL."/users/group_select.php"; $item_select = $adminURL."/relation_select.php"; $user_select = $adminURL."/users/user_select.php"; $cat_select = $adminURL."/cat_select.php"; $missing_edit = $adminURL."/config/missing_label_search.php"; $lang_Filter = language("la_Text_Filter"); $lang_View = language("la_Text_View"); $lang_Sort = language("la_Text_Sort"); $lang_Select = language("la_Text_Select"); $lang_Unselect = language("la_Text_Unselect"); $lang_Invert = language("la_Text_Invert"); $lang_PerPage = language("la_prompt_PerPage"); $lang_All = language("la_Text_All"); $lang_Asc = language("la_common_ascending"); $lang_Desc = language("la_common_descending"); $lang_Disabled = language("la_Text_Disabled"); $lang_Enabled = language("la_Text_Enabled"); $lang_Pending = language("la_Text_Pending"); $lang_Default = language("la_Text_Default"); $lang_CreatedOn = language("la_prompt_CreatedOn"); $lang_None = language("la_Text_None"); $lang_PerPage = language("la_prompt_PerPage"); $lang_Views = language("la_Text_Views"); $lang_URL = language("la_ColHeader_Url"); $lang_Status = language("la_prompt_Status"); $lang_Name = language("la_prompt_Name"); $lang_MoveDn = language("la_prompt_MoveDown"); $lang_MoveUp = language("la_prompt_MoveUp"); $lang_Delete = language("la_prompt_Delete"); $lang_Edit = language("la_prompt_Edit"); $errormsg = language("la_validation_AlertMsg"); $env2 = BuildEnv(); if(is_numeric($en)) { $env2 = BuildEnv() . "&en=$en"; } $editor_url = $adminURL."/editor/editor.php?env=$env2"; $email_url = $adminURL."/email/sendmail.php?env=$env2"; $phrase_edit = $adminURL."/config/edit_label.php?env=".$env2; $submit_done = isset($_REQUEST['submit_done']) ? 1 : 0; // returns form submit status $Cal = GetDateFormat(); if(strpos($Cal,"y")) { $Cal = str_replace("y","yy",$Cal); } else $Cal = str_replace("Y","y",$Cal); $Cal = str_replace("m","mm",$Cal); $Cal = str_replace("n","m",$Cal); $Cal = str_replace("d","dd",$Cal); $format = GetStdFormat(GetDateFormat()); $yearpos = (int)DateFieldOrder($format,"year"); $monthpos = (int)DateFieldOrder($format,"month"); $daypos = (int)DateFieldOrder($format,"day"); $ampm = is12HourMode() ? 'true' : 'false'; +$processable_formats = Array('m/d/y', 'm/d/Y'); + +$skip_date_validation = in_array(GetDateFormat(), $processable_formats) ? 'false' : 'true'; $SiteName = addslashes( strip_tags( $GLOBALS['objConfig']->Get('Site_Name') ) ); require_once($pathtoroot.$admin."/lv/js/js_lang.php"); print <<<END <script type="text/javascript" src="$adminURL/lv/js/in-portal.js"></script> <script language="Javascript"> var main_title = '$SiteName'; var CurrentTab= new String(); var \$Menus = new Array(); if(!\$fw_menus) var \$fw_menus = new Array(); var lang_Filter = "$lang_Filter"; var lang_Sort = "$lang_Sort"; var lang_Select = "$lang_Select"; var lang_Unselect = "$lang_Unselect"; var lang_Invert = "$lang_Invert"; var lang_PerPage = "$lang_PerPage"; var lang_All = "$lang_All"; var lang_Asc = "$lang_Asc"; var lang_Desc = "$lang_Desc"; var lang_Disabled = "$lang_Disabled"; var lang_Pending = "$lang_Pending"; var lang_Default = "$lang_Default"; var lang_CreatedOn = "$lang_CreatedOn"; var lang_View = "$lang_View"; var lang_Views = "$lang_Views"; var lang_None = "$lang_None"; var lang_PerPage = "$lang_PerPage"; var lang_Enabled = "$lang_Enabled"; var lang_URL = "$lang_URL"; var lang_Status = "$lang_Status"; var lang_Name = "$lang_Name"; var lang_Edit = "$lang_Edit"; var lang_Delete = "$lang_Delete"; var lang_MoveUp = "$lang_MoveUp"; var lang_MoveDn = "$lang_MoveDn"; var ampm = $ampm; +var skip_date_validation = $skip_date_validation; var listview_clear=1; var CalDateFormat = "$Cal"; var yearpos = $yearpos; var monthpos = $monthpos; var daypos = $daypos; var ErrorMsg = '$errormsg'; //en = $en var rootURL = '$rootURL'; function clear_list_checkboxes() { var inputs = document.getElementsByTagName("INPUT"); for (var i = 0; i < inputs.length; i++) if (inputs[i].type == "checkbox" && inputs[i].getAttribute("isSelector")) { inputs[i].checked=false; } } function getRealLeft(el) { xPos = el.offsetLeft; tempEl = el.offsetParent; while (tempEl != null) { xPos += tempEl.offsetLeft; tempEl = tempEl.offsetParent; } return xPos; } function getRealTop(el) { yPos = el.offsetTop; tempEl = el.offsetParent; while (tempEl != null) { yPos += tempEl.offsetTop; tempEl = tempEl.offsetParent; } return yPos; } function MM_preloadImages() { //v3.0 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} } function SetButtonStateByImage(btn_id, img_src) { // set state depending on image name var btn = document.getElementById(btn_id); if(btn) { if( !HasParam(img_src) ) img_src = btn.getAttribute('src'); var img_name = img_src.split('/'); img_name = img_name.length ? img_name[img_name.length - 1] : img_name; img_name = img_name.split('.'); img_name = img_name[0].split('_'); img_name = img_name.length ? img_name[img_name.length - 1] : img_name; if(img_name) { switch(img_name) { case 'f2': btn.setAttribute('ButtonState','over'); break; case 'f3': btn.setAttribute('ButtonState','disabled'); break; default: btn.setAttribute('ButtonState','enabled'); break; } } } } function swap(imgid, src, module_name){ // swaps toobar icons from kernel // admin or from module specified var ob = document.getElementById(imgid); if(ob) { SetButtonStateByImage(imgid, src); var s = src; s = s.slice(0,4); if(s=='http') { ob.src = src; } else { if(module_name == null) ob.src = '$adminURL' + '/images/' + src; else { ob.src = '$rootURL' + module_name + '/$admin/images/' + src; } } } } function flip(val) { if (val == 0) return 1; else return 0; } function config_val(field, val2,url){ //alert('Setting ' + field + ' to ' + val2); if(url) document.viewmenu.action=url; document.viewmenu.Action.value = "m_SetVariable"; document.viewmenu.fieldname.value = field; document.viewmenu.varvalue.value = val2; document.viewmenu.submit(); } function session_val(field, val2){ //alert('Setting ' + field + ' to ' + val2); document.viewmenu.Action.value = "m_SetSessionVariable"; document.viewmenu.fieldname.value = field; document.viewmenu.varvalue.value = val2; document.viewmenu.submit(); } function Submit_ListSearch(action) { f = document.getElementById('ListSearchForm'); s = document.getElementById('ListSearchWord'); if(f) { f.Action.value = action; f.list_search.value = s.value; f.submit(); } } function ValidTime(time_str) { var valid = true; if( trim(time_str) == '' ) return true; // is valid in case if not entered time_str = time_str.toUpperCase(); parts = time_str.split(/\s*[: ]\s*/); hour = parseInt(parts[0]); minute = parseInt(parts[1]); sec = parseInt(parts[2]); if(ampm == true) { amstr = parts[3]; var am_valid = (amstr == 'AM' || amstr == 'PM'); if(am_valid && hour > 12) valid = false; if(amstr == 'PM' && hour <= 12) hour = hour + 12; if(hour == 24) hour = 0; if(!am_valid) valid = false; } valid = valid && (hour > -1 && hour < 24); valid = valid && (minute > -1 && minute < 60); valid = valid && (sec > -1 && sec < 60); return valid; } function ValidCustomName(name_str) { if (trim(name_str) == '') return false; var re = new RegExp('^[a-zA-Z0-9_]{1,}$'); if (name_str.match(re)) { return true; } else { return false; } } function ValidThemeName(name_str) { if (trim(name_str) == '') return false; var re = new RegExp('^[a-zA-Z0-9-_]{1,}$'); if (name_str.match(re)) { return true; } else { return false; } } function DaysInMonth(month,year) { timeA = new Date(year, month,1); timeDifference = timeA - 86400000; timeB = new Date(timeDifference); return timeB.getDate(); } function ValidDate(date_str) { var valid = true; - + if (skip_date_validation) { + return valid; + } + if( trim(date_str) == '' ) return true; // is valid in case if not entered parts = date_str.split(/\s*\D\s*/); year = parts[yearpos-1]; month = parts[monthpos-1]; day = parts[daypos-1]; valid = (year>0); valid = valid && ((month>0) && (month<13)); valid = valid && (day<DaysInMonth(month,year)+1); return valid; } function trim(str) { return str.replace(/(^\s*)|(\s*$)/g,''); } function ValidateNumber(aValue, aNumberType) { var valid = true; if( trim(aValue) == '' ) return true; return (parseInt(aValue) == aValue); } function OpenEditor(extra_env,TargetForm,TargetField) { var url = '$editor_url'; url = url+'&TargetForm='+TargetForm+'&TargetField='+TargetField+'&destform=popup'; if(extra_env.length>0) url = url+extra_env; window.open(url,"html_edit","width=800,height=575,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no"); } function BitStatus(Value,bit) { var val = Math.pow(2,bit); if((Value & val)) { return 1; } else return 0; } function FlipBit(ValueName,Value,bit) { var val = Math.pow(2,bit); //alert('Setting bit ['+bit+'] of var ['+ValueName+'] with current value ['+Value+']'); if(BitStatus(Value,bit)) { Value = Value - val; } else Value = Value + val; session_val(ValueName,Value); } function PerPageSelected(Value,PageCount) { if(Value==PageCount) { return 2; } else return 0; } function RadioIsSelected(Value1,Value2) { if(Value1 == Value2) { return 2; } else return 0; } function OpenItemSelector(envstr) { //alert(envstr); window.open('$item_select?'+envstr,"groupselect","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no"); } function OpenUserSelector(CheckIdField,Checks,envstr) { if(Checks) var retval = Checks.getItemList(); f = document.getElementById('userpopup'); if(f) { if(CheckIdField) f.elements[CheckIdField].value = retval; } SessionPrepare('$user_select', envstr, 'userselect'); } function SessionPrepare(url, get_str, window_name) { var params = ExtractParams(get_str); if(params['destform']) { if(params['destform'] == 'popup') { CreatePopup(window_name, url + '?' + get_str); return true; } else var frm = CreateFakeForm(); } else var frm = CreateFakeForm(); if(!frm) return false; frm.destform.value = params['destform']; params['destform'] = 'popup'; get_str = MergeParams(params); CreatePopup(window_name); frm.target = window_name; frm.method = 'POST'; frm.action = url + '?' + get_str; frm.submit(); } function addField(form, type, name, value) { // create field in form var field = document.createElement("INPUT"); field.type = type; field.name = name; field.id = name; field.value = value; form.insertBefore(field, form.nextSibling); } function CreateFakeForm() { if($submit_done == 0) { var theBody = document.getElementsByTagName("BODY"); if(theBody.length == 1) { var frm = document.createElement("FORM"); frm.name = "fake_form"; frm.id = "fake_form"; frm.method = "post"; theBody[0].insertBefore(frm, theBody[0].nextSibling); addField(frm, 'hidden', 'submit_done', 1); addField(frm, 'hidden', 'destform', ''); return document.getElementById('fake_form'); } } return false; } function CreatePopup(window_name, url, width, height) { // creates a popup window & returns it if(url == null && typeof(url) == 'undefined' ) url = ''; if(width == null && typeof(width) == 'undefined' ) width = 750; if(height == null && typeof(height) == 'undefined' ) height = 400; return window.open(url,window_name,'width='+width+',height='+height+',status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no'); } function ShowHelp(section) { var frm = document.getElementById('help_form'); frm.section.value = section; frm.method = 'POST'; CreatePopup('HelpPopup','$rootURL$admin/help/blank.html'); // , null, 600 frm.target = 'HelpPopup'; frm.submit(); } function ExtractParams(get_str) { // extract params into associative array var params = get_str.split('&'); var result = Array(); var temp_var; var i = 0; var params_count = params.length; while(i < params_count) { temp_var = params[i].split('='); result[temp_var[0]] = temp_var[1]; i++; } return result; } function MergeParams(params) { // join splitted params into GET string var key; var result = ''; for(key in params) result += key + '=' + params[key] + '&'; if(result.length) result = result.substring(0, result.length - 1); return result; } function show_props(obj, objName) { var result = ""; for (var i in obj) { result += objName + "." + i + " = " + obj[i] + "\\n"; } return result; } function OpenGroupSelector(envstr) { //alert(envstr); SessionPrepare('$group_select', envstr, 'groupselect'); //window.open('$group_select?'+envstr,"groupselect","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no"); } function OpenCatSelector(envstr) { //alert(envstr); window.open('$cat_select?'+envstr,"catselect","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no"); } function openEmailPopup(envar,form,Checks) { var email_url='$email_url'; var url = email_url+envar; if(Checks.itemChecked()) { f = document.getElementById(form); if(f) { window.open('',"sendmail","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no"); f.idlist.value = Checks.getItemList(); f.submit(); } } } function OpenPhraseEditor(extra_env) { //SessionPrepare('$phrase_edit', extra_env, 'phrase_edit'); var url = '$phrase_edit'+extra_env+'&destform=popup'; window.open(url,"phrase_edit","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no"); } function set_window_title(\$title) { var \$window = window; if(\$window.parent) \$window = \$window.parent; \$window.document.title = (main_title.length ? main_title + ' - ' : '') + \$title; } var env = '$env2'; var SubmitFunc = false; </script> END; ?> Property changes on: trunk/admin/include/mainscript.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.17 \ No newline at end of property +1.18 \ No newline at end of property Index: trunk/admin/head.php =================================================================== --- trunk/admin/head.php (revision 3906) +++ trunk/admin/head.php (revision 3907) @@ -1,143 +1,143 @@ <?php define('DBG_SHOW_MEMORY_USAGE', 0); define('DBG_SKIP_REPORTING', 1); define('ADMIN', 1); define('REL_PATH', 'admin'); $relation_level = count( explode('/', REL_PATH) ); define('FULL_PATH', realpath(dirname(__FILE__) . str_repeat('/..', $relation_level) ) ); define('APPLICATION_CLASS', 'MyApplication'); include_once(FULL_PATH.'/kernel/kernel4/startup.php'); $application =& kApplication::Instance(); $application->Init(); if ($application->GetVar('check_server')) { echo 'PING: '.date('d/m/Y H:i:s'); exit; } $user = $application->recallObject('u'); $loginname = ($user->GetID() != -1) ? $user->GetDBField('Login') : 'root'; $logout = $application->HREF('', '', Array('logout' => 1, '__URLENCODE__' => 1), 'index.php'); $mainpage = $application->HREF('', '', Array('section' => 'in-portal:root', '__URLENCODE__' => 1), 'subitems.php'); $xmlhttp_url = $application->HREF('', '', Array('check_server' => 1, '__URLENCODE__' => 1)); $language =& $application->recallObject('lang.current'); $use_xml = $application->isDebugMode() && dbg_ConstOn('DBG_SHOW_EXPIRATION'); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> <html> <head> <title>HEAD</title> <meta http-equiv="content-type" content="text/html;charset=<?php echo $language->GetDBField('Charset'); ?>"> <meta name="generator" content="Notepad"> <link rel="stylesheet" type="text/css" href="include/style.css"> <?php if ($use_xml) { ?> <script language="javascript" type="text/javascript"> function getXMLHTTPObject() { var http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/plain'); // See note below about this line } } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } return http_request; } function processResponce(http_request) { if (http_request.readyState == 4) { if (http_request.status == 200) { document.getElementById('server_status').innerHTML = http_request.responseText; } else { // alert('There was a problem with the request.'); } } } </script> <?php } ?> </head> <body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" bgcolor="#FFFFFF"> <table cellpadding="0" cellspacing="0" border="0" width="100%" height="100%"> <tr> <td valign="bottom"> <table cellpadding="0" cellspacing="0" border="0" width="100%" height="90"> <tr> <td rowspan="3" valign="top"> <a href="<?php echo $mainpage; ?>" target="main"><img title="In-portal" src="images/globe.gif" width="84" height="91" border="0"></a> </td> <td rowspan="3" valign="top"> <a href="<?php echo $mainpage; ?>" target="main"><img title="In-portal" src="images/logo.gif" width="150" height="91" border="0"></a> </td> <td rowspan="3" width="100000" align="center"> <?php echo $use_xml ? '<div id="server_status"></div>' : ' '; ?> </td> <td width="400"> <img title="" src="images/blocks.gif" width="400" height="73"> </td> </tr> <tr> <td align="right" background="images/version_bg.gif" class="head_version" valign="bottom"> <img title="" src="images/spacer.gif" width="1" height="10" align="absmiddle"> <?php echo $application->Phrase('la_Logged_in_as').' <b>'.$loginname.' </b>'; ?> <a href="<?php echo $logout; ?>" target="_parent"><img src="images/blue_bar_logout.gif" height="16" width="16" align="absmiddle" border="0"></A> </td> </tr> <tr> <td><img title="" src="images/blocks2.gif" width="400" height="1"></td> </tr> <tr> <td bgcolor="black" colspan="4"><img title="" src="images/spacer.gif" width="1" height="1"></td> </tr> </table> </td> </tr> </table> <?php if ($use_xml) { ?> <script language="javascript" type="text/javascript"> function checkServer() { var http_request = getXMLHTTPObject(); http_request.onreadystatechange = function() { processResponce(http_request); }; http_request.open('GET', '<?php echo $xmlhttp_url; ?>', true); http_request.send(null); - setTimeout('checkServer()', 60000); + setTimeout('checkServer()', 5 * 60000); // one time in 5 minutes } checkServer(); </script> <?php } ?> </body> </html> <?php $application->Done(); ?> \ No newline at end of file Property changes on: trunk/admin/head.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.9 \ No newline at end of property +1.10 \ No newline at end of property Index: trunk/core/kernel/event_manager.php =================================================================== --- trunk/core/kernel/event_manager.php (revision 3906) +++ trunk/core/kernel/event_manager.php (revision 3907) @@ -1,417 +1,455 @@ <?php define('hBEFORE', 1); define('hAFTER', 2); define('reBEFORE', 1); define('reAFTER', 2); class kEventManager extends kBase { /** * Connection to database * * @var kDBConnection * @access public */ var $Conn; /** * Cache of QueryString parameters * from config, that are represented * in enviroment variable * * @var Array */ var $queryMaps = Array(); /** * Build events registred for * pseudo classes. key - pseudo class * value - event name * * @var Array * @access private */ var $buildEvents=Array(); /** * Events, that should be run before parser initialization * * @var Array */ var $beforeRegularEvents = Array(); /** * Events, that should be run after parser initialization * * @var Array */ var $afterRegularEvents = Array(); /** * Holds before hooks * key - prefix.event (to link to) * value - hooked event info * * @var Array * @access private */ var $beforeHooks=Array(); /** * Holds after hooks * key - prefix.event (to link to) * value - hooked event info * * @var Array * @access private */ var $afterHooks = Array(); + + var $recursionStack = Array(); + function kEventManager() { parent::kBase(); $this->Conn =& $this->Application->GetADODBConnection(); } /** * Set's new enviroment parameter mappings * between their names as application vars * * @param Array $new_query_maps * @access public */ /*function setQueryMaps($new_query_maps) { $this->queryMaps = $new_query_maps; }*/ /** * Adds new query map to already parsed query maps * * @param string $prefix */ function setQueryMap($prefix_special) { list($prefix) = explode('.', $prefix_special); $query_map = $this->Application->getUnitOption($prefix, 'QueryString'); if ($query_map) { $this->queryMaps[$prefix_special] = $query_map; } else { unset($this->queryMaps[$prefix]); } $this->Application->SetVar('passed', implode(',', array_keys($this->queryMaps)) ); return $query_map; } /** * Registers new regular event * * @param string $short_name name to be used to store last maintenace run info * @param string $event_name * @param int $run_interval run interval in seconds * @param int $type before or after regular event */ function registerRegularEvent($short_name, $event_name, $run_interval, $type = reBEFORE) { if($type == reBEFORE) { $this->beforeRegularEvents[$short_name] = Array('EventName' => $event_name, 'RunInterval' => $run_interval); } else { $this->afterRegularEvents[$short_name] = Array('EventName' => $event_name, 'RunInterval' => $run_interval); } } function registerBuildEvent($pseudo_class,$build_event_name) { $this->buildEvents[$pseudo_class]=$build_event_name; } /** * Returns build event by pseudo class * name if any defined in config * * @param string $pseudo_class * @return kEvent * @access public */ function &getBuildEvent($pseudo_class) { $false = false; if( !isset($this->buildEvents[$pseudo_class]) ) return $false; $event = new kEvent(); $event->Name=$this->buildEvents[$pseudo_class]; $event->MasterEvent=null; return $event; } /** + * Check if event is called twice, that causes recursion + * + * @param kEvent $event + */ + function isRecursion(&$event) + { + $event_key = $event->getPrefixSpecial().':'.$event->Name; + return in_array($event_key, $this->recursionStack) ? true : false; + } + + function pushEvent(&$event) + { + $event_key = $event->getPrefixSpecial().':'.$event->Name; + array_push($this->recursionStack, $event_key); + } + + function popEvent() + { + array_pop($this->recursionStack); + } + + /** * Allows to process any type of event * * @param kEvent $event * @access public */ function HandleEvent(&$event) { + if ($this->isRecursion($event)) { + return true; + } + + $this->pushEvent($event); + if( !$this->Application->prefixRegistred($event->Prefix) ) { trigger_error('Prefix <b>'.$event->Prefix.'</b> not registred (requested event <b>'.$event->Name.'</b>)', E_USER_NOTICE); return false; } if (!$event->SkipBeforeHooks) { $this->processHooks($event, hBEFORE); if ($event->status == erFATAL) return true; } $event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler'); $event_handler->processEvent($event); if ($event->status == erFATAL) return true; if (!$event->SkipAfterHooks) { $this->processHooks($event, hAFTER); } + $this->popEvent(); + return true; } function ProcessRequest() { $this->processOpener(); // 1. get events from $_POST $events = $this->Application->GetVar('events'); if ($events === false) $events = Array(); // 2. if nothing there, then try to find them in $_GET if ($this->queryMaps && !$events) { // if we got $_GET type submit (links, not javascript) foreach ($this->queryMaps as $prefix_special => $query_map) { $query_map = array_flip($query_map); if (isset($query_map['event'])) { $event_name = $this->Application->GetVar($prefix_special.'_event'); if ($event_name) { $events[$prefix_special] = $event_name; } } } $actions = $this->Application->GetVar('do'); if ($actions) { list($prefix, $event_name) = explode('_', $actions); $events[$prefix] = $event_name; } } $passed = explode(',', $this->Application->GetVar('passed')); foreach($events as $prefix_special => $event_name) { if(!$event_name) continue; if( is_array($event_name) ) { $event_name = key($event_name); $events[$prefix_special] = $event_name; $this->Application->SetVar($prefix_special.'_event', $event_name); } $event = new kEvent(); $event->Name=$event_name; $event->Prefix_Special=$prefix_special; $prefix_special=explode('.',$prefix_special); $event->Prefix=$prefix_special[0]; array_push($passed, $prefix_special[0]); $event->Special=isset($prefix_special[1])?$prefix_special[1]:''; $event->redirect_params = Array('opener'=>'s', 'pass'=>'all'); $event->redirect = true; $this->HandleEvent($event); if($event->status==erSUCCESS && ($event->redirect === true || strlen($event->redirect) > 0) ) { $this->Application->Redirect($event->redirect, $event->redirect_params, null, $event->redirect_script); } } $this->Application->SetVar('events', $events); $this->Application->SetVar('passed', implode(',', $passed)); } function processOpener() { $opener_action=$this->Application->GetVar('m_opener'); $opener_stack=$this->Application->RecallVar('opener_stack'); $opener_stack=$opener_stack?unserialize($opener_stack):Array(); switch($opener_action) { case 'r': // "reset" opener stack $opener_stack=Array(); break; case 'd': // "down/push" new template to opener stack, deeplevel++ if ($this->Application->GetVar('front')) { array_push($opener_stack, '../'.$this->Application->RecallVar('last_template') ); } else { array_push($opener_stack, $this->Application->RecallVar('last_template') ); } break; case 'u': // "up/pop" last template from opener stack, deeplevel-- array_pop($opener_stack); break; case 'p': //pop-up - do not store last template $this->Application->SetVar('skip_last_template', 1); break; default: // "s/0," stay on same deep level break; } if ( !$this->Application->GetVar('skip_last_template') ) { $this->Application->SetVar('m_opener','s'); } $this->Application->StoreVar('opener_stack',serialize($opener_stack)); } function registerHook($hookto_prefix, $hookto_special, $hookto_event, $mode, $do_prefix, $do_special, $do_event, $conditional) { if( !$this->Application->getUnitOptions($hookto_prefix) ) { if($this->Application->isDebugMode()) { trigger_error('Prefix <b>'.$hookto_prefix.'</b> doesn\'t exist when trying to hook from <b>'.$do_prefix.':'.$do_event.'</b>', E_USER_WARNING); } return; } $hookto_prefix_special = rtrim($hookto_prefix.'.'.$hookto_special, '.'); if ($mode == hBEFORE) { $this->beforeHooks[strtolower($hookto_prefix_special.'.'.$hookto_event)][] = Array( 'DoPrefix' => $do_prefix, 'DoSpecial' => $do_special, 'DoEvent' => $do_event, 'Conditional' => $conditional, ); } elseif ($mode == hAFTER) { $this->afterHooks[strtolower($hookto_prefix_special.'.'.$hookto_event)][] = Array( 'DoPrefix' => $do_prefix, 'DoSpecial' => $do_special, 'DoEvent' => $do_event, 'Conditional' => $conditional, ); } } /** * Enter description here... * * @param kEvent $event * @param int $mode hBEFORE or hAFTER * @return Array */ function &getHooks(&$event, $mode, $special = null) { $event_key = !isset($special) ? $event->Prefix_Special : $event->Prefix.'.'.$special; if ($mode == hBEFORE) { $mode_hooks =& $this->beforeHooks; } else { $mode_hooks =& $this->afterHooks; } $hooks = getArrayValue($mode_hooks, strtolower($event_key.'.'.$event->Name)); if (!$hooks) { $hooks = Array(); } return $hooks; } /** * Enter description here... * * @param kEvent $event * @param int $mode hBEFORE or hAFTER */ function processHooks(&$event, $mode) { // * - get hooks that are valid with any special of given prefix $hooks = array_merge_recursive2($this->getHooks($event, $mode, '*'), $this->getHooks($event, $mode)); if ($hooks) { foreach ($hooks as $hook) { + if ($hook['DoSpecial'] == '*') { + // use same special as master event + $hook['DoSpecial'] = $event->Special; + } + $prefix_special = rtrim($hook['DoPrefix'].'_'.$hook['DoSpecial'], '_'); if ( $hook['Conditional'] && !$this->Application->GetVar($prefix_special) ) { continue; } $hook_event = new kEvent( Array('name'=>$hook['DoEvent'],'prefix'=>$hook['DoPrefix'],'special'=>$hook['DoSpecial']) ); $hook_event->MasterEvent =& $event; $this->HandleEvent($hook_event); } } } /** * Set's new event for $prefix_special * passed * * @param string $prefix_special * @param string $event_name * @access public */ function setEvent($prefix_special,$event_name) { $actions =& $this->Application->recallObject('kActions'); $actions->Set('events['.$prefix_special.']',$event_name); } /** * Run registred regular events with specified event type * * @param int $event_type */ function RunRegularEvents($event_type = reBEFORE, $from_cron=false) { // if RegularEvents are set to run from cron if (!$from_cron && $this->Application->ConfigValue('UseCronForRegularEvent')) return ; $events_source = ($event_type == reBEFORE) ? $this->beforeRegularEvents : $this->afterRegularEvents; /*if(rand(0, 100) < 90) { return; }*/ $sql = 'SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = %s'; $event_last_runs = $this->Conn->GetOne( sprintf($sql, $this->Conn->qstr('RegularEventRuns') ) ); $event_last_runs = $event_last_runs ? unserialize($event_last_runs) : Array(); foreach($events_source as $short_name => $event_data) { $event_last_run = getArrayValue($event_last_runs, $short_name); if($event_last_run && $event_last_run > adodb_mktime() - $event_data['RunInterval']) { continue; } else { $event = new kEvent($event_data['EventName']); $event->redirect = false; $this->Application->HandleEvent($event); $event_last_runs[$short_name] = adodb_mktime(); } } $sql = 'REPLACE INTO '.TABLE_PREFIX.'Cache (VarName,Data,Cached) VALUES (%s,%s,%s)'; $this->Conn->Query( sprintf($sql, $this->Conn->qstr('RegularEventRuns'), $this->Conn->qstr(serialize($event_last_runs)), adodb_mktime() ) ); } } ?> \ No newline at end of file Property changes on: trunk/core/kernel/event_manager.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.20 \ No newline at end of property +1.21 \ No newline at end of property Index: trunk/core/units/users/users_item.php =================================================================== --- trunk/core/units/users/users_item.php (revision 3906) +++ trunk/core/units/users/users_item.php (revision 3907) @@ -1,234 +1,251 @@ <?php class UsersItem extends kDBItem { var $CustomFields = Array(); var $persistantVars = Array(); function Init($prefix, $special, $event_params = null) { parent::Init($prefix, $special, $event_params); $item_type = $this->Application->getUnitOption($this->Prefix, 'ItemType'); $sql = 'SELECT CustomFieldId, FieldName FROM '.TABLE_PREFIX.'CustomField WHERE Type = %s'; $this->CustomFields = $this->Conn->GetCol( sprintf($sql, $item_type), 'FieldName' ); } function defineFields() { parent::defineFields(); // add custom fields definitions (as virtual fields) $add_fields = Array(); $custom_field_options = Array('default' => '', 'not_null' => 1); foreach ($this->CustomFields as $custom_field => $custom_id) { $add_fields[$custom_field] = $custom_field_options; } if($add_fields) { $add_fields = array_merge_recursive2($add_fields, $this->VirtualFields); $this->setVirtualFields($add_fields); } } /** * Load custom fields values as virtual fields for dbitem * * @return bool */ function LoadCustomFields() { if (!$this->CustomFields) return false; $custom_ids = implode(',', $this->CustomFields); $sql = 'SELECT Value, CustomFieldId FROM '.TABLE_PREFIX.'CustomMetaData WHERE ResourceId = '.$this->GetDBField('ResourceId').' AND CustomFieldId IN ('.$custom_ids.')'; $custom_values = $this->Conn->GetCol($sql, 'CustomFieldId'); if (!$custom_values) return false; $custom_fields = array_flip($this->CustomFields); foreach ($custom_values as $custom_id => $custom_value) { $this->SetDBField($custom_fields[$custom_id], $custom_value); } return true; } function LoadPersistantVars() { $sql = 'SELECT VariableValue, VariableName FROM '.TABLE_PREFIX.'PersistantSessionData WHERE PortalUserId = '.$this->GetID(); $this->persistantVars = $this->Conn->GetCol($sql, 'VariableName'); } function setPersistantVar($var_name, $var_value) { $this->persistantVars[$var_name] = $var_value; $replace_hash = Array( 'PortalUserId' => $this->GetID(), 'VariableName' => $var_name, 'VariableValue' => $var_value ); $this->Conn->doInsert($replace_hash, TABLE_PREFIX.'PersistantSessionData', 'REPLACE'); } function getPersistantVar($var_name) { return getArrayValue($this->persistantVars, $var_name); } function UpdateCustomFields() { $data_table = TABLE_PREFIX.'CustomMetaData'; // get values already written, to find their ids $sql = 'SELECT CustomDataId, CustomFieldId FROM '.$data_table.' WHERE ResourceId = '.$this->GetDBField('ResourceId'); $custom_value_ids = $this->Conn->GetCol($sql, 'CustomFieldId'); $sql = 'REPLACE INTO '.$data_table.'(CustomDataId,ResourceId,CustomFieldId,Value) VALUES (%1$s,%2$s,%3$s,%4$s)'; foreach ($this->CustomFields as $custom_field => $custom_id) { $data_id = isset($custom_value_ids[$custom_id]) ? $custom_value_ids[$custom_id] : 0; $custom_value = $this->GetDBField($custom_field); if (!$custom_value && $data_id) { $temp_sql = 'DELETE FROM '.$data_table.' WHERE CustomDataId = '.$data_id; $this->Conn->Query($temp_sql); } elseif($custom_value) { $temp_sql = sprintf($sql, $data_id, $this->GetDBField('ResourceId'), $custom_id, $this->Conn->qstr( $this->GetDBField($custom_field) ) ); $this->Conn->Query($temp_sql); } } } function Load($id, $id_field_name = null) { $ret = parent::Load($id, $id_field_name); if($ret) { $this->LoadCustomFields(); $this->LoadPersistantVars(); } return $ret; } /** * Returns IDs of groups to which user belongs and membership is not expired * * @return Array * @access public */ function getMembershipGroups($force_reload = false) { $user_groups = $this->Application->RecallVar('UserGroups'); if($user_groups === false || $force_reload) { $sql = 'SELECT GroupId FROM %s WHERE (PortalUserId = %s) AND ( (MembershipExpires IS NULL) OR ( MembershipExpires >= UNIX_TIMESTAMP() ) )'; $sql = sprintf($sql, TABLE_PREFIX.'UserGroup', $this->GetID() ); return $this->Conn->GetCol($sql); } else { return explode(',', $user_groups); } } /** * Set's Login from Email if required by configuration settings * */ function setLogin() { if( $this->Application->ConfigValue('Email_As_Login') ) { $this->SetDBField('Login', $this->GetDBField('Email') ); } } function SendEmailEvents() { switch( $this->GetDBField('Status') ) { case 1: $this->Application->EmailEventAdmin('USER.ADD', $this->GetID() ); $this->Application->EmailEventUser('USER.ADD', $this->GetID() ); break; case 2: $this->Application->EmailEventAdmin('USER.ADD.PENDING', $this->GetID() ); $this->Application->EmailEventUser('USER.ADD.PENDING', $this->GetID() ); break; } } function isSubscriberOnly() { $subscribers_group_id = $this->Application->ConfigValue('User_SubscriberGroup'); $sql = 'SELECT PortalUserId FROM '.TABLE_PREFIX.'UserGroup WHERE GroupId = '.$subscribers_group_id.' AND PortalUserId = '.$this->GetDBField('PortalUserId').' AND PrimaryGroup = 1'; return $this->Conn->GetOne($sql) == $this->GetDBField('PortalUserId'); } function Create($force_id=false, $system_create=false) { $ret = parent::Create($force_id, $system_create); if ($ret) { $this->UpdateCustomFields(); // find out how to syncronize user only when it's copied to live table $sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('createUser', $this->FieldValues); } return $ret; } function Update($id=null, $system_update=false) { $ret = parent::Update($id, $system_update); if ($ret) { $this->UpdateCustomFields(); // find out how to syncronize user only when it's copied to live table $sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('updateUser', $this->FieldValues); } return $ret; } /** * Deletes the record from databse * * @access public * @return bool */ function Delete($id = null) { $ret = parent::Delete($id); if ($ret) { $sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize'); $sync_manager->performAction('deleteUser', $this->FieldValues); } return $ret; } + function setName($full_name) + { + $full_name = explode(' ', $full_name); + + if (count($full_name) > 2) { + $last_name = array_pop($full_name); + $first_name = implode(' ', $full_name); + } + else { + $last_name = $full_name[1]; + $first_name = $full_name[0]; + } + + $this->SetDBField('FirstName', $first_name); + $this->SetDBField('LastName', $last_name); + } + } ?> \ No newline at end of file Property changes on: trunk/core/units/users/users_item.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.7 \ No newline at end of property +1.8 \ No newline at end of property Index: trunk/core/units/users/users_config.php =================================================================== --- trunk/core/units/users/users_config.php (revision 3906) +++ trunk/core/units/users/users_config.php (revision 3907) @@ -1,116 +1,119 @@ <?php $config = Array( 'Prefix' => 'u', 'ItemClass' => Array('class'=>'UsersItem','file'=>'users_item.php','build_event'=>'OnItemBuild'), 'ListClass' => Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'), 'EventHandlerClass' => Array('class'=>'UsersEventHandler','file'=>'users_event_handler.php','build_event'=>'OnBuild'), 'TagProcessorClass' => Array('class'=>'UsersTagProcessor','file'=>'users_tag_processor.php','build_event'=>'OnBuild'), 'RegisterClasses' => Array( Array('pseudo' => 'UsersSyncronizeManager', 'class' => 'UsersSyncronizeManager', 'file' => 'users_syncronize.php', 'build_event' => ''), ), 'AutoLoad' => true, 'Hooks' => Array( Array( 'Mode' => hAFTER, 'Conditional' => false, 'HookToPrefix' => 'u', 'HookToSpecial' => '', 'HookToEvent' => Array('OnAfterItemLoad', 'OnBeforeItemCreate', 'OnBeforeItemUpdate', 'OnUpdateAddress'), 'DoPrefix' => '', 'DoSpecial' => '', 'DoEvent' => 'OnPrepareStates', ), Array( 'Mode' => hBEFORE, 'Conditional' => false, 'HookToPrefix' => 'affil', 'HookToSpecial' => '', 'HookToEvent' => Array('OnCheckAffiliateAgreement'), 'DoPrefix' => '', 'DoSpecial' => '', 'DoEvent' => 'OnSubstituteSubscriber', ), ), 'QueryString' => Array( 1 => 'id', 2 => 'page', 3 => 'event', ), 'RegularEvents' => Array( 'membership_expiration' => Array('EventName' => 'OnCheckExpiredMembership', 'RunInterval' => 1800, 'Type' => reAFTER), ), 'IDField' => 'PortalUserId', 'ItemType' => 6, // used for custom fields only (on user's case) 'TableName' => TABLE_PREFIX.'PortalUser', 'ListSQLs' => Array( ''=>'SELECT * FROM %s', ), // key - special, value - list select sql 'ItemSQLs' => Array( ''=>'SELECT * FROM %s', ), 'ListSortings' => Array( '' => Array( 'Sorting' => Array('Login' => 'asc'), ) ), 'SubItems' => Array('addr'), 'Fields' => Array ( 'PortalUserId' => Array(), 'Login' => Array('type' => 'string', 'unique'=>Array('Login'), 'default' => '','required'=>1, 'error_msgs' => Array('unique'=>'!lu_user_already_exist!')), 'Password' => Array('type' => 'string', 'formatter' => 'kPasswordFormatter', 'encryption_method' => 'md5', 'verify_field' => 'VerifyPassword', 'skip_empty' => 1, 'default' => md5('') ), 'FirstName' => Array('type' => 'string','default' => ''), 'LastName' => Array('type' => 'string','default' => ''), + 'Company' => Array('type' => 'string','not_null' => '1','default' => ''), 'Email' => Array('type' => 'string', 'formatter'=>'kFormatter', 'regexp'=>'/^[_a-zA-Z0-9-\.]+@[a-zA-Z0-9-\.]+\.[a-z]{2,4}$/', 'unique'=>Array('Email'), 'not_null' => '1', 'required'=>1, 'default' => '', 'error_msgs' => Array('invalid_format'=>'!la_invalid_email!', 'unique'=>'!lu_email_already_exist!') ), 'CreatedOn' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'default' => '#NOW#', 'not_null' => '1' ), 'Phone' => Array('type' => 'string','default' => ''), + 'Fax' => Array('type' => 'string','not_null' => '1','default' => ''), 'Street' => Array('type' => 'string','default' => ''), + 'Street2' => Array('type' => 'string', 'not_null' => '1', 'default' => ''), 'City' => Array('type' => 'string','default' => ''), 'State' => Array('formatter'=>'kOptionsFormatter', 'options' => Array(), 'option_key_field'=>'DestAbbr','option_title_field'=>'Translation', 'not_null' => '1','default' => ''), 'Zip' => Array('type' => 'string','default' => ''), 'Country' => Array('formatter'=>'kOptionsFormatter', 'options_sql'=>'SELECT %1$s FROM '.TABLE_PREFIX.'StdDestinations LEFT JOIN '.TABLE_PREFIX.'Phrase ON '.TABLE_PREFIX.'Phrase.Phrase = '.TABLE_PREFIX.'StdDestinations.DestName WHERE DestType=1 AND LanguageId = %2$s ORDER BY Translation', 'option_key_field'=>'DestAbbr','option_title_field'=>'Translation', 'not_null' => '1','default' => ''), 'ResourceId' => Array('type' => 'int','not_null' => '1','default' => '0'), 'Status' => Array('type' => 'int', 'formatter'=>'kOptionsFormatter', 'options'=>Array(1=>'la_Enabled', 0=>'la_Disabled', 2=>'la_Pending'), 'use_phrases'=>1, 'not_null' => '1','default' => 2), 'Modified' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'not_null' => '1', 'default' => '#NOW#' ), 'dob' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'not_null' => '1', 'default' => '', 'required'=>1), 'tz' => Array('type' => 'int','default' => ''), 'ip' => Array('type' => 'string','default' => ''), 'IsBanned' => Array('type' => 'int','not_null' => '1','default' => '0'), 'PassResetTime' => Array('type' => 'int','default' => ''), 'PwResetConfirm' => Array('type' => 'string','default' => ''), 'PwRequestTime' => Array('type' => 'int','default' => ''), 'MinPwResetDelay' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array('300' => '5', '600' => '10', '900' => '15', '1800' => '30', '3600' => '60'), 'use_phrases' => 0, 'not_null' => '1', 'default' => 30), ), 'VirtualFields' => Array( 'ValidateLogin' => Array('type'=>'string','default'=>''), 'SubscribeEmail' => Array('type'=>'string','default'=>''), ), 'Grids' => Array(), ); ?> \ No newline at end of file Property changes on: trunk/core/units/users/users_config.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.11 \ No newline at end of property +1.12 \ No newline at end of property