From c0fb7a421fa4d9ad9bde4357e12d002ebb6779b1 Mon Sep 17 00:00:00 2001 From: Naomi Date: Mon, 31 Mar 2014 16:52:10 -0400 Subject: [PATCH] CC-5762 : Playlist options validation saving rules separately again now. testing a bunch of ways to submit bad values. --- .../controllers/PlaylistController.php | 50 ++++++++++++++ .../application/forms/PlaylistRules.php | 34 ++++++---- .../application/services/PlaylistService.php | 34 ---------- .../views/scripts/form/playlist-rules.phtml | 66 +++++++++++++++---- .../views/scripts/playlist/playlist.phtml | 20 +++--- .../public/js/airtime/playlist/playlist.js | 44 +++++++++---- 6 files changed, 166 insertions(+), 82 deletions(-) diff --git a/airtime_mvc/application/controllers/PlaylistController.php b/airtime_mvc/application/controllers/PlaylistController.php index e64fc3486..0a1834664 100644 --- a/airtime_mvc/application/controllers/PlaylistController.php +++ b/airtime_mvc/application/controllers/PlaylistController.php @@ -20,6 +20,7 @@ class PlaylistController extends Zend_Controller_Action ->addActionContext('shuffle', 'json') ->addActionContext('generate', 'json') ->addActionContext('clear', 'json') + ->addActionContext('save-rules', 'json') ->initContext(); @@ -172,6 +173,55 @@ class PlaylistController extends Zend_Controller_Action } } + public function saveRulesAction() + { + $rules = $this->_getParam('rules'); + Logging::info($rules); + + $con = Propel::getConnection(PlaylistPeer::DATABASE_NAME); + $con->beginTransaction(); + + try { + $playlist = $this->getPlaylist(); + + $form = new Application_Form_PlaylistRules(); + + if (isset($rules["criteria"])) { + $form->buildCriteriaOptions($rules["criteria"]); + } + + $criteriaFields = $form->getPopulateHelp(); + + $playlistRules = array( + "pl_repeat_tracks" => $rules[Playlist::RULE_REPEAT_TRACKS], + "pl_my_tracks" => $rules[Playlist::RULE_USERS_TRACKS_ONLY], + "pl_order_column" => $rules[Playlist::RULE_ORDER][Playlist::RULE_ORDER_COLUMN], + "pl_order_direction" => $rules[Playlist::RULE_ORDER][Playlist::RULE_ORDER_DIRECTION], + "pl_limit_value" => $rules["limit"]["value"], + "pl_limit_options" => $rules["limit"]["unit"] + ); + + $data = array_merge($criteriaFields, $playlistRules); + + if ($form->isValid($data)) { + Logging::info("playlist rules are valid"); + Logging::info($form->getValues()); + $playlist->setRules($rules); + } + else { + Logging::info("invalid playlist rules"); + Logging::info($form->getMessages()); + $this->view->form = $form->render(); + } + + $con->commit(); + } + catch (Exception $e) { + $con->rollBack(); + $this->view->error = $e->getMessage(); + } + } + public function saveAction() { $info = $this->_getParam('serialized'); diff --git a/airtime_mvc/application/forms/PlaylistRules.php b/airtime_mvc/application/forms/PlaylistRules.php index c6b82d6df..f072953fb 100644 --- a/airtime_mvc/application/forms/PlaylistRules.php +++ b/airtime_mvc/application/forms/PlaylistRules.php @@ -205,7 +205,12 @@ class Application_Form_PlaylistRules extends Zend_Form ->setAttrib('class', 'sp_input_text_limit') ->setLabel(_('Limit to')) ->setRequired(true) - ->setDecorators(array('ViewHelper')); + ->setDecorators(array('ViewHelper')) + ->setValidators(array( + new Zend_Validate_NotEmpty(), + new Zend_Validate_Int(), + new Zend_Validate_Between(array('min' => 1, 'max' => PHP_INT_MAX)) + )); $this->addElement($limitValue); $orderby = new Zend_Form_Element_Select('pl_order_column'); @@ -252,6 +257,7 @@ class Application_Form_PlaylistRules extends Zend_Form $input->setValidators(array( new Zend_Validate_NotEmpty(), new Zend_Validate_Int(), + new Zend_Validate_Between(array('min' => 0, 'max' => PHP_INT_MAX)) )); break; case "s": @@ -276,7 +282,6 @@ class Application_Form_PlaylistRules extends Zend_Form $criteria = new Zend_Form_Element_Select("sp_criteria_field_{$suffix}"); $criteria ->setAttrib('class', 'input_select sp_input_select rule_criteria') - ->setValue('Select criteria') ->setDecorators(array('viewHelper')) ->setMultiOptions($this->getCriteriaOptions()); @@ -348,22 +353,25 @@ class Application_Form_PlaylistRules extends Zend_Form private function buildRuleCriteriaRow($info = null) { $suffix = mt_rand(10000, 99999); - if (is_null($info)) { - $criteria = ""; - } - else { - $criteria = $info["criteria"]; - } - - $critType = $this->_criteriaTypes[$criteria]; $critKey = self::buildRuleCriteria($suffix); - + if (isset($info)) { - + if (isset($info["criteria"])) { - $this->_populateHelp[$critKey] = $info["criteria"]; + + $criteria = $info["criteria"]; + $this->_populateHelp[$critKey] = $criteria; } + //check that a valid criteria was passed to build the rest of the row with. + try { + $critType = $this->_criteriaTypes[$criteria]; + } + catch (Exception $e) { + $this->getElement("sp_criteria_field_{$suffix}")->addError("Invalid criteria {$criteria}"); + return $suffix; + } + if (isset($info["modifier"])) { $options = self::getModifierOptions($criteria); diff --git a/airtime_mvc/application/services/PlaylistService.php b/airtime_mvc/application/services/PlaylistService.php index 7cf47b4a6..10ebd61b9 100644 --- a/airtime_mvc/application/services/PlaylistService.php +++ b/airtime_mvc/application/services/PlaylistService.php @@ -69,40 +69,6 @@ class Application_Service_PlaylistService $playlist->setDescription($info["description"]); } - if (isset($info["rules"])) { - - $rules = $info["rules"]; - - $form = new Application_Form_PlaylistRules(); - - if (isset($info["rules"]["criteria"])) { - $form->buildCriteriaOptions($info["rules"]["criteria"]); - } - - $criteriaFields = $form->getPopulateHelp(); - - $playlistRules = array( - "pl_repeat_tracks" => $rules[Playlist::RULE_REPEAT_TRACKS], - "pl_my_tracks" => $rules[Playlist::RULE_USERS_TRACKS_ONLY], - "pl_order_column" => $rules[Playlist::RULE_ORDER][Playlist::RULE_ORDER_COLUMN], - "pl_order_direction" => $rules[Playlist::RULE_ORDER][Playlist::RULE_ORDER_DIRECTION], - "pl_limit_value" => $rules["limit"]["value"], - "pl_limit_options" => $rules["limit"]["unit"] - ); - - $data = array_merge($criteriaFields, $playlistRules); - - if ($form->isValid($data)) { - Logging::info("playlist rules are valid"); - Logging::info($form->getValues()); - $playlist->setRules($info["rules"]); - } - else { - Logging::info("invalid playlist rules"); - Logging::info($form->getMessages()); - } - } - //only save content for static playlists if ($playlist->isStatic()) { $content = isset($info["content"]) ? $info["content"] : array(); diff --git a/airtime_mvc/application/views/scripts/form/playlist-rules.phtml b/airtime_mvc/application/views/scripts/form/playlist-rules.phtml index 4bea853e2..28ece23a6 100644 --- a/airtime_mvc/application/views/scripts/form/playlist-rules.phtml +++ b/airtime_mvc/application/views/scripts/form/playlist-rules.phtml @@ -1,9 +1,11 @@
-
+
element->getElement('pl_repeat_tracks')->getLabel() ?> element->getElement('pl_repeat_tracks')?> +
+
element->getElement('pl_my_tracks')->getLabel() ?> element->getElement('pl_my_tracks')?> @@ -24,15 +26,19 @@ $input1 = $this->element->getElement("sp_criteria_value_{$suffix}"); $input2 = $this->element->getElement("sp_criteria_extra_{$suffix}"); $unit1 = $this->element->getElement("sp_rel_date_unit_1_{$suffix}"); - $unit2 = $this->element->getElement("sp_rel_date_unit_2_{$suffix}") + $unit2 = $this->element->getElement("sp_rel_date_unit_2_{$suffix}"); + + $checkErrors = array($criteria, $modifier, $input1, $input2, $unit1, $unit2); ?> - - + + + + @@ -43,7 +49,7 @@ - getValue(), array(20, 21))): ?> + getValue(), array(20, 21))): ?> TO @@ -60,6 +66,17 @@ + + + hasErrors()) : ?> + getMessages() as $error): ?> + + + + + + + @@ -71,7 +88,9 @@
element->getElement('pl_order_column'); - $direction = $this->element->getElement('pl_order_direction'); + $direction = $this->element->getElement('pl_order_direction'); + + $checkErrors = array($order, $direction); ?> getLabel() ?> @@ -79,18 +98,37 @@ $direction->setAttrib('style', 'display:none;'); } ?> -
- -
- element->getElement('pl_limit_value')->getLabel() ?> - element->getElement('pl_limit_value')?> - element->getElement('pl_limit_options') ?> - element->getElement("pl_limit_value")->hasErrors()) : ?> - element->getElement("pl_limit_value")->getMessages() as $error): ?> + + + hasErrors()) : ?> + getMessages() as $error): ?> + +
+ +
+ element->getElement('pl_limit_value'); + $options = $this->element->getElement('pl_limit_options'); + + $checkErrors = array($value, $options); + ?> + getLabel() ?> + + + + + hasErrors()) : ?> + getMessages() as $error): ?> + + + + + +
\ No newline at end of file diff --git a/airtime_mvc/application/views/scripts/playlist/playlist.phtml b/airtime_mvc/application/views/scripts/playlist/playlist.phtml index 44ba69e97..c3e8c2ef1 100644 --- a/airtime_mvc/application/views/scripts/playlist/playlist.phtml +++ b/airtime_mvc/application/views/scripts/playlist/playlist.phtml @@ -33,6 +33,18 @@ obj)):?> + +
+ + + + + obj->getRules(); ?> +
+ +
+
+

