From e880f7f33c371ea120df2076f0249f82f1a76a9d Mon Sep 17 00:00:00 2001 From: tbaddade Date: Fri, 24 Apr 2026 10:42:27 +0200 Subject: [PATCH 1/2] prio: Individuelle Anzeige per SQL-Ausdruck (label_expression) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fügt dem prio-Value-Feld ein optionales Textfeld `label_expression` hinzu. Ist es befüllt, wird der SQL-Ausdruck direkt als Beschriftung im Sortier-Widget verwendet und ermöglicht so volle Kontrolle über Formatierung und Feldreihenfolge (z.B. CONCAT(lastname, ", ", firstname)). Ist das Feld leer, greift das bisherige Verhalten über `fields` — die Änderung ist vollständig rückwärtskompatibel. --- lang/de_de.lang | 2 + lang/en_gb.lang | 2 + lang/es_es.lang | 2 + lang/pt_br.lang | 2 + lang/sv_se.lang | 2 + lib/Field/value/prio.php | 79 ++++++++++++++++++++++++++-------------- 6 files changed, 61 insertions(+), 28 deletions(-) diff --git a/lang/de_de.lang b/lang/de_de.lang index 0cf2ecf77..561fe2f4e 100644 --- a/lang/de_de.lang +++ b/lang/de_de.lang @@ -657,6 +657,8 @@ yform_values_be_link_multiple = Mehrfachauswahl yform_values_prio_fields = Anzeige yform_values_prio_scope = Beschränkung yform_values_prio_default = Am Anfang +yform_values_prio_label_expression = Individuelle Anzeige (SQL) +yform_values_prio_label_expression_notice = SQL-Ausdruck als individuelle Anzeige, z.B. CONCAT(lastname, ", ", firstname). Überschreibt "Anzeige". yform_is = ist yform_will_set_to = wird diff --git a/lang/en_gb.lang b/lang/en_gb.lang index e6fb0e8e1..bc226df49 100644 --- a/lang/en_gb.lang +++ b/lang/en_gb.lang @@ -635,6 +635,8 @@ yform_values_be_link_multiple = Multiselect yform_values_prio_fields = Display yform_values_prio_scope = Restriction yform_values_prio_default = At the top +yform_values_prio_label_expression = Custom display (SQL) +yform_values_prio_label_expression_notice = SQL expression as custom display, e.g. CONCAT(lastname, ", ", firstname). Overrides "Display". yform_is = is yform_will_set_to = will be diff --git a/lang/es_es.lang b/lang/es_es.lang index 29211d00e..250956652 100644 --- a/lang/es_es.lang +++ b/lang/es_es.lang @@ -625,6 +625,8 @@ yform_values_be_link_multiple = La selección múltiple yform_values_prio_fields = Visualización yform_values_prio_scope = Restricción yform_values_prio_default = En el comienzo +yform_values_prio_label_expression = Visualización personalizada (SQL) +yform_values_prio_label_expression_notice = Expresión SQL como visualización personalizada, p.ej. CONCAT(lastname, ", ", firstname). Reemplaza "Visualización". yform_is = Es yform_will_set_to = Deberá diff --git a/lang/pt_br.lang b/lang/pt_br.lang index 472115f7d..34a5b029a 100644 --- a/lang/pt_br.lang +++ b/lang/pt_br.lang @@ -461,3 +461,5 @@ yform_values_be_link_multiple = Seleção múltipla yform_values_prio_fields = Exibir yform_values_prio_scope = Restrição yform_values_prio_default = No começo +yform_values_prio_label_expression = Exibição personalizada (SQL) +yform_values_prio_label_expression_notice = Expressão SQL como exibição personalizada, ex. CONCAT(lastname, ", ", firstname). Substitui "Exibir". diff --git a/lang/sv_se.lang b/lang/sv_se.lang index 72fa2e223..f10939eea 100644 --- a/lang/sv_se.lang +++ b/lang/sv_se.lang @@ -634,6 +634,8 @@ yform_values_be_link_multiple = Multiselect yform_values_prio_fields = Display yform_values_prio_scope = Begränsning yform_values_prio_default = Till början +yform_values_prio_label_expression = Anpassad visning (SQL) +yform_values_prio_label_expression_notice = SQL-uttryck som anpassad visning, t.ex. CONCAT(lastname, ", ", firstname). Åsidosätter "Display". yform_is = är yform_will_set_to = kommer att bli diff --git a/lib/Field/value/prio.php b/lib/Field/value/prio.php index 3a591d863..adbc28989 100644 --- a/lib/Field/value/prio.php +++ b/lib/Field/value/prio.php @@ -25,35 +25,57 @@ public function enterObject() if ($this->debug) { $sql->setDebug(); } - $fields = $this->getElement('fields'); - if (!is_array($fields)) { - $fields = array_filter(explode(',', $fields)); - } - if (empty($fields)) { - $fields = ['id']; - } - $selectFields = []; - foreach ($fields as $field) { - $selectFields[] = $field; - } - $sql->setQuery(sprintf( - 'SELECT id, %s, %s as prio FROM %s%s ORDER BY %2$s', - implode(', ', $selectFields), - $this->getElement('name'), - $this->params['main_table'], - $scopeWhere, - )); - $prio = 1; - while ($sql->hasNext()) { - if ($sql->getValue('id') != $this->params['main_id']) { - $prio = $sql->getValue('prio') + 1; - $label = []; - foreach ($fields as $field) { - $label[] = rex_i18n::translate((string) $sql->getValue($field), false); + $rawLabelExpression = $this->getElement('label_expression'); + $labelExpression = is_array($rawLabelExpression) ? '' : trim((string) $rawLabelExpression); + + if ('' !== $labelExpression) { + $sql->setQuery(sprintf( + 'SELECT id, (%s) AS _prio_label, %s as prio FROM %s%s ORDER BY %2$s', + $labelExpression, + $this->getElement('name'), + $this->params['main_table'], + $scopeWhere, + )); + $prio = 1; + while ($sql->hasNext()) { + if ($sql->getValue('id') != $this->params['main_id']) { + $prio = $sql->getValue('prio') + 1; + $label = rex_i18n::translate((string) $sql->getValue('_prio_label'), false); + $options[$prio] = rex_i18n::msg('yform_prio_after', $label); + } + $sql->next(); + } + } else { + $fields = $this->getElement('fields'); + if (!is_array($fields)) { + $fields = array_filter(explode(',', $fields)); + } + if (empty($fields)) { + $fields = ['id']; + } + $selectFields = []; + foreach ($fields as $field) { + $selectFields[] = $field; + } + $sql->setQuery(sprintf( + 'SELECT id, %s, %s as prio FROM %s%s ORDER BY %2$s', + implode(', ', $selectFields), + $this->getElement('name'), + $this->params['main_table'], + $scopeWhere, + )); + $prio = 1; + while ($sql->hasNext()) { + if ($sql->getValue('id') != $this->params['main_id']) { + $prio = $sql->getValue('prio') + 1; + $label = []; + foreach ($fields as $field) { + $label[] = rex_i18n::translate((string) $sql->getValue($field), false); + } + $options[$prio] = rex_i18n::msg('yform_prio_after', implode(' | ', $label)); } - $options[$prio] = rex_i18n::msg('yform_prio_after', implode(' | ', $label)); + $sql->next(); } - $sql->next(); } } @@ -88,7 +110,7 @@ public function enterObject() public function getDescription(): string { - return 'prio|name|label|fields|scope|defaultwert'; + return 'prio|name|label|fields|scope|defaultwert|label_expression'; } public function getDefinitions(): array @@ -100,6 +122,7 @@ public function getDefinitions(): array 'name' => ['type' => 'name', 'label' => rex_i18n::msg('yform_values_defaults_name')], 'label' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_defaults_label')], 'fields' => ['type' => 'select_names', 'label' => rex_i18n::msg('yform_values_prio_fields')], + 'label_expression' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_prio_label_expression'), 'notice' => rex_i18n::msg('yform_values_prio_label_expression_notice')], 'scope' => ['type' => 'select_names', 'label' => rex_i18n::msg('yform_values_prio_scope')], 'default' => ['type' => 'choice', 'label' => rex_i18n::msg('yform_values_prio_default'), 'choices' => [1 => 'Am Anfang', '' => 'Am Ende']], 'attributes' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_defaults_attributes'), 'notice' => rex_i18n::msg('yform_values_defaults_attributes_notice')], From c83dbd9618bf8565dfdaa17f52c286e17c614d2a Mon Sep 17 00:00:00 2001 From: tbaddade Date: Fri, 24 Apr 2026 11:43:38 +0200 Subject: [PATCH 2/2] prio: label_expression ans Ende der Definitionen verschoben MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit select_names bezieht seinen Tabellenkontext aus der Reihenfolge der Definitions-Einträge. label_expression zwischen fields und scope einzufügen brach die Tabelleneinschränkung im Auswahlfeld. --- lib/Field/value/prio.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Field/value/prio.php b/lib/Field/value/prio.php index adbc28989..f53651e58 100644 --- a/lib/Field/value/prio.php +++ b/lib/Field/value/prio.php @@ -122,9 +122,9 @@ public function getDefinitions(): array 'name' => ['type' => 'name', 'label' => rex_i18n::msg('yform_values_defaults_name')], 'label' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_defaults_label')], 'fields' => ['type' => 'select_names', 'label' => rex_i18n::msg('yform_values_prio_fields')], - 'label_expression' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_prio_label_expression'), 'notice' => rex_i18n::msg('yform_values_prio_label_expression_notice')], 'scope' => ['type' => 'select_names', 'label' => rex_i18n::msg('yform_values_prio_scope')], 'default' => ['type' => 'choice', 'label' => rex_i18n::msg('yform_values_prio_default'), 'choices' => [1 => 'Am Anfang', '' => 'Am Ende']], + 'label_expression' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_prio_label_expression'), 'notice' => rex_i18n::msg('yform_values_prio_label_expression_notice')], 'attributes' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_defaults_attributes'), 'notice' => rex_i18n::msg('yform_values_defaults_attributes_notice')], 'notice' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_defaults_notice')], ],