diff --git a/app/MetaGer.php b/app/MetaGer.php index 88183fbccc75c6126fd4dbdbb06bb1497b33231d..2eec10ed89495a4d96d704b6144d98128a50af25 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -361,19 +361,21 @@ class MetaGer public function createSearchEngines(Request $request) { + # Wenn es kein Suchwort gibt if (!$request->has("eingabe")) { return; } - # Überprüfe, welche Sumas eingeschaltet sind $xml = simplexml_load_file($this->sumaFile); + $sumas = $xml->xpath("suma"); $enabledSearchengines = []; $overtureEnabled = false; $sumaCount = 0; - $sumas = $xml->xpath("suma"); /* Erstellt die Liste der eingestellten Sumas - * Der einzige Unterschied bei angepasstem Suchfokus ist, dass nicht nach den Typen einer Suma, sondern den im Request mitgegebenen Typen entschieden wird + * Der einzige Unterschied bei angepasstem Suchfokus ist, + * dass nicht nach den Typen einer Suma, + * sondern den im Request mitgegebenen Typen entschieden wird. * Ansonsten wird genau das selbe geprüft und gemacht: * Handelt es sich um spezielle Suchmaschinen die immer an sein müssen * Wenn es Overture ist vermerken dass Overture an ist @@ -381,54 +383,24 @@ class MetaGer * Zu Liste hinzufügen */ foreach ($sumas as $suma) { - if ($this->fokus === "angepasst") { - if ($request->has($suma["name"]) - || ($this->fokus !== "bilder" - && ($suma["name"]->__toString() === "qualigo" - || $suma["name"]->__toString() === "similar_product_ads" - || (!$overtureEnabled && $suma["name"]->__toString() === "overtureAds") - || $suma["name"]->__toString() == "rlvproduct" - ) - ) - ) { - - if (!(isset($suma['disabled']) && $suma['disabled']->__toString() === "1")) { - if ($suma["name"]->__toString() === "overture" || $suma["name"]->__toString() === "overtureAds") { - $overtureEnabled = true; - } - if ($suma["name"]->__toString() !== "qualigo" && $suma["name"]->__toString() !== "similar_product_ads" && $suma["name"]->__toString() !== "overtureAds") { - $sumaCount += 1; - } - $enabledSearchengines[] = $suma; - } + if ($this->sumaIsSelected($suma, $request) + || ($this->isBildersuche() + && $this->sumaIsAdsuche($suma, $overtureEnabled)) + && (!$this->sumaIsDisabled($suma))) { + if ($this->sumaIsOverture($suma)) { + $overtureEnabled = true; } - } else { - $types = explode(",", $suma["type"]); - if (in_array($this->fokus, $types) - || ($this->fokus !== "bilder" - && ($suma["name"]->__toString() === "qualigo" - || $suma["name"]->__toString() === "similar_product_ads" - || (!$overtureEnabled && $suma["name"]->__toString() === "overtureAds") - || $suma["name"]->__toString() == "rlvproduct" - ) - ) - ) { - if (!(isset($suma['disabled']) && $suma['disabled']->__toString() === "1")) { - if ($suma["name"]->__toString() === "overture" || $suma["name"]->__toString() === "overtureAds") { - $overtureEnabled = true; - } - if ($suma["name"]->__toString() !== "qualigo" && $suma["name"]->__toString() !== "similar_product_ads" && $suma["name"]->__toString() !== "overtureAds") { - $sumaCount += 1; - } - $enabledSearchengines[] = $suma; - } + if ($this->sumaIsNotAdsuche($suma)) { + $sumaCount += 1; } + $enabledSearchengines[] = $suma; } } # Sonderregelung für alle Suchmaschinen, die zu den Minisuchern gehören. Diese können alle gemeinsam über einen Link abgefragt werden $subcollections = []; - $tmp = []; + + $tmp = []; foreach ($enabledSearchengines as $engine) { if (isset($engine['minismCollection'])) { $subcollections[] = $engine['minismCollection']->__toString(); @@ -439,91 +411,41 @@ class MetaGer } $enabledSearchengines = $tmp; if (sizeof($subcollections) > 0) { - $count = sizeof($subcollections) * 10; - $minisucherEngine = $xml->xpath('suma[@name="minism"]')[0]; - $subcollections = urlencode("(" . implode(" OR ", $subcollections) . ")"); - $minisucherEngine["formData"] = str_replace("<<SUBCOLLECTIONS>>", $subcollections, $minisucherEngine["formData"]); - $minisucherEngine["formData"] = str_replace("<<COUNT>>", $count, $minisucherEngine["formData"]); - $enabledSearchengines[] = $minisucherEngine; + $enabledSearchengines[] = $this->loadMiniSucher($xml, $subcollections); } if ($sumaCount <= 0) { $this->errors[] = trans('metaGer.settings.noneSelected'); } + $engines = []; - # Wenn eine Sitesearch durchgeführt werden soll, überprüfen wir ob eine der Suchmaschinen überhaupt eine Sitesearch unterstützt + # Wenn eine Sitesearch durchgeführt werden soll, überprüfen wir ob überhaupt eine der Suchmaschinen eine Sitesearch unterstützt $siteSearchFailed = $this->checkCanNotSitesearch($enabledSearchengines); $typeslist = []; $counter = 0; - if ($request->has('next') && Cache::has($request->input('next')) && unserialize(Cache::get($request->input('next')))['page'] > 1) { - $next = unserialize(Cache::get($request->input('next'))); - $this->page = $next['page']; - $engines = $next['engines']; - if (isset($next['startForwards'])) { - $this->startForwards = $next['startForwards']; - } - - if (isset($next['startBackwards'])) { - $this->startBackwards = $next['startBackwards']; - } - + if ($this->requestIsCached($request)) { + $engines = $this->getCachedEngines($request); } else { - foreach ($enabledSearchengines as $engine) { - - # Wenn diese Suchmaschine gar nicht eingeschaltet sein soll - if (!$siteSearchFailed && strlen($this->site) > 0 && (!isset($engine['hasSiteSearch']) || $engine['hasSiteSearch']->__toString() === "0")) { - continue; - } - - # Setze Pfad zu Parser - $path = "App\Models\parserSkripte\\" . ucfirst($engine["package"]->__toString()); - - # Prüfe ob Parser vorhanden - if (!file_exists(app_path() . "/Models/parserSkripte/" . ucfirst($engine["package"]->__toString()) . ".php")) { - Log::error(trans('metaGer.engines.noParser', ['engine' => $engine["name"]])); - continue; - } - - # Es wird versucht die Suchengine zu erstellen - $time = microtime(); - try { - $tmp = new $path($engine, $this); - } catch (\ErrorException $e) { - Log::error(trans('metaGer.engines.cantQuery', ['engine' => $engine["name"], 'error' => var_dump($e)])); - continue; - } - - # Ausgabe bei Debug-Modus - if ($tmp->enabled && isset($this->debug)) { - $this->warnings[] = $tmp->service . " Connection_Time: " . $tmp->connection_time . " Write_Time: " . $tmp->write_time . " Insgesamt:" . ((microtime() - $time) / 1000); - } - - # Wenn die neu erstellte Engine eingeschaltet ist, wird sie der Liste hinzugefügt - if ($tmp->isEnabled()) { - $engines[] = $tmp; - } - - } + $engines = $this->actuallyCreateSearchEngines($enabledSearchengines, $siteSearchFailed); } - # Wir starten die Suche manuell: + # Wir starten alle Suchen foreach ($engines as $engine) { $engine->startSearch($this); } $this->adjustFocus($sumas, $enabledSearchengines); - /* Nun passiert ein elementarer Schritt. - * Wir warten auf die Antwort der Suchmaschinen, da wir vorher nicht weiter machen können. - * Aber natürlich nicht ewig. - * Die Verbindung steht zu diesem Zeitpunkt und auch unsere Request wurde schon gesendet. - * Wir geben der Suchmaschine nun bis zu 500ms Zeit zu antworten. + /* Wir warten auf die Antwort der Suchmaschinen + * Die Verbindung steht zu diesem Zeitpunkt und auch unsere Requests wurden schon gesendet. + * Wir zählen die Suchmaschinen, die durch den Cache beantwortet wurden: + * $enginesToLoad zählt einerseits die Suchmaschinen auf die wir warten und andererseits + * welche Suchmaschinen nicht rechtzeitig geantwortet haben. */ - # Wir zählen die Suchmaschinen, die durch den Cache beantwortet wurden: $enginesToLoad = []; $canBreak = false; foreach ($engines as $engine) { @@ -532,8 +454,6 @@ class MetaGer $canBreak = true; } } else { - # Das Array zählt einerseits die Suchmaschinen, auf die wir warten und andererseits - # welche Suchmaschinen nicht rechtzeitig geantwortet haben. $enginesToLoad[$engine->name] = false; } } @@ -543,6 +463,135 @@ class MetaGer $this->retrieveResults($engines); } + # Spezielle Suchen und Sumas + + public function sumaIsSelected($suma, $request) + { + if ($this->fokus === "angepasst") { + if ($request->has($suma["name"])) { + return true; + } + } else { + $types = explode(",", $suma["type"]); + if (in_array($this->fokus, $types)) { + return true; + } + } + return false; + } + + public function actuallyCreateSearchEngines($enabledSearchengines, $siteSearchFailed) + { + $engines = []; + foreach ($enabledSearchengines as $engine) { + + # Wenn diese Suchmaschine gar nicht eingeschaltet sein soll + if (!$siteSearchFailed + && strlen($this->site) > 0 + && (!isset($engine['hasSiteSearch']) + || $engine['hasSiteSearch']->__toString() === "0")) { + continue; + } + + # Setze Pfad zu Parser + $path = "App\Models\parserSkripte\\" . ucfirst($engine["package"]->__toString()); + + # Prüfe ob Parser vorhanden + if (!file_exists(app_path() . "/Models/parserSkripte/" . ucfirst($engine["package"]->__toString()) . ".php")) { + Log::error(trans('metaGer.engines.noParser', ['engine' => $engine["name"]])); + continue; + } + + # Es wird versucht die Suchengine zu erstellen + $time = microtime(); + try { + $tmp = new $path($engine, $this); + } catch (\ErrorException $e) { + Log::error(trans('metaGer.engines.cantQuery', ['engine' => $engine["name"], 'error' => var_dump($e)])); + continue; + } + + # Ausgabe bei Debug-Modus + if ($tmp->enabled && isset($this->debug)) { + $this->warnings[] = $tmp->service . " Connection_Time: " . $tmp->connection_time . " Write_Time: " . $tmp->write_time . " Insgesamt:" . ((microtime() - $time) / 1000); + } + + # Wenn die neu erstellte Engine eingeschaltet ist, wird sie der Liste hinzugefügt + if ($tmp->isEnabled()) { + $engines[] = $tmp; + } + } + return $engines; + } + + public function isBildersuche() + { + return $this->fokus !== "bilder"; + } + + public function sumaIsAdsuche($suma, $overtureEnabled) + { + return + $suma["name"]->__toString() === "qualigo" + || $suma["name"]->__toString() === "similar_product_ads" + || (!$overtureEnabled + && $suma["name"]->__toString() === "overtureAds") + || $suma["name"]->__toString() == "rlvproduct"; + } + + public function sumaIsDisabled($suma) + { + return + isset($suma['disabled']) + && $suma['disabled']->__toString() === "1"; + } + + public function sumaIsOverture($suma) + { + return + $suma["name"]->__toString() === "overture" + || $suma["name"]->__toString() === "overtureAds"; + } + + public function sumaIsNotAdsuche($suma) + { + return + $suma["name"]->__toString() !== "qualigo" + && $suma["name"]->__toString() !== "similar_product_ads" + && $suma["name"]->__toString() !== "overtureAds"; + } + + public function requestIsCached($request) + { + return + $request->has('next') + && Cache::has($request->input('next')) + && unserialize(Cache::get($request->input('next')))['page'] > 1; + } + + public function getCachedEngines($request) + { + $next = unserialize(Cache::get($request->input('next'))); + $this->page = $next['page']; + $engines = $next['engines']; + if (isset($next['startForwards'])) { + $this->startForwards = $next['startForwards']; + } + if (isset($next['startBackwards'])) { + $this->startBackwards = $next['startBackwards']; + } + return $engines; + } + + public function loadMiniSucher($xml, $subcollections) + { + $minisucherEngine = $xml->xpath('suma[@name="minism"]')[0]; + $subcollections = urlencode("(" . implode(" OR ", $subcollections) . ")"); + $minisucherEngine["formData"] = str_replace("<<SUBCOLLECTIONS>>", $subcollections, $minisucherEngine["formData"]); + $minisucherEngine["formData"] = str_replace("<<COUNT>>", sizeof($subcollections) * 10, $minisucherEngine["formData"]); + return $minisucherEngine; + } + # Passt den Suchfokus an, falls für einen Fokus genau alle vorhandenen Sumas eingeschaltet sind public function adjustFocus($sumas, $enabledSearchengines) { @@ -688,9 +737,9 @@ class MetaGer $this->engines = $engines; } - /* - * Ende - */ +/* + * Ende Suchmaschinenerstellung und Ergebniserhalt + */ public function parseFormData(Request $request) {