Zum Inhalt springen

Extbase: Wie können versteckte Datensätze durch FE Benutzer bearbeitet werden?

Erstellt am 9. Mai 2014 · 3 Antworten · letzte Antwort am 10. Juni 2014

Tags: TYPO3 6, Frage

menak ·

Hallo allerseits,
in einem Extbase Plugin unter Typo3 6.2 sollen FE User versteckte Datensätze bearbeiten können, konkret sollen Sie Veranstaltungsdatensätze bearbeiten können.
Da diese nicht immer gleich freigeschaltet werden sollen, sollen sie auch versteckbar sein.

Solange ein Datensatz sichtbar ist kann der Datensatz editiert werden, kein Problem. Es kann auch versteckt werden, das Speichern funktioniert einwandfrei. Danach ist der Datensatz aber nicht wieder editierbar.

Die versteckten Datensätze werden dank der nachfolgenden Anweisung in der find Methode im Repository auch brav weiter gelistet:

$query->getQuerySettings()->setIgnoreEnableFields(TRUE);
$query->getQuerySettings()->setEnableFieldsToBeIgnored(array('disabled'));

In der editAction allerdings wird überhaupt keine Repository Methode aufgerufen. D.h. nicht explizit. Da schon mal die Frage: Welche Methode des Respository wird da aufgerufen?

Wenn ein FE User eine editAction aufruft erscheint die Exception:

#1297759968: Exception while property mapping at property path ""😮bject with identity "4" not found.

Wobei dann die "4" die UID des Datensatzes ist.

Wie kann ich auch in der editAction versteckte Datensätze zum Bearbeiten laden? Natürlich kann ich ein eigenes Feld zum Verstecken anlegen, allerdings scheint mir das am Sinn des Ganzen vorbeizugehen.

Vielen Dank im Voraus!

Grüße
Matthew

aemka ·

Falls du diese Anweisung noch nicht in den Default Query Settings und nur in einer Finder Methode deines Repositories gesetzt haben solltest, würde ich das mal versuchen:
http://forge.typo3.org/projects/typo3v4-mvc/wiki/Default_Orderings_and_Query_Settings_in_Repository

Wenn auch das nicht hilft, kannst du die automatische Request Parameter zu Objekt Konvertierung eben nicht nutzen und musst die Parameter-Typen deiner Editier-Controller ändern auf simples Array ändern und das Objekt dann selber finden und modifizieren, was ja auch kein Beinbruch wäre.

menak ·

Danke für deine Antwort, so hatte ich das mittlerweile auch umgesetzt. Schade, ich dachte es gäbe eine Möglichkeit mit Objekten zu realisieren.

froemken ·

Hallo Ihr beiden,

2 Möglichkeiten:

1.) Beim Aufruf der EditAction steht ja auch nur ein Integer in der URL, also kannst Du die editAction auch so schreiben:

/**
* @param integer $car
*/
public function editAction($car) {
$car = $this->carRepository->myMethodWithIgnoreDisabledFields($car);
...
}

Auf diese Weise hast Du auch wieder ein Objekt mit dem Du weiter arbeiten kannst.

Die zweite Lösung lässt bei einigen Extbase-Programmierern die Augen verdrehen :-) Aber hey...es geht:

2.) Erstell eine neue Eigenschaft vom Typ Session in Deinem Controller. Das ist der temporäre Cache für die Domainobjekte.

/**
 * @var \TYPO3\CMS\Extbase\Persistence\Generic\Session
 * @inject
 */
protected $session;

Erstell eine initializeEditAction():

public function initializeEditAction() {
  $carArg = $this->request->getArgument('car');
  $car = $this->carRepository->findHiddenEntryByUid($carArg);
  $this->session->registerObject($car, $car->getUid());  
}

Jetzt wo Dein Auto in der Session registriert ist, kannst Du Deine editAction wie gehabt aufrufen lassen und sogar die Validatoren laufen über dieses versteckte Objekt.

Stefan