Jump to content

Produkt rss feed feeder


Twilli

Recommended Posts

Hallo,

 

ich nutze derzeit den feeder (RSS feed neue Produkte). Nun würde ich den rss gerne nicht für die neuen/hinzugefügten Produkte verwenden sondern für alle im Shop vorhandenen Artikel bei denen es eine Änderung gab (Preis, Text....)

 

Mit diesem code erhalte ich im rss alle neuen/hinzugefügten Artikel und die neuen/hinzugefügten Artikel bei denen es eine Änderung gab.

 

>>>

 

// Get data
$number = ((int)(Tools::getValue('n')) ? (int)(Tools::getValue('n')) : 10);
$orderByValues = array(0 => 'date_add', 1 => 'price', 2 => 'name', 3 => 'date_upd', 4 => 'position');
$orderWayValues = array(0 => 'DESC', 1 => 'ASC');
$id_category = ((int)(Tools::getValue('id_category')) ? (int)(Tools::getValue('id_category')) : Configuration::get('PS_HOME_CATEGORY'));
$products = Product::getNewProducts((int)Context::getContext()->language->id, 0, 25, false, 'date_upd', 'DESC');
$currency = new Currency((int)Context::getContext()->currency->id);
$affiliate = (Tools::getValue('ac') ? '?ac='.(int)(Tools::getValue('ac')) : '');
$metas = Meta::getMetaByPage('index', (int)Context::getContext()->language->id);

 

>>>

 

Leider holt der rss die Daten nur aus den neuen/hinzugefügten Artikel und nicht aus allen Artikeln die im Shop sind. Hat jemand eine Idee/Anregung wie ich mit $products = alle im Shop aktiven Artikel ansprechen kann??

 

Vielen Dank

Edited by Twilli (see edit history)
Link to comment
Share on other sites

Servus,

 

was passiert wenn du anstatt:

$products = Product::getNewProducts((int)Context::getContext()->language->id, 0, 25, false, 'date_upd', 'DESC');

das New weglässt?

$products = Product::getProducts((int)Context::getContext()->language->id, 0, 25, false, 'date_upd', 'DESC');

und so würde es beim Originalen Quellcode aussehen:

$products = Product::getProducts((int)Context::getContext()->language->id, 0, ($number > 10 ? 10 : $number), "date_upd", "desc", $id_category, true);
Link to comment
Share on other sites

Servus Holger,

 

leider kommt ein "Fatal error" im Browser wenn ich das "New" weglasse und beim Originalcode werden mir keine Produkte im RSS angezeigt. Nach meiner Info zeigt der Originalcode nur Produkte aus der Kategorie "home" an ...

 

Danke !

 

Grüße

Link to comment
Share on other sites

So geht das in der Tat nicht, weil es diese Funktion nicht in dieser Art gibt. Erster Versuch wäre so:

$products = Product::getNewProducts((int)Context::getContext()->language->id, 0, 500, false, 'date_upd', 'DESC');

Die Zahl 500 entspricht dabei der Anzahl Produkte. Kann man ggf. auch erhöhen, wobei das irgendwann für einen RSS Feed dann auch nicht mehr Sinn macht.
 
Die Funktion sieht übrigens so aus mit allen Parametern und fndet sich in ../classes/Produt.php:

    public static function getNewProducts($id_lang, $page_number = 0, $nb_products = 10, $count = false, $order_by = null, $order_way = null, Context $context = null)

Die weitere Möglichkeit wäre, auf die Funktion umzustellen, die erwähnt wurde. Diese hat aber einen anderen Aufbau bezüglich der Übergabe-Parameter, deshalb der Fatal Error.

   public static function getProducts($id_lang, $start, $limit, $order_by, $order_way, $id_category = false,
        $only_active = false, Context $context = null)
Edited by Scully (see edit history)
Link to comment
Share on other sites

Servus Scully,

 

 

So geht das in der Tat nicht, weil es diese Funktion nicht in dieser Art gibt.

 

da muss ich dir leider widersprechen. Die Funktion gibt es sehr wohl (ebenfalls in der ../classes/Produt.php). Die Original rss.php aus diesem Modul verwendet diese.

 

