format = $format;
$GLOBALS["ditto_lang"] = $language;
$this->prefetch = false;
$this->advSort = false;
$this->constantFields[] = array("db","tv");
$this->constantFields["db"] = array("id","type","contentType","pagetitle","longtitle","description","alias","link_attributes","published","pub_date","unpub_date","parent","isfolder","introtext","content","richtext","template","menuindex","searchable","cacheable","createdby","createdon","editedby","editedon","deleted","deletedon","deletedby","publishedon","publishedby","menutitle","donthit","haskeywords","hasmetatags","privateweb","privatemgr","content_dispo","hidemenu");
$this->constantFields["tv"] = $this->getTVList();
$GLOBALS["ditto_constantFields"] = $this->constantFields;
$this->fields = array("display"=>array(),"backend"=>array("tv"=>array(),"db"=>array("id", "published")));
$this->sortOrder = false;
$this->customPlaceholdersMap = array();
$this->template = new template();
if (!is_null($debug)) {$this->debug = new debug($debug);}
}
// ---------------------------------------------------
// Function: getTVList
// Get a list of all available TVs
// ---------------------------------------------------
function getTVList() {
global $modx;
$table = $modx->getFullTableName("site_tmplvars");
$tvs = $modx->db->select("name", $table);
// TODO: make it so that it only pulls those that apply to the current template
$dbfields = array();
while ($dbfield = $modx->db->getRow($tvs))
$dbfields[] = $dbfield['name'];
return $dbfields;
}
// ---------------------------------------------------
// Function: addField
// Add a field to the internal field detection system
// ---------------------------------------------------
function addField($name,$location,$type=false) {
if ($type === false) {
$type = $this->getDocVarType($name);
}
if ($type == "tv:prefix") {
$type = "tv";
$name = substr($name, 2);
}
if ($location == "*") {
$this->fields["backend"][$type][] = $name;
$this->fields["display"][$type][] = $name;
} else {
$this->fields[$location][$type][] = $name;
}
}
// ---------------------------------------------------
// Function: removeField
// Remove a field to the internal field detection system
// ---------------------------------------------------
function removeField($name,$location,$type) {
$key = array_search ($name, $this->fields[$location][$type]);
if ($key !== false) {
unset($this->fields[$location][$type][$key]);
}
}
// ---------------------------------------------------
// Function: setDisplayFields
// Move the detected fields into the Ditto fields array
// ---------------------------------------------------
function setDisplayFields($fields,$hiddenFields) {
$this->fields["display"] = $fields;
if (count($this->fields["display"]['qe']) > 0) {
$this->addField("pagetitle","display","db");
}
if ($hiddenFields) {
foreach ($hiddenFields as $field) {
$this->addField($field,"display");
}
}
}
// ---------------------------------------------------
// Function: getDocVarType
// Determine if the provided field is a tv, a database field, or something else
// ---------------------------------------------------
function getDocVarType($field) {
global $ditto_constantFields;
$tvFields = $ditto_constantFields["tv"];
$dbFields = $ditto_constantFields["db"];
if(in_array($field, $tvFields)){
return "tv";
}else if(in_array(substr($field,2), $tvFields)) {
return "tv:prefix";
// TODO: Remove TV Prefix support
} else if(in_array($field, $dbFields)){
return "db";
} else {
return "unknown";
}
}
// ---------------------------------------------------
// Function: parseSort
// Parse out the sort
// ---------------------------------------------------
function parseSort($sortBy, $randomize) {
global $modx;
if ($randomize != 0) {return "RAND()";}
// if randomize is enabled, forget everything else!
$advSort = array ("pub_date","unpub_date","editedon","deletedon","publishedon");
// adv sort fields taht will require custom resets
$type = $this->getDocVarType($sortBy);
$sort = "id";
switch($type) {
case "tv:prefix":
$this->advSort = substr($sortBy, 2);
break;
case "tv":
$this->advSort = $sortBy;
break;
case "db":
if (in_array($sortBy, $advSort)) {
$this->advSort = $sortBy;
} else {
$sort = $sortBy;
}
break;
case "unknown":
$sort = "createdon";
break;
}
if ($this->advSort !== false) {$this->addField($this->advSort,"backend");}
$this->addField($sort,"backend");
return $sort;
}
// ---------------------------------------------------
// Function: parseFilters
// Split up the filters into an array and add the required fields to the fields array
// ---------------------------------------------------
function parseFilters($filter=false,$cFilters=false,$pFilters = false,$globalDelimiter,$localDelimiter) {
$parsedFilters = array("basic"=>array(),"custom"=>array());
$filters = explode($globalDelimiter, $filter);
if ($filter && count($filters) > 0) {
foreach ($filters AS $filter) {
if (!empty($filter)) {
$filterArray = explode($localDelimiter, $filter);
$source = $filterArray[0];
$this->addField($source,"backend");
$value = $filterArray[1];
$mode = (isset ($filterArray[2])) ? $filterArray[2] : 1;
$parsedFilters["basic"][] = array("source"=>$source,"value"=>$value,"mode"=>$mode);
}
}
}
if ($cFilters) {
foreach ($cFilters as $name=>$value) {
if (!empty($name) && !empty($value)) {
$parsedFilters["custom"][$name] = $value[1];
if(strpos($value[0],",")!==false){
$fields = explode(",",$value[0]);
foreach ($fields as $field) {
$this->addField($field,"backend");
}
} else {
$this->addField($value[0],"backend");
}
}
}
}
if($pFilters) {
foreach ($pFilters as $filter) {
foreach ($filter as $name=>$value) {
$parsedFilters["basic"][] = $value;
if(strpos($value["source"],",")!==false){
$fields = explode(",",$value["source"]);
foreach ($fields as $field) {
$this->addField($field,"backend");
}
} else {
$this->addField($value["source"],"backend");
}
}
}
}
return $parsedFilters;
}
// ---------------------------------------------------
// Function: render
// Render the document output
// ---------------------------------------------------
function render($resource, $template, $removeChunk,$dateSource,$dateFormat,$ph=array(),$phx=1) {
global $modx,$ditto_lang;
if (!is_array($resource)) {
return $ditto_lang["resource_array_error"];
}
$placeholders = array();
$contentVars = array();
foreach ($resource as $name=>$value) {
$placeholders["$name"] = $value;
$contentVars["[*$name*]"] = $value;
}
// set author placeholder
if (in_array("author",$this->fields["display"]["custom"])) {
$placeholders['author'] = $this->getAuthor($resource['createdby']);
}
if (in_array("editer",$this->fields["display"]["custom"])) {
$placeholders['editer'] = $this->getAuthor($resource['editedby']);
}
// set title placeholder
if (in_array("title",$this->fields["display"]["custom"])) {
$placeholders['title'] = $resource['pagetitle'];
}
// set url placeholder
if (in_array("url",$this->fields["display"]["custom"])) {
$placeholders['url'] = substr($modx->config['site_url'], 0, -1).$modx->makeURL($resource['id']);
}
if (in_array("date",$this->fields["display"]["custom"])) {
$timestamp = ($resource[$dateSource] != "0") ? $resource[$dateSource] : $resource["createdon"];
$placeholders['date'] = $this->formatDate($timestamp, $dateFormat);
}
if (in_array("content",$this->fields["display"]["db"]) && $this->format != "html") {
$resource['content'] = $this->relToAbs($resource['content'], $modx->config['site_url']);
}
if (in_array("introtext",$this->fields["display"]["db"]) && $this->format != "html") {
$resource['introtext'] = $this->relToAbs($resource['introtext'], $modx->config['site_url']);
}
$customPlaceholders = $ph;
// set custom placeholder
foreach ($ph as $name=>$value) {
if ($name != "*") {
$placeholders[$name] = call_user_func($value[1],$resource);
unset($customPlaceholders[$name]);
}
}
foreach ($customPlaceholders as $name=>$value) {
$placeholders = call_user_func($value,$placeholders);
}
if (count($this->fields["display"]['qe']) > 0) {
$placeholders = $this->renderQELinks($this->template->fields['qe'],$resource,$ditto_lang["edit"]." : ".$resource['pagetitle']." : ",$placeholders);
// set QE Placeholders
}
if ($phx == 1) {
$PHs = $placeholders;
foreach($PHs as $key=>$output) {
$placeholders[$key] = str_replace( array_keys( $contentVars ), array_values( $contentVars ), $output );
}
unset($PHs);
$phx = new prePHx($template);
$phx->setPlaceholders($placeholders);
$output = $phx->output();
} else {
$output = $this->str_replace_phx($placeholders,$template);
$output = str_replace( array_keys( $contentVars ), array_values( $contentVars ), $output );
}
if ($removeChunk) {
foreach ($removeChunk as $chunk) {
$output = str_replace('{{'.$chunk.'}}',"",$output);
$output = str_replace($modx->getChunk($chunk),"",$output);
// remove chunk that is not wanted
}
}
return $output;
}
function str_replace_phx( $placeholders, $tpl ) {
$phs = array();
foreach ($placeholders as $ph=>$value) {
$phs["[+$ph+]"] = $value;
}
return str_replace( array_keys( $phs ), array_values( $phs ), $tpl );
}
// ---------------------------------------------------
// Function: parseFields
// Find the fields that are contained in the custom placeholders or those that are needed in other functions
// ---------------------------------------------------
function parseFields($placeholders,$seeThruUnpub,$dateSource,$randomize) {
$this->parseCustomPlaceholders($placeholders);
$this->parseDBFields($seeThruUnpub);
if ($randomize != 0) {
$this->addField($randomize,"backend");
}
$this->addField("id","display","db");
$this->addField("pagetitle","display","db");
$checkOptions = array("pub_date","unpub_date","editedon","deletedon","publishedon");
if (in_array($dateSource,$checkOptions)) {
$this->addField("createdon","display");
}
if (in_array("date",$this->fields["display"]["custom"])) {
$this->addField($dateSource,"display");
}
$this->fields = $this->arrayUnique($this->fields);
}
// ---------------------------------------------------
// Function: arrayUnique
// Make fields array unique
// ---------------------------------------------------
function arrayUnique($array) {
foreach($array as $u => $a) {
foreach ($a as $n => $b) {
$array[$u][$n] = array_unique($b);
}
}
return $array;
}
// ---------------------------------------------------
// Function: parseCustomPlaceholders
// Parse the required fields out of the custom placeholders
// ---------------------------------------------------
function parseCustomPlaceholders($placeholders) {
foreach ($placeholders as $name=>$value) {
$this->addField($name,"display","custom");
$this->removeField($name,"display","unknown");
$source = $value[0];
$qe = $value[2];
if(is_array($source)) {
if(strpos($source[0],",")!==false){
$fields = explode(",",$source[0]);
foreach ($fields as $field) {
if (!empty($field)) {
$this->addField($field,$source[1]);
$this->customPlaceholdersMap[$name] = $field;
}
}
} else {
$this->addField($source[0],$source[1]);
$this->customPlaceholdersMap[$name] = $source[0];
}
} else if(is_array($value)) {
$fields = explode(",",$source);
foreach ($fields as $field) {
if (!empty($field)) {
$this->addField($field,"display");
$this->customPlaceholdersMap[$name] = $field;
}
}
}
if (!is_null($qe)) {
$this->customPlaceholdersMap[$name] = array('qe',$qe);
}
}
}
// ---------------------------------------------------
// Function: parseDBFields
// Parse out the fields required for each state
// ---------------------------------------------------
function parseDBFields($seeThruUnpub) {
if (!$seeThruUnpub) {
$this->addField("parent","backend","db");
}
if (in_array("author",$this->fields["display"]["custom"])) {
$this->fields["display"]["db"][] = "createdby";
}
if (in_array("editer",$this->fields["display"]["custom"])) {
$this->fields["display"]["db"][] = "editedby";
}
if (count($this->fields["display"]["tv"]) >= 0) {
$this->addField("published","display","db");
}
}
// ---------------------------------------------------
// Function: renderQELinks
// Render QE links when needed
// ---------------------------------------------------
function renderQELinks($fields, $resource, $QEPrefix,$placeholders) {
global $modx,$dittoID;
$table = $modx->getFullTableName("site_modules");
$idResult = $modx->db->select("id", $table,"name='QuickEdit'","id","1");
$id = $modx->db->getRow($idResult);
$id = $id["id"];
$custom = array("author","editer","date","url","title");
$set = $modx->hasPermission('exec_module');
foreach ($fields as $dv) {
$ds = $dv;
if ($dv == "title") {
$ds = "pagetitle";
}
if (!in_array($dv,$custom) && in_array($dv,$this->fields["display"]["custom"])) {
$value = $this->customPlaceholdersMap[$dv];
$ds = $value;
if (is_array($value) && $value[0] == "qe") {
$value = $value[1];
if (substr($value,0,7) == "@GLOBAL") {
$key = trim(substr($value,7));
$ds = $GLOBALS[$key];
}
}
}
$js = "window.open('".$modx->config["site_url"]."manager/index.php?a=112&id=".$id."&doc=".$resource["id"]."&var=".$ds."', 'QuickEditor', 'width=525, height=300, toolbar=0, menubar=0, status=0, alwaysRaised=1, dependent=1');";
$url = $this->buildURL("qe_open=true",$modx->documentIdentifier,$dittoID);
unset($custom[3]);
if ($set && !in_array($dv,$custom)) {
$placeholders["#$dv"] = $placeholders["$dv"].'« '.$QEPrefix.$dv.'';
} else {
$placeholders["#$dv"] = $placeholders["$dv"];
}
}
return $placeholders;
}
// ---------------------------------------------------
// Function: getAuthor
// Get the author name, or if not available the username
// ---------------------------------------------------
function getAuthor($createdby) {
global $modx;
$user = false;
if ($createdby > 0) {
$user = $modx->getUserInfo($createdby);
} else {
$user = $modx->getWebUserInfo(abs($createdby));
}
if ($user === false) {
// get admin user name
$user = $modx->getUserInfo(1);
}
return ($user['fullname'] != "") ? $user['fullname'] : $user['username'];
}
// ---------------------------------------------------
// Function: customSort
// Sort resource array if advanced sorting is needed
// ---------------------------------------------------
function customSort($data, $fields, $order) {
// Covert $fields string to array
// user contributed
foreach (explode(',', $fields) as $s)
$sortfields[] = trim($s);
$code = "";
for ($c = 0; $c < count($sortfields); $c++)
$code .= "\$retval = strnatcmp(\$a['$sortfields[$c]'], \$b['$sortfields[$c]']); if(\$retval) return \$retval; ";
$code .= "return \$retval;";
$params = ($order == 'ASC') ? '$a,$b' : '$b,$a';
uasort($data, create_function($params, $code));
return $data;
}
// ---------------------------------------------------
// Function: setSortOrder
// Set the order of the documents for future use
// ---------------------------------------------------
function setSortOrder($processedIDs) {
return array_flip($processedIDs);
}
// ---------------------------------------------------
// Function: determineIDs
// Get Document IDs for future use
// ---------------------------------------------------
function determineIDs($IDs, $IDType, $TVs, $sortBy, $sortDir, $depth, $showPublishedOnly, $seeThruUnpub, $hideFolders, $showInMenuOnly, $myWhere, $keywords, $limit, $summarize, $filter, $paginate, $randomize) {
global $modx;
if (($summarize == 0 && $summarize != "all") || count($IDs) == 0 || ($IDs == false && $IDs != "0")) {
return array();
}
// Get starting IDs;
switch($IDType) {
case "parents":
$IDs = explode(",",$IDs);
$documentIDs = $this->getChildIDs($IDs, $depth);
break;
case "documents":
$documentIDs = explode(",",$IDs);
break;
}
if ($this->advSort == false && $hideFolders==0 && $showInMenuOnly==0 && $myWhere == "" && $filter == false) {
$this->prefetch = false;
$documents = $modx->getDocuments($documentIDs, $showPublishedOnly, 0,"id");
$documentIDs = array();
if ($documents) {
foreach ($documents as $null=>$doc) {
$documentIDs[] = $doc["id"];
}
}
return $documentIDs;
} else {
$this->prefetch = true;
}
// Create where clause
$where = array ();
if ($hideFolders) {
$where[] = 'isfolder = 0';
}
if ($showInMenuOnly) {
$where[] = 'hidemenu = 0';
}
if ($myWhere != '') {
$where[] = $myWhere;
}
$where = implode(" AND ", $where);
$limit = ($limit == 0) ? "" : $limit;
// set limit
$customReset = $this->buildCustomResetList($sortBy,$this->advSort);
if ($this->debug) {$this->addField("pagetitle","backend","db");}
if (count($customReset) > 0) {$this->addField("createdon","backend","db");}
$resource = $this->getDocuments($documentIDs, $this->fields["backend"]["db"], $TVs,$keywords,$showPublishedOnly,0,$where,$limit,$sortBy,$sortDir,$randomize);
if ($resource !== false) {
$resource = array_values($resource);
// remove #'s from keys
$recordCount = count($resource);
// count number of records
if (!$seeThruUnpub) {
$parentList = $this->getParentList();
// get parent list
}
for ($i = 0; $i < $recordCount; $i++) {
if (!$seeThruUnpub) {
$published = $parentList[$resource[$i]["parent"]];
if ($published == "0")
unset ($resource[$i]);
}
if (count($customReset) > 0) {
foreach ($customReset as $field) {
if ($resource[$i][$field] === "0") {
$resource[$i][$field] = $resource[$i]["createdon"];
}
}
}
}
if ($this->debug) {
$dbg_resource = $resource;
}
if ($filter != false) {
$filterObj = new filter();
$resource = $filterObj->execute($resource, $filter);
}
if ($this->advSort !== false) {
$resource = $this->customSort($resource, $this->advSort, $sortDir);
}
$fields = (array_intersect($this->fields["backend"],$this->fields["display"]));
$readyFields = array();
foreach ($fields as $field) {
$readyFields = array_merge($readyFields,$field);
}
$processedIDs = array ();
$keep = array();
foreach ($resource as $key => $value) {
$processedIDs[] = $value['id'];
$iKey = '#'.$value['id'];
foreach ($value as $key=>$v) {
if (in_array($key,$readyFields)) {
$keep[$iKey][$key] = $v;
}
if ($this->getDocVarType($key) == "tv:prefix") {
if (in_array(substr($key,2),$readyFields)) {
$keep[$iKey][$key] = $v;
}
}
}
}
$this->prefetch = array("resource"=>$keep,"fields"=>$fields);
if ($this->debug) {
$this->prefetch["dbg_resource"] = $dbg_resource;
$this->prefetch["dbg_IDs_pre"] = $documentIDs;
$this->prefetch["dbg_IDs_post"] = $processedIDs;
}
if (count($processedIDs) > 0) {
if ($randomize != 0) {shuffle($processedIDs);}
$this->sortOrder = $this->setSortOrder($processedIDs);
// saves the order of the documents for use later
}
return $processedIDs;
} else {
return array();
}
}
function weightedRandom($resource,$field,$show) {
$type = $this->getDocVarType($field);
if ($type == "unknown") {
return $resource;
// handle vad field passed
}
$random = new random();
foreach ($resource as $document) {
$doc = $document;
$random->add($doc,abs(intval($document[$field])));
}
$resource = $random->select_weighted_unique($show);
shuffle($resource);
return $resource;
}
// ---------------------------------------------------
// Function: getParentList
// Get a list of all available parents
// ---------------------------------------------------
function getParentList() {
global $modx;
$kids = array();
foreach ($modx->documentMap as $null => $document) {
foreach ($document as $parent => $id) {
$kids[$parent][] = $id;
}
}
$parents = array();
foreach ($kids as $item => $value) {
if ($item != 0) {
$pInfo = $modx->getPageInfo($item,0,"published");
} else {
$pInfo["published"] = "1";
}
$parents[$item] = $pInfo["published"];
}
return $parents;
}
// ---------------------------------------------------
// Function: appendTV
// Apeend a TV to the documents array
// ---------------------------------------------------
function appendTV($tvname="",$docIDs){
global $modx;
$baspath= $modx->config["base_path"] . "manager/includes";
include_once $baspath . "/tmplvars.format.inc.php";
include_once $baspath . "/tmplvars.commands.inc.php";
$tb1 = $modx->getFullTableName("site_tmplvar_contentvalues");
$tb2 = $modx->getFullTableName("site_tmplvars");
$query = "SELECT stv.name,stc.tmplvarid,stc.contentid,stv.type,stv.display,stv.display_params,stc.value";
$query .= " FROM ".$tb1." stc LEFT JOIN ".$tb2." stv ON stv.id=stc.tmplvarid ";
$query .= " WHERE stv.name='".$tvname."' AND stc.contentid IN (".implode($docIDs,",").") ORDER BY stc.contentid ASC;";
$rs = $modx->db->query($query);
$tot = $modx->db->getRecordCount($rs);
$resourceArray = array();
for($i=0;$i<$tot;$i++) {
$row = @$modx->fetchRow($rs);
$resourceArray["#".$row['contentid']][$row['name']] = getTVDisplayFormat($row['name'], $row['value'], $row['display'], $row['display_params'], $row['type'],$row['contentid']);
$resourceArray["#".$row['contentid']]["tv".$row['name']] = $resourceArray["#".$row['contentid']][$row['name']];
}
if ($tot != count($docIDs)) {
$query = "SELECT name,type,display,display_params,default_text";
$query .= " FROM $tb2";
$query .= " WHERE name='".$tvname."' LIMIT 1";
$rs = $modx->db->query($query);
$row = @$modx->fetchRow($rs);
$defaultOutput = getTVDisplayFormat($row['name'], $row['default_text'], $row['display'], $row['display_params'], $row['type'],$row['contentid']);
foreach ($docIDs as $id) {
if (!isset($resourceArray["#".$id])) {
$resourceArray["#$id"][$tvname] = $defaultOutput;
$resourceArray["#$id"]["tv".$tvname] = $resourceArray["#$id"][$tvname];
}
}
}
return $resourceArray;
}
// ---------------------------------------------------
// Function: appendKeywords
// Append keywords's to the resource array
// ---------------------------------------------------
function appendKeywords($resource) {
$keys = $this->fetchKeywords($resource);
$resource["keywords"] = "$keys";
return $resource;
}
// ---------------------------------------------------
// Function: fetchKeywords
// Helper function to
// ---------------------------------------------------
function fetchKeywords($resource) {
global $modx;
if($resource['haskeywords']==1) {
// insert keywords
$metas = implode(",",$modx->getKeywords($resource["id"]));
}
if($resource['hasmetatags']==1){
// insert meta tags
$tags = $modx->getMETATags($resource["id"]);
foreach ($tags as $n=>$col) {
$tag = strtolower($col['tag']);
$metas.= ",".$col['tagvalue'];
}
}
return $metas;
}
// ---------------------------------------------------
// Function: getChildIDs
// Get the IDs ready to be processed
// Similar to the modx version by the same name but much faster
// ---------------------------------------------------
function getChildIDs($IDs, $depth) {
global $modx;
$depth = intval($depth);
$kids = array();
$docIDs = array();
if ($depth == 0) {
foreach ($modx->documentMap as $null => $document) {
foreach ($document as $parent => $id) {
$kids[] = $id;
}
}
return $kids;
}
foreach ($modx->documentMap as $null => $document) {
foreach ($document as $parent => $id) {
$kids[$parent][] = $id;
}
}
foreach ($IDs AS $seed) {
if (!empty($kids[intval($seed)])) {
$docIDs = array_merge($docIDs,$kids[intval($seed)]);
}
}
$depth--;
while($depth != 0) {
foreach ($docIDs as $child=>$id) {
if (!empty($kids[intval($id)])) {
$docIDs = array_merge($docIDs,$kids[intval($id)]);
}
}
$depth--;
}
return array_unique($docIDs);
}
// ---------------------------------------------------
// Function: getDocuments
// Get documents and append TVs + Prefetch Data, and sort
// ---------------------------------------------------
function getDocuments($ids= array (), $fields, $TVs, $keywords, $published= 1, $deleted= 0, $where= '', $limit= "", $sort= "id", $dir= "ASC",$randomize=0) {
global $modx;
if (count($ids) == 0) {
return false;
} else {
sort($ids);
$limit= ($limit != "") ? "LIMIT $limit" : ""; // LIMIT capabilities - rad14701
$tblsc= $modx->getFullTableName("site_content");
$tbldg= $modx->getFullTableName("document_groups");
// modify field names to use sc. table reference
$fields= "sc.".implode(",sc.",$fields);
if ($randomize != 0) {
$sort = "RAND()";
$dir = "";
} else {
$sort= ($sort == "") ? "" : 'sc.' . implode(',sc.', preg_replace("/^\s/i", "", explode(',', $sort)));
}
$where= ($where == "") ? "" : 'AND sc.' . implode('AND sc.', preg_replace("/^\s/i", "", explode('AND', $where)));
// get document groups for current user
if ($docgrp= $modx->getUserDocGroups())
$docgrp= implode(",", $docgrp);
$access= ($modx->isFrontend() ? "sc.privateweb=0" : "1='" . $_SESSION['mgrRole'] . "' OR sc.privatemgr=0") .
(!$docgrp ? "" : " OR dg.document_group IN ($docgrp)");
$sql= "SELECT DISTINCT $fields FROM $tblsc sc
LEFT JOIN $tbldg dg on dg.document = sc.id
WHERE (sc.id IN (" . join($ids, ",") . ") AND sc.published=$published AND sc.deleted=$deleted $where)
AND ($access)
GROUP BY sc.id" .
($sort ? " ORDER BY $sort $dir" : "") . " $limit ";
$result= $modx->db->query($sql);
$resourceArray= array ();
$cnt = @$modx->recordCount($result);
$TVData = array();
$TVIDs = array();
if ($cnt) {
for ($i= 0; $i < $cnt; $i++) {
$resource = $modx->fetchRow($result);
if($keywords) {
$resource = $this->appendKeywords($resource);
}
if ($this->prefetch == true && $this->sortOrder !== false) $resource["ditto_sort"] = $this->sortOrder[$resource["id"]];
$TVIDs[] = $resource["id"];
$resourceArray["#".$resource["id"]] = $resource;
if (count($this->prefetch["resource"]) > 0) {
$x = "#".$resource["id"];
$resourceArray[$x] = array_merge($resource,$this->prefetch["resource"][$x]);
// merge the prefetch array and the normal array
}
}
$TVs = array_unique($TVs);
if (count($TVs) > 0) {
foreach($TVs as $tv){
$TVData = array_merge_recursive($this->appendTV($tv,$TVIDs),$TVData);
}
}
$resourceArray = array_merge_recursive($resourceArray,$TVData);
if ($this->prefetch == true && $this->sortOrder !== false) {$resourceArray = $this->customSort($resourceArray,"ditto_sort","ASC");}
return $resourceArray;
} else {
return false;
}
}
}
// ---------------------------------------------------
// Function: buildCustomResetList
// Build a list of the fields needing to be reset
// ---------------------------------------------------
function buildCustomResetList($sortBy,$advSort) {
$checks = array($sortBy,$advSort);
// array of values that may need to be reset
$checkOptions = array("pub_date","unpub_date","editedon","deletedon","publishedon");
// array of fields that may need to be reset
$customReset = array();
foreach ($checks as $check) {
if (in_array($check, $checkOptions)) {
$customReset[] = $check;
}
}
return $customReset;
}
// ---------------------------------------------------
// Function: cleanIDs
// Clean the IDs of any dangerous characters
// ---------------------------------------------------
function cleanIDs($IDs) {
//Define the pattern to search for
$pattern = array (
'`(,)+`', //Multiple commas
'`^(,)`', //Comma on first position
'`(,)$`' //Comma on last position
);
//Define replacement parameters
$replace = array (
',',
'',
''
);
//Clean startID (all chars except commas and numbers are removed)
$IDs = preg_replace($pattern, $replace, $IDs);
return $IDs;
}
// ---------------------------------------------------
// Function: formatDate
// Render the date in the proper format and encoding
// ---------------------------------------------------
function formatDate($dateUnixTime, $dateFormat) {
global $modx;
$dt = strftime($dateFormat, (intval($dateUnixTime) + $modx->config["server_offset_time"]));
if ($modx->config["modx_charset"] == "UTF-8") {
$dt = utf8_encode($dt);
}
return $dt;
}
// ---------------------------------------------------
// Function: buildURL
// Build a URL with regard to Ditto ID
// ---------------------------------------------------
function buildURL($args,$id=false,$dittoIdentifier=false) {
global $modx, $dittoID;
$dittoID = ($dittoIdentifier !== false) ? $dittoIdentifier : $dittoID;
$query = $_GET;
unset($query["id"]);
unset($query["q"]);
if (!is_array($args)) {
$args = explode("&",$args);
foreach ($args as $arg) {
$arg = explode("=",$arg);
$query[$dittoID.$arg[0]] = urlencode(trim($arg[1]));
}
} else {
foreach ($args as $name=>$value) {
$query[$dittoID.$name] = urlencode(trim($value));
}
}
$queryString = "";
foreach ($query as $param=>$value) {
$queryString .= '&'.$param.'='.(is_array($value) ? implode(",",$value) : $value);
}
$cID = ($id !== false) ? $id : $modx->documentObject['id'];
$url = $modx->makeURL(trim($cID), '', $queryString);
return str_replace("&","&",$url);
}
// ---------------------------------------------------
// Function: getParam
// Get a parameter or use the default language value
// ---------------------------------------------------
function getParam($param,$langString){
// get a parameter value and if it is not set get the default language string value
global $modx,$ditto_lang;
$out = "";
if ($modx->getChunk($param) != "") {
return $modx->getChunk($param);
} else if(!empty($param)) {
return $param;
}else{
return $ditto_lang[$langString];
}
}
// ---------------------------------------------------
// Function: paginate
// Paginate the documents
// ---------------------------------------------------
function paginate($start, $stop, $total, $summarize, $tplPaginateNext, $tplPaginatePrevious, $paginateAlwaysShowLinks, $paginateSplitterCharacter) {
global $modx, $dittoID;
if ($stop == 0 || $total == 0 || $summarize==0) {
return false;
}
$next = $start + $summarize;
$nextlink = "" . $tplPaginateNext . "";
$previous = $start - $summarize;
$previouslink = "" . $tplPaginatePrevious . "";
$limten = $summarize + $start;
if ($paginateAlwaysShowLinks == 1) {
$previousplaceholder = "" . $tplPaginatePrevious . "";
$nextplaceholder = "" . $tplPaginateNext . "";
} else {
$previousplaceholder = "";
$nextplaceholder = "";
}
$split = "";
if ($previous > -1 && $next < $total)
$split = $paginateSplitterCharacter;
if ($previous > -1)
$previousplaceholder = $previouslink;
if ($next < $total)
$nextplaceholder = $nextlink;
if ($start < $total)
$stop = $limten;
if ($limten > $total) {
$limiter = $total;
} else {
$limiter = $limten;
}
$totalpages = ceil($total / $summarize);
for ($x = 0; $x <= $totalpages -1; $x++) {
$inc = $x * $summarize;
$display = $x +1;
if ($inc != $start) {
$pages .= "$display";
} else {
$modx->setPlaceholder($dittoID."currentPage", $display);
$pages .= "$display";
}
}
$modx->setPlaceholder($dittoID."next", $nextplaceholder);
$modx->setPlaceholder($dittoID."previous", $previousplaceholder);
$modx->setPlaceholder($dittoID."splitter", $split);
$modx->setPlaceholder($dittoID."start", $start +1);
$modx->setPlaceholder($dittoID."urlStart", $start);
$modx->setPlaceholder($dittoID."stop", $limiter);
$modx->setPlaceholder($dittoID."total", $total);
$modx->setPlaceholder($dittoID."pages", $pages);
$modx->setPlaceholder($dittoID."perPage", $summarize);
$modx->setPlaceholder($dittoID."totalPages", $totalpages);
}
// ---------------------------------------------------
// Function: relToAbs
// Convert relative urls to absolute URLs
// Based on script from http://wintermute.com.au/bits/2005-09/php-relative-absolute-links/
// ---------------------------------------------------
function relToAbs($text, $base) {
return preg_replace('#(href|src)="([^:"]*)(?:")#','$1="'.$base.'$2"',$text);
}
}
?>