I asked a similar question about a month or so ago, and the answer was to use the Views Modes module. That module required the PURL module. The problem is the PURL module leaves parameters on your URL all over the site, and have not figured out a way to turn it off. Others have posted a support issue and it goes ignored.

So, I'm back to the drawing board. I have nodes that are rendered, using view modes defined in Display Suite. Is there a way I can toggle between view modes in Views? What I'm really trying to do is provide a bunch of filter checkboxes, along with the ability to toggle between view modes, but I need to find a solution for the view modes first.

Is there a module that makes this easy, or do I need to write some code. If I do need to write some code, how should I approach it?

  • Do you mean if you display 3 nodes in a view then you want to show 2 of them with view mode A and the 3rd with view mode B ? Depending on a field value in the node? – donquixote Nov 13 '13 at 18:35
  • Should the view mode depend on a field value or other entity property, or should it depend on the position in the view? (e.g. zebra striping). That's an important distinction. – donquixote Nov 13 '13 at 18:41
  • No, they all would display in the same view mode. I want the toggle functionality that you find at the top right of a lot of sites, where you can, for example, switch between a grid view and a list view of the results. – vintorg Nov 13 '13 at 21:00
  • It would, from the UI standpoint, depend on if they click an icon that determines the view modes of the results. – vintorg Nov 13 '13 at 21:01
  • Then I would make it two separate Views displays. And some mechanic to switch between them. Either two separate urls, or some ajax magic. – donquixote Nov 13 '13 at 21:10

Solution that I use sometimes.

  1. Create a content type with one or more multiple-value block reference fields.
    This is like a "cheap" version of panels..
  2. Create your views displays as blocks. One for each version.
  3. Create a custom module to define a block that acts as the "switcher" between the two. Put some dummy content for now.
  4. Create two nodes with the block reference.
    • One that has the switcher and the Views display A.
    • One that has the switcher and the Views display B.
  5. Set url aliases for both nodes.
  6. Flesh out the "switcher" block. E.g. make it keep the url query parameters. Make it look different depending on whether you are on A or B.
  7. If you want, you can have a separate block for the exposed filters, that you also add via the blockreference.
  8. Use Display suite or some other way to arrange the different blocks on the page.

The benefit of block reference + ds over theme regions is that you don't spam your theme regions with one-page-only blocks.

  • Boy... that's ugly. I'm wondering if it would make sense to use the ajax views API and just do it in code. I'm using Display Suite. I'd rather write a cleaner solution and hand it off or post it in sandbox. Can you tell me where I should start? – vintorg Nov 13 '13 at 23:19
  • And still I get the bounty? I think I can come up with something better :) The block reference is still my favorite solution, but for other reasons than your requirements. So it might be distracting. – donquixote Nov 13 '13 at 23:30
  • I generally find nodes easier to work with than page views. – donquixote Nov 13 '13 at 23:34
  • Yeah... is there no way to signal the nodes to render using another view mode, defined by DS? Is there a way to do it via AJAX? – vintorg Nov 13 '13 at 23:36
  • Ah.. the ajax is important to you? Having the views on different urls is not an option? – donquixote Nov 13 '13 at 23:38

Just an idea and I might be mis-understanding what you need here but could you create multiple views, one for each view you need, expose the filters on them and then combine all these views with the quicktabs module?

  • The issue is it can't be part of the exposed block of filters, because the filters need to be on the left, and the view mode toggle at the top right somewhere. As I understand it, that can't be done because that would break up the form element. – vintorg Nov 12 '13 at 22:24
  • yeah my bad, I was mistaken about what you were trying to do. Dont know about the toggling of views modes but better exposed filters might help with the other part. which isnt what you asked but.... – Craicerjack Nov 12 '13 at 23:04
  • Yeah, I think I am going to try Better Exposed Filters. I just need to figure out this view modes thing. If I have to do it in code, that's fine, I just need someone to point me in the right direction. – vintorg Nov 13 '13 at 0:12
  • I have just been looking into Display Suite and in the configuration page of Display suite extras (admin/structure/ds/list/extras) under the Other tab there is a "View Mode Switcher" check box. Could this help? – Craicerjack Nov 14 '13 at 15:26
  • not sure... I couldn't figure out what that was for... I'm going to look further... – vintorg Nov 14 '13 at 20:04

So, it seems the general idea will be to have multiple views displays, and something to switch between those views displays.

The problem seems to be

  1. How to create the switcher.
  2. How to display the switcher in the intended location next to the exposed filters.

One solution could be hook_form_views_exposed_form_alter() to sneak the switcher into the form.

EDIT: Another solution can be to put the switcher as custom html in the View header. Or you can write your own Views header plugin to have it reusable.

  • No. The switcher can be located anywhere. I can render the switcher. The requirement is it can't be bound with the exposed filters. – vintorg Nov 13 '13 at 23:12

What about creating a custom select that appends arguments to the current url, and then implementing hook_entity_view_mode_alter and checking the paths?

function mymodule_entity_view_mode_alter(&$view_mode, $context) {
  if ($context['entity_type'] == 'node') {
    if (arg(0) == 'myview' && arg(1) == 'mode' && arg(2) == 'custom') {
      $view_mode = 'custom_view_mode';

There must be a cleaner way to do this. But this should work.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.