与 SO 上的问题发布表单类似,Drupal 在通过表单 api 创建的文本区域底部添加了一个可拖动的扩展器。我怎样才能以一种很好的方式禁用它?
5 回答
可拖动扩展器通过“misc/textearea.js”中定义的行为添加。从中您可以看到它适用于具有“可调整大小”类的文本区域。如果您将textareas FAPI 定义上的 '#resizable' 属性设置为 FALSE(如果未显式设置,则默认为 TRUE),您可以阻止此类的输出。
因此,对于您自己的表单,您可以相应地声明 textareas。对于其他形式,您需要通过hook_form_alter()
.
一个名为Disable Resizable Textarea的新模块现已发布。
这是一个简单的模块,添加了覆盖 textarea 字段的默认 #resizable 属性的能力。默认情况下,所有文本区域都是可调整大小的。此模块允许您在每个字段上禁用此功能。
设置非常简单。只需编辑所需的字段,您将看到“禁用此文本区域的#resizable 属性”选项。如果该字段的类型为“带摘要的长文本”,您还可以从其摘要中禁用调整大小。
body textarea {
resize: none;
}
最简单的方法是删除文件/misc/textarea.js
。
更难但可能更好的方法是在您的主题或小模块中解决此问题。
在您的主题中,您又有两个选择:
- 使用预处理从 javascript 文件列表中删除 textarea.js。
- 使用主题覆盖 ( )从呈现的 HTML
yourtheme_textarea
中删除类。论坛里的resizable-textarea
一些信息
模块中的选项是运行 ahook_form_alter()
以获取任何形式并通过处理器运行:
/**
* Implementation of hook_form_alter().
*
* Before Drupal 7, there is no way to easily identify form fields that are
* input format enabled. As a workaround, we assign a form #after_build
* processing callback that is executed on all forms after they have been
* completely built, so form elements are in their effective order
* and position already.
*
* @see wysiwyg_process_form()
*/ /**
* Implementation of hook_form_alter().
*
* Before Drupal 7, there is no way to easily identify form fields that are
* input format enabled. As a workaround, we assign a form #after_build
* processing callback that is executed on all forms after they have been
* completely built, so form elements are in their effective order
* and position already.
*
* @see wysiwyg_process_form()
*/
function wysiwyg_form_alter(&$form, &$form_state) {
$form['#after_build'][] = 'wysiwyg_process_form';
// Teaser splitter is unconditionally removed and NOT supported.
if (isset($form['body_field'])) {
unset($form['body_field']['teaser_js']);
}
}
function wysiwyg_process_form(&$form) {
// Iterate over element children; resetting array keys to access last index.
if ($children = array_values(element_children($form))) {
foreach ($children as $index => $item) {
$element = &$form[$item];
// filter_form() always uses the key 'format'. We need a type-agnostic
// match to prevent false positives. Also, there must have been at least
// one element on this level.
if (($item === 'format' || $item === 'signature_format') && $index > 0) {
// Make sure we either match a input format selector or input format
// guidelines (displayed if user has access to one input format only).
if ((isset($element['#type']) && $element['#type'] == 'fieldset') || isset($element['format']['guidelines'])) {
// The element before this element is the target form field.
$field = &$form[$children[$index - 1]];
$extra_class = '';
if (!empty($field['#resizable'])) {
$extra_class = ' wysiwyg-resizable-1';
drupal_add_js('misc/textarea.js');
}
// If we loaded at least one editor, then the 'none' editor will
// handle resizable textareas instead of core.
if (isset($loaded) && !empty($field['#resizable'])) {
$field['#resizable'] = FALSE;
}
}
// If this element is 'format', do not recurse further.
continue;
}
// Recurse into children.
wysiwyg_process_form($element);
}
}
return $form;
}
这些示例来自所见即所得模块,并略有改动。
在您的主题中非常简单,但需要一个您可以覆盖的主题。该模块在性能方面更差,而且更复杂。但是,它适用于任何主题。
在 Drupal (7) 中有一些方法可以删除可调整大小的文本区域。
第 1名这个简单的剪辑到您的主题template.php
中。不要忘记将 THEMENAME 重命名为您的主题名称。
/**
* Override of theme('textarea').
* Deprecate misc/textarea.js in favor of using the 'resize' CSS3 property.
*/
function THEMENAME_textarea($variables) {
$element = $variables ['element'];
element_set_attributes($element, array('id', 'name', 'cols', 'rows'));
_form_set_class($element, array('form-textarea'));
$wrapper_attributes = array(
'class' => array('form-textarea-wrapper'),
);
$output = '<div' . drupal_attributes($wrapper_attributes) . '>';
$output .= '<textarea' . drupal_attributes($element ['#attributes']) . '>' . check_plain($element ['#value']) . '</textarea>';
$output .= '</div>';
return $output;
}
第二种方法是使用另一个名为Disable resizable textarea的模块。