it-swarm.asia

قم بتغيير الفئة على غلاف div لعنصر نموذج

هل هناك طريقة لإضافة أو تغيير فئة إلى غلاف النموذج (div) باستخدام api للنموذج؟

أم أن ذلك تم للتو مع وظيفة السمة؟

إذا كان الأمر كذلك ، ما هي وظيفة السمة المستخدمة لتغيير ذلك؟

11
chrisjlee

يمكنك تجاوز theme_form_element() بشكل طبيعي إذا كنت تريد تغييرها بشكل عام. إذا كنت مهتمًا بتعديل عنصر نموذج واحد فقط ، فأنا على دراية بخيارين.

  1. يمكنك تسجيل وظيفة سمة جديدة لنوع معين من عنصر النموذج الذي تهتم به (على سبيل المثال ، حقل النص). ثم تقوم بإنشاء وظيفة السمة هذه (استنادًا إلى الأصل ، على سبيل المثال theme_textfield() ) ولكن هذا لا يستدعي theme('form_element', ...) في النهاية (يمكنك إما التعامل مع كل من المجمع والعنصر في وظيفة السمة الواحدة ، أو يمكنك إنشاء وظيفة سمة مجمعة منفصلة واستخدام ذلك). أخيرًا ، يمكنك إضافة خاصية #theme إلى عنصر نموذج معين ، وسيحصل هذا العنصر على السمات المخصصة الخاصة بك.

  2. يمكنك إنشاء ملف قالب يسمى form_element.tpl.php والذي لديه السلوك الافتراضي لـ theme_form_element() ثم استخدم hook_preprocess_form_element() لإضافة اقتراح قالب. ثم تقوم بإنشاء القالب الجديد الذي يطابق الاقتراح. غالبًا ما تسمع أشخاصًا يذكرون أن النماذج أبطأ قليلاً من الوظائف ، وبالنسبة لمكالمة السمة المستخدمة بشكل متكرر ، يمكنني أن أتخيل أن الناس يتخبطون في استخدام القالب. لم أقم أبدًا بأي قياسات لهذا بنفسي. أيضًا ، يجب أن يكون لديك سياق كافٍ في مرحلة ما قبل المعالجة حتى تتمكن من تقديم الاقتراح.

5
Andy

أعلم أن هذا موضوع قديم جدًا ، لكني كنت أتعلم كيفية تغيير عناصر النموذج وإضافة الفصول الدراسية. لقد قمت بعمل وحدة مخصصة:

function yourtheme_custom_form_alter(&$form, &$form_state, $form_id) {
 case'webform_number_whatever':
   _yourtheme_form_add_wrapper($form['submitted']['yourfieldhere'], array('form-field-some-style', 'not-label', 'whatever-other-styles-you-want'));
 break;
}

function _yourtheme_form_add_wrapper(&$element, $classes = array(), $type = array('form-item', 'form-type-textfield'), $removeTitle = FALSE){
  $element['#prefix'] = '<div class="' . implode(" ", $classes) . '"><div class="' . implode(" ", $type) . '">';
  $element['#suffix'] = '</div></div>';
}
4
tdm

لتغيير "المجمع" تحتاج إلى تجاوز form_element. بشكل أساسي ، يتم تقديم جميع عناصر النموذج باستخدام نسق form_element theme_form_element($element,$value); (ملف form.inc)

لذا لتغيير طريقة عرض عناصر النموذج ، ما عليك سوى نسخ هذه الوظيفة إلى مجلد template.php وإعادة تسميتها إلى: phptemplate_form_element($element,$value)

الآن يمكنك إجراء أي تغييرات وسيتم استخدامها بدلاً من الوظيفة الأصلية

  1. نسخ theme_form_element($element,$value); من form.inc
  2. الصقه في template.php (السمة الخاصة بك)
  3. أعد تسميته إلى: phptemplate_form_element($element,$value)
  4. مسح كافة ذاكرة التخزين المؤقت للموضوع
  5. قم بإجراء التغييرات التي تريدها وسيتم استخدامها.
