Fieldtype Table (ProField)
Hinweise
Das Table Field bringt zwar Performance, allerdings gibt es ein paar Dinge zu beachten.
Table Feld und Seite Updaten
https://processwire.com/talk/topic/25017-solved-populating-table-rows-via-api-first-row-gets-persistently-skipped/
Nur die Seite speichern reicht nicht. Das Table Feld muss ebenfalls gespeichert werden:
//eg, this works:
$u->of(false);
$u->subscriptions->last()->amount_paid = '10.00';
$u->save('subscriptions');
//but this doesn't:
$u->of(false);
$u->subscriptions->last()->amount_paid = '10.00';
$u->save();
Snippets
Zeilen erzeugen (Kurzform)
$page->of(false);
$tableRows = $page->table;
foreach($sources as $src) {
$src->of(false); // only necessary if $src is a Page
$row = $tableRows->new([ 'title' => $src->title ]);
}
$page->setAndSave('table', $tableRows); // explicitly save
Zeile erzeugen
Beispiel aus DEKRA Quiz
$statsTableRow = $statsPage->quiz_stats->makeBlankItem(); // getNew(); is wrong, allocation done by makeBlankItem()
$statsPage->of(false); // always a good idea
$statsTableRow->page_name = $pageName;
$statsTableRow->question_id = $question->id;
$statsTableRow->given_answers = $answersJson;
$statsTableRow->answered_correctly = $correct;
$statsTableRow->answer_date = date('D, d M Y H:i:s');
$statsTableRow->contact_email = $contactEmail;
$statsTableRow->contact_name = $contactName;
$statsPage->quiz_stats->add($statsTableRow);
$statsPage->save('quiz_stats'); // only save that field - saving is often needed in table fields
$statsPage->of(true);
Diverse Infos holen
$field = $fields->get('table_field'); // Field
$columnName = 'column'; // Column name in table
$optionValue = 'my_option'; // Option value
$optionTitle = $field->type->getSelectColumnOptions($field, $columnName)[$optionValue]; // Returns array of value => label
echo $optionTitle;
Zeilen löschen
Löschen funktioniert nicht so wie man es erwartet. Man würde denken man macht sucht Zeilen mit einem Selector und nutzt ein Remove:
// DOES NOT WORK
$u->of(false);
$queued_message = $u->queued_messages->get("sid=$sid");
$u->queued_messages->remove($queued_message);
$u->save('queued_messages');
Ryan schreibt, das hat damit zu tun, dass das Abfrageergebnis eine Kopie des Originalen WireArrays ist. D.h. man löscht nicht im Original.
Als Workaround kann man komplett durch die Zeilen loopen und einzelne Zeilen löschen. Finde ich nicht sinnvoll, da man ja das Table Field nimmt um effizient ui sein.
// WORKS BUT UGLY
$i=0;
foreach($u->queued_messages as $row) {
if ($row->sid == $sid) {
$u->of(false);
$u->queued_messages->remove($i);
$u->save('queued_messages');
}
$i++;
}
Komischerweise berichtet Adrian im Forum das folgende Lösung manchmal funktioniert:
// works SOMETIMES ???
$u->of(false);
$queued_message = $u->queued_messages->get("sid=$sid");
$u->queued_messages->remove($queued_message);
$u->save('queued_messages');
</syntaxhighlight>
Effizient über SQL löschen
Ryan sagt man kann problemlos über die mySQL Funktionen löschen:
$sql = "DELETE FROM field_table WHERE data=123";
// $database variable is available in your templates. $database is the PDO way.
$query = $database->prepare($sql);
$query->execute();
Erste oder letzte Zeile löschen
Dies ist wohl möglich:
$page->of(false);
$award = $page->awards->first();
$page->awards->remove($award);
$page->save('awards');