From e6cb5fdc89f2ad4137657cccea79fbdc23bb37cb Mon Sep 17 00:00:00 2001 From: sysadminstory Date: Wed, 13 Mar 2024 23:47:46 +0100 Subject: [PATCH] [IdealoBridge] Fix Feed items & Feed title customisation (#4013) - Feed items with new price tracking had "Max Price Used" instead of "Max Price New" - Feed Title is now customised with the product name and the Price limits - Fixed logic for saving prices in cache - remove undefined variable notices --- bridges/IdealoBridge.php | 83 +++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 14 deletions(-) diff --git a/bridges/IdealoBridge.php b/bridges/IdealoBridge.php index cef2b812165..fe13e13dd52 100644 --- a/bridges/IdealoBridge.php +++ b/bridges/IdealoBridge.php @@ -40,6 +40,47 @@ public function getIcon() return 'https://cdn.idealo.com/storage/ids-assets/ico/favicon.ico'; } + /** + * Returns the RSS Feed title when a RSS feed is rendered + * @return string the RSS feed Title + */ + private function getFeedTitle() + { + $cacheDuration = 604800; + $link = $this->getInput('Link'); + $keyTITLE = $link . 'TITLE'; + $product = $this->loadCacheValue($keyTITLE, $cacheDuration); + + // The cache does not contain the title of the bridge, we must get it and save it in the cache + if ($product === null) { + $header = [ + 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2.1 Safari/605.1.15' + ]; + $html = getSimpleHTMLDOM($link, $header); + $product = $html->find('.oopStage-title', 0)->find('span', 0)->plaintext; + $this->saveCacheValue($keyTITLE, $product); + } + + $MaxPriceUsed = $this->getInput('MaxPriceUsed'); + $MaxPriceNew = $this->getInput('MaxPriceNew'); + $titleParts = []; + + $titleParts[] = $product; + + // Add Max Prices to the title + if ($MaxPriceUsed !== null) { + $titleParts[] = 'Max Price Used : ' . $MaxPriceUsed . '€'; + } + if ($MaxPriceNew !== null) { + $titleParts[] = 'Max Price New : ' . $MaxPriceNew . '€'; + } + + $title = implode(' ', $titleParts); + + + return $title . ' - ' . $this::NAME; + } + public function collectData() { // Needs header with user-agent to function properly. @@ -69,12 +110,16 @@ public function collectData() $FirstButton = $html->find('.oopStage-conditionButton-wrapper-text', 0); if ($FirstButton) { $PriceNew = $FirstButton->find('strong', 0)->plaintext; + // Save current price + $this->saveCacheValue($KeyNEW, $PriceNew); } // Second Button is used $SecondButton = $html->find('.oopStage-conditionButton-wrapper-text', 1); if ($SecondButton) { $PriceUsed = $SecondButton->find('strong', 0)->plaintext; + // Save current price + $this->saveCacheValue($KeyUSED, $PriceUsed); } // Only continue if a price has changed @@ -83,16 +128,16 @@ public function collectData() $image = $html->find('.datasheet-cover-image', 0)->src; // Generate Content - if ($PriceNew > 1) { + if (isset($PriceNew) && $PriceNew > 1) { $content = "

Price New:
$PriceNew

"; $content .= "

Price New before:
$OldPriceNew

"; } if ($this->getInput('MaxPriceNew') != '') { - $content .= sprintf('

Max Price Used:
%s,00 €

', $this->getInput('MaxPriceNew')); + $content .= sprintf('

Max Price New:
%s,00 €

', $this->getInput('MaxPriceNew')); } - if ($PriceUsed > 1) { + if (isset($PriceUsed) && $PriceUsed > 1) { $content .= "

Price Used:
$PriceUsed

"; $content .= "

Price Used before:
$OldPriceUsed

"; } @@ -110,8 +155,8 @@ public function collectData() // Currently under Max new price if ($this->getInput('MaxPriceNew') != '') { - if ($PriceNew < $this->getInput('MaxPriceNew')) { - $title = sprintf($Pricealarm, 'Used', $PriceNew, $Productname, $now); + if (isset($PriceNew) && $PriceNew < $this->getInput('MaxPriceNew')) { + $title = sprintf($Pricealarm, 'New', $PriceNew, $Productname, $now); $item = [ 'title' => $title, 'uri' => $link, @@ -124,7 +169,7 @@ public function collectData() // Currently under Max used price if ($this->getInput('MaxPriceUsed') != '') { - if ($PriceUsed < $this->getInput('MaxPriceUsed')) { + if (isset($PriceUsed) && $PriceUsed < $this->getInput('MaxPriceUsed')) { $title = sprintf($Pricealarm, 'Used', $PriceUsed, $Productname, $now); $item = [ 'title' => $title, @@ -143,23 +188,23 @@ public function collectData() (!$this->getInput('ExcludeNew') && $PriceNew != $OldPriceNew ) || (!$this->getInput('ExcludeUsed') && $PriceUsed != $OldPriceUsed ) ) { - $title .= 'Priceupdate! '; + $title = 'Priceupdate! '; if (!$this->getInput('ExcludeNew')) { - if ($PriceNew < $OldPriceNew) { + if (isset($PriceNew) && $PriceNew < $OldPriceNew) { $title .= 'NEW:⬇ '; // Arrow Down Emoji } - if ($PriceNew > $OldPriceNew) { + if (isset($PriceNew) && $PriceNew > $OldPriceNew) { $title .= 'NEW:⬆ '; // Arrow Up Emoji } } if (!$this->getInput('ExcludeUsed')) { - if ($PriceUsed < $OldPriceUsed) { + if (isset($PriceUsed) && $PriceUsed < $OldPriceUsed) { $title .= 'USED:⬇ '; // Arrow Down Emoji } - if ($PriceUsed > $OldPriceUsed) { + if (isset($PriceUsed) && $PriceUsed > $OldPriceUsed) { $title .= 'USED:⬆ '; // Arrow Up Emoji } } @@ -177,9 +222,19 @@ public function collectData() } } } + } - // Save current price - $this->saveCacheValue($KeyNEW, $PriceNew); - $this->saveCacheValue($KeyUSED, $PriceUsed); + /** + * Returns the RSS Feed title according to the parameters + * @return string the RSS feed Tile + */ + public function getName() + { + switch ($this->queriedContext) { + case '0': + return $this->getFeedTitle(); + default: + return parent::getName(); + } } }