In einer extbase-Erweiterung, wie Sie Zugriff auf die Persistenz-Schicht aus einem scheduler-task?
Was klingt ein wenig akademisch im Titel ist eigentlich ziemlich einfach: ich habe ein TYPO3 6.1 extbase extension, die ich habe, ausgestattet mit einem scheduler-task. Die Aufgabe soll zum importieren einer CSV-Datei und speichern Sie Sie in die Erweiterung der Datenbank-Felder.
Aber wie sage ich der scheduler-task zu verwenden der Erweiterung ist das Modell etc. und speichern die empfangenen Daten in der Persistenzschicht?
Habe ich gesehen, dass diese Antwort zu einer ähnlichen Frage: Ausführen repository-Funktionen im scheduler-task und ich denke, dass es Punkte für den richtigen Weg, aber ich denke, brauchen Sie ein umfassendes Beispiel zu verstehen beginnen, wie die dependency injection funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie haben zu prüfen, den Aspekt der Leistung:
Wenn Sie möchten, legen Sie eine große Menge von Daten, sollten Sie nicht verwenden die Extbase Persistenz für eine solche Aufgabe. Denn wenn Sie das tun, erzeugt es ein Objekt für jede Zeile, die Sie einfügen möchten, und speichern Sie es sofort. Diese ist ziemlich langsam und hat einen großen Speicherbedarf.
Wenn du nicht viel Daten, oder Sie teilen Sie die jobs (z.B. durchführen 100 import jobs per scheduler ausführen), dann verwenden Sie die Extbase Persistenz.
Können Sie sowohl in CommandController Kontext, und da CommandControllers sind straight-forward einrichten, sollten Sie gehen für Sie, anstatt einen eigenen Scheduler-task.
Mit Extbase Persistenz
In der CommandController, injizieren Sie Ihr repository:
Dann Durchlaufen Sie die Zeilen, die Sie importieren möchten (foreach) und erstellen Sie ein neues Objekt für jede Zeile, und fügen Sie es zu Ihrem repository:
Tatsächlich speichern die Objekte der Datenbank, die Sie brauchen, zu persistieren. Damit Sie auch Spritzen der persistenceManager:
Und Verwendung:
Sollten Sie nicht tun, dass für jedes einzelne Objekt (aus performance-Gründen); aber für die Speichernutzung Gründe, warum Sie sollten nicht warten, bis Sie nach tausenden von Objekten zu bestehen, entweder. So fügen Sie einfach einen iterator, um Ihre foreach-Schleife und bestehen jeder 20., 40., oder was auch immer Schleife.
Bitte vergessen Sie nicht, dass der Scheduler arbeitet in Backend-Kontext, also das TypoScript muss verfügbar sein
module.tx_yourext
. Wenn Sie möchten, teilen Sie die gleichen Einstellungen/storagePid mit dem frontend-Teil der app, verwenden SieDen TypoScript muss in das root-Seite Ihrer website für die backend-Module/CommandControllers, Sie zu benutzen. Ich schlage vor, Sie fügen Sie das Zeug zu myext/Configuration/TypoScript/setup.txt und fügen Sie das statische template der Erweiterung der root-Seite.
Mit DataHandler
TYPO3 DataHandler (ehemals TCEmain) ist der Motor des TYPO3-backend verwendet, die für das einfügen und ändern von Datenbank-Datensätzen. Es ist sehr mächtig.
Statt ein Objekt, in deinem loop erstellen Sie ein array mit allen Daten. Der erste array-index ist die Tabelle, die nächste Ebene ist die des betroffenen Datensatzes, in dem NEUE bedeutet, dass ein neuer Datensatz erstellt wird. Dann können Sie nur setzen Sie in jedes Feld einer Tabelle mit dem gewünschten Wert
Nun kann man eine Instanz von DataHandler und speichern Sie die änderungen:
Bitte beachten Sie die Linie
$tce->admin = TRUE
. Dieser schlägt DataHandler, dass ein admin die Aktion durchführt. Dies ist praktisch, weil Sie nicht haben, zu setzen erlaubt schließt Felder für die Scheduler-Benutzer und kann auch einfügen von Datensätzen mit PID 0. Aber es ist eine mögliche Schwachstelle, so sorgfältig prüfen, seine Verwendung.Datensätze, die eingefügt/aktualisiert DataHandler korrekt, kann zurückgesetzt werden, etc.. finden Sie einige Beispiele (wie das hinzufügen von Bildern, auflösen MM-Beziehungen) hier. In diesem Fall werden alle DataHandler Verwandte Funktionen verschoben wurden, zu einem externen repository-Klasse, die injiziert wird, um die CommandController wie oben beschrieben (die nur mit Namen in Extbase-übereinkommen).
Einen guten überblick über den DataHandler Funktionen finden Sie hier.
$item->setPid($storagePid);
, und - wichtiger noch$this->itemRepository->add($item);
macht den job, aber ich möchte ein update auf die gleiche Sache die ganze Zeit. Aber der Austausch funktioniert nicht:$all = $this->itemRepository->findAll(); $first = $all->getFirst();if(count($all) > 0){$this->itemRepository->replace($first,$item);}
- tut nichts. Können Sie mir einen anderen Tip???module.tx_yourext.persistence < plugin.tx_yourext.persistence
gesetzt? Ich habe versucht, das hinzufügen es zumyext/Configuration/TypoScript/setup.txt
, aber es hatte keine Wirkung. Für meinen aktuellen Fall$item->setPid($storagePid);
scheint zu funktionieren, aber es wäre gut zu wissen mehr.Neben lorenz 's Antwort: Beginner' s Guide to set up a Command Controller-Scheduler-task:
Mein Beispiel ist ein task importieren. Ändern Sie die Name-Teil "Importieren", um Ihre Bedürfnisse.
Erstellen Sie eine neue Datei EXT:Classes/Controller/ImportCommandController.php
In EXT:ext_localconf.php fügen Sie den Befehl-controller:
Konfigurieren Planer:
Das ist es!
$this->itemRepository->findByUid()
, dann Bearbeiten und dann aktualisieren Sie es in der itemRepository.