drupal 8 条件字段
drupal 8 conditional field
我想在 drupal 8 中向用户实体添加省和城市字段。通过更改省,城市列表应该会更新。在 drupal 7 中,我已经使用条件字段模块完成了此操作,但该模块尚未为 drupal 8 做好准备。
在 drupal 8 中执行此操作的正确方法是什么?
我应该添加字段然后将 jquery 添加到我的注册模板来执行此操作,还是有更好的标准方法来执行此操作。
谢谢。
Drupal 通过 Conditional fields 模块提供您需要的功能。
作为 early adopter, you may consider to follow this issue 并最终通过移植到 Drupal 8 来支持社区。
今天,只有当稳定的贡献模块支持我需要的所有或大部分功能时,我个人才会选择 Drupal 8。否则,我会选择 Drupal 7。
只需一点 (PHP) 代码,就可以使用 Drupal's states processing 明确说明在给定条件下应显示或隐藏哪些字段。
例如,当在类别字段中选择设计(术语 ID 4)时,这会显示设计类型、设计位置和设计学科字段等:
/**
* Implements hook_form_alter().
*
* On Work node add and edit, set only selected category's associated
* vocabularies as visible.
*/
function mass_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if ($form_id != 'node_work_form' && $form_id != 'node_work_edit_form') {
return;
}
if (isset($form['field_category'])) {
$states_when_category_is_design = array(
'visible' => array(
':input[name="field_category"]' => array('value' => '4'),
),
);
$states_when_category_is_advocacy = array(
'visible' => array(
':input[name="field_category"]' => array('value' => '19'),
),
);
$states_when_category_is_research = array(
'visible' => array(
':input[name="field_category"]' => array('value' => '25'),
),
);
if (isset($form['field_design_type'])) {
$form['field_design_type']['#states'] = $states_when_category_is_design;
}
if (isset($form['field_design_location'])) {
$form['field_design_location']['#states'] = $states_when_category_is_design;
};
if (isset($form['field_design_discipline'])) {
$form['field_design_discipline']['#states'] = $states_when_category_is_design;
};
if (isset($form['field_advocacy_type'])) {
$form['field_advocacy_type']['#states'] = $states_when_category_is_advocacy;
};
if (isset($form['field_research_type'])) {
$form['field_research_type']['#states'] = $states_when_category_is_research;
};
}
}
(此代码无耻地从我在 Agaric 的同事兼工人所有者 Mauricio Dinarte aka dinarcon 那里窃取。)
我用它来显示或隐藏下拉列表 select 中具有依赖性的字段。
/**
* Implements hook_form_alter().
*/
function MYMODULE_form_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id) {
if ($form_id == 'node_CONTENT_TYPE_form' || $form_id == 'node_CONTENT_TYPE_edit_form') {
conditional_field_select(
$form,
'field_target',
'field_controller',
['value_a', 'value_b', 'value_c'],
'visible'
);
}
}
function conditional_field_select(array &$form, $targetField, $controlledBy, array $values, $state = 'invisible', $cond = 'or') {
if (isset($form[$targetField]) && isset($form[$controlledBy])) {
$form[$targetField]['#states'][$state] = [];
foreach ($values as $value) {
array_push($form[$targetField]['#states'][$state], ['select[name=' . $controlledBy . ']' => ['value' => $value]]);
if (end($values) !== $value) {
array_push($form[$targetField]['#states'][$state], $cond);
}
}
}
}
很容易改成输入法。
array_push($form[$targetField]['#states'][$state], [':input[name=' . $controlledBy . ']' => ['value' => $value]]);
我想在 drupal 8 中向用户实体添加省和城市字段。通过更改省,城市列表应该会更新。在 drupal 7 中,我已经使用条件字段模块完成了此操作,但该模块尚未为 drupal 8 做好准备。 在 drupal 8 中执行此操作的正确方法是什么? 我应该添加字段然后将 jquery 添加到我的注册模板来执行此操作,还是有更好的标准方法来执行此操作。 谢谢。
Drupal 通过 Conditional fields 模块提供您需要的功能。
作为 early adopter, you may consider to follow this issue 并最终通过移植到 Drupal 8 来支持社区。
今天,只有当稳定的贡献模块支持我需要的所有或大部分功能时,我个人才会选择 Drupal 8。否则,我会选择 Drupal 7。
只需一点 (PHP) 代码,就可以使用 Drupal's states processing 明确说明在给定条件下应显示或隐藏哪些字段。
例如,当在类别字段中选择设计(术语 ID 4)时,这会显示设计类型、设计位置和设计学科字段等:
/**
* Implements hook_form_alter().
*
* On Work node add and edit, set only selected category's associated
* vocabularies as visible.
*/
function mass_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if ($form_id != 'node_work_form' && $form_id != 'node_work_edit_form') {
return;
}
if (isset($form['field_category'])) {
$states_when_category_is_design = array(
'visible' => array(
':input[name="field_category"]' => array('value' => '4'),
),
);
$states_when_category_is_advocacy = array(
'visible' => array(
':input[name="field_category"]' => array('value' => '19'),
),
);
$states_when_category_is_research = array(
'visible' => array(
':input[name="field_category"]' => array('value' => '25'),
),
);
if (isset($form['field_design_type'])) {
$form['field_design_type']['#states'] = $states_when_category_is_design;
}
if (isset($form['field_design_location'])) {
$form['field_design_location']['#states'] = $states_when_category_is_design;
};
if (isset($form['field_design_discipline'])) {
$form['field_design_discipline']['#states'] = $states_when_category_is_design;
};
if (isset($form['field_advocacy_type'])) {
$form['field_advocacy_type']['#states'] = $states_when_category_is_advocacy;
};
if (isset($form['field_research_type'])) {
$form['field_research_type']['#states'] = $states_when_category_is_research;
};
}
}
(此代码无耻地从我在 Agaric 的同事兼工人所有者 Mauricio Dinarte aka dinarcon 那里窃取。)
我用它来显示或隐藏下拉列表 select 中具有依赖性的字段。
/**
* Implements hook_form_alter().
*/
function MYMODULE_form_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id) {
if ($form_id == 'node_CONTENT_TYPE_form' || $form_id == 'node_CONTENT_TYPE_edit_form') {
conditional_field_select(
$form,
'field_target',
'field_controller',
['value_a', 'value_b', 'value_c'],
'visible'
);
}
}
function conditional_field_select(array &$form, $targetField, $controlledBy, array $values, $state = 'invisible', $cond = 'or') {
if (isset($form[$targetField]) && isset($form[$controlledBy])) {
$form[$targetField]['#states'][$state] = [];
foreach ($values as $value) {
array_push($form[$targetField]['#states'][$state], ['select[name=' . $controlledBy . ']' => ['value' => $value]]);
if (end($values) !== $value) {
array_push($form[$targetField]['#states'][$state], $cond);
}
}
}
}
很容易改成输入法。
array_push($form[$targetField]['#states'][$state], [':input[name=' . $controlledBy . ']' => ['value' => $value]]);