', $columns);
}
/**
* Construct a HTML table of the subrecord data.
* Column syntax
* definition:https://docs.typo3.org/p/IMATHUZH/qfq/master/en-us/Manual.html#type-subrecord
*
* @param array $formElement
* @param string $htmlFormElementName
* @param string $value
* @param array $json
* @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
*
* @return string
* @throws \CodeException
* @throws \DbException
* @throws \UserFormException
* @throws \UserReportException
*/
public function buildSubrecord(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
$rcText = false;
$nameColumnId = 'id';
// $targetTableName = '';
$flagNew = false;
$flagEdit = false;
$flagDelete = false;
$linkNew = '';
$control = array();
$primaryRecord = $this->store->getStore(STORE_RECORD);
$cssClassColumnId = $this->store->getVar(SYSTEM_CSS_CLASS_COLUMN_ID, STORE_SYSTEM . STORE_EMPTY);
if (!$this->prepareSubrecord($formElement, $primaryRecord, $rcText, $nameColumnId)) {
return $rcText;
}
if (isset($formElement[SUBRECORD_PARAMETER_FORM])) {
Support::setIfNotSet($formElement, F_EXTRA_DELETE_FORM, '');
$formElement[F_FINAL_DELETE_FORM] = $formElement[F_EXTRA_DELETE_FORM] != '' ? $formElement[F_EXTRA_DELETE_FORM] : $formElement[SUBRECORD_PARAMETER_FORM];
// Decode settings in subrecordOption
$flagNew = Support::findInSet(SUBRECORD_NEW, $formElement[FE_SUBRECORD_OPTION]) && ($formElement[FE_MODE] != FE_MODE_READONLY);
$flagEdit = Support::findInSet(SUBRECORD_EDIT, $formElement[FE_SUBRECORD_OPTION]);
$flagDelete = Support::findInSet(SUBRECORD_DELETE, $formElement[FE_SUBRECORD_OPTION]) && ($formElement[FE_MODE] != FE_MODE_READONLY);
$editColumnTitle = $flagNew ? $this->createFormLink($formElement, 0, $primaryRecord, $this->symbol[SYMBOL_NEW], 'New') : '';
$editColumnTitle .= ' ' . ($formElement[SUBRECORD_COLUMN_TITLE_EDIT] ?? '');
if ($flagNew || $flagEdit) {
$linkNew = Support::wrapTag('', $editColumnTitle);
}
}
// Determine if DragAndDrop is active
$hasDragAndDrop = false;
$orderColumn = $formElement[FE_ORDER_COLUMN] ?? DND_COLUMN_ORD;
$dndTable = '';
if (isset($formElement[FE_DND_TABLE])) {
// Table is specified in parameter field
$dndTable = $formElement[FE_DND_TABLE];
} elseif (!empty($formElement[SUBRECORD_PARAMETER_FORM])) {
// Read table from form specified in subrecord
$formName = $formElement[SUBRECORD_PARAMETER_FORM];
$form = $this->dbArray[$this->dbIndexQfq]->sql("SELECT * FROM Form AS f WHERE f." . F_NAME . " LIKE ? AND f.deleted='no'",
ROW_REGULAR, [$formName]);
if (count($form) > 0) {
$dndTable = $form[0][F_TABLE_NAME];
}
} else {
throw new \UserFormException(json_encode(
[ERROR_MESSAGE_TO_USER => 'Missing Parameter',
ERROR_MESSAGE_TO_DEVELOPER => FE_DND_TABLE . ' or ' . SUBRECORD_PARAMETER_FORM]),
ERROR_MISSING_TABLE_NAME);
}
if ($dndTable) {
$columns = $this->dbArray[$this->dbIndexData]->sql("SHOW COLUMNS FROM $dndTable");
foreach ($columns as $column) {
if ($column['Field'] === $orderColumn) {
// DragAndDrop is active if the dndTable has the orderColumn
$hasDragAndDrop = true;
break;
}
}
}
$firstRow = isset($formElement[FE_SQL1][0]) ? $formElement[FE_SQL1][0] : array();
$htmlHead = $this->subrecordHead($linkNew, $flagDelete, ($formElement[SUBRECORD_COLUMN_TITLE_DELETE] ?? ''), $firstRow, $control);
$htmlBody = '';
foreach ($formElement[FE_SQL1] as $row) {
$rowHtml = '';
if ($flagEdit) {
$toolTip = ($formElement[FE_MODE] == FE_MODE_READONLY) ? 'Show' : 'Edit';
$symbol = ($formElement[FE_MODE] == FE_MODE_READONLY) ? $this->symbol[SYMBOL_SHOW] : $this->symbol[SYMBOL_EDIT];
$rowHtml .= Support::wrapTag(' | ', $this->createFormLink($formElement, $row[$nameColumnId], $primaryRecord, $symbol, $toolTip, $row));
} elseif ($flagNew) {
$rowHtml .= Support::wrapTag(' | ', $rowHtml, false);
}
// All columns
foreach ($row as $columnName => $value) {
if (isset($control[SUBRECORD_COLUMN_TITLE][$columnName])) {
$rowHtml .= Support::wrapTag(" | ", $this->renderCell($control, $columnName, $value, $cssClassColumnId));
}
}
if ($flagDelete) {
$toolTip = 'Delete';
if ($this->showDebugInfoFlag) {
$toolTip .= PHP_EOL . "form = '" . $formElement[F_FINAL_DELETE_FORM] . "'" . PHP_EOL . "r = '" . $row[$nameColumnId] . "'";
}
$s = $this->createDeleteUrl($formElement[F_FINAL_DELETE_FORM], $row[$nameColumnId], RETURN_SIP);
$rowHtml .= Support::wrapTag(' | ', Support::wrapTag(" |