зеркало из https://github.com/mozilla/gecko-dev.git
239 строки
7.9 KiB
PHP
239 строки
7.9 KiB
PHP
<?php
|
|
uses('Sanitize');
|
|
class Application extends AppModel {
|
|
var $name = 'Application';
|
|
|
|
/* Rather than adding this association here, only add it when you need it.
|
|
* Otherwise queries become very slow (since the result table is so large). Just
|
|
* call the following before you need to join the tables:
|
|
* $this->bindModel(array('hasOne' => array('Result')));
|
|
*/
|
|
//var $hasOne = array('Result');
|
|
|
|
var $hasAndBelongsToMany = array(
|
|
'Collection' => array( 'className' => 'Collection',
|
|
'joinTable' => 'applications_collections',
|
|
'foreignKey' => 'application_id',
|
|
'associationForeignKey' => 'collection_id'
|
|
)
|
|
);
|
|
|
|
var $Sanitize;
|
|
|
|
function Application() {
|
|
parent::AppModel();
|
|
|
|
$this->Sanitize = new Sanitize();
|
|
}
|
|
|
|
/**
|
|
* Expecting to have cake's version of $_GET
|
|
* Will return the default APP+Version if given invalid input.
|
|
*/
|
|
function getIdFromUrl($params)
|
|
{
|
|
$_conditions = array();
|
|
|
|
// defaults
|
|
if (empty($params['product'])) {
|
|
array_push($_conditions, "`Application`.`name` LIKE '".DEFAULT_APP_NAME."'");
|
|
array_push($_conditions, "`Application`.`version` LIKE '".DEFAULT_APP_VERSION."'");
|
|
} else {
|
|
// product's come in looking like:
|
|
// Mozilla Firefox 1.5.0.1
|
|
$_exp = explode(' ',urldecode($params['product']));
|
|
|
|
if(count($_exp) == 3) {
|
|
$_product = $_exp[0].' '.$_exp[1];
|
|
|
|
$_version = $_exp[2];
|
|
|
|
array_push($_conditions, "`Application`.`name` LIKE '{$_product}'");
|
|
array_push($_conditions, "`Application`.`version` LIKE '{$_version}'");
|
|
} else {
|
|
array_push($_conditions, "`Application`.`name` LIKE '".DEFAULT_APP_NAME."'");
|
|
array_push($_conditions, "`Application`.`version` LIKE '".DEFAULT_APP_VERSION."'");
|
|
}
|
|
}
|
|
|
|
$_application_id = $this->findAll($_conditions, 'Application.id');
|
|
if (is_numeric($_application_id[0]['Application']['id'])) {
|
|
return $_application_id[0]['Application']['id'];
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int application id
|
|
* @return array set of intentions
|
|
*/
|
|
function getIntentions($id) {
|
|
// this should never happen...
|
|
if (!is_numeric($id)) {
|
|
return array();
|
|
}
|
|
|
|
$_max_id = $this->getMaxCollectionId($id,'intention');
|
|
if (!is_numeric($_max_id[0][0]['max'])) {
|
|
return array();
|
|
}
|
|
|
|
$_query = "
|
|
SELECT
|
|
*
|
|
FROM
|
|
applications
|
|
JOIN applications_collections ON application_id = applications.id
|
|
JOIN collections ON collections.id = applications_collections.collection_id
|
|
JOIN choices_collections ON choices_collections.collection_id = collections.id
|
|
JOIN choices ON choices.id = choices_collections.choice_id
|
|
WHERE
|
|
applications.id={$id}
|
|
AND
|
|
choices.type='intention'
|
|
AND
|
|
collections.id={$_max_id[0][0]['max']}
|
|
";
|
|
|
|
return $this->query($_query);
|
|
}
|
|
|
|
/**
|
|
* @param int application id
|
|
* @return array set of issues
|
|
*/
|
|
function getIssues($id)
|
|
{
|
|
// this should never happen...
|
|
if (!is_numeric($id)) {
|
|
return array();
|
|
}
|
|
|
|
$_max_id = $this->getMaxCollectionId($id,'issue');
|
|
if (!is_numeric($_max_id[0][0]['max'])) {
|
|
return array();
|
|
}
|
|
|
|
|
|
$_query = "
|
|
SELECT
|
|
*
|
|
FROM
|
|
applications
|
|
JOIN applications_collections ON application_id = applications.id
|
|
JOIN collections ON collections.id = applications_collections.collection_id
|
|
JOIN choices_collections ON choices_collections.collection_id = collections.id
|
|
JOIN choices ON choices.id = choices_collections.choice_id
|
|
WHERE
|
|
applications.id={$id}
|
|
AND
|
|
choices.type='issue'
|
|
AND
|
|
collections.id={$_max_id[0][0]['max']}
|
|
";
|
|
|
|
return $this->query($_query);
|
|
}
|
|
|
|
function getMaxCollectionId($id, $type)
|
|
{
|
|
if (!is_numeric($id)) {
|
|
return false;
|
|
}
|
|
$_type = $this->Sanitize->sql($type);
|
|
|
|
$_query = "
|
|
SELECT
|
|
MAX(collections.id) as max
|
|
FROM
|
|
applications
|
|
JOIN applications_collections ON application_id = applications.id
|
|
JOIN collections ON collections.id = applications_collections.collection_id
|
|
JOIN choices_collections ON choices_collections.collection_id = collections.id
|
|
JOIN choices ON choices.id = choices_collections.choice_id
|
|
WHERE
|
|
applications.id={$id}
|
|
AND
|
|
choices.type='{$_type}'
|
|
";
|
|
|
|
return $this->query($_query);
|
|
}
|
|
|
|
|
|
/**
|
|
* @param array cake url array
|
|
* @return array set of collections
|
|
*/
|
|
function getCollectionsFromUrl($params, $type)
|
|
{
|
|
// Clean parameters for inserting into SQL
|
|
$params = $this->cleanArrayForSql($params);
|
|
|
|
$_conditions = "1=1";
|
|
// Firstly, determine our application
|
|
if (!empty($params['product'])) {
|
|
|
|
// product's come in looking like:
|
|
// Mozilla Firefox 1.5.0.1
|
|
$_exp = explode(' ',urldecode($params['product']));
|
|
|
|
if(count($_exp) == 3) {
|
|
$_product = $_exp[0].' '.$_exp[1];
|
|
|
|
$_version = $_exp[2];
|
|
|
|
$_conditions .= " AND `Application`.`name` LIKE '{$_product}'";
|
|
$_conditions .= " AND `Application`.`version` LIKE '{$_version}'";
|
|
} else {
|
|
// defaults I guess?
|
|
$_conditions .= " AND `Application`.`name` LIKE '".DEFAULT_APP_NAME."'";
|
|
$_conditions .= " AND `Application`.`version` LIKE '".DEFAULT_APP_VERSION."'";
|
|
}
|
|
} else {
|
|
// I'm providing a default here, because otherwise all results will be
|
|
// returned (across all applications) and that is not desired
|
|
$_conditions .= " AND `Application`.`name` LIKE '".DEFAULT_APP_NAME."'";
|
|
$_conditions .= " AND `Application`.`version` LIKE '".DEFAULT_APP_VERSION."'";
|
|
}
|
|
|
|
$_application_id = $this->findAll($_conditions, 'Application.id');
|
|
return $this->getCollections($_application_id[0]['Application']['id'], $type);
|
|
}
|
|
|
|
/**
|
|
* @param int application id
|
|
* @param string choice type (either 'issue' or 'intention' right now)
|
|
* @return array set of collections
|
|
*/
|
|
function getCollections($id, $type)
|
|
{
|
|
// this should never happen...
|
|
if (!is_numeric($id)) {
|
|
return array();
|
|
}
|
|
|
|
$_type = $this->Sanitize->sql($type);
|
|
$_query = "
|
|
SELECT
|
|
*
|
|
FROM
|
|
applications
|
|
JOIN applications_collections ON application_id = applications.id
|
|
JOIN collections ON collections.id = applications_collections.collection_id
|
|
JOIN choices_collections ON choices_collections.collection_id = collections.id
|
|
JOIN choices ON choices.id = choices_collections.choice_id
|
|
WHERE
|
|
applications.id={$id}
|
|
AND
|
|
choices.type='{$_type}'
|
|
GROUP BY collections.description
|
|
ORDER BY collections.id DESC";
|
|
|
|
return $this->query($_query);
|
|
}
|
|
|
|
}
|
|
?>
|