Fieldtype Table (ProField)
Snippets
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
$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: <syntaxhighlight lang="php"> $page->of(false); $award = $page->awards->first(); $page->awards->remove($award); $page->save('awards'); </syntaxhiglhlight>