browse apps: Add support for only showing downloadable apps

This commit is contained in:
Alexander Nicolaysen Sørnes
2008-06-15 00:53:34 +02:00
committed by Chris Morgan
parent fc379cb4a1
commit a1410d38c6
4 changed files with 143 additions and 32 deletions

View File

@@ -949,10 +949,20 @@ class Application {
$sExtraTables = ''; $sExtraTables = '';
$sWhereFilter = $oFilters ? $oFilters->getWhereClause() : ''; $sWhereFilter = $oFilters ? $oFilters->getWhereClause() : '';
if($sWhereFilter) $aOptions = $oFilters ? $oFilters->getOptions() : array('onlyDownloadable' => 'false');
if($sWhereFilter || $aOptions['onlyDownloadable'] == 'true')
{ {
$sExtraTables = ',appVersion'; $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? */ /* Should we add a limit clause to the query? */
if($iRows || $iStart) 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('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('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('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; return $oFilter;
} }
@@ -1167,10 +1178,20 @@ class Application {
{ {
$sExtraTables = ''; $sExtraTables = '';
$sWhereFilter = $oFilters ? $oFilters->getWhereClause() : ''; $sWhereFilter = $oFilters ? $oFilters->getWhereClause() : '';
if($sWhereFilter) $aOptions = $oFilters ? $oFilters->getOptions() : array('onlyDownloadable' => 'false');
if($sWhereFilter || $aOptions['onlyDownloadable'] == 'true')
{ {
$sExtraTables = ',appVersion'; $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()) if($sState != 'accepted' && !application::canEdit())

View File

@@ -14,7 +14,7 @@ define('FILTER_GREATER_THAN', 3);
define('FILTER_LESS_THAN', 4); define('FILTER_LESS_THAN', 4);
define('FILTER_NOT_EQUALS', 5); define('FILTER_NOT_EQUALS', 5);
define('FILTER_NOT_LIKE', 6); 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' */ /* A filter as part of an SQL query, such as something = 'somevalue' */
class Filter 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(); $sOp = $this->getOperator();
return "{$this->sColumn} $sOp '{$this->sData}'"; return "{$this->sColumn} $sOp '{$this->sData}'";
@@ -150,18 +155,18 @@ class FilterSet
public function getWhereClause() public function getWhereClause()
{ {
$sFilter = ''; $aFilters = array();
for($i = 0; $i < sizeof($this->aFilters); $i++) for($i = 0; $i < sizeof($this->aFilters); $i++)
{ {
$oFilter = $this->aFilters[$i]; $oFilter = $this->aFilters[$i];
$sFilter .= $oFilter->getFilter(); $sThisFilter = $oFilter->getExpression();
if($i < sizeof($this->aFilters) - 1) if($sThisFilter)
$sFilter .= ' AND '; $aFilters[] = $sThisFilter;
} }
return $sFilter; return implode($aFilters, ' AND ');
} }
function getQuery($sTable, $iLimit = 0) function getQuery($sTable, $iLimit = 0)

View File

@@ -13,6 +13,7 @@ require_once('db_filter.php');
define(FILTER_VALUES_NORMAL, 1); define(FILTER_VALUES_NORMAL, 1);
define(FILTER_VALUES_ENUM, 2); define(FILTER_VALUES_ENUM, 2);
define(FILTER_VALUES_BOOL, 3); define(FILTER_VALUES_BOOL, 3);
define(FILTER_VALUES_OPTION, 4);
/* Info describing an available filter: what column it applies to, /* Info describing an available filter: what column it applies to,
and what comparison options are available */ and what comparison options are available */
@@ -158,6 +159,37 @@ class FilterInterface
return $shEditor; 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) public function getItemEditor($iId, Filter $oFilter)
{ {
@@ -295,21 +327,12 @@ class FilterInterface
public function getEditor() public function getEditor()
{ {
$shEditor = ''; $shNewItemsEditor = '';
$shCurrentItemsEditor = '';
$aCounts = array(); $aCounts = array();
$shEditor .= '<b>Add new filter</b> <i>(You don&#8217;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())) 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) foreach($this->oFilterSet->getFilters() as $oFilter)
{ {
$sColumn = $oFilter->getColumn(); $sColumn = $oFilter->getColumn();
@@ -317,13 +340,33 @@ class FilterInterface
if(!array_key_exists($sColumn, $aCounts)) if(!array_key_exists($sColumn, $aCounts))
$aCounts[$sColumn] = 0; $aCounts[$sColumn] = 0;
$shEditor .= $this->getItemEditor($aCounts[$sColumn], $oFilter); if($oFilter->getOperatorId() == FILTER_OPTION_BOOL)
$shEditor .= '<br />'; $shCurrentItemsEditor .= $this->getOptionBoolEditor($aCounts[$sColumn], $oFilter);
else
$shCurrentItemsEditor .= $this->getItemEditor($aCounts[$sColumn], $oFilter);
$shCurrentItemsEditor .= '<br />';
$aCounts[$sColumn]++; $aCounts[$sColumn]++;
} }
return $shEditor; $shNewItemsEditor .= '<b>Add new filter</b> <i>(You don&#8217;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() public function getFilterInfo()
@@ -335,11 +378,12 @@ class FilterInterface
public function readInputForColumn($aClean, FilterInfo $oOption) public function readInputForColumn($aClean, FilterInfo $oOption)
{ {
$aReturn = array(); $aReturn = array();
$bChangedOption = false;
for($i = 0; array_key_exists('i'.$this->escapeChars($oOption->getColumn())."Op$i", $aClean); $i++) for($i = 0; array_key_exists('i'.$this->escapeChars($oOption->getColumn())."Op$i", $aClean); $i++)
{ {
$sColumn = $this->escapeChars($oOption->getColumn()); $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"]; $iOp = $aClean["i{$sColumn}Op$i"];
if(!$iOp) if(!$iOp)
@@ -347,6 +391,20 @@ class FilterInterface
$oFilter = new Filter($oOption->getColumn(), $iOp, $sData); $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; $aReturn[] = $oFilter;
} }
@@ -357,7 +415,8 @@ class FilterInterface
$sData = $aClean["s{$sColumn}Data"]; $sData = $aClean["s{$sColumn}Data"];
$iOp = $aClean["i{$sColumn}Op"]; $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); $oFilter = new Filter($oOption->getColumn(), $iOp, $sData);
$aReturn[] = $oFilter; $aReturn[] = $oFilter;
@@ -393,6 +452,29 @@ class FilterInterface
return $this->oFilterSet->getFilterCount(); 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() public function getWhereClause()
{ {
return $this->oFilterSet->getWhereClause(); return $this->oFilterSet->getWhereClause();

View File

@@ -1220,7 +1220,7 @@ class ObjectManager
} }
/* Make an objectManager URL based on the object and optional parameters */ /* 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?"; $sUrl = APPDB_ROOT."objectManager.php?";
@@ -1253,7 +1253,10 @@ class ObjectManager
$sUrl .= "&amp;iPage=".$this->oMultiPage->iPage; $sUrl .= "&amp;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(); $sUrl .= $this->oFilters->getUrlData();
if($this->oSortInfo && $this->oSortInfo->sCurrentSort) if($this->oSortInfo && $this->oSortInfo->sCurrentSort)
@@ -1338,7 +1341,7 @@ class ObjectManager
/* Show filter info */ /* Show filter info */
if($this->oFilters) 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(); echo $this->oFilters->getEditor();