CCK - skapa en select-list som uppdaterar innehållet i sig beroende på vilket val som gjorts i en föregående select-list. möjligt/omöjligt?

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

Hejsan,

Jag finslipar just nu på en band-site; det enda som saknas är lyrics-delen, där bandet skall kunna lägga knyta texter till deras låtar. Jag har sedan tidigare en custom content type vid namn discography där man kan lägga till en skiva med namn, utgivningsår etc. Avslutningsvis kan man via ett text-fält lägga till låtnamnen ('number of values' är satt till unlimited, så man lägger enkelt till rader till rätt antal låtar.).

För Lyrics-content typen har jag nu skapat en select-list som via en php-truddelutt (enligt denna modell) i 'allowed values' hämtar ut alla namnen på skivorna som är tillagda. Det jag vill nu är att när jag väljer en viss skiva i listan så skall en select list som ligger under befolkas med de låtar som är knytna till den releasen, så att man sedan kan skriva in texten för den låten. Jag har tittat lite på Conditional Fields-modulen, men den innebär att jag måste skapa ett nytt fält för varje skiva, vilket inte är en godtagbar lösning (lösningen måste fortsätta fungera även med skivor som läggs till i framtiden.). Är det möjligt att göra någon typ av dynamisk lösning som hämtar låtlistan från den skiva som väljs i föregående select list?

I ett taffligt försök att illustrera slängde jag ihop följande:
Only local images are allowed.

  • Alltså, i den första select listan väljer användaren vilken skiva han/hon vill lägga till en låt till (skivorna har sedan tidigare skapats som en annan content type; listan hämtar bara ut titeln på dessa noder).
  • När skiva har valts skall den undre select-listen lista de låtar som finns tillagda för vald skiva (dessa låtar sparas idag som text fields i respektive "skiv-nod")

Frågan är alltså; tror ni att detta möjligt att få ihop? Och om inte; är det någon som har något bra förslag på hur man skulle kunna lösa det?

Tacksam för svar,

Mvh

/E

Comments

Låt som nodtyp istället för lyrics?

fabsor's picture

För mig låter det mer logiskt att göra låtar som nodtyper istället. En låt har ju nämligen bara en låttext (vanligen), och en låt skulle i så fall kunna förekomma på flera skivor. Man skulle därefter kunna använda nodreferens-fält till olika plattor för att lösa hela alltet skulle jag tro. Ta dig en titt på modulen Node relationships som ger dig trevliga verktyg för att hantera nodreferenser.

I mina ögon skulle det ur ett databasdesignperspektiv vara en snyggare lösning, annars identifieras en lyric av en textsträng som är låtnamnet, vilket låter i allmänhet obehagligt =)

//Fabian Sörqvist

Hej Fabian, Jag kikade lite

epavletic's picture

Hej Fabian,
Jag kikade lite närmare på Node Relationships-modulen, och har fått till det någolunda. Jag har efter dina rekommendationer tänkt om vad gäller låtarna; det är helt klart mer logiskt att skapa dom som en egen nodtyp, så att de kan refereras till flera skivor. Mitt sista hinder att ta mig över är nu ett rent presentativt sådant:

Som lösningen ser ut nu skapar användaren först en ny låt-nod för varje låt, där han skriver in namn och text(/lyrik). När han sedan skapar en nod av typen skiva listar han (med hjälp av Node Relationships) de låtar som finns med på skivan (han gör det i den ordning de ligger på skivan). Nu till mitt problem:

Only local images are allowed.

När jag ska presentera själva skivan på sidan vill jag att låtnamnen skall ligga i en numrerad lista såsom det övre exemplet i bilden här över. Här har jag i php'n en enkel kodsnutt som loopar igenom de text-fält där namnen på låtarna ligger sparade:

<ol>
   <?php
     
foreach($node->field_songs as $songs)
       {
          print
"<li>" . $songs['value'] . "</li>";
        }
 
?>

</ol>

Notera att detta är den gamla lösningen med text-fält som låtnamn. Nu, det är enkelt att göra det som ovan, eftersom jag kommer åt namnen på låtarna med hjälp av Devel. Det luriga (som jag ser det) är att med den nya lösningen (som visas under på bilden ovan) så får jag inget att jobba med. Det enda jag får är en array likt den ovan, men den innehåller endast node id't till den sång-nod jag angett. Länk och rubrik bygger sedan Drupal själv ihop i $content och spottar ur det, utan en möjlighet för mig att styra HUR det skall spottas ut. (det övre exemplet är alltså ihopsnickrat av mig, det under är i princip <?php print $content; ?> )

Det jag försöker få fram är: Hur får jag Drupal att lista mina Node Relationsships i en numrerad lista, så att det blir uppenbart att det är en låtlista man tittar på?

