Quando si implementa hook_field_extra_fields () , posso rendere nascosto il campo extra per impostazione predefinita?
A volte è più semplice offrire i campi extra come opzione, invece di visualizzarli immediatamente dopo l'attivazione di un modulo.
Quando si implementa hook_field_extra_fields () , posso rendere nascosto il campo extra per impostazione predefinita?
A volte è più semplice offrire i campi extra come opzione, invece di visualizzarli immediatamente dopo l'attivazione di un modulo.
Risposte:
Nei _field_info_prepare_extra_fields()
campi extra sono impostati come visibili per impostazione predefinita, ma le impostazioni del campo extra sono memorizzate nella variabile field_bundle_settings che è possibile modificare hook_install()
come:
$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_render () , il callback pre-rendering utilizzato da field_attach_form () e field_attach_view () , contiene il seguente codice:
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'];
}
}
}
Implementando hook_field_extra_fields_display_alter () , è possibile modificare l'impostazione di visibilità, ma ciò renderebbe il campo non visibile ogni volta che viene visualizzato il modulo. Se non si desidera mostrare il campo al primo caricamento del modulo e mostrarlo quando, ad esempio, viene selezionato un altro campo del modulo o il suo valore viene modificato, è necessario utilizzare un codice 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>
in un primo momento.
hook_field_extra_fields()
. Tuttavia, è possibile modificare il campo modulo o il formatter utilizzato dal campo.
C'è una patch per aggiungere questa capacità al core drupal.
Se vuoi vederlo entrare ti preghiamo di rivederlo e dare un feedback.
Nel gancio di installazione del modulo è possibile effettuare una chiamata a una funzione simile a questa e per impostazione predefinita verranno nascosti in blocco i campi aggiuntivi.
/**
* 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);
}
}
Esempio molto più semplice. Per Drupal 7 Creare esempio_modulo.install nella directory esempio_modulo
/**
* 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);
}
}
Documentazione per hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_install/7
Nel file esempio_modulo.module aggiungi
/**
* 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;
}
Documentazione per hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/function/hook_field_extra_fields/7