Visa delar av innehållet av en Content Type i en View baserat på del av path
Jag har en Content Type (Product Group) som innehåller en väldig massa fält, grupperade i olika sektioner, ex. Overview, Specifications, Sights and sounds, Opinions.
Jag har en view som ska visa denna information beroende på path.
Ex.:
/products/minprodukt/overview
Ska visa fälten overview_image, overview_description och overview_at_a_glance.
I nuläget så har jag en lösning med en switch-sats i template.php, theme_preprocess_node som sätter variabler som jag sedan använder i node-product_group.tpl.php. Switch-satsen jobbar utifrån värdet i $_GET['section'].
Ok, det här funkar, men det känns väldigt o-Drupal :) Och för att göra ändringar i vilken info som visas eller hur den presenteras så måste man in och fixa i PHP-kod, vilket väl borde hållas till ett minimum om man utvecklar i Drupal.
Finns det nåt sätt att skapa displayer i view:n som triggas vid products/[produkt]/[sektion] ?


Ical feed
ConTemplate ftw
Jag kan varmt rekommendera Content Template (contemplate) modulen för att göra sådant, om inte annat kan man använder modulens UI för att hitta de variabler/arrays som man vill ha med.
http://drupal.org/project/contemplate
Om du väljer att visa noder
Om du väljer att visa noder som display för din vy så kommer följande ske:
1) Views bygger upp en SQL-fråga, "ge mig alla produktgruppsnoder", som skickas till databasen.
2) Views får tillbaka en lista med noder och dess ID (nid).
3) node_load() anropas för varje enskilt nid, vilket i sin tur ställer en ny SQL-fråga för varje nod som ska visas.
4) CCK ser att en nod laddas (för varje nod) och skickar därför en egen SQL-fråga för att hämta data till nod-objektet.
5) theme_preprocess-node() kastar bort 90% av datan.
Databaser är mycket arbetsskygga varelser som det är bäst att inte stöta sig med.
Därför skulle jag istället rekommendera att du i samma vy lägger till flera olika page-displayer, en för varje avdelning och med sin egen path. Sedan byter du till att istället använda fält (fields) som display och lägger därefter till de fält du vill visa för aktuell avdelning. Du får inte lika mycket klart i fråga om temning (eftersom du inte kan freerida på nodvisningen) men det är en enkel match och utbytet är att du får en mycket smidigare och "Drupalig" lösning.
Hoppas det hjälper!
Tobias Sjösten | NodeOne
PS. Jag har en magkänsla av att det går att optimera din lösning ännu mer men det lämnar vi till en annan tråd. :) DS.
Det där med Path...
Jag har testat det där tidigare, men testade igen för säkerhets skull. Problemet är att den lösningen inte verkar funka med mina path alias. Jag vill ju att "products/x2000/overview" ska ge samma resultat som "node/66/overview", och det gör det inte i nuläget.
Om jag gissar rätt är
Om jag gissar rätt är x2000 alltså titeln på noden med nid 66?
I så fall kan du fortfarande köra med receptet jag föreslog. Dock behöver du utöver det antingen skapa en page-display till, eller lägga till funktionalitet för att automagiskt skapa alias så att du får två identiska sidor.
Jag skulle föreslå det första - en till page-display. Om det är
products/x2000/overviewdu vill skapa så kan du hämta utx2000ur URL:en med hjälp av ett argument och matcha det mot noders titel. Resultatet blir att endast den nod med titel <emx2000 visas. Samma sak gäller förnode/%/overviewmen då matchar du det mot noders nid istället.Tobias Sjösten | NodeOne
Nja, inte riktigt..
x2000 är pathen. Ett konkret exempel skulle kunna vara en node med titlen "Superdrum X2000 PT" som får pathen "node/66" och ett alias "products/superdrum-x2000-pt".
Eventuellt så kan problemet ligga i att path-aliaset som jag vill använda är "products/produkten", alltså "products" ingår i aliaset. Är det ett problem?
Tabbar kanske?
@chosig Tror inte Contemplate är lösningen för detta problem. Faktum är att jag sällan finner användning av Contemplate...
Ett sätt du kan lösa det på är att arrangerar informationen i tabbar som visas på varje nod. Besökarna kommer alltså att se fyra olika tabbar när dom tittar på en nod:
% motsvarar det nod ID som du tittar på.
Dom tre sista tabbarna kommer att fundera som vanliga vyer som visar relevant information för varje flik.
Allt detta åstadkommer du genom att skapa 3 page displays (overview, specification, sights) i en vy. Dessa page displays ska ha URL:en exakt formaterad som ovan (med %). Efter detta lägger du till argumentet "Node: Nid" till din vy. Vad detta gör är att den begränsar vyn till just det nod ID som förekommer i URL:en. Du kan nu formatera dina page displays precis som du vill. Och allt arrangeras snyggt som tabbar för din nod.
Det var lite kortfattat hur det fungerar. Hoppas du hänger med på vad jag försöker säga :)
Det känns som att den
Det känns som att den lösningen lider av samma problem (för mig) som Tobias tips ovan. Jag vet inte riktigt vad du menar med "tabbar". Är det nåt Drupal-specifikt (modul) eller menar du att jag ska dumpa allt innehåll och sen skapa tabbar med jQuery eller nåt sånt? Helst så ska ju uppdelningen fungera även utan javascript.
Får inga tabbar
Jag uppfattade det som att tabbarna ska komma automatiskt när man konfigurerar på detta sätt, men de dyker inte upp. Är det något mer som behövs?
En annan sida av problemet
Tack för all hjälp! Det är tydligt att det finns (alldeles för?) många sätt att hantera problem i Drupal :)
Jag funderar på att lösa det här med hjälp av block istället, alltså skapa en block-view för varje sektion (eventuellt även delar av sektioner) och sedan helt enkelt skapa de block som behövs och sätta att de bara ska visas på ex. products/*/overview. Nackdelen är väl att det blir väldigt många block, men det kanske inte är så farligt..
Ett helt annat problem jag har är att jag vill kunna lägga till egendefinierade sektioner till produkterna. Det finns ett antal fält som är gemensamma för (nästan) alla produkter: Overview, Specifications, FAQ, Opinions m.fl. Men det finns även produktspecifika delar, t.ex så har synthar information ("keyboard info") som inte trummaskiner har och vice versa.
Finns det nåt bra sätt att lösa det utan att behöva lägga till alla tänkbara alternativ? Det kan bli väldigt många slaskfält om det dyker upp många avvikande sektioner.
Jag är ju helt ny här i gruppen, så säg gärna till om det här är något jag bör skapa en egen tråd för.
Anledningen till att jag ändå vill vädra även detta problem i den här tråden är att jag ju kommer att behöva skapa menyn där dessa "avvikelser" skall finnas dynamiskt beroende på om ett fält är ifyllt eller inte, alternativt om ett fält med TITELN "About the keyboard" finns eller inte. Jag måste ju även skapa eller hantera de block som skall visa informationen dynamiskt vilket går hand i hand med min tidigare fråga.