代码之家  ›  专栏  ›  技术社区  ›  Finbarr

禁用Drupal的文本区域扩展器?

  •  2
  • Finbarr  · 技术社区  · 14 年前

    与SO上的问题发布表单类似,Drupal在通过表单API创建的文本区域底部添加了一个可拖动的扩展程序。我怎样才能以一种好的方式禁用它?

    5 回复  |  直到 6 年前
        1
  •  8
  •   Henrik Opel    14 年前

    通过“misc/texteeara.js”中定义的行为添加可拖动的扩展程序。从中可以看出,它适用于具有类“可调整大小”的文本区域。如果设置了 the '#resizable' property on a textareas FAPI definition 设置为假(如果未显式设置,则默认为真)。

    因此,对于您自己的表单,您可以相应地声明文本区域。对于其他形式,您需要通过 hook_form_alter() .

        2
  •  2
  •   Thiago Régis    10 年前

    一个名为 Disable Resizable Textarea 现在被释放了。

    这是一个简单的模块,它添加了覆盖文本区域字段的默认可调整大小属性的功能。默认情况下,所有文本区域都可以调整大小。此模块允许您在每个字段上禁用此功能。

    很容易设置。只需编辑所需字段,您将看到“禁用此文本区域的可调整大小属性”选项。如果字段类型为“带摘要的长文本”,也可以从其摘要中禁用“可调整大小”。

        3
  •  1
  •   Alexey    11 年前
    body textarea {
      resize: none;
    }
    
        4
  •  0
  •   berkes    14 年前

    最简单的方法是删除文件 /misc/textarea.js .

    更难,但可能更好的方法是在你的主题或者一个小模块中解决这个问题。

    在您的主题中,您还有两个选项:

    • 使用预处理从javascript文件列表中删除textarea.js。
    • 使用主题替代( yourtheme_textarea )移除类 resizable-textarea 从呈现的HTML。关于这个的一些信息 in the forums

    模块中的选项是运行 hook_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;
    }
    

    这些例子来自WYSIWYG模块,并略有改变。

    在你的主题中是非常简单的,但是需要一个你可以覆盖的主题。模块在性能方面更差,而且更复杂。但是,它可以在任何主题上工作。

        5
  •  0
  •   Jasom Dotnet    9 年前

    在Drupal(7)中有很多方法可以移除可调整大小的文本区域。

    第一 把这个简单的剪接成你的主题 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 .

    More info and source .

    推荐文章