3
Andre

يمكنك استخدام wrapper_attributes الخاصية.

$form['example'] = [
  '#type' => 'textfield',
  '#title' => $this->t('Example'),
  '#wrapper_attributes' => ['class' => ['wrapper-class']],
];
1
ya.teck

الأهم من ذلك ، أن theme_form_element سيعدل فقط div المجمع الرئيسي المباشر وقد لا يكون هذا هو الهدف المقصود لتأثيرات CSS.

[على الرغم من أنه ليس برنامجًا آليًا ، إذا كان أحد يريد ببساطة تطبيق فئة على الغلاف العلوي لحقل العقدة (إنه الغلاف ، الغلاف ، الغلاف) ، فيمكن للمرء أن يفترض استخدام وحدة "مجموعة الحقول" عن طريق تحديد "إدارة الحقول" لنوع محتوى معين و حدد "إضافة مجموعة جديدة" باعتبارها DIV بسيطة. ثم يمكن إزالة الملصق وتعيين الفئات المرغوبة في الغلاف الإضافي (ولكن الآن لدينا المزيد من الأغلفة) - مع تداخل غير محدود]

0
user24737

جعل سمات المجمع قابلة للتكوين!

إنشاء وظيفة سمة عنصر النموذج الخاصة بك في السمة ... sites/all/themes/MY_THEME/theme/form-element.theme.inc

function my_theme_form_element($variables) {
  $element = &$variables['element'];

  $attributes = isset($element['#my_theme_wrapper_attributes']) ?
    $element['#my_theme_wrapper_attributes'] : array();

  ...

  $output = '<div' . drupal_attributes($attributes) . '>' . "\n";

  ...
}

ثم يمكنك القيام بأشياء مثل هذا ...

function my_module_form_alter(&$form, &$form_state, $form_id) {
  $form['account']['mail']['#my_theme_wrapper_attributes']['class'][] = 'form-field--inline';
}
0
doublejosh

هناك حالات قادمة لا يعطي فيها _#prefix/#suffix_ ولا #attributes => array('class') النتائج المرجوة. حالتي الخاصة هي إضافة فئة إلى div-ajax-wrapper حول عنصر خاضعة للإدارة. _#prefix/#suffix_ ينشئ حاوية جديدة و _#attributes/'class'_ يعدل فئة العنصر الداخلي ، وليس الطبقة الخارجية.

القسم الخارجي العادي هو فقط

_<div id="edit-doc1--XX-ajax-wrapper">
_

وهو أمر يصعب استهدافه في CSS. يمكنني استهداف _[id^="edit-doc"]_ أو _[id$="-ajax-wrapper"]_ ولكن كلاهما يستهدفان أكثر من العناصر التي أريدها فقط.

الحل الذي توصلت إليه هو إضافة _#process_ element إلى النموذج ومعالجة رمز العنصر يدويًا. إليك السمة _#process_ التي تمت إضافتها إلى تعريف عنصر النموذج:

_$form['doc1'] = array(
  '#type' => 'managed_file',
  '#process' => array('mymodule_managed_file_process'),
);
_

وإليك وظيفة mymodule_managed_file_process():

_function mymodule_managed_file_process($element, &$form_state, $form) {

  // Call the original function to perform its processing.
  $element = file_managed_file_process($element, $form_state, $form);

  // Add our own class for theming.
  $element['#prefix'] = str_replace(
    'id=',
    'class="managed-file-wrapper" id=',
    $element['#prefix']
  );

  return $element;
}
_

الاعتماد على استبدال السلاسل ليس سهل الحمل ، لذا استخدم _str_replace_ على مسؤوليتك الخاصة. ومع ذلك ، فإن هذا الرمز يغير بالفعل DIV الأبعد لإضافة الفئة اللازمة:

_<div class="managed-file-wrapper" id="edit-doc1--XX-ajax-wrapper">
_
0
Joseph Cheek

يمكنك استخدام

'#prefix' => '<div class="new_class">', '#suffix' => '</div>'

وهذا سوف يلفها

0
Alex