feat(legacy): add filename block criteria (#3015)

### Description

Adds filename block criteria because sometimes you just need the
filename and the ID3 tags won't do.

Closes  #3014
This commit is contained in:
dakriy 2024-06-22 02:51:59 -07:00 committed by GitHub
parent 7f3f318601
commit 4642b6c08e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 269 additions and 394 deletions

View File

@ -73,7 +73,7 @@
"js/airtime/nowplaying/register.js": "7d1e5d38eee510c22e408077155ab672", "js/airtime/nowplaying/register.js": "7d1e5d38eee510c22e408077155ab672",
"js/airtime/player/player.js": "76a78bfc1bac0c5479916d9d4641a5b1", "js/airtime/player/player.js": "76a78bfc1bac0c5479916d9d4641a5b1",
"js/airtime/player/playerhtml5.js": "058b061891abf4b3ee827c8e83996611", "js/airtime/player/playerhtml5.js": "058b061891abf4b3ee827c8e83996611",
"js/airtime/playlist/smart_blockbuilder.js": "36337e7e025d89976d754e34fc914887", "js/airtime/playlist/smart_blockbuilder.js": "9e6bbad77150a589a6efd3b7da80a03b",
"js/airtime/playouthistory/configuretemplate.js": "44386f366d2baca3039f8c4cb9cd4422", "js/airtime/playouthistory/configuretemplate.js": "44386f366d2baca3039f8c4cb9cd4422",
"js/airtime/playouthistory/historytable.js": "7e84ee76011ecf8f21abdd483487a45e", "js/airtime/playouthistory/historytable.js": "7e84ee76011ecf8f21abdd483487a45e",
"js/airtime/playouthistory/template.js": "742af1a411aef1745fa2ad3082499452", "js/airtime/playouthistory/template.js": "742af1a411aef1745fa2ad3082499452",

View File

@ -2,149 +2,11 @@
class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
{ {
private $criteriaOptions;
private $stringCriteriaOptions;
private $numericCriteriaOptions;
private $dateTimeCriteriaOptions;
private $timePeriodCriteriaOptions; private $timePeriodCriteriaOptions;
private $sortOptions; private $sortOptions;
private $limitOptions; private $limitOptions;
private $isOrNotCriteriaOptions;
private $trackTypeOptions; private $trackTypeOptions;
/* We need to know if the criteria value will be a string
* or numeric value in order to populate the modifier
* select list
*/
private $criteriaTypes = [
0 => '',
'album_title' => 's',
'bit_rate' => 'n',
'bpm' => 'n',
'composer' => 's',
'conductor' => 's',
'copyright' => 's',
'cuein' => 'n',
'cueout' => 'n',
'description' => 's',
'artist_name' => 's',
'encoded_by' => 's',
'utime' => 'd',
'mtime' => 'd',
'lptime' => 'd',
'genre' => 's',
'isrc_number' => 's',
'label' => 's',
'language' => 's',
'length' => 'n',
'mime' => 's',
'mood' => 's',
'owner_id' => 's',
'replay_gain' => 'n',
'sample_rate' => 'n',
'track_title' => 's',
'track_number' => 'n',
'info_url' => 's',
'year' => 'n',
'track_type_id' => 'tt',
];
private function getCriteriaOptions($option = null)
{
if (!isset($this->criteriaOptions)) {
$this->criteriaOptions = [
0 => _('Select criteria'),
'album_title' => _('Album'),
'bit_rate' => _('Bit Rate (Kbps)'),
'bpm' => _('BPM'),
'composer' => _('Composer'),
'conductor' => _('Conductor'),
'copyright' => _('Copyright'),
'cuein' => _('Cue In'),
'cueout' => _('Cue Out'),
'description' => _('Description'),
'artist_name' => _('Creator'),
'encoded_by' => _('Encoded By'),
'genre' => _('Genre'),
'isrc_number' => _('ISRC'),
'label' => _('Label'),
'language' => _('Language'),
'mtime' => _('Last Modified'),
'lptime' => _('Last Played'),
'length' => _('Length'),
'track_type_id' => _('Track Type'),
'mime' => _('Mime'),
'mood' => _('Mood'),
'owner_id' => _('Owner'),
'replay_gain' => _('Replay Gain'),
'sample_rate' => _('Sample Rate (kHz)'),
'track_title' => _('Title'),
'track_number' => _('Track Number'),
'utime' => _('Uploaded'),
'info_url' => _('Website'),
'year' => _('Year'),
];
}
if (is_null($option)) {
return $this->criteriaOptions;
}
return $this->criteriaOptions[$option];
}
private function getStringCriteriaOptions()
{
if (!isset($this->stringCriteriaOptions)) {
$this->stringCriteriaOptions = [
'0' => _('Select modifier'),
'contains' => _('contains'),
'does not contain' => _('does not contain'),
'is' => _('is'),
'is not' => _('is not'),
'starts with' => _('starts with'),
'ends with' => _('ends with'),
];
}
return $this->stringCriteriaOptions;
}
private function getNumericCriteriaOptions()
{
if (!isset($this->numericCriteriaOptions)) {
$this->numericCriteriaOptions = [
'0' => _('Select modifier'),
'is' => _('is'),
'is not' => _('is not'),
'is greater than' => _('is greater than'),
'is less than' => _('is less than'),
'is in the range' => _('is in the range'),
];
}
return $this->numericCriteriaOptions;
}
private function getDateTimeCriteriaOptions()
{
if (!isset($this->dateTimeCriteriaOptions)) {
$this->dateTimeCriteriaOptions = [
'0' => _('Select modifier'),
'before' => _('before'),
'after' => _('after'),
'between' => _('between'),
'is' => _('is'),
'is not' => _('is not'),
'is greater than' => _('is greater than'),
'is less than' => _('is less than'),
'is in the range' => _('is in the range'),
];
}
return $this->dateTimeCriteriaOptions;
}
private function getTimePeriodCriteriaOptions() private function getTimePeriodCriteriaOptions()
{ {
if (!isset($this->timePeriodCriteriaOptions)) { if (!isset($this->timePeriodCriteriaOptions)) {
@ -191,19 +53,6 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
return $this->sortOptions; return $this->sortOptions;
} }
private function getIsNotOptions()
{
if (!isset($this->isOrNotCriteriaOptions)) {
$this->isOrNotCriteriaOptions = [
'0' => _('Select modifier'),
'is' => _('is'),
'is not' => _('is not'),
];
}
return $this->isOrNotCriteriaOptions;
}
private function getTracktypeOptions() private function getTracktypeOptions()
{ {
if (!isset($this->trackTypeOptions)) { if (!isset($this->trackTypeOptions)) {
@ -297,7 +146,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
} }
// the way the everything is currently built it setups 25 smartblock criteria forms and then disables them // the way the everything is currently built it setups 25 smartblock criteria forms and then disables them
// but this creates 29 elements // but this creates 29 elements
$numElements = count($this->getCriteriaOptions()); $numElements = count(BlockCriteria::displayCriteria());
// loop through once for each potential criteria option ie album, composer, track // loop through once for each potential criteria option ie album, composer, track
// criteria from different groups are separated already by the getCriteriaGrouped call // criteria from different groups are separated already by the getCriteriaGrouped call
@ -335,7 +184,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$criteria->setAttrib('class', 'input_select sp_input_select' . $invisible) $criteria->setAttrib('class', 'input_select sp_input_select' . $invisible)
->setValue('Select criteria') ->setValue('Select criteria')
->setDecorators(['viewHelper']) ->setDecorators(['viewHelper'])
->setMultiOptions($this->getCriteriaOptions()); ->setMultiOptions(BlockCriteria::displayCriteria());
// if this isn't the first criteria and there isn't an entry for it already disable it // if this isn't the first criteria and there isn't an entry for it already disable it
if ($i != 0 && !isset($criteriaKeys[$i])) { if ($i != 0 && !isset($criteriaKeys[$i])) {
$criteria->setAttrib('disabled', 'disabled'); $criteria->setAttrib('disabled', 'disabled');
@ -344,8 +193,9 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
// the j loop starts at 0 and grows for each item matching the same criteria // the j loop starts at 0 and grows for each item matching the same criteria
// look up the criteria type using the criteriaTypes function from above based upon the criteria value // look up the criteria type using the criteriaTypes function from above based upon the criteria value
if (isset($criteriaKeys[$i])) { if (isset($criteriaKeys[$i])) {
$criteriaType = $this->criteriaTypes[$storedCrit['crit'][$criteriaKeys[$i]][$j]['criteria']]; $bCriteria = BlockCriteria::get($storedCrit['crit'][$criteriaKeys[$i]][$j]['criteria']);
$criteria->setValue($storedCrit['crit'][$criteriaKeys[$i]][$j]['criteria']); $criteriaType = $bCriteria->type;
$criteria->setValue($bCriteria->key);
} }
$this->addElement($criteria); $this->addElement($criteria);
@ -361,18 +211,10 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
} }
// determine the modifier based upon criteria type which is looked up based upon an array // determine the modifier based upon criteria type which is looked up based upon an array
if (isset($criteriaKeys[$i])) { if (isset($criteriaKeys[$i])) {
if ($criteriaType == 's') { $criteriaModifers->setMultiOptions($bCriteria->displayModifiers());
$criteriaModifers->setMultiOptions($this->getStringCriteriaOptions());
} elseif ($criteriaType == 'd') {
$criteriaModifers->setMultiOptions($this->getDateTimeCriteriaOptions());
} elseif ($criteriaType == 'tt') {
$criteriaModifers->setMultiOptions($this->getIsNotOptions());
} else {
$criteriaModifers->setMultiOptions($this->getNumericCriteriaOptions());
}
$criteriaModifers->setValue($storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier']); $criteriaModifers->setValue($storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier']);
} else { } else {
$criteriaModifers->setMultiOptions(['0' => _('Select modifier')]); $criteriaModifers->setMultiOptions(CriteriaModifier::mapToDisplay([]));
} }
$this->addElement($criteriaModifers); $this->addElement($criteriaModifers);
@ -381,7 +223,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
if (isset($criteriaKeys[$i])) { if (isset($criteriaKeys[$i])) {
$modifierTest = (string) $storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier']; $modifierTest = (string) $storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier'];
if ( if (
isset($criteriaType) && $criteriaType == 'tt' isset($criteriaType) && $criteriaType == ModifierType::TRACK_TYPE
&& preg_match('/is|is not/', $modifierTest) == 1 && preg_match('/is|is not/', $modifierTest) == 1
) { ) {
$criteriaValue = new Zend_Form_Element_Select('sp_criteria_value_' . $i . '_' . $j); $criteriaValue = new Zend_Form_Element_Select('sp_criteria_value_' . $i . '_' . $j);
@ -412,14 +254,14 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$relativeDateTime = false; $relativeDateTime = false;
$modifierTest = (string) $storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier']; $modifierTest = (string) $storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier'];
if ( if (
isset($criteriaType) && $criteriaType == 'd' isset($criteriaType) && $criteriaType == ModifierType::DATE
&& preg_match('/before|after|between/', $modifierTest) == 1 && preg_match('/before|after|between/', $modifierTest) == 1
) { ) {
// set relativeDatetime boolean to true so that the datetime select is displayed below // set relativeDatetime boolean to true so that the datetime select is displayed below
$relativeDateTime = true; $relativeDateTime = true;
$criteriaValue->setValue(filter_var($storedCrit['crit'][$criteriaKeys[$i]][$j]['value'], FILTER_SANITIZE_NUMBER_INT)); $criteriaValue->setValue(filter_var($storedCrit['crit'][$criteriaKeys[$i]][$j]['value'], FILTER_SANITIZE_NUMBER_INT));
} elseif ( } elseif (
isset($criteriaType) && $criteriaType == 'tt' isset($criteriaType) && $criteriaType == ModifierType::TRACK_TYPE
&& preg_match('/is|is not/', $modifierTest) == 1 && preg_match('/is|is not/', $modifierTest) == 1
) { ) {
// set relativeDatetime boolean to true so that the datetime select is displayed below // set relativeDatetime boolean to true so that the datetime select is displayed below
@ -455,7 +297,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
// check if the value is stored and it is a relative datetime field // check if the value is stored and it is a relative datetime field
if ( if (
isset($criteriaKeys[$i], $storedCrit['crit'][$criteriaKeys[$i]][$j]['value'], $criteriaType) isset($criteriaKeys[$i], $storedCrit['crit'][$criteriaKeys[$i]][$j]['value'], $criteriaType)
&& $criteriaType == 'd' && $criteriaType == ModifierType::DATE
&& preg_match('/before|after|between/', $modifierTest) == 1 && preg_match('/before|after|between/', $modifierTest) == 1
) { ) {
// need to remove any leading numbers stored in the database // need to remove any leading numbers stored in the database
@ -478,7 +320,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
->setDecorators(['viewHelper']); ->setDecorators(['viewHelper']);
if (isset($criteriaKeys[$i], $storedCrit['crit'][$criteriaKeys[$i]][$j]['extra'])) { if (isset($criteriaKeys[$i], $storedCrit['crit'][$criteriaKeys[$i]][$j]['extra'])) {
// need to check if this is a relative date time value // need to check if this is a relative date time value
if (isset($criteriaType) && $criteriaType == 'd' && $modifierTest == 'between') { if (isset($criteriaType) && $criteriaType == ModifierType::DATE && $modifierTest == 'between') {
// the criteria value will be a number followed by time unit and ago so set input to number part // the criteria value will be a number followed by time unit and ago so set input to number part
$criteriaExtra->setValue(filter_var($storedCrit['crit'][$criteriaKeys[$i]][$j]['extra'], FILTER_SANITIZE_NUMBER_INT)); $criteriaExtra->setValue(filter_var($storedCrit['crit'][$criteriaKeys[$i]][$j]['extra'], FILTER_SANITIZE_NUMBER_INT));
} else { } else {
@ -610,28 +452,21 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
foreach ($data['criteria'] as $critKey => $d) { foreach ($data['criteria'] as $critKey => $d) {
$count = 1; $count = 1;
foreach ($d as $modKey => $modInfo) { foreach ($d as $modKey => $modInfo) {
$critMod = $critKey . '_' . $modKey;
$blockCriteria = BlockCriteria::get($modInfo['sp_criteria_field']);
if ($modKey == 0) { if ($modKey == 0) {
$eleCrit = $this->getElement('sp_criteria_field_' . $critKey . '_' . $modKey); $eleCrit = $this->getElement('sp_criteria_field_' . $critMod);
$eleCrit->setValue($this->getCriteriaOptions($modInfo['sp_criteria_field'])); $eleCrit->setValue($blockCriteria->display);
$eleCrit->setAttrib('disabled', null); $eleCrit->setAttrib('disabled', null);
$eleMod = $this->getElement('sp_criteria_modifier_' . $critKey . '_' . $modKey); $eleMod = $this->getElement('sp_criteria_modifier_' . $critMod);
$criteriaType = $this->criteriaTypes[$modInfo['sp_criteria_field']];
if ($criteriaType == 's') { $eleMod->setMultiOptions($blockCriteria->displayModifiers());
$eleMod->setMultiOptions($this->getStringCriteriaOptions());
} elseif ($criteriaType == 'n') {
$eleMod->setMultiOptions($this->getNumericCriteriaOptions());
} elseif ($criteriaType == 'd') {
$eleMod->setMultiOptions($this->getDateTimeCriteriaOptions());
} elseif ($criteriaType == 'tt') {
$eleMod->setMultiOptions($this->getIsNotOptions());
} else {
$eleMod->setMultiOptions(['0' => _('Select modifier')]);
}
$eleMod->setValue($modInfo['sp_criteria_modifier']); $eleMod->setValue($modInfo['sp_criteria_modifier']);
$eleMod->setAttrib('disabled', null); $eleMod->setAttrib('disabled', null);
$eleDatetime = $this->getElement('sp_criteria_datetime_select_' . $critKey . '_' . $modKey); $eleDatetime = $this->getElement('sp_criteria_datetime_select_' . $critMod);
if ($this->enableDateTimeUnit($eleMod->getValue())) { if ($this->enableDateTimeUnit($eleMod->getValue())) {
$eleDatetime->setAttrib('enabled', 'enabled'); $eleDatetime->setAttrib('enabled', 'enabled');
$eleDatetime->setValue($modInfo['sp_criteria_datetime_select']); $eleDatetime->setValue($modInfo['sp_criteria_datetime_select']);
@ -639,17 +474,17 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
} else { } else {
$eleDatetime->setAttrib('disabled', 'disabled'); $eleDatetime->setAttrib('disabled', 'disabled');
} }
$eleValue = $this->getElement('sp_criteria_value_' . $critKey . '_' . $modKey); $eleValue = $this->getElement('sp_criteria_value_' . $critMod);
$eleValue->setValue($modInfo['sp_criteria_value']); $eleValue->setValue($modInfo['sp_criteria_value']);
$eleValue->setAttrib('disabled', null); $eleValue->setAttrib('disabled', null);
if (isset($modInfo['sp_criteria_extra'])) { if (isset($modInfo['sp_criteria_extra'])) {
$eleExtra = $this->getElement('sp_criteria_extra_' . $critKey . '_' . $modKey); $eleExtra = $this->getElement('sp_criteria_extra_' . $critMod);
$eleExtra->setValue($modInfo['sp_criteria_extra']); $eleExtra->setValue($modInfo['sp_criteria_extra']);
$eleValue->setAttrib('class', 'input_text sp_extra_input_text'); $eleValue->setAttrib('class', 'input_text sp_extra_input_text');
$eleExtra->setAttrib('disabled', null); $eleExtra->setAttrib('disabled', null);
} }
$eleExtraDatetime = $this->getElement('sp_criteria_extra_datetime_select_' . $critKey . '_' . $modKey); $eleExtraDatetime = $this->getElement('sp_criteria_extra_datetime_select_' . $critMod);
if ($eleMod->getValue() == 'between') { if ($eleMod->getValue() == 'between') {
$eleExtraDatetime->setAttrib('enabled', 'enabled'); $eleExtraDatetime->setAttrib('enabled', 'enabled');
$eleExtraDatetime->setValue($modInfo['sp_criteria_extra_datetime_select']); $eleExtraDatetime->setValue($modInfo['sp_criteria_extra_datetime_select']);
@ -658,45 +493,34 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$eleExtraDatetime->setAttrib('disabled', 'disabled'); $eleExtraDatetime->setAttrib('disabled', 'disabled');
} }
} else { } else {
$criteria = new Zend_Form_Element_Select('sp_criteria_field_' . $critKey . '_' . $modKey); $criteria = new Zend_Form_Element_Select('sp_criteria_field_' . $critMod);
$criteria->setAttrib('class', 'input_select sp_input_select sp-invisible') $criteria->setAttrib('class', 'input_select sp_input_select sp-invisible')
->setValue('Select criteria') ->setValue('Select criteria')
->setDecorators(['viewHelper']) ->setDecorators(['viewHelper'])
->setMultiOptions($this->getCriteriaOptions()); ->setMultiOptions(BlockCriteria::displayCriteria());
$criteriaType = $this->criteriaTypes[$modInfo['sp_criteria_field']]; $criteria->setValue($blockCriteria->display);
$criteria->setValue($this->getCriteriaOptions($modInfo['sp_criteria_field']));
$this->addElement($criteria); $this->addElement($criteria);
// MODIFIER // MODIFIER
$criteriaModifers = new Zend_Form_Element_Select('sp_criteria_modifier_' . $critKey . '_' . $modKey); $criteriaModifers = new Zend_Form_Element_Select('sp_criteria_modifier_' . $critMod);
$criteriaModifers->setValue('Select modifier') $criteriaModifers->setValue('Select modifier')
->setAttrib('class', 'input_select sp_input_select') ->setAttrib('class', 'input_select sp_input_select')
->setDecorators(['viewHelper']); ->setDecorators(['viewHelper']);
if ($criteriaType == 's') { $criteriaModifers->setMultiOptions($blockCriteria->displayModifiers());
$criteriaModifers->setMultiOptions($this->getStringCriteriaOptions());
} elseif ($criteriaType == 'n') {
$criteriaModifers->setMultiOptions($this->getNumericCriteriaOptions());
} elseif ($criteriaType == 'd') {
$criteriaModifers->setMultiOptions($this->getDateTimeCriteriaOptions());
} elseif ($criteriaType == 'tt') {
$criteriaModifers->setMultiOptions($this->getIsNotOptions());
} else {
$criteriaModifers->setMultiOptions(['0' => _('Select modifier')]);
}
$criteriaModifers->setValue($modInfo['sp_criteria_modifier']); $criteriaModifers->setValue($modInfo['sp_criteria_modifier']);
$this->addElement($criteriaModifers); $this->addElement($criteriaModifers);
// VALUE // VALUE
$criteriaValue = new Zend_Form_Element_Text('sp_criteria_value_' . $critKey . '_' . $modKey); $criteriaValue = new Zend_Form_Element_Text('sp_criteria_value_' . $critMod);
$criteriaValue->setAttrib('class', 'input_text sp_input_text') $criteriaValue->setAttrib('class', 'input_text sp_input_text')
->setDecorators(['viewHelper']); ->setDecorators(['viewHelper']);
$criteriaValue->setValue($modInfo['sp_criteria_value']); $criteriaValue->setValue($modInfo['sp_criteria_value']);
$this->addElement($criteriaValue); $this->addElement($criteriaValue);
// DATETIME UNIT SELECT // DATETIME UNIT SELECT
$criteriaDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_datetime_select_' . $critKey . '_' . $modKey); $criteriaDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_datetime_select_' . $critMod);
$criteriaDatetimeSelect->setAttrib('class', 'input_select sp_input_select') $criteriaDatetimeSelect->setAttrib('class', 'input_select sp_input_select')
->setDecorators(['viewHelper']); ->setDecorators(['viewHelper']);
if ($this->enableDateTimeUnit($criteriaValue->getValue())) { if ($this->enableDateTimeUnit($criteriaValue->getValue())) {
@ -708,7 +532,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$criteriaDatetimeSelect->setAttrib('disabled', 'disabled'); $criteriaDatetimeSelect->setAttrib('disabled', 'disabled');
} }
// EXTRA // EXTRA
$criteriaExtra = new Zend_Form_Element_Text('sp_criteria_extra_' . $critKey . '_' . $modKey); $criteriaExtra = new Zend_Form_Element_Text('sp_criteria_extra_' . $critMod);
$criteriaExtra->setAttrib('class', 'input_text sp_extra_input_text') $criteriaExtra->setAttrib('class', 'input_text sp_extra_input_text')
->setDecorators(['viewHelper']); ->setDecorators(['viewHelper']);
if (isset($modInfo['sp_criteria_extra'])) { if (isset($modInfo['sp_criteria_extra'])) {
@ -721,7 +545,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
// EXTRA DATETIME UNIT SELECT // EXTRA DATETIME UNIT SELECT
$criteriaExtraDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_extra_datetime_select_' . $critKey . '_' . $modKey); $criteriaExtraDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_extra_datetime_select_' . $critMod);
$criteriaExtraDatetimeSelect->setAttrib('class', 'input_select sp_input_select') $criteriaExtraDatetimeSelect->setAttrib('class', 'input_select sp_input_select')
->setDecorators(['viewHelper']); ->setDecorators(['viewHelper']);
if ($criteriaValue->getValue() == 'between') { if ($criteriaValue->getValue() == 'between') {
@ -761,45 +585,13 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
{ {
$isValid = true; $isValid = true;
$data = $this->preValidation($params); $data = $this->preValidation($params);
$criteria2PeerMap = [ $allCriteria = BlockCriteria::criteriaMap();
0 => 'Select criteria',
'album_title' => 'DbAlbumTitle',
'artist_name' => 'DbArtistName',
'bit_rate' => 'DbBitRate',
'bpm' => 'DbBpm',
'composer' => 'DbComposer',
'conductor' => 'DbConductor',
'copyright' => 'DbCopyright',
'cuein' => 'DbCuein',
'cueout' => 'DbCueout',
'description' => 'DbDescription',
'encoded_by' => 'DbEncodedBy',
'utime' => 'DbUtime',
'mtime' => 'DbMtime',
'lptime' => 'DbLPtime',
'genre' => 'DbGenre',
'info_url' => 'DbInfoUrl',
'isrc_number' => 'DbIsrcNumber',
'label' => 'DbLabel',
'language' => 'DbLanguage',
'length' => 'DbLength',
'mime' => 'DbMime',
'mood' => 'DbMood',
'owner_id' => 'DbOwnerId',
'replay_gain' => 'DbReplayGain',
'sample_rate' => 'DbSampleRate',
'track_title' => 'DbTrackTitle',
'track_number' => 'DbTrackNumber',
'year' => 'DbYear',
'track_type_id' => 'DbTrackTypeId',
];
// things we need to check // things we need to check
// 1. limit value shouldn't be empty and has upperbound of 24 hrs // 1. limit value shouldn't be empty and has upperbound of 24 hrs
// 2. sp_criteria or sp_criteria_modifier shouldn't be 0 // 2. sp_criteria or sp_criteria_modifier shouldn't be 0
// 3. validate formate according to DB column type // 3. validate formate according to DB column type
$multiplier = 1; $multiplier = 1;
$result = 0;
// validation start // validation start
if ($data['etc']['sp_limit_options'] == 'hours') { if ($data['etc']['sp_limit_options'] == 'hours') {
@ -840,7 +632,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$element->addError(_('You must select Criteria and Modifier')); $element->addError(_('You must select Criteria and Modifier'));
$isValid = false; $isValid = false;
} else { } else {
$column = CcFilesPeer::getTableMap()->getColumnByPhpName($criteria2PeerMap[$d['sp_criteria_field']]); $column = CcFilesPeer::getTableMap()->getColumnByPhpName($allCriteria[$d['sp_criteria_field']]->peer);
// validation on type of column // validation on type of column
if (in_array($d['sp_criteria_field'], ['length', 'cuein', 'cueout'])) { if (in_array($d['sp_criteria_field'], ['length', 'cuein', 'cueout'])) {
if (!preg_match('/^(\d{2}):(\d{2}):(\d{2})/', $d['sp_criteria_value'])) { if (!preg_match('/^(\d{2}):(\d{2}):(\d{2})/', $d['sp_criteria_value'])) {

View File

@ -41,51 +41,18 @@ class Application_Model_Block implements Application_Model_LibraryEditable
]; ];
private static $modifier2CriteriaMap = [ private static $modifier2CriteriaMap = [
'contains' => Criteria::ILIKE, CriteriaModifier::CONTAINS => Criteria::ILIKE,
'does not contain' => Criteria::NOT_ILIKE, CriteriaModifier::DOES_NOT_CONTAIN => Criteria::NOT_ILIKE,
'is' => Criteria::EQUAL, CriteriaModifier::IS => Criteria::EQUAL,
'is not' => Criteria::NOT_EQUAL, CriteriaModifier::IS_NOT => Criteria::NOT_EQUAL,
'starts with' => Criteria::ILIKE, CriteriaModifier::STARTS_WITH => Criteria::ILIKE,
'ends with' => Criteria::ILIKE, CriteriaModifier::ENDS_WITH => Criteria::ILIKE,
'is greater than' => Criteria::GREATER_THAN, CriteriaModifier::IS_GREATER_THAN => Criteria::GREATER_THAN,
'is less than' => Criteria::LESS_THAN, CriteriaModifier::IS_LESS_THAN => Criteria::LESS_THAN,
'is in the range' => Criteria::CUSTOM, CriteriaModifier::IS_IN_THE_RANGE => Criteria::CUSTOM,
'before' => Criteria::CUSTOM, CriteriaModifier::BEFORE => Criteria::CUSTOM,
'after' => Criteria::CUSTOM, CriteriaModifier::AFTER => Criteria::CUSTOM,
'between' => Criteria::CUSTOM, CriteriaModifier::BETWEEN => Criteria::CUSTOM,
];
private static $criteria2PeerMap = [
0 => 'Select criteria',
'album_title' => 'DbAlbumTitle',
'artist_name' => 'DbArtistName',
'bit_rate' => 'DbBitRate',
'bpm' => 'DbBpm',
'composer' => 'DbComposer',
'conductor' => 'DbConductor',
'copyright' => 'DbCopyright',
'cuein' => 'DbCuein',
'cueout' => 'DbCueout',
'description' => 'DbDescription',
'encoded_by' => 'DbEncodedBy',
'utime' => 'DbUtime',
'mtime' => 'DbMtime',
'lptime' => 'DbLPtime',
'genre' => 'DbGenre',
'info_url' => 'DbInfoUrl',
'isrc_number' => 'DbIsrcNumber',
'label' => 'DbLabel',
'language' => 'DbLanguage',
'length' => 'DbLength',
'mime' => 'DbMime',
'mood' => 'DbMood',
'owner_id' => 'DbOwnerId',
'replay_gain' => 'DbReplayGain',
'sample_rate' => 'DbSampleRate',
'track_title' => 'DbTrackTitle',
'track_number' => 'DbTrackNumber',
'year' => 'DbYear',
'track_type_id' => 'DbTrackTypeId',
]; ];
public function __construct($id = null, $con = null) public function __construct($id = null, $con = null)
@ -1424,57 +1391,8 @@ SQL;
*/ */
public function getCriteria() public function getCriteria()
{ {
$criteriaOptions = [ $allCriteria = BlockCriteria::criteriaMap();
0 => _('Select criteria'), $allOptions = CriteriaModifier::mapToDisplay();
'album_title' => _('Album'),
'bit_rate' => _('Bit Rate (Kbps)'),
'bpm' => _('BPM'),
'composer' => _('Composer'),
'conductor' => _('Conductor'),
'copyright' => _('Copyright'),
'cuein' => _('Cue In'),
'cueout' => _('Cue Out'),
'description' => _('Description'),
'artist_name' => _('Creator'),
'encoded_by' => _('Encoded By'),
'genre' => _('Genre'),
'isrc_number' => _('ISRC'),
'label' => _('Label'),
'language' => _('Language'),
'utime' => _('Upload Time'),
'mtime' => _('Last Modified'),
'lptime' => _('Last Played'),
'length' => _('Length'),
'track_type_id' => _('Track Type'),
'mime' => _('Mime'),
'mood' => _('Mood'),
'owner_id' => _('Owner'),
'replay_gain' => _('Replay Gain'),
'sample_rate' => _('Sample Rate (kHz)'),
'track_title' => _('Title'),
'track_number' => _('Track Number'),
'utime' => _('Uploaded'),
'info_url' => _('Website'),
'year' => _('Year'),
];
$modifierOptions = [
'0' => _('Select modifier'),
'contains' => _('contains'),
'does not contain' => _('does not contain'),
'is' => _('is'),
'is not' => _('is not'),
'starts with' => _('starts with'),
'ends with' => _('ends with'),
'before' => _('before'),
'after' => _('after'),
'between' => _('between'),
'is' => _('is'),
'is not' => _('is not'),
'is greater than' => _('is greater than'),
'is less than' => _('is less than'),
'is in the range' => _('is in the range'),
];
// Load criteria from db // Load criteria from db
$out = CcBlockcriteriaQuery::create()->orderByDbCriteria()->findByDbBlockId($this->id); $out = CcBlockcriteriaQuery::create()->orderByDbCriteria()->findByDbBlockId($this->id);
@ -1500,14 +1418,15 @@ SQL;
} elseif ($criteria == 'sort') { } elseif ($criteria == 'sort') {
$storedCrit['sort'] = ['value' => $value]; $storedCrit['sort'] = ['value' => $value];
} else { } else {
$c = $allCriteria[$criteria];
$storedCrit['crit'][$criteria][] = [ $storedCrit['crit'][$criteria][] = [
'criteria' => $criteria, 'criteria' => $criteria,
'value' => $value, 'value' => $value,
'modifier' => $modifier, 'modifier' => $modifier,
'extra' => $extra, 'extra' => $extra,
'criteria_group' => $criteriagroup, 'criteria_group' => $criteriagroup,
'display_name' => $criteriaOptions[$criteria], 'display_name' => $c->display,
'display_modifier' => $modifierOptions[$modifier], 'display_modifier' => $allOptions[$modifier],
]; ];
} }
} }
@ -1522,57 +1441,8 @@ SQL;
*/ */
public function getCriteriaGrouped() public function getCriteriaGrouped()
{ {
$criteriaOptions = [ $criteriaOptions = BlockCriteria::displayCriteria();
0 => _('Select criteria'), $modifierOptions = CriteriaModifier::mapToDisplay();
'album_title' => _('Album'),
'bit_rate' => _('Bit Rate (Kbps)'),
'bpm' => _('BPM'),
'composer' => _('Composer'),
'conductor' => _('Conductor'),
'copyright' => _('Copyright'),
'cuein' => _('Cue In'),
'cueout' => _('Cue Out'),
'description' => _('Description'),
'artist_name' => _('Creator'),
'encoded_by' => _('Encoded By'),
'genre' => _('Genre'),
'isrc_number' => _('ISRC'),
'label' => _('Label'),
'language' => _('Language'),
'utime' => _('Upload Time'),
'mtime' => _('Last Modified'),
'lptime' => _('Last Played'),
'length' => _('Length'),
'track_type_id' => _('Track Type'),
'mime' => _('Mime'),
'mood' => _('Mood'),
'owner_id' => _('Owner'),
'replay_gain' => _('Replay Gain'),
'sample_rate' => _('Sample Rate (kHz)'),
'track_title' => _('Title'),
'track_number' => _('Track Number'),
'utime' => _('Uploaded'),
'info_url' => _('Website'),
'year' => _('Year'),
];
$modifierOptions = [
'0' => _('Select modifier'),
'contains' => _('contains'),
'does not contain' => _('does not contain'),
'is' => _('is'),
'is not' => _('is not'),
'starts with' => _('starts with'),
'ends with' => _('ends with'),
'before' => _('before'),
'after' => _('after'),
'between' => _('between'),
'is' => _('is'),
'is not' => _('is not'),
'is greater than' => _('is greater than'),
'is less than' => _('is less than'),
'is in the range' => _('is in the range'),
];
// Load criteria from db // Load criteria from db
$out = CcBlockcriteriaQuery::create()->orderByDbCriteria()->findByDbBlockId($this->id); $out = CcBlockcriteriaQuery::create()->orderByDbCriteria()->findByDbBlockId($this->id);
@ -1633,6 +1503,8 @@ SQL;
$qry = CcFilesQuery::create(); $qry = CcFilesQuery::create();
$qry->useFkOwnerQuery('subj', 'left join'); $qry->useFkOwnerQuery('subj', 'left join');
$allCriteria = BlockCriteria::criteriaMap();
// Logging::info($storedCrit); // Logging::info($storedCrit);
if (isset($storedCrit['crit'])) { if (isset($storedCrit['crit'])) {
foreach ($storedCrit['crit'] as $crit) { foreach ($storedCrit['crit'] as $crit) {
@ -1649,7 +1521,7 @@ SQL;
$spCriteria = $criteria['criteria']; $spCriteria = $criteria['criteria'];
$spCriteriaModifier = $criteria['modifier']; $spCriteriaModifier = $criteria['modifier'];
$column = CcFilesPeer::getTableMap()->getColumnByPhpName(self::$criteria2PeerMap[$spCriteria]); $column = CcFilesPeer::getTableMap()->getColumnByPhpName($allCriteria[$spCriteria]->peer);
// data should already be in UTC, do we have to do anything special here anymore? // data should already be in UTC, do we have to do anything special here anymore?
if ($column->getType() == PropelColumnTypes::TIMESTAMP) { if ($column->getType() == PropelColumnTypes::TIMESTAMP) {

View File

@ -0,0 +1,210 @@
<?php
class ModifierType
{
public const STRING = 's';
public const NUMBER = 'n';
public const DATE = 'd';
public const TRACK_TYPE = 'tt';
}
class CriteriaModifier
{
public const CONTAINS = 'contains';
public const DOES_NOT_CONTAIN = 'does not contain';
public const IS = 'is';
public const IS_NOT = 'is not';
public const STARTS_WITH = 'starts with';
public const ENDS_WITH = 'ends with';
public const BEFORE = 'before';
public const AFTER = 'after';
public const BETWEEN = 'between';
public const IS_GREATER_THAN = 'is greater than';
public const IS_LESS_THAN = 'is less than';
public const IS_IN_THE_RANGE = 'is in the range';
public static function mapToDisplay(array $modifiers = self::ALL): array
{
$arr = ['0' => _('Select modifier')];
foreach ($modifiers as $m) {
$arr[$m] = _($m);
}
return $arr;
}
public const ALL = [
CriteriaModifier::CONTAINS,
CriteriaModifier::DOES_NOT_CONTAIN,
CriteriaModifier::IS,
CriteriaModifier::IS_NOT,
CriteriaModifier::STARTS_WITH,
CriteriaModifier::ENDS_WITH,
CriteriaModifier::BEFORE,
CriteriaModifier::AFTER,
CriteriaModifier::BETWEEN,
CriteriaModifier::IS_GREATER_THAN,
CriteriaModifier::IS_LESS_THAN,
CriteriaModifier::IS_IN_THE_RANGE,
];
public const FOR_STRING = [
CriteriaModifier::CONTAINS,
CriteriaModifier::DOES_NOT_CONTAIN,
CriteriaModifier::IS,
CriteriaModifier::IS_NOT,
CriteriaModifier::STARTS_WITH,
CriteriaModifier::ENDS_WITH,
];
public const FOR_NUMBER = [
CriteriaModifier::IS,
CriteriaModifier::IS_NOT,
CriteriaModifier::IS_GREATER_THAN,
CriteriaModifier::IS_LESS_THAN,
CriteriaModifier::IS_IN_THE_RANGE,
];
public const FOR_DATE = [
CriteriaModifier::BEFORE,
CriteriaModifier::AFTER,
CriteriaModifier::BETWEEN,
CriteriaModifier::IS,
CriteriaModifier::IS_NOT,
CriteriaModifier::IS_GREATER_THAN,
CriteriaModifier::IS_LESS_THAN,
CriteriaModifier::IS_IN_THE_RANGE,
];
public const FOR_TRACK_TYPE = [
CriteriaModifier::IS,
CriteriaModifier::IS_NOT,
];
}
class BlockCriteria
{
public string $key;
public string $type;
public string $peer;
public string $display;
public function __construct(string $key, string $type, string $peer, string $display)
{
$this->key = $key;
$this->type = $type;
$this->peer = $peer;
$this->display = $display;
}
public function getModifiers(): array
{
$modifiers = [];
switch ($this->type) {
case ModifierType::STRING:
$modifiers = CriteriaModifier::FOR_STRING;
break;
case ModifierType::DATE:
$modifiers = CriteriaModifier::FOR_DATE;
break;
case ModifierType::NUMBER:
$modifiers = CriteriaModifier::FOR_NUMBER;
break;
case ModifierType::TRACK_TYPE:
$modifiers = CriteriaModifier::FOR_TRACK_TYPE;
break;
}
return $modifiers;
}
public function displayModifiers(): array
{
return CriteriaModifier::mapToDisplay(self::getModifiers());
}
private static array $allCriteria;
/**
* After adding a new criteria don't forget to also add it into smart_blockbuilder.js.
*
* @return BlockCriteria[]
*/
public static function allCriteria(): array
{
if (!isset(BlockCriteria::$allCriteria)) {
BlockCriteria::$allCriteria = [
new BlockCriteria('album_title', ModifierType::STRING, 'DbAlbumTitle', _('Album')),
new BlockCriteria('artist_name', ModifierType::STRING, 'DbArtistName', _('Creator')),
new BlockCriteria('bit_rate', ModifierType::NUMBER, 'DbBitRate', _('Bit Rate (Kbps)')),
new BlockCriteria('bpm', ModifierType::NUMBER, 'DbBpm', _('BPM')),
new BlockCriteria('composer', ModifierType::STRING, 'DbComposer', _('Composer')),
new BlockCriteria('conductor', ModifierType::STRING, 'DbConductor', _('Conductor')),
new BlockCriteria('copyright', ModifierType::STRING, 'DbCopyright', _('Copyright')),
new BlockCriteria('cuein', ModifierType::NUMBER, 'DbCuein', _('Cue In')),
new BlockCriteria('cueout', ModifierType::NUMBER, 'DbCueout', _('Cue Out')),
new BlockCriteria('description', ModifierType::STRING, 'DbDescription', _('Description')),
new BlockCriteria('encoded_by', ModifierType::STRING, 'DbEncodedBy', _('Encoded By')),
new BlockCriteria('utime', ModifierType::DATE, 'DbUtime', _('Uploaded')),
new BlockCriteria('mtime', ModifierType::DATE, 'DbMtime', _('Last Modified')),
new BlockCriteria('lptime', ModifierType::DATE, 'DbLPtime', _('Last Played')),
new BlockCriteria('genre', ModifierType::STRING, 'DbGenre', _('Genre')),
new BlockCriteria('info_url', ModifierType::STRING, 'DbInfoUrl', _('Website')),
new BlockCriteria('isrc_number', ModifierType::STRING, 'DbIsrcNumber', _('ISRC')),
new BlockCriteria('label', ModifierType::STRING, 'DbLabel', _('Label')),
new BlockCriteria('language', ModifierType::STRING, 'DbLanguage', _('Language')),
new BlockCriteria('length', ModifierType::NUMBER, 'DbLength', _('Length')),
new BlockCriteria('mime', ModifierType::STRING, 'DbMime', _('Mime')),
new BlockCriteria('mood', ModifierType::STRING, 'DbMood', _('Mood')),
new BlockCriteria('owner_id', ModifierType::STRING, 'DbOwnerId', _('Owner')),
new BlockCriteria('replay_gain', ModifierType::NUMBER, 'DbReplayGain', _('Replay Gain')),
new BlockCriteria('sample_rate', ModifierType::NUMBER, 'DbSampleRate', _('Sample Rate (kHz)')),
new BlockCriteria('track_title', ModifierType::STRING, 'DbTrackTitle', _('Title')),
new BlockCriteria('track_number', ModifierType::NUMBER, 'DbTrackNumber', _('Track Number')),
new BlockCriteria('year', ModifierType::NUMBER, 'DbYear', _('Year')),
new BlockCriteria('track_type_id', ModifierType::TRACK_TYPE, 'DbTrackTypeId', _('Track Type')),
new BlockCriteria('filepath', ModifierType::STRING, 'DbFilepath', _('File Name')),
];
}
return BlockCriteria::$allCriteria;
}
public static function displayCriteria(): array
{
$arr = [0 => _('Select criteria')];
foreach (self::allCriteria() as $c) {
$arr[$c->key] = $c->display;
}
return $arr;
}
/**
* @return BlockCriteria[]
*/
public static function criteriaMap(): array
{
$arr = [];
foreach (self::allCriteria() as $i) {
$arr[$i->key] = $i;
}
return $arr;
}
public static function get(string $key): BlockCriteria
{
return self::criteriaMap()[$key];
}
}

View File

@ -1102,6 +1102,7 @@ var criteriaTypes = {
info_url: "s", info_url: "s",
year: "n", year: "n",
track_type_id: "tt", track_type_id: "tt",
filepath: "s",
}; };
var stringCriteriaOptions = { var stringCriteriaOptions = {