Hier der Aufruf mit allen Parametern:

public static function getProducts($id_lang, $start, $limit, $order_by, $order_way, $id_category = false, $only_active = false, Context $context = null)
Link to comment
Share on other sites

Leute, jetzt werde ich auch langsam neugierig auf das Thema, weil mich an den RSS auch nervt, dass die nur neue Artikel setzen, aber bei Änderungen eben nichts neues gezeigt wird. Gerade da sollte aber der RSS noch eher "zuschlagen" denn neue Produkte ziehen ja nur den an, der diese explizit sucht, Änderungen sind für fast jeden Abonnenten wichtiger.

Link to comment
Share on other sites

Servus,

 

@Scully Sorry, ich hatte nur den Anfang deines Posts gelesen und nicht weiter gescrollt....

 

Ich hab jetzt mal schnell Lokal mit dem Quellcode der rss.php gespielt.

// Get data
//$number = ((int)(Tools::getValue('n')) ? (int)(Tools::getValue('n')) : 10);
//$orderBy = Tools::getProductsOrder('by', Tools::getValue('orderby'));
//$orderWay = Tools::getProductsOrder('way', Tools::getValue('orderway'));
//$id_category = ((int)(Tools::getValue('id_category')) ? (int)(Tools::getValue('id_category')) : Configuration::get('PS_HOME_CATEGORY'));
$products = Product::getProducts((int)$context->language->id, 0, 25, 'date_upd', 'desc', false, true);

$number - wird nicht benötigt. Den Wert als Zahl (25) vorgegeben. Es werden hierbei vom "Start" (0) aus 25 Artikel ausgelesen.

$orderBy - wird nicht benötigt. Fest vorgegeben mit "date_upd" = Zuletzt aktualisierte Artikel.

$orderWay - wird nicht benötigt. Fest vorgegeben mit "desc" = Artikel absteigend sortieren.

$id_category - wird nicht benötigt. Fest vorgegeben mit "false"= Alle Artikel aus allen Kategorien holen.

 

Wenn ich jetzt nicht irgendwo einen Wurm eingebaut hab, könnte es so funktionieren?

Edited by BagHira (see edit history)
Link to comment
Share on other sites

Ich klinke mich auch mal ein:

 

Wenn das nachher läuft muss ich mal gucken ob 1.7 in dem Bereich genauso aufgebaut ist. Ist doch sehr interessant das Feature.

Lässt sich der Feed denn dann auch (zusätzlich) im selben Shop im Modul Block RSS-Feed nutzen?

Ich habe immer die Meldung bekommen das man nicht den Feed des eigenen Shops anzeigen lassen kann. Ist das technisch wirklich nicht Möglich?

Würde den Feed halt gern auf unserer Homepage und im Shop anzeigen lassen. Gerade wenn der auch Änderungen an Produkten an zeigt.

Link to comment
Share on other sites

Noch was: Ich kann auf dem Server nachsehen, wan der Feed abgerufen wird und von welcher IP und welchem Client. Gibt es da ein Script, mit dem man sich das als Statistik anzeigen lassen könnte, um zu sehen, ob die Feeds überhaupt jemanden interessieren?

Link to comment
Share on other sites

Du könntest 1x am Tag das Logfile auswerten.

cat access....log | grep "URL_mit_RSS_Feed" | wc -l

Gibt Dir alle Aufrufe an soweit das entsprechende Logfile zurückreicht.

 

IMHO sind RSS Feeds heute nicht mehr das grosse Ding. Das war vor 10 Jahren noch eine andere Ausgangslage. Ich habe für Nicht-Onlineshop-Seiten schon vor Jahren den Feed aufgegeben. Für Onlineshops habe ich es gar nicht erst versucht.

 

Eine andere Idee wäre, jedesmall einen Counter in ps_configuration zu erhöhen, wenn die RSS Funktion ausgeführt wird.

Aber bevor ich da viel Arbeit reinstecken würde, erstmal auf einfache Art prüfen, ob den Feed überhaupt wer anschaut.

Edited by Scully (see edit history)
Link to comment
Share on other sites

