browse apps: Add support for only showing downloadable apps
This commit is contained in:
committed by
Chris Morgan
parent
fc379cb4a1
commit
a1410d38c6
@@ -949,10 +949,20 @@ class Application {
|
||||
|
||||
$sExtraTables = '';
|
||||
$sWhereFilter = $oFilters ? $oFilters->getWhereClause() : '';
|
||||
if($sWhereFilter)
|
||||
$aOptions = $oFilters ? $oFilters->getOptions() : array('onlyDownloadable' => 'false');
|
||||
|
||||
if($sWhereFilter || $aOptions['onlyDownloadable'] == 'true')
|
||||
{
|
||||
$sExtraTables = ',appVersion';
|
||||
$sWhereFilter = " AND appVersion.appId = appFamily.appId AND $sWhereFilter";
|
||||
if($sWhereFilter)
|
||||
$sWhereFilter = " AND $sWhereFilter";
|
||||
$sWhereFilter = " AND appVersion.state = 'accepted' AND appVersion.appId = appFamily.appId $sWhereFilter";
|
||||
}
|
||||
|
||||
if($aOptions['onlyDownloadable'] == 'true')
|
||||
{
|
||||
$sExtraTables .= ',appData';
|
||||
$sWhereFilter .= " AND appData.type = 'downloadurl' AND appData.versionId = appVersion.versionId AND appData.state = 'accepted'";
|
||||
}
|
||||
/* Should we add a limit clause to the query? */
|
||||
if($iRows || $iStart)
|
||||
@@ -1025,6 +1035,7 @@ class Application {
|
||||
$oFilter->AddFilterInfo('appVersion.rating', 'Rating', array(FILTER_EQUALS, FILTER_LESS_THAN, FILTER_GREATER_THAN), FILTER_VALUES_ENUM, array('Platinum', 'Gold', 'Silver', 'Bronze', 'Garbage'));
|
||||
$oFilter->AddFilterInfo('appFamily.catId', 'Category', array(FILTER_EQUALS), FILTER_VALUES_ENUM, $aCatIds, $aCatNames);
|
||||
$oFilter->AddFilterInfo('appVersion.license', 'License', array(FILTER_EQUALS), FILTER_VALUES_ENUM, $aLicenses);
|
||||
$oFilter->AddFilterInfo('onlyDownloadable', 'Only show downloadable apps', array(FILTER_OPTION_BOOL), FILTER_VALUES_OPTION_BOOL, array('false','true'));
|
||||
return $oFilter;
|
||||
}
|
||||
|
||||
@@ -1167,10 +1178,20 @@ class Application {
|
||||
{
|
||||
$sExtraTables = '';
|
||||
$sWhereFilter = $oFilters ? $oFilters->getWhereClause() : '';
|
||||
if($sWhereFilter)
|
||||
$aOptions = $oFilters ? $oFilters->getOptions() : array('onlyDownloadable' => 'false');
|
||||
|
||||
if($sWhereFilter || $aOptions['onlyDownloadable'] == 'true')
|
||||
{
|
||||
$sExtraTables = ',appVersion';
|
||||
$sWhereFilter = " AND appVersion.appId = appFamily.appId AND $sWhereFilter";
|
||||
if($sWhereFilter)
|
||||
$sWhereFilter = " AND $sWhereFilter";
|
||||
$sWhereFilter = " AND appVersion.appId = appFamily.appId $sWhereFilter";
|
||||
}
|
||||
|
||||
if($aOptions['onlyDownloadable'] == 'true')
|
||||
{
|
||||
$sExtraTables .= ',appData';
|
||||
$sWhereFilter .= " AND appData.type = 'downloadurl' AND appData.versionId = appVersion.versionId";
|
||||
}
|
||||
|
||||
if($sState != 'accepted' && !application::canEdit())
|
||||
|
||||
@@ -14,7 +14,7 @@ define('FILTER_GREATER_THAN', 3);
|
||||
define('FILTER_LESS_THAN', 4);
|
||||
define('FILTER_NOT_EQUALS', 5);
|
||||
define('FILTER_NOT_LIKE', 6);
|
||||
define('FILTER_ENUM', 7);
|
||||
define('FILTER_OPTION_BOOL', 7);
|
||||
|
||||
/* A filter as part of an SQL query, such as something = 'somevalue' */
|
||||
class Filter
|
||||
@@ -72,8 +72,13 @@ class Filter
|
||||
}
|
||||
}
|
||||
|
||||
public function getFilter()
|
||||
/* Gets an SQL expression representing the current filter, for use in a WHERE clause */
|
||||
public function getExpression()
|
||||
{
|
||||
/* We let callers handle options themselves, so don't include them in the WHERE clause */
|
||||
if($this->iType == FILTER_OPTION_BOOL)
|
||||
return '';
|
||||
|
||||
$sOp = $this->getOperator();
|
||||
|
||||
return "{$this->sColumn} $sOp '{$this->sData}'";
|
||||
@@ -150,18 +155,18 @@ class FilterSet
|
||||
|
||||
public function getWhereClause()
|
||||
{
|
||||
$sFilter = '';
|
||||
$aFilters = array();
|
||||
for($i = 0; $i < sizeof($this->aFilters); $i++)
|
||||
{
|
||||
$oFilter = $this->aFilters[$i];
|
||||
|
||||
$sFilter .= $oFilter->getFilter();
|
||||
$sThisFilter = $oFilter->getExpression();
|
||||
|
||||
if($i < sizeof($this->aFilters) - 1)
|
||||
$sFilter .= ' AND ';
|
||||
if($sThisFilter)
|
||||
$aFilters[] = $sThisFilter;
|
||||
}
|
||||
|
||||
return $sFilter;
|
||||
return implode($aFilters, ' AND ');
|
||||
}
|
||||
|
||||
function getQuery($sTable, $iLimit = 0)
|
||||
|
||||
@@ -13,6 +13,7 @@ require_once('db_filter.php');
|
||||
define(FILTER_VALUES_NORMAL, 1);
|
||||
define(FILTER_VALUES_ENUM, 2);
|
||||
define(FILTER_VALUES_BOOL, 3);
|
||||
define(FILTER_VALUES_OPTION, 4);
|
||||
|
||||
/* Info describing an available filter: what column it applies to,
|
||||
and what comparison options are available */
|
||||
@@ -158,6 +159,37 @@ class FilterInterface
|
||||
return $shEditor;
|
||||
}
|
||||
|
||||
public function getOptionBoolEditor($iId, Filter $oFilter)
|
||||
{
|
||||
$sColumn = $this->escapeChars($oFilter->getColumn());
|
||||
$oColumn = $this->aFilterInfo[$oFilter->getColumn()];
|
||||
$sId = ($iId == -1) ? '' : $iId;
|
||||
|
||||
$aTypes = $oColumn->getTypes();
|
||||
$iOp = $aTypes[0];
|
||||
|
||||
if($iId == -1)
|
||||
{
|
||||
/* The first entry in the list of choices is the default */
|
||||
$aValues = $oColumn->getValueTypeData();
|
||||
$sData = $aValues[0];
|
||||
} else
|
||||
{
|
||||
$sData = $oFilter->getData();
|
||||
}
|
||||
|
||||
$shRet = "<input type=\"hidden\" name=\"i{$sColumn}Op$sId\" value=\"$iOp\" />";
|
||||
|
||||
if($sData == 'true')
|
||||
$sChecked = ' checked="checked"';
|
||||
else
|
||||
$sChecked = '';
|
||||
|
||||
$shRet .= "<input value=\"true\" $sChecked name=\"s{$sColumn}Data$sId\" type=\"checkbox\" />";
|
||||
$shRet .= ' '.$oColumn->getDisplayName();
|
||||
|
||||
return $shRet;
|
||||
}
|
||||
|
||||
public function getItemEditor($iId, Filter $oFilter)
|
||||
{
|
||||
@@ -295,21 +327,12 @@ class FilterInterface
|
||||
|
||||
public function getEditor()
|
||||
{
|
||||
$shEditor = '';
|
||||
$shNewItemsEditor = '';
|
||||
$shCurrentItemsEditor = '';
|
||||
$aCounts = array();
|
||||
|
||||
$shEditor .= '<b>Add new filter</b> <i>(You don’t have to fill out all rows.)</i><br />';
|
||||
foreach($this->aFilterInfo as $oOption)
|
||||
{
|
||||
$oDummyFilter = new Filter($oOption->getColumn(), 0, '');
|
||||
$aTypes = $oOption->getTypes();
|
||||
|
||||
$shEditor .= $this->getItemEditor(-1, $oDummyFilter);
|
||||
$shEditor .= '<br />';
|
||||
}
|
||||
|
||||
if(sizeof($this->oFilterSet->getFilters()))
|
||||
$shEditor .= '<br /><b>Active filters</b><br />';
|
||||
$shCurrentItemsEditor .= '<br /><b>Active filters</b><br />';
|
||||
foreach($this->oFilterSet->getFilters() as $oFilter)
|
||||
{
|
||||
$sColumn = $oFilter->getColumn();
|
||||
@@ -317,13 +340,33 @@ class FilterInterface
|
||||
if(!array_key_exists($sColumn, $aCounts))
|
||||
$aCounts[$sColumn] = 0;
|
||||
|
||||
$shEditor .= $this->getItemEditor($aCounts[$sColumn], $oFilter);
|
||||
$shEditor .= '<br />';
|
||||
if($oFilter->getOperatorId() == FILTER_OPTION_BOOL)
|
||||
$shCurrentItemsEditor .= $this->getOptionBoolEditor($aCounts[$sColumn], $oFilter);
|
||||
else
|
||||
$shCurrentItemsEditor .= $this->getItemEditor($aCounts[$sColumn], $oFilter);
|
||||
$shCurrentItemsEditor .= '<br />';
|
||||
|
||||
$aCounts[$sColumn]++;
|
||||
}
|
||||
|
||||
return $shEditor;
|
||||
$shNewItemsEditor .= '<b>Add new filter</b> <i>(You don’t have to fill out all rows.)</i><br />';
|
||||
foreach($this->aFilterInfo as $oOption)
|
||||
{
|
||||
$oDummyFilter = new Filter($oOption->getColumn(), 0, '');
|
||||
$aTypes = $oOption->getTypes();
|
||||
|
||||
if($oOption->getValueType() == FILTER_VALUES_OPTION_BOOL)
|
||||
{
|
||||
if(!array_key_exists($oOption->getColumn(), $aCounts))
|
||||
$shNewItemsEditor .= $this->getOptionBoolEditor(-1, $oDummyFilter);
|
||||
} else
|
||||
{
|
||||
$shNewItemsEditor .= $this->getItemEditor(-1, $oDummyFilter);
|
||||
}
|
||||
$shNewItemsEditor .= '<br />';
|
||||
}
|
||||
|
||||
return $shNewItemsEditor.$shCurrentItemsEditor;
|
||||
}
|
||||
|
||||
public function getFilterInfo()
|
||||
@@ -335,11 +378,12 @@ class FilterInterface
|
||||
public function readInputForColumn($aClean, FilterInfo $oOption)
|
||||
{
|
||||
$aReturn = array();
|
||||
$bChangedOption = false;
|
||||
|
||||
for($i = 0; array_key_exists('i'.$this->escapeChars($oOption->getColumn())."Op$i", $aClean); $i++)
|
||||
{
|
||||
$sColumn = $this->escapeChars($oOption->getColumn());
|
||||
$sData = query_escape_string($aClean["s{$sColumn}Data$i"]);
|
||||
$sData = query_escape_string(getInput("s{$sColumn}Data$i", $aClean));
|
||||
$iOp = $aClean["i{$sColumn}Op$i"];
|
||||
|
||||
if(!$iOp)
|
||||
@@ -347,6 +391,20 @@ class FilterInterface
|
||||
|
||||
$oFilter = new Filter($oOption->getColumn(), $iOp, $sData);
|
||||
|
||||
/* Only show an option as an active filter if it has been changed
|
||||
from the default */
|
||||
if($oOption->getValueType() == FILTER_VALUES_OPTION_BOOL)
|
||||
{
|
||||
/* The default option is the first entry in the list of choices */
|
||||
$aChoices = $oOption->getValueTypeData();
|
||||
$sDefault = $aChoices[0];
|
||||
if(!$sData)
|
||||
$sData = 'false';
|
||||
if($sData == $sDefault)
|
||||
continue;
|
||||
$bChangedOption = true;
|
||||
}
|
||||
|
||||
$aReturn[] = $oFilter;
|
||||
}
|
||||
|
||||
@@ -357,7 +415,8 @@ class FilterInterface
|
||||
$sData = $aClean["s{$sColumn}Data"];
|
||||
$iOp = $aClean["i{$sColumn}Op"];
|
||||
|
||||
if($iOp && $sData)
|
||||
|
||||
if($iOp && $sData && ($oOption->getValueType() != FILTER_VALUES_OPTON_BOOL || !$bChangedOoption))
|
||||
{
|
||||
$oFilter = new Filter($oOption->getColumn(), $iOp, $sData);
|
||||
$aReturn[] = $oFilter;
|
||||
@@ -393,6 +452,29 @@ class FilterInterface
|
||||
return $this->oFilterSet->getFilterCount();
|
||||
}
|
||||
|
||||
/* Returns an array of options, where the keys are the columns and the members
|
||||
are the settings themselves */
|
||||
public function getOptions()
|
||||
{
|
||||
$aOptions = array();
|
||||
foreach($this->oFilterSet->getFilters() as $oFilter)
|
||||
{
|
||||
if($oFilter->getOperatorId() == FILTER_OPTION_BOOL)
|
||||
$aOptions[$oFilter->getColumn()] = $oFilter->getData();
|
||||
}
|
||||
foreach($this->aFilterInfo as $oFilterInfo)
|
||||
{
|
||||
if($oFilterInfo->getValueType() == FILTER_VALUES_OPTION_BOOL &&
|
||||
!array_key_exists($oFilterInfo->getColumn(), $aOptions))
|
||||
{
|
||||
$aTypes = $oFilterInfo->getTypes();
|
||||
$sDefault = $aTypes[0];
|
||||
$aOptions[$oFilterInfo->getColumn()] = $sDefault;
|
||||
}
|
||||
}
|
||||
return $aOptions;
|
||||
}
|
||||
|
||||
public function getWhereClause()
|
||||
{
|
||||
return $this->oFilterSet->getWhereClause();
|
||||
|
||||
@@ -1220,7 +1220,7 @@ class ObjectManager
|
||||
}
|
||||
|
||||
/* Make an objectManager URL based on the object and optional parameters */
|
||||
public function makeUrl($sAction = false, $iId = false, $sTitle = false)
|
||||
public function makeUrl($sAction = false, $iId = false, $sTitle = false, $bOmitFilters = false)
|
||||
{
|
||||
$sUrl = APPDB_ROOT."objectManager.php?";
|
||||
|
||||
@@ -1253,7 +1253,10 @@ class ObjectManager
|
||||
$sUrl .= "&iPage=".$this->oMultiPage->iPage;
|
||||
}
|
||||
|
||||
if($this->oFilters)
|
||||
/* Some times it is necessary to omit the filter data, for instance when using
|
||||
makeUrl() to form the action element of a form tag. This is because having
|
||||
filter data present may prevent clearing a filter */
|
||||
if($this->oFilters && !$bOmitFilters)
|
||||
$sUrl .= $this->oFilters->getUrlData();
|
||||
|
||||
if($this->oSortInfo && $this->oSortInfo->sCurrentSort)
|
||||
@@ -1338,7 +1341,7 @@ class ObjectManager
|
||||
/* Show filter info */
|
||||
if($this->oFilters)
|
||||
{
|
||||
echo "<form method=\"post\" action=\"".$this->makeUrl()."\" >";
|
||||
echo "<form method=\"post\" action=\"".$this->makeUrl(false, false, false, true)."\" >";
|
||||
|
||||
echo $this->oFilters->getEditor();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user