Views & Drupal Commerce-producten: verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 141: Regel 141:
 
);
 
);
 
</pre>
 
</pre>
 +
 +
{|
 +
|[[file:20160611-1454.png|thumb|570px|Weergave-opties van het ''referenced field'': ''Rendered entity'' met bijpassende ''view mode'']]
 +
|}
  
 
== Bronnen ==
 
== Bronnen ==
  
 
* https://drupalcommerce.org/user-guide/setting-product-catalog
 
* https://drupalcommerce.org/user-guide/setting-product-catalog

Versie van 11 jun 2016 12:55

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 producttype (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?
  • Casus zomer 2016: In de zomer 2016 worstelde ik met een Drupal Commmerce-pt dat een verwijzing bevatte naar een entiteit van het type tool. Het betreffende veld heette pt_tool_reference

Views direct gebaseerd op producttypes (pt's)

Om te beginnen: Je kunt een view rechtstreeks baseren op het achterliggende producttype. Da's handig bij testen, maar in de praktijk wellicht van beperkte waarde, omdat sommige functionaliteiten alleen beschikbaar zijn voor de nodes oftewel displays, bovenop de producttypes (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

Bronentiteit (source entity): Gelijk een cruciale keuze bij het aanmaken van een nieuwe view Wordt het Content of Drupal Commerce, of iets heel anders? De truuk is, dat je dit later niet kunt aanpassen, en dat je deze instelling ook niet terugziet in het gebruikelijke View-scherm

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.

Sub-bronentiteit Deze keuze kun je later 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

Show: Content + Fields Als je Show: Content hebt gekozen, kun je niet direct losse producttype-velden selecteren. Het kan wel indirect, door display te kiezen en in die display de juiste velden neer te zetten
Show: Commerce products + Display Suite Fields Toegang tot alle individuele velden, ook die van het achterliggende producttype, vermits ze voorkomen in een Display View of zoiets
Show: Commerce products + Fields Toegang tot alle individuele velden, ook die van het achterliggende producttype
Show: Commerce products + Rendered Entity Geen toegang tot individuele velden
Show: Content + Relationship: En nu een hele andere aanpak: Een view gebaseerd op Content, maar nu het relatieveld toegevoegd dat de display verbindt met de achterliggende producttype. Nu heb je wel de beschikking over alle velden. Zie [1] voor details

De opties bij elkaar:

Aanmaak view: Weergave Aanmaak view: Weergavetype Format: Show Format: Opties Evaluatie
Content Product-display Teaser ? Geen directe toegang tot velden. Ik weet niet waar 'Teaser' naar verwijst
Content

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: 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,
);
Weergave-opties van het referenced field: Rendered entity met bijpassende view mode

Bronnen