Ich habe versucht das Feld EAN aus der Tabelle s_articles_details für die ISBN zu nutzen und mit in den Einstellungen als Suche eingebunden, aber wenn er einen 100% treffer haben müsste, werden auch viele andere Artikel angezeigt, sodass ich mir jetzt den Quelltext etwas genauer angesehen habe.
In der Datei /engine/Shopware/Controllers/Frontend/Search.php habe ich folgenden Code zur Funktion searchFuzzyCheck hinzugefügt.
function findIsbn($str)
{
$regex = '/\b(?:ISBN(?:: ?| ))?((?:97[89])?\d{9}[\dx])\b/i';
if (preg_match($regex, str_replace('-', '', $str), $matches)) {
return (10 === strlen($matches[1]))
? 1 // ISBN-10
: 2; // ISBN-13
}
return false; // No valid ISBN found
}
if (!empty($search)) $searchISBN = findIsbn($search);
if (( $searchISBN==1 || $searchISBN==2 ) && strlen($search) >= $minSearch) {
$sql = '
SELECT DISTINCT articleID, ean, s_articles.configurator_set_id
FROM s_articles_details
INNER JOIN s_articles
ON s_articles.id = s_articles_details.articleID
WHERE ean = ?
GROUP BY articleID
LIMIT 1
';
$products = $this->get('db')->fetchAll($sql, [$search]);
if ($products[0]['configurator_set_id']) {
$number = $products[0]['ean'];
}
$products = array_column($products, 'articleID');
if (empty($products)) {
$like_search = $search . '%';
$sql = '
SELECT DISTINCT articleID
FROM s_articles_details
WHERE ean = ?
OR ean LIKE ?
GROUP BY articleID
LIMIT 1
';
$products = $this->get('db')->fetchCol($sql, [$search, $like_search]);
}
} else {
if (!empty($search) && strlen($search) >= $minSearch) {
$sql = '
SELECT DISTINCT articleID, ordernumber, s_articles.configurator_set_id
FROM s_articles_details
INNER JOIN s_articles
ON s_articles.id = s_articles_details.articleID
WHERE ordernumber = ?
GROUP BY articleID
LIMIT 2
';
$products = $this->get('db')->fetchAll($sql, [$search]);
if ($products[0]['configurator_set_id']) {
$number = $products[0]['ordernumber'];
}
$products = array_column($products, 'articleID');
if (empty($products)) {
$like_search = $search . '%';
$sql = '
SELECT DISTINCT articleID
FROM s_articles_details
WHERE ordernumber = ?
OR ordernumber LIKE ?
GROUP BY articleID
LIMIT 2
';
$products = $this->get('db')->fetchCol($sql, [$search, $like_search]);
}
}
}
Die Abfrage wird angewendet, wenn ich eine ISBN eingebe und er einen Match hat, mit klick auf die Lupe komme ich direkt zum Artikel, aber die Ajaxsuche /engine/Shopware/Controllers/Frontend/AjaxSearch.php, gibt mir weiterhin mehrere Artikel aus.
Jemand eine Idee wie ich das Problem auch noch löse, das er den Artikel wie bei der Artikelnummer nur alleine anzeigt?