Khi triển khai hook_field_extra_fields () , tôi có thể làm cho trường bổ sung bị ẩn theo mặc định không?
Đôi khi, cung cấp các trường bổ sung dưới dạng tùy chọn, thay vì hiển thị ngay lập tức sau khi mô-đun được bật.
Khi triển khai hook_field_extra_fields () , tôi có thể làm cho trường bổ sung bị ẩn theo mặc định không?
Đôi khi, cung cấp các trường bổ sung dưới dạng tùy chọn, thay vì hiển thị ngay lập tức sau khi mô-đun được bật.
Câu trả lời:
Trong _field_info_prepare_extra_fields()
các trường bổ sung được đặt thành hiển thị theo mặc định, nhưng các cài đặt trường bổ sung được lưu trữ trong biến field_bundle_sinstall mà bạn có thể thay đổi trong mô-đun của mình hook_install()
như sau:
$entity_type = 'node';
$bundle = 'article';
$field_name = 'my_extra_field';
$view_mode = 'teaser';
$field_bundle_setting = variable_get('field_bundle_settings', array());
$field_bundle_setting[$entity_type][$bundle]['extra_fields']['display'][$field_name][$view_mode]['visible'] = FALSE;
variable_set('field_bundle_settings', $field_bundle_setting);
_field_extra_fields_pre numnder () , cuộc gọi lại kết xuất trước được sử dụng bởi field_attach_form () và field_attach_view () , chứa mã sau:
elseif (isset($elements['#view_mode'])) {
$view_mode = $elements['#view_mode'];
$extra_fields = field_extra_fields_get_display($entity_type, $bundle, $view_mode);
foreach ($extra_fields as $name => $settings) {
if (isset($elements[$name])) {
$elements[$name]['#weight'] = $settings['weight'];
// Visibility: make sure we do not accidentally show a hidden element.
$elements[$name]['#access'] = isset($elements[$name]['#access']) ? ($elements[$name]['#access'] && $settings['visible']) : $settings['visible'];
}
}
}
Việc triển khai hook_field_extra_fields_display_alter () , bạn có thể thay đổi cài đặt hiển thị, nhưng điều đó sẽ khiến trường không hiển thị trong suốt thời gian biểu mẫu được hiển thị. Nếu bạn muốn không hiển thị trường khi biểu mẫu được tải lần đầu tiên và hiển thị nó khi, ví dụ, trường biểu mẫu khác được chọn hoặc giá trị của nó bị thay đổi, thì bạn cần sử dụng một số mã JavaScript.
function mymodule_field_extra_fields_display_alter(&$displays, $context) {
if ($context['entity_type'] == 'taxonomy_term' && $context['view_mode'] == 'full') {
$displays['description']['visible'] = FALSE;
}
}
<hidden>
lần đầu tiên.
hook_field_extra_fields()
. Tuy nhiên, bạn có thể thay đổi trường biểu mẫu hoặc thay đổi trình định dạng được sử dụng bởi trường.
Có một bản vá để thêm khả năng này vào lõi drupal.
Nếu bạn muốn thấy điều này, hãy xem lại và đưa ra phản hồi.
Trong hook cài đặt của mô-đun của bạn, bạn có thể thực hiện cuộc gọi đến một chức năng tương tự như chức năng này và nó sẽ ẩn hàng loạt các trường thừa của bạn theo mặc định.
/**
* Sets default visibility of extra fields in all active view modes on entity bundles.
*
* This will not overwrite visibility that already exists in the variable.
*
* @param array $extra_field_names An array of extra fields
* @param string $entity_type The name of the entity type. Defaults to 'node'.
* @param array $bundles An array of bundle objects or names.
*/
function my_module_hide_extra_fields($extra_field_names, $entity_type = 'node', $bundles = NULL) {
$entity_info = entity_get_info($entity_type);
if ($bundles === NULL) {
$bundles = array_keys($entity_info['bundles']);
}
foreach ($bundles as $bundle) {
if (!is_string($bundle)) {
$bundle = $bundle->type;
}
$settings = field_bundle_settings($entity_type, $bundle);
$active_modes = array('default');
foreach ($settings['view_modes'] as $mode => $mode_settings) {
if ($mode_settings['custom_settings']) {
$active_modes[] = $mode;
}
}
foreach ($extra_field_names as $field_name) {
foreach ($active_modes as $mode) {
if (empty($settings['extra_fields']['display'][$field_name][$mode])
|| !array_key_exists('visible', $settings['extra_fields']['display'][$field_name][$mode])) {
$settings['extra_fields']['display'][$field_name][$mode]['visible'] = FALSE;
$settings['extra_fields']['display'][$field_name][$mode] += array(
'weight' => 0,
);
}
}
}
field_bundle_settings($entity_type, $bundle, $settings);
}
}
Vì vậy, ví dụ đơn giản hơn nhiều. Đối với Drupal 7 Tạo example_module.install trong thư mục example_module
/**
* hook_install
*/
function example_module_install() {
$field_machine_name = 'new_extra_field';
$entity_types = array('node', 'taxonomy_term', 'user');
foreach ($entity_types as $type) {
$info = entity_get_info($type);
$settings = field_bundle_settings($type, $bundle);
$view_modes = array_merge(array('default'), array_keys($info['view modes']));
foreach($view_modes as $view_mode) {
$settings['extra_fields']['display'][$field_machine_name][$view_mode] = array(
'visible' => FALSE,
'weight' => 0,
);
}
field_bundle_settings($type, $bundle, $settings);
}
}
Tài liệu cho hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/feft/hook_install/7
Trong tệp example_module.module của bạn thêm
/**
* Implementation of hook_field_extra_fields
*
*/
function example_module_field_extra_fields() {
$extra = array();
$field_machine_name = 'new_extra_field';
$entity_types = array('node', 'taxonomy_term', 'user');
foreach ($entity_types as $type) {
$info = entity_get_info($type);
foreach(array_keys($info["bundles"]) as $bundle) {
$extra[$type][$bundle]['display'][$field_machine_name] = array(
'label' => t('New extra field that will show up in manage display'),
'description' => 'A description for the extra field',
'weight' => 5,
);
}
}
return $extra;
}
Tài liệu cho hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/feft/hook_field_extra_fields/7