Beim Onlineshop ist es soweit für meine weiteren Pläne sinnvoll, weil ich meine Händler damit über neue Produkte und Änderungen bestehender Produkte informieren kann.

 

Welche anderen Möglichkeiten hat man ausser einen newsletter, der mir zu stressig wäre, wenn ich den immer selbst schreiben muss. Ein newslettergenerator wäre da z.B. okay, wenn der am Ende des Tages alles direkt selbst erstellt und versendet, bei neuen Artikeln und Preisänderungen... *träum*

Edited by Claudiocool (see edit history)
Link to comment
Share on other sites

Wenn Du an Wiederverkäufer / Händler lieferst, dann kann ich mir das vorstellen. Bei Verkauf an Endkunden eher weniger. Die schauen heute doch häufiger erst bei Vergleichsportalen oder googeln nach dem Produkt.

Link to comment
Share on other sites

Ja, ich denke, das läuft so ganz okay... :) Dank der kleinen Änderung werden nun alle Änderungen zuverlässig in die Outlook-Feeds übertragen, dann sehen meine Kunden gleich, wenn sich irgendwas geändert hat, es gab gestern dafür schon ein Lob ;)

Link to comment
Share on other sites

@Scully:

 

Kommt natürlich darauf an was man verkauft. Schuhe gibt es überall da wird sicherlich keinen einen Feed verfolgen. Aber genug Shops verkaufen ja auch selbst produziertes. Da gibt es evtl. keine oder wenig Konkurenz und da kann ich mir auch vorstellen das Kunden da Informiert bleiben würden. Muss ja nicht immer der nervige Newsletter sein wenn man sich durch einen Feed selbst auf dem laufenden halten kann.

 

@all:

 

Leider funktioniert es bei 1.7 so nicht mehr. Jedenfalls ist die Stelle in der rss.php etwas anders aufgebaut. Anders genug das ich es nicht ableiten kann.

Link to comment
Share on other sites

@claudiocool: Freut mich das es positive Rückmeldungen gab.

 

@shad86: Ich habe heute morgen testweise die 1.7.1.2 installiert. Komme aber auch nicht weiter - es liegt wohl an der Kategorie. False wird hier bei der Moduleigenen Funktion getProducts nicht akzeptiert.

Ich habe es dann mit der "alten" Funktion getProducts aus der 1.6.1.x versucht. Diese habe ich in die rss.php als RSSgetProducts eingebunden. Aber auch hier bekomme ich die Ausgabe des Feeds nicht hin :( . In 1.7.x ist wohl soviel geändert, das dies so nicht funktioniert.

Link to comment
Share on other sites

Hallo,

 

jetzt muss ich das Thema noch mal aufgreifen.

Gibt es eine Möglichkeit nur die aktualisierten Artikel anzeigen zu lassen. Dh. da das "date_upd" genommen wird, dies aber auch bei der Neuanlage eines Artikels in die DB geschrieben wird,  müsste man im rss alle Artikel anzeigen lassen nach "date_upd" wenn "date_add" nicht dem gleichen Datum (Tag) entspricht.
 

Grüße

Edited by Twilli (see edit history)
Link to comment
Share on other sites

Servus Twilli,

 

du kopierst die Funktion getProducts() aus der ../classes/Produt.php in eine neue Datei.

    public static function getProducts($id_lang, $start, $limit, $order_by, $order_way, $id_category = false,
        $only_active = false, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }

        $front = true;
        if (!in_array($context->controller->controller_type, array('front', 'modulefront'))) {
            $front = false;
        }

        if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) {
            die(Tools::displayError());
        }
        if ($order_by == 'id_product' || $order_by == 'price' || $order_by == 'date_add' || $order_by == 'date_upd') {
            $order_by_prefix = 'p';
        } elseif ($order_by == 'name') {
            $order_by_prefix = 'pl';
        } elseif ($order_by == 'position') {
            $order_by_prefix = 'c';
        }

        if (strpos($order_by, '.') > 0) {
            $order_by = explode('.', $order_by);
            $order_by_prefix = $order_by[0];
            $order_by = $order_by[1];
        }
        $sql = 'SELECT p.*, product_shop.*, pl.* , m.`name` AS manufacturer_name, s.`name` AS supplier_name
				FROM `'._DB_PREFIX_.'product` p
				'.Shop::addSqlAssociation('product', 'p').'
				LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` '.Shop::addSqlRestrictionOnLang('pl').')
				LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
				LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`)'.
                ($id_category ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)' : '').'
				WHERE pl.`id_lang` = '.(int)$id_lang.
                    ($id_category ? ' AND c.`id_category` = '.(int)$id_category : '').
                    ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
                    ($only_active ? ' AND product_shop.`active` = 1' : '').'
				ORDER BY '.(isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).
                ($limit > 0 ? ' LIMIT '.(int)$start.','.(int)$limit : '');
        $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
        if ($order_by == 'price') {
            Tools::orderbyPrice($rq, $order_way);
        }

        foreach ($rq as &$row) {
            $row = Product::getTaxesInformations($row);
        }

        return ($rq);
    }

