[gelöst] Automatisierter Aufruf von Feeds-Imports mit Zusatzaufgaben

am 17.02.2013 - 14:46 Uhr in
Hallo,
ich habe mehrere Feeds-Importer eingerichtet.
Die werden momentan per Hand aufgerufen über den entsprechenden Menüpunkt.
Das klappt soweit ganz gut, soll aber automatisiert werden, so daß einmal in der Nacht ein Import-Vorgang abläuft.
Das wäre ja sicher kein Problem, mit "Periodic import" alle 1 Tage.
Aber es soll noch folgendes passieren:
Bei den Importen handelt es sich um Affiliate-Daten-Feeds, also Produkte mit Bild, Name, Beschreibung, Preis und Link in den Online-Shop eines Händer-Partners.
Um sicherzustellen, daß in meiner Datenbank keine Produkte angezeigt werden, die im Händler-Shop nicht mehr vorhanden sind, möchte ich vor jedem Import-Vorgang dieses Händlers alle Nodes vom Typ 'Produkt' mit Referenz auf den Händler, der gleich importiert werden soll, auf Nicht veröffentlicht setzen.
Beim Importvorgang gibt es ein Feld, das dann alle Produkte, dieses Händlers, die bereits vorhanden sind (Artikelnummer) wieder auf Status 1 setzt, also Veröffentlicht.
Ich habe noch keinen rechten Plan, wie ich diese Aufgabe lösen kann.
Mein erster Gedanke war, das über Rules zu machen und es gibt ja sogar ein Rules Feeds-Modul.
Dort sehe ich aber keinen passenden Event, dem ich die Aktion "deaktiviere alle nodes vom Händler xy" anhängen könnte.
Alternative wäre:
Ein Modul schreiben, wo ich in einer Schleife alle anstehenden Importvorgänge aufrufe und jeweils vorher den Update auf die Produkte durchführe.
Es gibt bereits einen Inhaltstyp Händler mit der ID, auf die in den Produkt-Nodes referenziert wird und der URL, bei der die Produktdaten liegen, die importiert werden sollen.
Vermutlich müßte ich mich dann an dieser Anleitung orientieren:
http://nodesforbreakfast.com/article/2012/09/23/programmatically-execute...
Habe ich eine weitere Lösungsmöglichkeit übersehen?
Könnte ich das doch mit Rules machen?
- Anmelden oder Registrieren um Kommentare zu schreiben
schau dir mal feeds_tamper an
am 17.02.2013 - 20:24 Uhr
damit kannst du jedes beliebige Feld vor dem Import manipulieren.
Damit sollte eigentlich (fast) jede "Schweinerei" möglich sein ;-)
Grüße
Ronald
Ronald, Du ahnst ja gar
am 17.02.2013 - 21:13 Uhr
Ronald, Du ahnst ja gar nicht, welche Schweinereien ich mit Tamper schon alles mache ;-)
Im konkreten Fall funktioniert das nicht, oder ich habe einen Knoten im Hirn, was ja sein kann...
Noch mal worum es geht:
Ich möchte v o r dem Import alle Nodes, die zu diesem Import (also einem bestimmten Händler-Daten-Feed) gehören auf nicht veröffentlicht setzen.
Beim Import werden dann die jeweils mitgelieferten Datensätze wieder auf veröffentlicht gesetzt.
Es passiert ja entweder ein Insert, wenn der Datenstatz (also das Produkt) neu ist, oder ein Update, wenn diese Artikelnummer bereits vorhanden ist.
(Diese wird über GUID als unique gekennzeichnet).
Ich kann ja beim Import keinen Datensatz manipulieren (auf nichtveröffentlicht setzen), der im Feed gar nicht vorkommt.
Noch mal worum es geht:
Es handelt sich um eine Schnittstelle zu einem Online-Shop.
In meiner Drupal-Datenbank sollen keine Produkte angezeigt werden, die der Online-Shop evt. aus dem Sortiment genommen hat.
Geliefert werden im Feed nur aktive Produkte.
Geht doch nicht mit Tamper, oder?
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
daten, die der feed nicht kennt,
am 17.02.2013 - 22:07 Uhr
Kann er logischerweise nicht manipulieren.
Hier würde ich versuchen mit rules anzusetzen.
Die rule müsste entweder zeitgesteuert sicher vor dem import laufen, oder vom import getriggert werden.
Dabei muss aber sichergestellt werden, dass der import erst anläuft, wenn der deaktivierungsprozess fertig ist.
Nicht ganz trivial ;)
Grüße
Ronald
Ja, die Rules-Lösung gefällt
am 17.02.2013 - 22:28 Uhr
Ja, die Rules-Lösung gefällt mir nicht, weil ich ja eine flexible Lösung möchte, die einmal eingerichtet für alle Importer funktioniert.
Ich versuche mich gerade an einer Batch-Lösung nach diesem Strickmuster:
$feed = 'myimporter';
$feedSource = feeds_source($feed);
$config = $feedSource->getConfig();
$config['FeedsHTTPFetcher']['source'] = 'myfilename.csv';
$feedSource->setConfig($config);
$feedSource->save();
$batch = array(
'title' => t('Importing feeds'),
'operations' => array(
array('feeds_batch', array('import', $feed, 0)),
),
'progress_message' => t('Current: @current | Remaining:
@remaining | Total: @total | Percentage: @percentage | Estimate:
@estimate | Elapsed: @elapsed'),
);
batch_set($batch);
batch_process('redirect-url');
Den Code habe ich einfach in eine Testseite geschrieben, die ich via URL mit admin-Rechten aufrufe.
Um spätere Integration in einem Modul und Aufruf via Cron muß ich mich noch separat kümmern.
Der Code soll dann in einer Schleife für jeden Importer aufgerufen werden und vorher wird die Manipulation an den Nodes für diesen Händler passieren.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Inzwiswchen habe ich das
am 19.02.2013 - 10:33 Uhr
Inzwiswchen habe ich das Script in ein eigenes Modul gelegt mit einem hook_cron -Aufruf
function feedsimport_cron() {
//Tue, was Du nicht lassen kannst
}
Den Cron habe ich mit elysia_cron konfiguriert.
Ein paar Feinheiten funktionieren noch nicht, wie gewünscht (timeout).
Ich bin aber zuversichtlich, daß ich das auch noch rausfummel und setze den Thread deshalb auf gelöst.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de