Wie ändere ich die Feldeinstellungen für Ansichten programmgesteuert?

7

Ich möchte einige Feldeinstellungen in einer bestimmten Ansicht ändern, die programmgesteuert mit Ansichten erstellt wurde .

Zum Beispiel möchte ich die Einstellungen " Formatierer " und " Bildstil " eines Bildfelds ändern . So sehen die Einstellungen dieses Feldes aus, wenn ich diese Ansicht exportiere:

/* Field: Taxonomy term: Natural images */
$handler->display->display_options['fields']['field_gallery_natural_images']['id'] = 'field_gallery_natural_images';
$handler->display->display_options['fields']['field_gallery_natural_images']['table'] = 'field_data_field_gallery_natural_images';
$handler->display->display_options['fields']['field_gallery_natural_images']['field'] = 'field_gallery_natural_images';
$handler->display->display_options['fields']['field_gallery_natural_images']['click_sort_column'] = 'fid';
$handler->display->display_options['fields']['field_gallery_natural_images']['type'] = 'colorbox';
$handler->display->display_options['fields']['field_gallery_natural_images']['settings'] = array(
  'colorbox_node_style' => '',
  'colorbox_image_style' => '',
  'colorbox_gallery' => 'post',
  'colorbox_gallery_custom' => '',
  'colorbox_caption' => 'auto',
  'colorbox_caption_custom' => '',
  'display_empty' => '',
  'custom_text' => '',
  'empty_callback' => 'mymodule_empty_fields_no_data',
);

Ich möchte den "Bildstil" des Colorbox-Formatierers irgendwie so ändern:

$handler->display->display_options['fields']['field_gallery_natural_images']['settings']['colorbox_node_style'] = 'thumbnail';

und speichere das. Wie soll ich das machen

Wie hier:

Ansichten - Ändern Sie die Einstellungen für das Bildfeld


BEARBEITEN 1.

Vielleicht sollte ich verwenden views_save_view():
http://api.drupal.org/api/views/views.module/function/views_save_view/7

Es speichert eine Ansicht - also sollte ich vielleicht die gesamte Ansicht abfragen, diese ändern und diese Funktion verwenden. Aber wie genau?

BEARBEITEN 2.

Ich habe festgestellt, views/includes/admin.incdass die angegebene Ansicht folgendermaßen gespeichert wird: $form_state['view']->save();in views_ui_edit_view_form_submit().

Ich weiß bereits, wie man den "Bildstil" eines Bildfelds in einem bestimmten Ansichtsmodus programmgesteuert ändert (wie auf der Registerkarte "Anzeige verwalten" nach dem Klicken auf das Zahnrad) , aber jetzt würde ich mich freuen, wenn ich mit einer bestimmten Ansicht etwas Ähnliches tun könnte .

Sk8erPeter
quelle
Versuchen Sie es in einen der Haken zu ändern , ich würde hook_views_pre_build
mojzis
Nur zu deiner Information. Sie haben Ihren Taxonomiebegriff auf dem Foto verdunkelt. aber es ist in dem von Ihnen bereitgestellten Code-Dump.
Chrisjlee
@mojzis: danke, aber soweit ich weiß, ändert es nur die Anzeige der gegebenen Ansicht, aber es speichert diese Änderungen nicht wirklich in der Datenbank. Daher möchte ich die Änderungen auf die gleiche Weise wie über die Benutzeroberfläche von Ansichten speichern, jedoch programmgesteuert.
Sk8erPeter
@chrisjlee: Ja, danke, das weiß ich, aber später wurde mir klar, dass es nicht wirklich wichtig ist. :)
Sk8erPeter
Ich erwarte hier eine Antwort von @Clive.
Niksmac

Antworten:

18

AKTUALISIERT :

Mit diesem Codefragment können Sie eine Ansicht ändern, ohne views_alter:

$view = views_get_view($view_name, TRUE);
$view->display['default']->display_options['fields']['field_gallery_natural_images']['settings']['colorbox_node_style'] = 'thumbnail';
views_save_view($view);

Ändern Sie die defaultAnzeige-ID, wenn Sie eine andere als die Standardanzeige verwenden möchten.


Wenn Sie die Ansicht mithilfe hook_views_default_views()des Moduls Features oder des Features-Moduls in Code exportiert haben , gibt es einen Hook, mit dem Sie die Ansichten programmgesteuert ändern können:

/**
 * Alter default views defined by other modules.
 *
 * This hook is called right before all default views are cached to the
 * database. It takes a keyed array of views by reference.
 *
 * Example usage to add a field to a view:
 * @code
 *   $handler =& $view->display['DISPLAY_ID']->handler;
 *   // Add the user name field to the view.
 *   $handler->display->display_options['fields']['name']['id'] = 'name';
 *   $handler->display->display_options['fields']['name']['table'] = 'users';
 *   $handler->display->display_options['fields']['name']['field'] = 'name';
 *   $handler->display->display_options['fields']['name']['label'] = 'Author';
 *   $handler->display->display_options['fields']['name']['link_to_user'] = 1;
 * @endcode
 */
function hook_views_default_views_alter(&$views) {
  if (isset($views['taxonomy_term'])) {
    $views['taxonomy_term']->display['default']->display_options['title'] = 'Categories';
  }
}

Zum Beispiel:

/**
 * Implements hook_views_default_views_alter()
 */
function MYMODULE_views_default_views_alter(&$views) {
  if (isset($views['VIEW_NAME'])) {
    $views['VIEW_NAME']->display['default']->display_options['fields']['field_gallery_natural_images']['settings']['colorbox_node_style'] = 'thumbnail';
  }
}

Denken Sie daran, den Cache zu leeren und die Ansicht zurückzusetzen, um Änderungen zu übernehmen.

smartinm
quelle
danke, aber hook_views_default_views_alter()nur zum Ändern von "Standardansichten, die von anderen Modulen definiert wurden" , was bedeutet, dass Ansichten, die über die Benutzeroberfläche " Ansichten" erstellt (oder sogar überschrieben?) wurden (die nur in der Datenbank gespeichert sind), nicht auf diese Weise geändert werden können, sondern nur die definierten Ansichten im Code, aber jetzt ist mein Zweck, einige bestimmte Ansichten zu ändern, die über die Benutzeroberfläche von Ansichten erstellt wurden, ohne sie zu exportieren. :-( Irgendwelche anderen Ideen?
Sk8erPeter
Damit die Felder auf der Benutzeroberfläche von Ansichten angezeigt werden views_ui_edit_form_get_bucket(), werden Felder hinzugefügt und verknüpft admin/structure/views/nojs/config-item/$view->name/$display->id/$type/$idund können geändert werden. Vielleicht sollte ich diesen Weg gehen und diesen nachverfolgen ... Ich habe ihn gestartet, aber immer noch nicht gefunden die wirkliche Lösung.
Sk8erPeter
@ Sk8erPeter Ich habe die Antwort mit einer alternativen Lösung aktualisiert.
Smartinm
2
wow, benutze views_get_view(), ändere die entsprechenden Anzeigeeinstellungen und speichere danach die Ansicht mit views_save_view()wirklich gelöst! Vielen Dank, smartinm ! :) Du verdienst das Lob. :) Ich habe auch Ihre Antwort für Ihre Bemühungen positiv bewertet. Ich habe es so getestet: pastebin.com/ukSy0xqM , und es hat wirklich funktioniert.
Sk8erPeter
Ich bin froh, dass ich dir helfen konnte :)
smartinm