@@ -62,14 +74,6 @@ -
- - - - - obj->getRules(); ?> -
- obj->hasContent()):?>
    diff --git a/airtime_mvc/public/js/airtime/playlist/playlist.js b/airtime_mvc/public/js/airtime/playlist/playlist.js index 783b90348..1dfa95a33 100644 --- a/airtime_mvc/public/js/airtime/playlist/playlist.js +++ b/airtime_mvc/public/js/airtime/playlist/playlist.js @@ -439,20 +439,9 @@ var AIRTIME = (function(AIRTIME){ return criteria; } - function serializePlaylist(order) { - var i, len, - info = {}, - entries = []; + function serializeRules() { - for (i = 0, len = order.length; i < len; i++) { - entries.push(getEntryDetails(order[i])); - } - - info["name"] = cleanString($("#playlist_name").text()); - info["description"] = cleanString($("#playlist_description").val()); - info["content"] = entries; - - info["rules"] = { + var rules = { "repeat-tracks": $("#pl_repeat_tracks").is(":checked"), "my-tracks": $("#pl_my_tracks").is(":checked"), "limit": { @@ -466,6 +455,22 @@ var AIRTIME = (function(AIRTIME){ } }; + return rules; + } + + function serializePlaylist(order) { + var i, len, + info = {}, + entries = []; + + for (i = 0, len = order.length; i < len; i++) { + entries.push(getEntryDetails(order[i])); + } + + info["name"] = cleanString($("#playlist_name").text()); + info["description"] = cleanString($("#playlist_description").val()); + info["content"] = entries; + return info; } @@ -799,6 +804,19 @@ var AIRTIME = (function(AIRTIME){ }); }); + $playlist.on("click", "#spl_rules_save", function(e) { + var url = baseUrl+"playlist/save-rules", + data; + + data = {format: "json", rules: serializeRules()}; + + $.post(url, data, function(json) { + if (json.form !== undefined) { + $(".search-criteria").replaceWith(json.form); + } + }); + }); + $playlist.on("click", "#spl_save", function(e) { var $contents = $("#spl_sortable"), order = $contents.sortable("toArray"),