From 1dd29796641e4b0c28ad4abeafe9da75d1d6c912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carsten=20G=C3=B6tzinger?= Date: Thu, 15 Feb 2018 06:14:26 +0100 Subject: [PATCH] =?UTF-8?q?Umstellung=20auf=20eigene=20Ajax-Verarbeitung?= =?UTF-8?q?=20=C3=BCber=20Route=20"rateit"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 3 +- src/ContaoManagerPlugin.php | 13 ++ src/Controller/AjaxRateItController.php | 34 +++ src/Resources/config/routing.yml | 3 + src/Resources/contao/classes/RateIt.php | 206 ++++++++---------- .../contao/config/event_listeners.php | 18 -- .../public/js/rateit-uncompressed.js | 4 +- src/Resources/public/js/rateit.js | 6 +- 8 files changed, 149 insertions(+), 138 deletions(-) create mode 100644 src/Controller/AjaxRateItController.php create mode 100644 src/Resources/config/routing.yml delete mode 100644 src/Resources/contao/config/event_listeners.php diff --git a/composer.json b/composer.json index 8ba4ad3..13d25a8 100644 --- a/composer.json +++ b/composer.json @@ -21,8 +21,7 @@ "require":{ "php":">=7.0", "contao/core-bundle": "^4.4", - "cgo-it/contao-xls_export-bundle": "^4.0", - "richardhj/contao-simple-ajax": "^1.3" + "cgo-it/contao-xls_export-bundle": "^4.0" }, "require-dev": { "contao/manager-plugin": "^2.0" diff --git a/src/ContaoManagerPlugin.php b/src/ContaoManagerPlugin.php index 279a703..fb7db62 100644 --- a/src/ContaoManagerPlugin.php +++ b/src/ContaoManagerPlugin.php @@ -6,6 +6,8 @@ use Contao\CoreBundle\ContaoCoreBundle; use Contao\ManagerPlugin\Bundle\Config\BundleConfig; use Contao\ManagerPlugin\Bundle\BundlePluginInterface; use Contao\ManagerPlugin\Bundle\Parser\ParserInterface; +use Symfony\Component\Config\Loader\LoaderResolverInterface; +use Symfony\Component\HttpKernel\KernelInterface; /** * Plugin for the Contao Manager. @@ -25,4 +27,15 @@ class ContaoManagerPlugin implements BundlePluginInterface ->setReplace(['rate-it']), ]; } + + /** + * {@inheritdoc} + */ + public function getRouteCollection(LoaderResolverInterface $resolver, KernelInterface $kernel) + { + return $resolver + ->resolve(__DIR__.'/Resources/config/routing.yml') + ->load(__DIR__.'/Resources/config/routing.yml') + ; + } } diff --git a/src/Controller/AjaxRateItController.php b/src/Controller/AjaxRateItController.php new file mode 100644 index 0000000..2543b8a --- /dev/null +++ b/src/Controller/AjaxRateItController.php @@ -0,0 +1,34 @@ +container->get('contao.framework')->initialize(); + + $controller = new RateIt(); + + $response = $controller->doVote(); + $response->send(); + } + +} diff --git a/src/Resources/config/routing.yml b/src/Resources/config/routing.yml new file mode 100644 index 0000000..846ab49 --- /dev/null +++ b/src/Resources/config/routing.yml @@ -0,0 +1,3 @@ +ajax_rateit: + resource: "@CgoITRateItBundle/Controller/" + type: annotation diff --git a/src/Resources/contao/classes/RateIt.php b/src/Resources/contao/classes/RateIt.php index acdc957..fc28fdb 100644 --- a/src/Resources/contao/classes/RateIt.php +++ b/src/Resources/contao/classes/RateIt.php @@ -31,7 +31,6 @@ namespace cgoIT\rateit; use cgoIT\rateit\RateItFrontend; -use SimpleAjax\Event\SimpleAjax; use Symfony\Component\HttpFoundation\JsonResponse; class RateIt extends \Frontend { @@ -65,127 +64,108 @@ class RateIt extends \Frontend { * @param integer id - The id of key to register a rating for. * @param integer percent - The rating in percentages. */ - public function doVote(SimpleAjax $event) { - $input = $event->getEnvironment()->getInputProvider(); + public function doVote() { + $ip = $_SERVER['REMOTE_ADDR']; - if ((true === $input->hasParameter('do')) - && ('rateit' === $input->getParameter('do')) - ) { - $ip = $_SERVER['REMOTE_ADDR']; + $rkey = $this->Input->post('id'); + $percent = $this->Input->post('vote'); + $type = $this->Input->post('type'); - $rkey = $input->getParameter('id'); - $percent = $input->getParameter('vote'); - $type = $input->getParameter('type'); - - //Make sure that the ratable ID is a number and not something crazy. - if (strstr($rkey, '|')) { - $arrRkey = explode('|', $rkey); - foreach ($arrRkey as $key) { - if (!is_numeric($key)) { - $return = [$GLOBALS['TL_LANG']['rateit']['error']['invalid_rating']]; - $response = new JsonResponse($return); - $event->setResponse($response); - return $event; - } - $id = $rkey; - } - } else { - if (is_numeric($rkey)) { - $id = $rkey; - } else { + //Make sure that the ratable ID is a number and not something crazy. + if (strstr($rkey, '|')) { + $arrRkey = explode('|', $rkey); + foreach ($arrRkey as $key) { + if (!is_numeric($key)) { $return = [$GLOBALS['TL_LANG']['rateit']['error']['invalid_rating']]; - $response = new JsonResponse($return); - $event->setResponse($response); - return $event; + return new JsonResponse($return); } + $id = $rkey; } - - //Make sure the percent is a number and under 100. - if (is_numeric($percent) && $percent < 101) { - $rating = $percent; + } else { + if (is_numeric($rkey)) { + $id = $rkey; } else { $return = [$GLOBALS['TL_LANG']['rateit']['error']['invalid_rating']]; - $response = new JsonResponse($return); - $event->setResponse($response); - return $event; + return new JsonResponse($return); } - - //Make sure that the ratable type is 'page' or 'ce' or 'module' - if (!($type === 'page' || $type === 'article' || $type === 'ce' || $type === 'module' || $type === 'news' || $type === 'faq' || $type === 'galpic' || $type === 'news4ward')) { - $return = [$GLOBALS['TL_LANG']['rateit']['error']['invalid_type']]; - $response = new JsonResponse($return); - $event->setResponse($response); - return $event; - } - - $strHash = sha1(session_id() . (!$GLOBALS['TL_CONFIG']['disableIpCheck'] ? \Environment::get('ip') : '') . 'FE_USER_AUTH'); - - // FrontendUser auslesen - if (FE_USER_LOGGED_IN) { - $objUser = $this->Database->prepare("SELECT pid FROM tl_session WHERE hash=?") - ->limit(1) - ->execute($strHash); - - if ($objUser->numRows) { - $userId = $objUser->pid; - } - } - - - $ratableKeyId = $this->Database->prepare('SELECT id FROM tl_rateit_items WHERE rkey=? and typ=?') - ->execute($id, $type) - ->fetchAssoc(); - - $canVote = false; - if (isset($userId)) { - $countUser = $this->Database->prepare('SELECT * FROM tl_rateit_ratings WHERE pid=? and memberid=?') - ->execute($ratableKeyId['id'], $userId) - ->count(); - } - $countIp = $this->Database->prepare('SELECT * FROM tl_rateit_ratings WHERE pid=? and ip_address=?') - ->execute($ratableKeyId['id'], $ip) - ->count(); - - // Die with an error if the insert fails (duplicate IP or duplicate member id for a vote). - if ((!$this->allowDuplicatesForMembers && (isset($countUser) ? $countUser == 0 : false)) || ($this->allowDuplicatesForMembers && isset($userId))) { - // Insert the data. - $arrSet = array('pid' => $ratableKeyId['id'], - 'tstamp' => time(), - 'ip_address' => $ip, - 'memberid' => isset($userId) ? $userId : null, - 'rating' => $rating, - 'createdat'=> time() - ); - $this->Database->prepare('INSERT INTO tl_rateit_ratings %s') - ->set($arrSet) - ->execute(); - } elseif (!isset($countUser) && ((!$this->allowDuplicates && $countIp == 0) || $this->allowDuplicates)) { - // Insert the data. - $arrSet = array('pid' => $ratableKeyId['id'], - 'tstamp' => time(), - 'ip_address' => $ip, - 'memberid' => isset($userId) ? $userId : null, - 'rating' => $rating, - 'createdat'=> time() - ); - $this->Database->prepare('INSERT INTO tl_rateit_ratings %s') - ->set($arrSet) - ->execute(); - } else { - $return = [$GLOBALS['TL_LANG']['rateit']['error']['duplicate_vote']]; - $response = new JsonResponse($return); - $event->setResponse($response); - return $event; - } - - $rating = $this->rateItFrontend->loadRating($id, $type); - - $return = [$this->rateItFrontend->getStarMessage($rating)]; - $response = new JsonResponse($return); - $event->setResponse($response); - return $event; } - } + //Make sure the percent is a number and under 100. + if (is_numeric($percent) && $percent < 101) { + $rating = $percent; + } else { + $return = [$GLOBALS['TL_LANG']['rateit']['error']['invalid_rating']]; + return new JsonResponse($return); + } + + //Make sure that the ratable type is 'page' or 'ce' or 'module' + if (!($type === 'page' || $type === 'article' || $type === 'ce' || $type === 'module' || $type === 'news' || $type === 'faq' || $type === 'galpic' || $type === 'news4ward')) { + $return = [$GLOBALS['TL_LANG']['rateit']['error']['invalid_type']]; + return new JsonResponse($return); + } + + $strHash = sha1(session_id() . (!$GLOBALS['TL_CONFIG']['disableIpCheck'] ? \Environment::get('ip') : '') . 'FE_USER_AUTH'); + + // FrontendUser auslesen + if (FE_USER_LOGGED_IN) { + $objUser = $this->Database->prepare("SELECT pid FROM tl_session WHERE hash=?") + ->limit(1) + ->execute($strHash); + + if ($objUser->numRows) { + $userId = $objUser->pid; + } + } + + + $ratableKeyId = $this->Database->prepare('SELECT id FROM tl_rateit_items WHERE rkey=? and typ=?') + ->execute($id, $type) + ->fetchAssoc(); + + $canVote = false; + if (isset($userId)) { + $countUser = $this->Database->prepare('SELECT * FROM tl_rateit_ratings WHERE pid=? and memberid=?') + ->execute($ratableKeyId['id'], $userId) + ->count(); + } + $countIp = $this->Database->prepare('SELECT * FROM tl_rateit_ratings WHERE pid=? and ip_address=?') + ->execute($ratableKeyId['id'], $ip) + ->count(); + + // Die with an error if the insert fails (duplicate IP or duplicate member id for a vote). + if ((!$this->allowDuplicatesForMembers && (isset($countUser) ? $countUser == 0 : false)) || ($this->allowDuplicatesForMembers && isset($userId))) { + // Insert the data. + $arrSet = array('pid' => $ratableKeyId['id'], + 'tstamp' => time(), + 'ip_address' => $ip, + 'memberid' => isset($userId) ? $userId : null, + 'rating' => $rating, + 'createdat'=> time() + ); + $this->Database->prepare('INSERT INTO tl_rateit_ratings %s') + ->set($arrSet) + ->execute(); + } elseif (!isset($countUser) && ((!$this->allowDuplicates && $countIp == 0) || $this->allowDuplicates)) { + // Insert the data. + $arrSet = array('pid' => $ratableKeyId['id'], + 'tstamp' => time(), + 'ip_address' => $ip, + 'memberid' => isset($userId) ? $userId : null, + 'rating' => $rating, + 'createdat'=> time() + ); + $this->Database->prepare('INSERT INTO tl_rateit_ratings %s') + ->set($arrSet) + ->execute(); + } else { + $return = [$GLOBALS['TL_LANG']['rateit']['error']['duplicate_vote']]; + return new JsonResponse($return); + } + + $rating = $this->rateItFrontend->loadRating($id, $type); + + $return = [$this->rateItFrontend->getStarMessage($rating)]; + return new JsonResponse($return); + } } ?> diff --git a/src/Resources/contao/config/event_listeners.php b/src/Resources/contao/config/event_listeners.php deleted file mode 100644 index 6bff0c7..0000000 --- a/src/Resources/contao/config/event_listeners.php +++ /dev/null @@ -1,18 +0,0 @@ - array( - array( - array(new RateIt(), 'doVote'), - RateIt::PRIORITY - ) - ) - ); -} - -return array(); diff --git a/src/Resources/public/js/rateit-uncompressed.js b/src/Resources/public/js/rateit-uncompressed.js index ee8441f..971aa97 100644 --- a/src/Resources/public/js/rateit-uncompressed.js +++ b/src/Resources/public/js/rateit-uncompressed.js @@ -271,7 +271,7 @@ function doRateIt() { }); window.addEvent('domready', function(e) { - RateItRating = new RateItRatings({url:'SimpleAjaxFrontend.php?do=rateit'}); + RateItRating = new RateItRatings({url:'rateit'}); }); } else if (window.jQuery) { // the rateit plugin as an Object @@ -579,7 +579,7 @@ function doRateIt() { async: false, cache: true }); - RateItRating = Object.create(RateItRatings).initialize({url:'SimpleAjaxFrontend.php?do=rateit'}); + RateItRating = Object.create(RateItRatings).initialize({url:'rateit'}); }); var jEscape = function(jquery) { diff --git a/src/Resources/public/js/rateit.js b/src/Resources/public/js/rateit.js index ff597b2..ecff8c0 100644 --- a/src/Resources/public/js/rateit.js +++ b/src/Resources/public/js/rateit.js @@ -9,7 +9,7 @@ var votePercent=this.getVotePercent(el.newFill);if(this.options.url!=null){new R el.textEl.set('text',text);if(typeof($('.mbrateItRating'))!='undefined'&&el.id.indexOf('mb')==0){var mbid=el.getAttribute('id');mbid=mbid.replace('mb','');if(typeof(arrRatings)=='object'){for(var ri=0;ri100){el.newFill=this.getFillPercent(100);} -el.selected.setStyle('width',el.newFill);},getStarPercent:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);if(stars!=null){var score=stars[3].toFloat();var scale=stars[4].toFloat();var percent=(score/scale)*100;return percent;}else{return 0;}},getFillPercent:function(starPercent){return(starPercent/100)*(this.options.starwidth*this.options.max);},getVotePercent:function(actVote){var starsWidth=this.options.starwidth*this.options.max;var percent=(actVote/starsWidth*100).round(2);return percent;},getRatableId:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);return stars!=null?stars[1]:'';},getRatableType:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);return stars!=null?stars[2]:'';},getRatableMaxValue:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);return stars!=null?stars[4].toInt():0;},setBackgroundPosition:function(el,pos){el.setStyle('background-position','0% '+pos+'px');},getBackgroundImagePath:function(el){return el.getStyle('background-image');},getBackgroundImage:function(el){var reg_imgFile=/url\s*\(["']?(.*)["']?\)/i;var dummy=document.createElement('img');var string=this.getBackgroundImagePath(el);string=string.match(reg_imgFile)[1];string=string.replace('\"','');dummy.src=string;return dummy;}});window.addEvent('domready',function(e){RateItRating=new RateItRatings({url:'SimpleAjaxFrontend.php?do=rateit'});});}else if(window.jQuery){(function(){RateItRatings={options:{step:0.1,readonly:false,resetable:false},initialize:function(options){if(typeof options=='object'&&typeof options['url']!='undefined') +el.selected.setStyle('width',el.newFill);},getStarPercent:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);if(stars!=null){var score=stars[3].toFloat();var scale=stars[4].toFloat();var percent=(score/scale)*100;return percent;}else{return 0;}},getFillPercent:function(starPercent){return(starPercent/100)*(this.options.starwidth*this.options.max);},getVotePercent:function(actVote){var starsWidth=this.options.starwidth*this.options.max;var percent=(actVote/starsWidth*100).round(2);return percent;},getRatableId:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);return stars!=null?stars[1]:'';},getRatableType:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);return stars!=null?stars[2]:'';},getRatableMaxValue:function(id){var stars=id.match(/(\d*\|?\d*)-(page|article|ce|module|news|faq|galpic|news4ward)-(\d*\.?\d+)_(\d*\.?\d+)$/);return stars!=null?stars[4].toInt():0;},setBackgroundPosition:function(el,pos){el.setStyle('background-position','0% '+pos+'px');},getBackgroundImagePath:function(el){return el.getStyle('background-image');},getBackgroundImage:function(el){var reg_imgFile=/url\s*\(["']?(.*)["']?\)/i;var dummy=document.createElement('img');var string=this.getBackgroundImagePath(el);string=string.match(reg_imgFile)[1];string=string.replace('\"','');dummy.src=string;return dummy;}});window.addEvent('domready',function(e){RateItRating=new RateItRatings({url:'rateit'});});}else if(window.jQuery){(function(){RateItRatings={options:{step:0.1,readonly:false,resetable:false},initialize:function(options){if(typeof options=='object'&&typeof options['url']!='undefined') this.options.url=options['url'];var self=this;jQuery('.rateItRating').each(function(i,element){self.initMe(element);});return this;},initMe:function(element){var self=this;if(!Browser.Engine.trident4){var el=jQuery(element);el.data('id',el.attr('id'));el.data('rateable',el.attr('rel')=='not-rateable'?false:true);el.data('wrapper',el.find('.wrapper'));el.data('textEl',el.find('.ratingText'));el.data('selected',el.find('.rateItRating-selected'));el.data('hover',el.find('.rateItRating-hover'));jQuery.when(self.getBackgroundImage(el.data('wrapper'))).done(function(backgroundImageSize){self.options.starwidth=backgroundImageSize[0];self.options.starheight=backgroundImageSize[1]/3;});if(self.options.starwidth===undefined||self.options.starwidth<16){self.options.starwidth=16;} if(self.options.starheight===undefined||self.options.starheight<16){self.options.starheight=16;} self.setBackgroundPosition(el.data('selected'),-1*self.options.starheight);self.setBackgroundPosition(el.data('hover'),-1*2*self.options.starheight);el.data('starPercent',self.getStarPercent(el.data('id')));el.data('ratableId',self.getRatableId(el.data('id')));el.data('ratableType',self.getRatableType(el.data('id')));self.options.max=self.getRatableMaxValue(el.data('id'));el.data('selected').css('height',self.options.starheight);el.data('hover').css('height',self.options.starheight);el.data('wrapper').css('width',self.options.starwidth*self.options.max);el.data('wrapper').css('height',self.options.starheight);self.fillVote(el.data('starPercent'),el);el.data('currentFill',self.getFillPercent(el.data('starPercent')));if(el.data('rateable')){el.data('wrapper').mouseenter(function(event){el.data('selected').hide(500,"easeInOutQuad");el.data('hover').show();el.data('wrapper').mousemove({'el':el,'self':self},self.mouseCrap);});el.data('wrapper').mouseleave(function(event){el.data('wrapper').unbind('mousemove');el.data('hover').hide();el.data('selected').show();el.data('selected').animate({width:el.data('currentFill')},500);});el.data('wrapper').click(function(event){el.data('currentFill',el.data('newFill'));el.data('wrapper').unbind();el.data('oldTxt',el.data('textEl').text());el.data('textEl').html('          ');el.data('textEl').addClass('loading');if(typeof(jQuery('.mbrateItRating'))!='undefined'&&el.data('id').indexOf('mb')==0){var mbid=el.data('id');mbid=mbid.replace('mb','');if(typeof(arrRatings)=='object'){for(var ri=0;ri').attr('src',string).load(function(){backgroundImageSize.push(this.width);backgroundImageSize.push(this.height);dfd.resolve(backgroundImageSize);});return dfd.promise();},updateText:function(el,text){error=text.split('ERROR:')[1];el.data('textEl').removeClass('loading');if(error){this.RateItRating.showError(el,error);return false;} el.data('textEl').text(text);if(typeof(jQuery('.mbrateItRating'))!='undefined'&&el.data('id').indexOf('mb')==0){var mbid=el.attr('id');mbid=mbid.replace('mb','');if(typeof(arrRatings)=='object'){for(var ri=0;ri