$c = $modx->newQuery('modResource');
$c->innerJoin('modTemplateVarResource','TemplateVarResources');
$c->where( array
(
'published' => 1,
'deleted' => 0,
'parent' => '220',
'TemplateVarResources.tmplvarid' => 21,
'TemplateVarResources.value:LIKE' => '%'.$lang.'%',
'TemplateVarResources.tmplvarid' => 20,
'TemplateVarResources.value:LIKE' => '%'.$context.'%',
));$c = $modx->newQuery('modResource');
$c->innerJoin('modTemplateVarResource','TemplateVarResources');
$c->where( array
(
array
(
'published' => 1,
'deleted' => 0,
'parent' => '220',
),
array
(
array
(
'TemplateVarResources.tmplvarid' => 21,
'TemplateVarResources.value:LIKE' => '%'.$lang.'%',
),
array
(
'TemplateVarResources.tmplvarid' => 20,
'TemplateVarResources.value:LIKE' => '%'.$context.'%',
),
),
));
function tvFilters($tvFilters = '', &$criteria)
{
$tvFilters = !empty($tvFilters) ? explode('||', $tvFilters) : array();
if (!empty($tvFilters)) {
$tmplVarTbl = $this->modx->getTableName('modTemplateVar');
$tmplVarResourceTbl = $this->modx->getTableName('modTemplateVarResource');
$conditions = array();
$operators = array(
'<=>' => '<=>',
'===' => '=',
'!==' => '!=',
'<>' => '<>',
'==' => 'LIKE',
'!=' => 'NOT LIKE',
'<<' => '<',
'<=' => '<=',
'=<' => '=<',
'>>' => '>',
'>=' => '>=',
'=>' => '=>');
foreach ($tvFilters as $fGroup => $tvFilter) {
$filterGroup = array();
$filters = explode(',', $tvFilter);
$multiple = count($filters) > 0;
foreach ($filters as $filter) {
$operator = '==';
$sqlOperator = 'LIKE';
foreach ($operators as $op => $opSymbol) {
if (strpos($filter, $op, 1) !== false) {
$operator = $op;
$sqlOperator = $opSymbol;
break;
}
}
$tvValueField = 'tvr.value';
$tvDefaultField = 'tv.default_text';
$f = explode($operator, $filter);
if (count($f) == 2) {
$tvName = $this->modx->quote($f[0]);
if (is_numeric($f[1]) && !in_array($sqlOperator, array('LIKE', 'NOT LIKE'))) {
$tvValue = $f[1];
if ($f[1] == (integer)$f[1]) {
$tvValueField = "CAST({$tvValueField} AS SIGNED INTEGER)";
$tvDefaultField = "CAST({$tvDefaultField} AS SIGNED INTEGER)";
} else {
$tvValueField = "CAST({$tvValueField} AS DECIMAL)";
$tvDefaultField = "CAST({$tvDefaultField} AS DECIMAL)";
}
} else {
$tvValue = $this->modx->quote($f[1]);
}
if ($multiple) {
$filterGroup[] = "(EXISTS (SELECT 1 FROM {$tmplVarResourceTbl} tvr JOIN {$tmplVarTbl} tv ON {$tvValueField} {$sqlOperator} {$tvValue} AND tv.name = {$tvName} AND tv.id = tvr.tmplvarid WHERE tvr.contentid = modResource.id) " .
"OR EXISTS (SELECT 1 FROM {$tmplVarTbl} tv WHERE tv.name = {$tvName} AND {$tvDefaultField} {$sqlOperator} {$tvValue} AND tv.id NOT IN (SELECT tmplvarid FROM {$tmplVarResourceTbl} WHERE contentid = modResource.id)) " .
")";
} else {
$filterGroup = "(EXISTS (SELECT 1 FROM {$tmplVarResourceTbl} tvr JOIN {$tmplVarTbl} tv ON {$tvValueField} {$sqlOperator} {$tvValue} AND tv.name = {$tvName} AND tv.id = tvr.tmplvarid WHERE tvr.contentid = modResource.id) " .
"OR EXISTS (SELECT 1 FROM {$tmplVarTbl} tv WHERE tv.name = {$tvName} AND {$tvDefaultField} {$sqlOperator} {$tvValue} AND tv.id NOT IN (SELECT tmplvarid FROM {$tmplVarResourceTbl} WHERE contentid = modResource.id)) " .
")";
}
} elseif (count($f) == 1) {
$tvValue = $this->modx->quote($f[0]);
if ($multiple) {
$filterGroup[] = "EXISTS (SELECT 1 FROM {$tmplVarResourceTbl} tvr JOIN {$tmplVarTbl} tv ON {$tvValueField} {$sqlOperator} {$tvValue} AND tv.id = tvr.tmplvarid WHERE tvr.contentid = modResource.id)";
} else {
$filterGroup = "EXISTS (SELECT 1 FROM {$tmplVarResourceTbl} tvr JOIN {$tmplVarTbl} tv ON {$tvValueField} {$sqlOperator} {$tvValue} AND tv.id = tvr.tmplvarid WHERE tvr.contentid = modResource.id)";
}
}
}
$conditions[] = $filterGroup;
}
if (!empty($conditions)) {
$firstGroup = true;
foreach ($conditions as $cGroup => $c) {
if (is_array($c)) {
$first = true;
foreach ($c as $cond) {
if ($first && !$firstGroup) {
$criteria->condition($criteria->query['where'][0][1], $cond, xPDOQuery::SQL_OR, null, $cGroup);
} else {
$criteria->condition($criteria->query['where'][0][1], $cond, xPDOQuery::SQL_AND, null, $cGroup);
}
$first = false;
}
} else {
$criteria->condition($criteria->query['where'][0][1], $c, $firstGroup ? xPDOQuery::SQL_AND : xPDOQuery::SQL_OR, null, $cGroup);
}
$firstGroup = false;
}
}
return true;
}
}
$filter = 'tvname1==%'.$lang.'%,tvname2==%'.$context.'%';
$c = $modx->newQuery('modResource');
$yourclassInstance->tvFilters($filter,$c);
$c->where(array
(
'published' => 1,
'deleted' => 0,
'parent' => '220',
));
$collection = $modx->getCollection('modResource',$c);global $modx;
$c = $modx->newQuery('modResource');
$c->condition( $c->query["where"][0][1], "(EXISTS (SELECT 1 FROM `modx_site_tmplvar_contentvalues` tvr JOIN `modx_site_tmplvars` tv ON tvr.value LIKE '%luponatural%' AND tv.name = 'Site' AND tv.id = tvr.tmplvarid WHERE tvr.contentid = modResource.id) OR EXISTS (SELECT 1 FROM `modx_site_tmplvars` tv WHERE tv.name = 'Site' AND tv.default_text LIKE '%luponatural%' AND tv.id NOT IN (SELECT tmplvarid FROM `modx_site_tmplvar_contentvalues` WHERE contentid = modResource.id)) )", xPDOQuery::SQL_AND, null, "0");
$c->where( array
(
'published' => 1,
'deleted' => 0,
'parent' => '220',
));
$children = $modx->getCollection('modResource',$c);function sortbyTV( $sortbyTV, $criteria, $sortdirTV='ASC', $sortbyTVType='string')
{
global $modx;
$columns = $modx->getSelectColumns('modResource', 'modResource');
$criteria->select($columns);
if (!empty($sortbyTV)) {
$criteria->leftJoin('modTemplateVar', 'tvDefault', array(
"tvDefault.name" => $sortbyTV
));
$criteria->leftJoin('modTemplateVarResource', 'tvSort', array(
"tvSort.contentid = modResource.id",
"tvSort.tmplvarid = tvDefault.id"
));
if (empty($sortbyTVType)) $sortbyTVType = 'string';
if ($modx->getOption('dbtype') === 'mysql') {
switch ($sortbyTVType) {
case 'integer':
$criteria->select("CAST(IFNULL(tvSort.value, tvDefault.default_text) AS SIGNED INTEGER) AS sortTV");
break;
case 'decimal':
$criteria->select("CAST(IFNULL(tvSort.value, tvDefault.default_text) AS DECIMAL) AS sortTV");
break;
case 'datetime':
$criteria->select("CAST(IFNULL(tvSort.value, tvDefault.default_text) AS DATETIME) AS sortTV");
break;
case 'string':
default:
$criteria->select("IFNULL(tvSort.value, tvDefault.default_text) AS sortTV");
break;
}
} elseif ($modx->getOption('dbtype') === 'sqlsrv') {
switch ($sortbyTVType) {
case 'integer':
$criteria->select("CAST(ISNULL(tvSort.value, tvDefault.default_text) AS BIGINT) AS sortTV");
break;
case 'decimal':
$criteria->select("CAST(ISNULL(tvSort.value, tvDefault.default_text) AS DECIMAL) AS sortTV");
break;
case 'datetime':
$criteria->select("CAST(ISNULL(tvSort.value, tvDefault.default_text) AS DATETIME) AS sortTV");
break;
case 'string':
default:
$criteria->select("ISNULL(tvSort.value, tvDefault.default_text) AS sortTV");
break;
}
}
$criteria->sortby("sortTV", $sortdirTV);
}
}sortbyTV( 'myTVName', $c, 'ASC');