Die Funktion in der neuen Datei nennst du dann z.B. RSSgetProducts(). Nun musst du die WHERE -Klausel bezüglich date_upd entsprechend anpassen. Das Format für dieses Tabellenfeld ist z.B. 2017-07-14 06:47:50. D.h. du musst dir alle Datensätze holen die >= 2017-07-14 00:00:00 sind um nur die Produkte zu haben die du Heute neu eingestellt oder aktualisiert hast.

 

 

Das mit dem "neu eingestellt" würde ich aber vorher noch einmal testen: Erstelle einen Dummy-Artikel und speichere ihn ab. Nun schaust du in die Datenbanktabelle ps_product_shop ob das Feld date_upd für diesen Artikel bereits belegt ist.

 

Nun speicherst du die Datei per FTP in dem Ordner ../override/classes mit dem Namen Produt.php ab.

 

In der rss.php rufst du die Funktion auf mit:

$products = Product::RSSgetProducts((int)$context->language->id, 0, 25, 'date_upd', 'desc', false, true);

Theoretisch sollte das so funktionieren. Getestet hab ich das nicht :rolleyes:

Aber ich muss claudiocool schon recht geben, ich würde die Änderung auch nicht so einbauen.

Link to comment
Share on other sites

Servus Holger,

 

das funktioniert theoretisch ABER ich habe mir das anders gedacht....

Es sollen ALLE Produkte die "nur" aktualisiert worden sind angezeigt werden. Also nicht nur die von heute oder gestern.

Sobald ein neuer Artikel angelegt wird und man diesen dann speichert wird auch im Feld "date_upd" ein entsprechender Wert eingetragen. Dadurch wir dieser neue Artikel ebenfalls im rss angezeigt. Mein Gedanke war es sozusagen zwei RSS anzubieten. 1mal mit den neuen Artikeln und 1mal einen mit den aktualisierten Artikeln. Somit hat der Kunde eine genaue und geteilte Übersicht was NEU dazu gekommen ist und welche Artikel "geändert/aktualisiert" worden sind.

 

Vielen Dank !!!

 

Grüße

Link to comment
Share on other sites

Okay, wohl falsch verstanden ;)

 

Ob das geht kann ich dir nicht sagen, den du müsstest hierzu zumindest die rss.php duplizieren (z.B. rss_upd.php).

Falls das so einfach geht und du die aufrufen kannst und dir der Feed angezeigt wird ist es wieder eine SQL-Geschichte. In dem Feld date_add steht ja das Erstellungsdatum. Dies müsstest du dann mit date_upd vergleichen. Wenn date_upd um "X" größer als date_add ....

 

Wobei "X" so eine Sache ist:

- Du legst jetzt einen neuen Artikel an.

  - Nach ca. zwei Stunden änderst du diesen. Soll er dann angezeigt werden...

  - Nach einem Tag....

  - oder ...

 

Ich glaube das verwischt alles etwas und ist für den Kunden dann recht unübersichtlich.

 

PS.:

Das mit dem duplizieren geht bei diesem Modul, gerade getestet.

Edited by BagHira (see edit history)
Link to comment
Share on other sites

Hallo allseits,

 

date_add wird nur beim erstellen gesetzt.

date_upd wird sowohl beim erstellen auf die aktuelle Zeit als auch bei jedem Update nachgeführt

 

