Skip to content
Snippets Groups Projects
Commit 6a428e62 authored by Carsten  Rose's avatar Carsten Rose
Browse files

AbstractBuildForm: Select Statements might contain empty lists. First version...

AbstractBuildForm:  Select Statements might contain empty lists. First version of editlink(). Subrecords with links to detailform.
parent 0eb47a8b
No related branches found
No related tags found
No related merge requests found
......@@ -18,6 +18,7 @@ require_once(__DIR__ . '/../qfq/exceptions/DbException.php');
require_once(__DIR__ . '/../qfq/exceptions/UserException.php');
require_once(__DIR__ . '/../qfq/Database.php');
require_once(__DIR__ . '/../qfq/helper/HelperFormElement.php');
require_once(__DIR__ . '/../qfq/helper/Support.php');
/**
......@@ -158,7 +159,11 @@ abstract class AbstractBuildForm {
$this->store->setVar(SYSTEM_FORM_ELEMENT, $fe['name'] . ' / ' . $fe['id'], STORE_SYSTEM);
// evaluate current FormElement
$formElement = $this->evaluate->parseArray($fe);
$evaluate = new Evaluate($this->store, $this->db);
$formElement = $evaluate->parseArray($fe, $fe['debug'] === 'yes');
if ($fe['debug'] === 'yes') {
throw new UserException($evaluate->getDebug(), ERROR_DEBUG);
}
// Get default value
$value = $formElement['value'] === '' ? $this->store->getVar($formElement['name']) : $value = $formElement['value'];
......@@ -396,7 +401,7 @@ abstract class AbstractBuildForm {
// Get fallback, if 'checkBoxMode' is not defined:
if (!isset($formElement['checkBoxMode'])) {
// This fallback is problematic if 'set' or 'enum' has 2 elements: defaults to single but maybe multi is meant.
// This fallback is problematic if 'set' or 'enum' has 2 : defaults to single but maybe multi is meant.
$formElement['checkBoxMode'] = (count($itemKey) > 2) ? 'multi' : 'single';
}
......@@ -447,25 +452,28 @@ abstract class AbstractBuildForm {
$itemValue = $this->getItemsForEnumOrSet($formElement['name'], $fieldType);
if (is_array($formElement['sql1'])) {
$keys = array_keys($formElement['sql1'][0]);
$itemKey = array_column($formElement['sql1'], 'id');
if (count($formElement['sql1']) > 0) {
$keys = array_keys($formElement['sql1'][0]);
$itemKey = array_column($formElement['sql1'], 'id');
// If there is no column 'id' and at least two columns in total
if (count($itemKey) === 0 && count($keys) >= 2) {
$itemKey = array_column($formElement['sql1'], $keys[0]);
}
// If there is no column 'id' and at least two columns in total
if (count($itemKey) === 0 && count($keys) >= 2) {
$itemKey = array_column($formElement['sql1'], $keys[0]);
}
$itemValue = array_column($formElement['sql1'], 'label');
// If there is no column 'label' (e.g.: SHOW tables)
if (count($itemValue) === 0) {
$idx = count($keys) == 1 ? 0 : 1;
$itemValue = array_column($formElement['sql1'], $keys[$idx]);
$itemValue = array_column($formElement['sql1'], 'label');
// If there is no column 'label' (e.g.: SHOW tables)
if (count($itemValue) === 0) {
$idx = count($keys) == 1 ? 0 : 1;
$itemValue = array_column($formElement['sql1'], $keys[$idx]);
}
}
} elseif (isset($formElement['itemList'])) {
$arr = KeyValueStringParser::parse($formElement['itemList'], ':', ',', IF_VALUE_EMPTY_COPY_KEY);
$itemValue = array_values($arr);
$itemKey = array_keys($arr);
if (count($formElement['itemList']) > 0) {
$arr = KeyValueStringParser::parse($formElement['itemList'], ':', ',', IF_VALUE_EMPTY_COPY_KEY);
$itemValue = array_values($arr);
$itemKey = array_keys($arr);
}
} elseif ($fieldType === 'enum' || $fieldType === 'set') {
// already done at the beginning with '$this->getItemsForEnumOrSet($formElement['name'], $fieldType);'
} else {
......@@ -744,17 +752,39 @@ abstract class AbstractBuildForm {
public function buildSubrecord(array $formElement, $htmlFormElementId, $value) {
$html = '';
$primaryRecord = $this->store->getStore(STORE_RECORD);
if (!isset($primaryRecord['id'])) {
return 'Please save main record fist.';
}
$page = Support::getCurrentPage();
if (!is_array($formElement['sql1'])) {
throw new UserException('Missing \'sql1\' Query', ERROR_MISSING_SQL1);
}
// No records?
if (count($formElement['sql1']) == 0) {
return '';
}
if (!isset($formElement['sql1'][0]['id'])) {
throw new UserException('Missing column \'id\' in \'sql1\' Query', ERROR_MISSING_COLUMN_ID);
}
// construct column attributes
$control = $this->getSubrecordColumnControl(array_keys($formElement['sql1'][0]));
// $html .= '<b>' . $formElement['label'] . '</b>';
$html .= '<table border="1">';
$html .= '<tr><th>' . implode('</th><th>', $control['title']) . '</th></tr>';
$html .= '<tr><th></th><th>' . implode('</th><th>', $control['title']) . '</th></tr>';
foreach ($formElement['sql1'] as $row) {
$html .= '<tr>';
$html .= '<td>' . $this->editLink($formElement, $page, $row['id'], $primaryRecord) . '</td>';
foreach ($row as $columnName => $value) {
$html .= '<td>' . $this->formatColumn($control, $columnName, $value) . '</td>';
}
......@@ -807,6 +837,50 @@ abstract class AbstractBuildForm {
return $control;
}
/**
* @param $formElement
* @param $page
* @param $targetRecordId
* @param $record
* @return string
* @throws UserException
*/
private function editLink($formElement, $page, $targetRecordId, $record) {
$queryStringArray = [
"id" => $page,
'form' => $formElement['form'],
'r' => $targetRecordId,
];
// Add custom query parameter
if (isset($formElement['detail'])) {
$detailParam = KeyValueStringParser::parse($formElement['detail']);
foreach ($detailParam as $src => $dest) {
if ($src[0] == '#') {
$queryStringArray[$dest] = substr($src, 1);
continue;
}
if (isset($record[$src])) {
$queryStringArray[$dest] = $record[$src];
}
}
}
Support::appendTypo3ParameterToArray($queryStringArray);
//-----------------
$queryString = Support::arrayToQueryString($queryStringArray);
$sip = $this->store->getSip();
$url = $formElement['page'] . $sip->queryStringToSip($queryString);
return "<a href='$url'><span class='glyphicon glyphicon-pencil'></span></a>";
}
/**
* @param array $control
* @param $columnName
......
......@@ -130,7 +130,7 @@ class BuildFormBootstrap extends AbstractBuildForm {
throw new UserException("Field 'name' and/or 'label' are empty", ERROR_NAME_LABEL_EMPTY);
}
$a = '<a href="#' . $this->createAnker($formElement['id']) . '" data-toggle="tab">' . $formElement['name'] . '</a>';
$a = '<a href="#' . $this->createAnker($formElement['id']) . '" data-toggle="tab">' . $formElement['label'] . '</a>';
if ($ii <= $maxVisiblePill) {
$pillButton .= '<li role="presentation" ' . $active . '>' . $a . '</li>';
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment