Philipp88 schrieb
1. Wie kann ich, wenn ich in meinem Controller per finAll() alle Datensätze hole mit den SQL- Befehlen "WHERE", "GROUP BY", "ORDER BY", "LIMIT" die Ausgabe ändern? Oder muss ich da ein eigenes Statement schreiben?
Group By gibt es in extbase nicht, wenn du um die nutzung davon nicht rum kommst musst du ein eigenes SQL-Query schreiben. (es gibt aber ein GroupFor Viewhelper, den du eventuell vorher mal ausprobieren solltest)
Für andere Querys musst du das entsprechende Repository erweitern
Dort kannst du mit $this->createQuery() ein neues Query Objekt erstellen und dem Conditions und Sortierung mitgeben. Ich hab leider grad kein Simples Beispiel zur Hand, Schau dir am besten die Klasse \TYPO3\CMS\Extbase\Persistence\Generic\Query an. (wichtige methoden zum beispiel: matching(), execute() und setOrderings())
Für einfache Abfragen wo du nur anhand einer Property filtern musst gibt es die findBy* Methoden.
Also zum Beispiel findByUid() oder findByName() oder wie auch immer deine Properties heißen.
Philipp88 schrieb
2. SQL wird ja erst ausgeführt, wenn ich die Daten für den Viewhelper benötige. Was ist aber, wenn ich die Daten erst noch per PHP bearbeiten möchte und die dann erst ausgeben möchte? Früher habe ich per $GLOBALS["TYPO3_DB"]->SQL_fetch_assoc($res) jede Zeile einzeln geholt, Daten abgeändert und in Marker geschrieben. Wie geht sowas?
Du kannst die Results aus den Repositories auch schon im PHP per foreach Schleife durchgehen. Und deine bearbeiten Dateien dann in ein Array oder ein ObjectStorage stecken und an den View weitergeben.
also zum Beispiel so in der Art.
$array = array();
foreach($this->repository->findAll() as $object)
{
$object->SetWhatEver(42);
$array[] = $object;
}
$this->view->assign('list', $array);
Philipp88 schrieb
3. Ich habe folgende Funktion in Repostory:
public function all_name() {
$res = array(
"vorname" => "wwe",
"name" => "wwebhj",
);
return $res;
}
Wie bekomme ich ein Array - so wie ein SQL- Query - Zeile für Zeile ins Template? Wie muss das Array aufgebaut sein?
Ich verstehe dein Beispiel grad glaube ich nicht ganz 😉
Aber auf ein Array kannst du auf zwei Wege zugreifen.
Wenn du ein Numerisches Array hast, also mit Index von 0 bis n
kannst du mittels des for-ViewHelpers durch iterieren.
und auf keys direkt kannst du mit "." zugreifen, also zum Beispiel "array.key"
Hier ein kurzes Beispiel.
$list = array(array('a' => 1, 'b' => 2),
array('a' => 3, 'b' => 4),
array('a' => 5, 'b' => 6),
array('a' => 7, 'b' => 8-),
);
$this->view->assign('list', $list);
<f:for earch="{list}" as="value">
<f:comment>{value} ist jetzt immer einer der inneren Arrays aus {list]</f:comment>
<div>
{value.a} <!-- 1, 3, 5 oder 7. je nach dem in welcher iteration wir sind -->
{value.b} <!-- 2, 4, 6, 8 -->
</div>
</f:for>
{list.0.a} würde natürlich ebenfalls 1 ausgeben. Das Funktioniert natürlich nicht mehr
wenn du ein QueryResult (aus dem Repository) oder ein ObjectStorage (aus dem Model) hast.
Zu beachten ist eventuell noch, dass du auf die Property eines Models mit {model.property} zugreifst. (dabei wird dann $model->getProperty() ausgeführt)
Philipp88 schrieb
4. Wenn ich per Extension Builder eine Extension erstelle, ist ja als Default eingestellt, dass die list- Action als erstes aufgerufen wird. Wie kann man das ändern?
Dort wo du im Builder dein Plugin definierst, kannst du auch die gültigen Actions angeben.
immer in der Form "Controller => Action1, Action2, Action3" und je eine Zeile pro Controller.
Die erste Action die du hier angibst wird Standardmäßig aufgerufen. (Hier Action1)
Alle Beispiele sind frei runtergetippt, also keine Garantie das sie direkt laufen!