Views & Drupal Commerce-producten
Het probleem
Hoe bouw je een view met Drupal Commerce-producten? Lijkt een simpele vraag, maar het antwoord kan tegenvallen. In het bijzonder:
- Toegang tot alle velden? Hoe krijg ik toegang tot alle velden? Dus zowel de product display (pd)-velden als de product (pr & pt)-velden?
- Toegang tot reference entity-velden? In het bijzonder: Hoe krijg ik toegang tot reference entity-velden die vanaf een Drupal Commerce-producttype verwijzen naar een andere entiteit?
- Puzzel tav. reference entity-velden: In de zomer 2016 worstelde ik met een Drupal Commmerce-pt dat een verwijzing bevatte naar een entiteit van het type tool, dat ik maar niet aan de praat kreeg. Wat bleek: De relatie had ik bidirectioneel gedefineerd. Dus beide entiteiten bevatten een veld naar de ander, maar ik had slechts op één plek dat veld van waarden voorzien.
Views direct gebaseerd op producten
Je kunt een view rechtstreeks baseren op het achterliggende producttype. Fantastisch simpel, omdat je daarmee displays compleet kunt overslaan. Helaas: In de praktijk heb je displays al snel nodig, omdat bepaalde functionaliteiten alleen van toepassing is op displays, en niet op producten (bv. SEF-URL's)
Bronentiteit (source entity)
Bij het aanmaken van een nieuwe view moet je bepalen wat de bron van de view wordt. Ik noem dat veld bronentiteit of source entity
De bronentiteit vind je terug in de header van de code die je via Export genereert. Het illustreert dat dit een allesbepalende keuze betreft:
$view = new view(); $view->name = 'test2'; $view->description = ''; $view->tag = 'default'; $view->base_table = 'node'; ← Bronentiteit $view->human_name = 'test2'; $view->core = 7; $view->api_version = '3.0'; $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
$view = new view(); $view->name = 'test3'; $view->description = ''; $view->tag = 'default'; $view->base_table = 'commerce_product'; ← Bronentiteit $view->human_name = 'test3'; $view->core = 7; $view->api_version = '3.0'; $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
Sub-bronentiteit (sub source entity)
Vervolgens moet je de sub-bronentiteit (sub source entity) bepalen. Da's minder schokkend, want die kun je naderhand aanpassen.
De keuze vind je terug in de code onder Master » Content: Type. Bv.:
/* Filter criterion: Content: Type */ $handler->display->display_options['filters']['type']['id'] = 'type'; $handler->display->display_options['filters']['type']['table'] = 'node'; $handler->display->display_options['filters']['type']['field'] = 'type'; $handler->display->display_options['filters']['type']['value'] = array('product_display' => 'product_display', ← Sub-bronentiteit
Dezelfde view, maar nu met aangepaste instellingen onder Filter criteria:
/* Filter criterion: Content: Type */ $handler->display->display_options['filters']['type']['id'] = 'type'; $handler->display->display_options['filters']['type']['table'] = 'node'; $handler->display->display_options['filters']['type']['field'] = 'type'; $handler->display->display_options['filters']['type']['value'] = array( 'all' => 'all', 'article' => 'article', 'page' => 'page', 'product_display' => 'product_display', 'tool' => 'tool', );
Diverse combinaties van instellingen
Bronentiteit: Commerce Products
Zoals je kunt zien in het overzicht van de diverse varianten: Commerce Products lijkt het meest kansrijk als bronentiteit. Dat wordt verder aangehouden, tenzij anders vermeld.
Subbronentiteit: Display Suite fields
Geen idee hoe dat werkt.
Subbronentiteit: Fields
Dit lijkt de juiste optie te zijn om toegang te krijgen tot alle velden, inclusief entity reference fields. Alleen blijven de entity reference fields leeg.
Entity reference: Details
Bidirectionele relatie? Dan op twee plekken vullen!
Wat de eerder genoemde puzzel betreft tav. entity reference: Producten en bepaalde andere nodes zijn bidrectioneel gelinkt. Dan moet je in beide objecten de betreffende velden vullen! Dat had ik over het hoofd gezien.
Dit kan op p1-niveau
Indien een entity reference-veld is gedefineerd op p1-niveau, kan deze prima worden verwerkt in views. Wat views betreft, is er geen reden om dit op p2-niveau te doen.
Entity reference: Voorbeeld
Voorbeeld van een site waarop dit werkt. Header van de view, gebaseerd op nodes. Deze nodes betreffen overigens géén Drupal Commerce-producten:
$view = new view(); $view->name = 'clone_of_taxonomy_term'; $view->description = 'A clone of the view drupal\'s taxonomy term emulation pages'; $view->tag = 'default'; $view->base_table = 'node'; ← Deze view is gebaseerd op nodes $view->human_name = 'Cb - Powertools Taxonomy term'; $view->core = 7; $view->api_version = '3.0'; $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
Het betreffende referenced field. Dit veld is gedefineerd op node-niveau en niet op pt-niveau, want het betreft geen product:
/* Field: Content: Cb to use */ $handler->display->display_options['fields']['field_powertool_cb']['id'] = 'field_powertool_cb'; $handler->display->display_options['fields']['field_powertool_cb']['table'] = 'field_data_field_powertool_cb'; $handler->display->display_options['fields']['field_powertool_cb']['field'] = 'field_powertool_cb'; $handler->display->display_options['fields']['field_powertool_cb']['type'] = 'entityreference_entity_view'; $handler->display->display_options['fields']['field_powertool_cb']['settings'] = array( 'view_mode' => 'cb_teaser_in_pt_view', 'links' => 1, );
Zie ook
Bronnen
- https://drupalcommerce.org/user-guide/setting-product-catalog
- https://www.drupal.org/node/1841004 - Display a parent node and a view of child nodes that reference it (via Entity Reference, View Relationship, and View Contextual Filter)