Für die Selektion der Updates einer Woche:

... and p.date_upd >=(CURDATE() - INTERVAL 7 DAY)

wäre obiges SQL-Fragment geeignet, welches in die WHERE - Clause mit reinmüsste, um eine Selektion nach Update-Datum vorzunehmen.

In diesem Fall würde alles angezeigt, was innert der letzten  Woche letztmals aktualisiert worden ist. Den Wert INTERVAL kann man nach belieben setzen (Minuten, Stunden, Tage, Monate ....)

 

@Claudio hat aber recht, wenn er sagt, dass es dann unschön ist, wenn man nichts aktualisiert hat und der Kunde dann nicht sieht.

Übrigens -> Bravo für die Komplimente des Kunden.

 

Besser wäre meines erachtens deshalb folgendes:

... ORDER BY p.date_upd DESC LIMIT 0, 50

Sortiert absteigend nach dem letztem Update-Datum und nimmt in dieser Reihenfolge dann die ersten 50 Treffer (LIMIT 0, 50).

So hat man immer etwas im Feed, auch wenn man mal nichts aktualisiert hat in neuster Zeit.

 

Da der Wert für "Order by" aus einer Variablen kommt, könnte man diese evtl. so setzen:

 

$order_by = "p.date_add";

$order_way = "DESC";

 

Bitte den Tabellen-Alias p. beachten. Der SELECT geht sowohl über die Tabelle product als auch product_shop. Beide führen die Felder date_add und date_upd. Wenn man den Alias wegliesse, könnte das das zu einem SQL-Fehler führen.

 

Viele Grüsse

Edited by Scully (see edit history)
Link to comment
Share on other sites

Hallo,

vielen Dank für Euer feedback.

Sobald ein neuer Artikel angelegt wird erfolgt ein Eintrag in "date_add" und "date_upd", wobei der Wert in "date_add" immer kleiner ist als "date_upd".
Wenn ich mir den rss nach "date_add" auflisten lasse erhalte ich immer die neuen Artikel im RSS ("date_add").
Wenn ich mir den rss nach "date_upd" auflisten lasse erhalte ich immer die geänderten sowie die neuen Artikel im RSS ("date_upd").

Jetzt würde ich gerne die neuen Artikel vom RSS ("date_upd") ausschließen. Die Definition wann/wie lange (Zeitraum) ein Artikel als NEU gelten soll ist Ansichtssache.

Z.B alle Artikel auflisten deren "date_upd" um mindestens vier Tage größer/älter ist als das "date_add".
Also nur die Artikel deren date_upd ab vier Tage (eben alle älteren) nach dem date_add erfolgt ist.


Beispiel:

date_add 2017-07-14 11:17:05
date_update 2017-07-14 11:35:05
Soll nicht aufgelistet werden | Der Zeitraum zwischen add und update ist zu gering

date_add 2017-07-14 11:17:05
date_update 2017-07-19 12:17:05
Soll aufgelistet werden | Der Zeitraum zwischn add und update ist größer 4 Tage

date_add 2012-04-14 11:17:05
date_update 2017-07-19 12:17:05
Soll aufgelistet werden | Der Zeitraum zwischn add und update ist größer 4 Tage

if ('date_add'<='date_upd')


Aber vielleicht hab ich da gerade ein Denkwirrwarr...

Grüße

Edited by Twilli (see edit history)
Link to comment
Share on other sites

Versuche mal dieses da:

... where (p.date_add + INTERVAL 4 DAY) <= CURDATE()

zeigt alle Produkte an, die mindestens 4 Tage alt sind. Zum feld date_add werden 4 Tage hinzugerechnet.

Erfassung am: 10.07.2017 18:00:00
plus 4 Tage : 14.07.2017 18:00:00

 

Wenn dieses Resultat kleiner gleich heutigen Tag und Zeit ist (CURDATE) ist, dann erscheint das Produkt.
Im Beispiel also erstmals heute Abend um 18 Uhr.

 

Man kann sich das Resultat auch so vorgängig auf den Bildschirm holen, um die Selektion des mit INTERVAL errechneten Wertes vorgängig zu sehen.

