Visa delar av innehållet av en Content Type i en View baserat på del av path

Events happening in the community are now at Drupal community events on www.drupal.org.
coldert's picture

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] ?

Comments

ConTemplate ftw

chosig's picture

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

--
Hjälper gärna (pro bono) de som vill lära sig Drupal (fast jag är inte i "Drupal Nirvana" än), vill någon ha professionell hjälp har jag ett företag också.

Om du väljer att visa noder

tobiassjosten's picture

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...

coldert's picture

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

tobiassjosten's picture

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/overview du vill skapa så kan du hämta ut x2000 ur 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ör node/%/overview men då matchar du det mot noders nid istället.


Tobias Sjösten | NodeOne

Nja, inte riktigt..

coldert's picture

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?

dixon_'s picture

@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:

  • Visa -- som är standard (node/%)
  • Overview (node/%/overview)
  • Specification (node/%/specification)
  • Sights (node/%/sights)

% 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

coldert's picture

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

nadam's picture

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?

Menu settings: tab

Itangalo's picture

För att få fram flikar behövs en speciell menyinställning i Views. Jag är rätt säker på att den heter Tab, men det lär vara tydligt när man ser inställningen. Kolla in menyinställningarna för displaytypen Page i Views.

Att lägga till nya flikar är rätt enkelt om det redan finns flikar på en sida. Annars blir man tvungen att skapa en defaultflik, som ska vara vald när "modersidan" visas. Den ska gärna se ut exakt som modersidan, och dessutom måste sökvägar matcha på lite finurliga sätt. Lite lurigt är det, men inte omöjligt. (Säg till om mer vägledning behövs.)

Och lycka till!
//Johan Falk

En annan sida av problemet

coldert's picture

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.