Stort tack för att du tar dig tid att hjälpa mig!

// Erik

Finns lite olika sätt...

fabsor's picture

Först det "hackiga" sättet:

Gör som du gjorde innan, men använd funktionen "_nodereference_titles" för att få fram titeln. Det är den funktionen nodereference använder internt. Det blir alltså nåt sånt här (förutsatt att field_songs är det fält som innehåller nidarna):

<?php
     
foreach($node->field_songs as $songs)
       {
          print
"<li>" . _nodereference_titles($songs['nid']) . "</li>";
        }
?>

Notera att jag inte testat det, så du får säkert fixa nåt litet, men det är principen iaf. Lägg även märke till _-tecknet innan nodereference som antyder att den borde vara privat. Dock används denna funktion även i theme-funktionen för field formattern, så jag ifrågasätter varför den skulle vara privat egentligen.

Det lite mindre hackiga sättet

Gör en regelrätt field formatter för det hela. Detta kan du göra genom att implementera hooken hook_field_formatter_info och skriva en egen theme-funktion för hur outputen ska se ut. Använder du detta alternativ kan koden återanvändas. Den här approachen är nog den jobbigaste att genomföra, särskilt om man inte är van vid att arbeta med CCK-apit.

The drupal way (utan egen kod =)

Skapa en view som gör en lista av alla nodreferenser för en nod. Använd sedan modulen views attach för att lägga till denna view som innehåll i noden. Använder du den här metoden kan du ändra på viewn vid behov och du får inte någon extra kod att underhålla.

Tips: Om du redan använder t.ex. Panels kan du göra detsamma utan views attach, som ibland kan vara lite bråkig att jobba med.

Nackdelen med den här approachen är att den eventuellt lägger på onödig komplexitet (fler moduler) till din site. Helt plötsligt måste du baka in en view i din nod, eller använda panels. Om du har en liten site så tror jag dock inte att det är någon större fara, och jag tror att det här är den bästa approachen i återanvändningssynpunkt. Det blir också enklast för andra som vill sätta sig in i hur din site fungerar.

//Fabian Sörqvist

Tackar!

epavletic's picture

Fabian, du är en klippa. Tre sätt att potentiellt lösa samma problem, så att jag kan kika närmare på det och förstå bättre hur saker och ting fungerar. Stort tack!

(testade den första varianten, och fick det att fungera så på ett eller annat sätt kommer det lösa sig.)

Bara en liten fråga till ;)

Node Relationships vill ju ha jQuery UI-modulen för att lira, så jag installerade den med (dvs lade upp modulen samt laddade ned senaste dev package't från code.google.com såsom det står beskrivet i readme-filen). Allt funkar och så, enda kruxet att det verkar bli nån krock med Date Popup-modulen jag använder för att få användarvänliga date-pickers på fält där datum skall anges. de ser numera ut såhär:

Only local images are allowed.
Förutom att det ser kackigt ut så går det inte länge att snabbt välja månad/år utan man måste tokbläddra mellan månaderna om man skall hoppa långt. Är detta något du känner igen som det finns en smidig lösning för?

Mvh,

// Erik

Konstigt...

fabsor's picture

Enligt date-projektets hemsida är det snarare rekommenderat att använda jquery UI-modulen. Såhär står det på projektsidan:

"The Calendar/Date Popups use the jQuery UI datepicker. A version of that is included with the Date Popup module, but you are strongly encouraged to use the jQuery UI module instead. If the jQuery UI module is installed, the Date Popup will use the datepicker from that module, which is likely to be more current. If you are having any problems with Popups and you are not already using jQuery UI, please do that as a first step before reporting problems."

Prova som vanligt med att cleara alla caches, och se om det är nåt sånt som förorsakar problemet. Jag tittade runt lite och det verkar var fler som har liknande problem, t.ex. i den här issuen. Du kan prova att använda någon av filerna som folk har laddat upp i issue-kön och se om de löser problemet, jag har dock aldrig haft det själv. Du kan även undersöka om det är möjligt att "nedgradera" jquery och jquery UI till en tidigare version.

//Fabian Sörqvist

Tack för issue-länken!

epavletic's picture

Tack för issue-länken! Testade med #3 och det gjorde susen; en css-fil som inte hängde med i alla uppdateringar hit och dit tydligen.

Vad gäller Back references; finns det någon liknande _nodereference_titles($songs['nid']) att använda i lyrics-templaten för att visa vilka skivor som en låt finns med på?
Jag har kikat lite på den view man kan lägga under Back references settings (som en Page då) men får endast en ful view underst på sidan där relationerna listas. Vore trevligare om man kunde peta in relationerna lite där man ville i templaten.

Sweden

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: