[FEATURE] Placeholder for TCEForm fields
authorTobias Liebig <tobias.liebig@typo3.org>
Mon, 16 Jan 2012 20:41:08 +0000 (21:41 +0100)
committerIngmar Schlecht <ingmar@typo3.org>
Wed, 1 Feb 2012 16:44:13 +0000 (17:44 +0100)
Possibility to display a placeholder/ghosttext in TCEForm fields to guide the user about default values. The Placeholder will disappear as soon as the user enters a value. The Placeholder is configurable by TCA config. Uses the HTML5 placeholder attribute.

Change-Id: Icdb4f774be6d04ebbdf14dcf1653c0950a6d0ed6
Resolves: #33235
Reviewed-on: http://review.typo3.org/7823
Reviewed-by: Tolleiv Nietsch
Tested-by: Tolleiv Nietsch
Reviewed-by: Georg Ringer
Tested-by: Georg Ringer
Reviewed-by: Ingmar Schlecht
Tested-by: Ingmar Schlecht
t3lib/class.t3lib_tceforms.php

index d77fcd3..efa7852 100644 (file)
@@ -1060,10 +1060,18 @@ class t3lib_TCEforms {
                $mLgd = ($config['max'] ? $config['max'] : 256);
                $iOnChange = implode('', $PA['fieldChangeFunc']);
 
-               $item .= '<input type="text" id="' . $inputId .
-                                '" class="' . implode(' ', $cssClasses) . '" name="' . $PA['itemFormElName'] .
-                                '_hr" value="" style="' . $cssStyle . '" maxlength="' . $mLgd . '" onchange="' .
-                                htmlspecialchars($iOnChange) . '"' . $PA['onFocus'] . ' />'; // This is the EDITABLE form field.
+               $cssClasses[] = 'hasDefaultValue';
+               $item .= '<input type="text" ' .
+                                $this->getPlaceholderAttribute($table, $field, $config, $row) .
+                                'id="' . $inputId . '" ' .
+                                'class="' . implode(' ', $cssClasses) . '" ' .
+                                'name="' . $PA['itemFormElName'] . '_hr" ' .
+                                'value=""' .
+                                'style="' . $cssStyle . '" ' .
+                                'maxlength="' . $mLgd . '" ' .
+                                'onchange="' . htmlspecialchars($iOnChange) . '"' .
+                                $PA['onFocus'] .
+                                ' />'; // This is the EDITABLE form field.
                $item .= '<input type="hidden" name="' . $PA['itemFormElName'] . '" value="' .
                                 htmlspecialchars($PA['itemFormElValue']) . '" />'; // This is the ACTUAL form field - values from the EDITABLE field must be transferred to this field which is the one that is written to the database.
                $item .= $fieldAppendix . '</span><div style="clear:both;"></div>';
@@ -1242,7 +1250,16 @@ class t3lib_TCEforms {
 
                                $iOnChange = implode('', $PA['fieldChangeFunc']);
                                $item .= '
-                                                       <textarea id="' . uniqid('tceforms-textarea-') . '" name="' . $PA['itemFormElName'] . '"' . $formWidthText . $class . ' rows="' . $rows . '" wrap="' . $wrap . '" onchange="' . htmlspecialchars($iOnChange) . '"' . $PA['onFocus'] . '>' .
+                                                       <textarea ' .
+                                                'id="' . uniqid('tceforms-textarea-') . '" ' .
+                                                'name="' . $PA['itemFormElName'] . '"' .
+                                                $formWidthText .
+                                                $class . ' ' .
+                                                'rows="' . $rows . '" ' .
+                                                'wrap="' . $wrap . '" ' .
+                                                'onchange="' . htmlspecialchars($iOnChange) . '"' .
+                                               $this->getPlaceholderAttribute($table, $field, $config, $row) .
+                                                $PA['onFocus'] . '>' .
                                                 t3lib_div::formatForTextarea($PA['itemFormElValue']) .
                                                 '</textarea>';
                                $item = $this->renderWizards(array($item, $altItem), $config['wizards'], $table, $row, $field, $PA, $PA['itemFormElName'], $specConf, $RTEwouldHaveBeenLoaded);
@@ -6462,6 +6479,54 @@ class t3lib_TCEforms {
                }
        }
 
+       /**
+        * Determine and get the value for the placeholder and return the placeholder attribute
+        *
+        * @param string $table
+        * @param string $field
+        * @param array $config
+        * @param array $row
+        * @return string
+        */
+       protected function getPlaceholderAttribute($table, $field, array $config, array $row) {
+               $value = trim($config['placeholder']);
+               if (!$value) {
+                       return '';
+               }
+
+                       // Check if we have a reference to another field value from the current record
+               if (substr($value, 0, 6) === '__row|') {
+                       $keySegments = t3lib_div::trimExplode('|', substr($value, 6));
+
+                       if (isset($row[$keySegments[0]])) {
+                                       // First segment (fieldname) exists in the current row
+                               $value = $row[$keySegments[0]];
+
+                               $fieldConf = $GLOBALS['TCA'][$table]['columns'][$keySegments[0]];
+                               if ($fieldConf['config']['type'] === 'group' && $fieldConf['config']['internal_type'] === 'db') {
+                                               // The field is a relation to another record
+                                       list($foreignIdentifier, $foreignTitle) = t3lib_div::trimExplode('|', $value);
+
+                                               // Use the foreign title
+                                       $value = $foreignTitle;
+
+                                       if (!empty($keySegments[1])) {
+                                                       // Use any field in the foreign record
+                                               list($foreignTable, $foreignUid) = t3lib_BEfunc::splitTable_Uid($foreignIdentifier);
+                                               $foreignRecord = t3lib_befunc::getRecord($foreignTable, $foreignUid);
+                                               if (isset($foreignRecord[$keySegments[1]])) {
+                                                       $value = $foreignRecord[$keySegments[1]];
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+                       // Cleanup the string and support 'LLL:'
+               $value = htmlspecialchars(trim($this->sL($value)));
+               return empty($value) ? '' : (' placeholder="' . $value . '" ');
+       }
+
        /**
         * Insert additional style sheet link
         *