select id_product, date_add, date_upd, (p.date_add + INTERVAL 4 DAY)
from pre_product p
where (p.date_add + INTERVAL 4 DAY) <= CURDATE()
order by p.date_upd DESC
limit 0,50

Hier wird dann noch nach date_upd absteigend sortiert, sodass ich die letztgeänderten Produkte oben auf der Liste habe.

Edited by Scully (see edit history)
Link to comment
Share on other sites

Klappt gerade nicht . . . . aber evtl. setze ich das where falsch

public static function RSSgetProducts($id_lang, $start, $limit, $order_by, $order_way, $id_category = false,
        $only_active = false, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }

        $front = true;
        if (!in_array($context->controller->controller_type, array('front', 'modulefront'))) {
            $front = false;
        }

        if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) {
            die(Tools::displayError());
        }
        if ($order_by == 'id_product' || $order_by == 'price' || $order_by == 'date_add' || $order_by == 'date_upd') {
            $order_by_prefix = 'p';
        } elseif ($order_by == 'name') {
            $order_by_prefix = 'pl';
        } elseif ($order_by == 'position') {
            $order_by_prefix = 'c';
        }

        if (strpos($order_by, '.') > 0) {
            $order_by = explode('.', $order_by);
            $order_by_prefix = $order_by[0];
            $order_by = $order_by[1];
        }
        $sql = 'SELECT p.*, product_shop.*, pl.* , m.`name` AS manufacturer_name, s.`name` AS supplier_name
				FROM `'._DB_PREFIX_.'product` p
				'.Shop::addSqlAssociation('product', 'p').'
				LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` '.Shop::addSqlRestrictionOnLang('pl').')
				LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
				LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`)'.
                ($id_category ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)' : '').'
				WHERE pl.`id_lang` = '.(int)$id_lang.
                    ($id_category ? ' AND c.`id_category` = '.(int)$id_category : '').
                    ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
                    ($only_active ? ' AND product_shop.`active` = 1' : '').'
				ORDER BY '.(isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).
                ($limit > 0 ? ' LIMIT '.(int)$start.','.(int)$limit : '');
        $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
        if ($order_by == 'price') {
            Tools::orderbyPrice($rq, $order_way);
        }

        foreach ($rq as &$row) {
            $row = Product::getTaxesInformations($row);
        }

        return ($rq);
    }    

Grüße

Link to comment
Share on other sites

Ich sehe da jetzt grad keine relevante Ergänzung in dem Code ???

Du musst ab ca. Zeile 36 wo WHERE steht und nachfolgend etwa so ändern:

WHERE (p.date_add + INTERVAL 4 DAY) <= CURDATE() 
   AND  pl.`id_lang` = '.(int)$id_lang . ' 
   AND product_shop.`visibility` IN ("both", "catalog") 
   AND product_shop.`active` = 1

Und DIREKT anschliessend so weiter für die Sortierung.

ORDER BY by p.date_upd DESC, p.id_product DESC
LIMIT 0,50';

Den dynamische Teil nach ORDER BY können wir weglassen, da es für diesen Fall des RSS nicht relevant ist.

Edited by Scully (see edit history)
Link to comment
Share on other sites

Nur ganz kurz,

 

mein Vorschlag mit dem Overrideordner funktioniert nicht - Verstehe zwar nicht warum, aber egal.

Die Funktion muss dann direkt in die Pruduct.php des class Ordner...

 

meine getestete Änderung:

....                
($id_category ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)' : '').'
WHERE pl.`id_lang` = '.(int)$id_lang.
' AND p.`date_add` <= DATE_SUB(p.`date_upd`,INTERVAL 4 DAY)'.
($id_category ? ' AND c.`id_category` = '.(int)$id_category : '').
($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
($only_active ? ' AND product_shop.`active` = 1' : '').'
...

Hier sind nur leider die "neuen" Artikel auch noch mit bei. Weiter bin ich noch nicht gekommen.

Link to comment
Share on other sites

Wenn der Override nicht funktioniert, dann weiss PrestaShop von diesem in der Regel nichts.

Das kann man ändern in dem man folgende Datei löscht:

./cache/class_index.php

Ist diese NICHT vorhanden, prüft PrestaShop erstmal, ob und welche Overrides es gibt und baut die Datei neu auf.

Würde diese Prüfung bei jeder Funktion automatisch laufen, würde der Shop unendlich langsam werden.

 

Und der select sollte etwa so aussehen (der untere Teil):

WHERE (p.date_add + INTERVAL 4 DAY) <= CURDATE()
AND  pl.`id_lang` = '.(int)$id_lang . '
AND product_shop.`visibility` IN ("both", "catalog")
AND product_shop.`active` = 1
ORDER BY by p.date_upd DESC, p.id_product DESC
LIMIT 0,50';
Edited by Scully (see edit history)
Link to comment
Share on other sites

Vielen herzlichen Dank für eure Lösungen/Vorschläge.

 

Ich habe folgendes zur classes/Product.php hinzugefügt. Somit kann ich mehrere RSS anbieten.

 

Der RSS Teil in der Product.php für Artikel die aktualisiert wurden. Ausgenommen sind Artikel die in den letzten 4 Tagen neu angelegt wurden.

public static function RSSgetProducts($id_lang, $start, $limit, $order_by, $order_way, $id_category = false,
        $only_active = false, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }

        $front = true;
        if (!in_array($context->controller->controller_type, array('front', 'modulefront'))) {
            $front = false;
        }

        if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) {
            die(Tools::displayError());
        }
        if ($order_by == 'id_product' || $order_by == 'price' || $order_by == 'date_add' || $order_by == 'date_upd') {
            $order_by_prefix = 'p';
        } elseif ($order_by == 'name') {
            $order_by_prefix = 'pl';
        } elseif ($order_by == 'position') {
            $order_by_prefix = 'c';
        }

        if (strpos($order_by, '.') > 0) {
            $order_by = explode('.', $order_by);
            $order_by_prefix = $order_by[0];
            $order_by = $order_by[1];
        }
        $sql = 'SELECT p.*, product_shop.*, pl.* , m.`name` AS manufacturer_name, s.`name` AS supplier_name
				FROM `'._DB_PREFIX_.'product` p
				'.Shop::addSqlAssociation('product', 'p').'
				LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` '.Shop::addSqlRestrictionOnLang('pl').')
				LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
				LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`)'.
                ($id_category ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)' : '').'
				WHERE (p.date_add + INTERVAL 4 DAY) <= CURDATE()
                AND  pl.`id_lang` = '.(int)$id_lang . '
                AND product_shop.`visibility` IN ("both", "catalog")
                AND product_shop.`active` = 1            
                                                
				ORDER BY '.(isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).
                ($limit > 0 ? ' LIMIT '.(int)$start.','.(int)$limit : '');
        $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
        if ($order_by == 'price') {
            Tools::orderbyPrice($rq, $order_way);
        }

        foreach ($rq as &$row) {
            $row = Product::getTaxesInformations($row);
        }

        return ($rq);
    }    

In modules/feeder habe ich eine Kopie der rss.php umbenannt in rss-upd.php und folgenden Teil geändert

if (!Module::getInstanceByName('feeder')->active)
	exit;

// Get data
// $number = ((int)(Tools::getValue('n')) ? (int)(Tools::getValue('n')) : 10);
// $orderByValues = array(0 => 'date_upd', 1 => 'price', 2 => 'name', 3 => 'date_upd', 4 => 'position');
// $orderWayValues = array(0 => 'DESC', 1 => 'ASC');
// $id_category = ((int)(Tools::getValue('id_category')) ? (int)(Tools::getValue('id_category')) : Configuration::get('PS_HOME_CATEGORY'));
$products = Product::RSSgetProducts((int)$context->language->id, 0, 25, 'date_upd', 'desc', false, true);
$currency = new Currency((int)Context::getContext()->currency->id);
$affiliate = (Tools::getValue('ac') ? '?ac='.(int)(Tools::getValue('ac')) : '');
$metas = Meta::getMetaByPage('index', (int)Context::getContext()->language->id);

Läuft bei mir 1A!

Presta 1.6.1.10

 

 

Grüße

 

Twilli

Edited by Twilli (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...