Detta är en CCK-nöt jag inte lyckats knäcka än. Kanske nån har en idé?
Det finns lägen när man vill att en nod ska visas olika, beroende på värdet i vissa av dess fält. T.ex., anta att man har en "kritisk"-flagga i en typ. Om skribenten sätter denna flagga ska beskrivningen visas med röd text.
En lösning jag har funderat på vore om det fanns ett CCK-fält som genererar en CSS-klass för vår nod. Alltså, t.ex. om värdet på "kritisk" är "ja", så sätts "class=critical" på hela nod-wrappern. Finns det? Annars kanske man kan skriva en custom template-fil, men det känns lite mindre generellt.
En utökning av problemet vore att flaggan styr om man ska visa en stor eller en liten bild, dvs låta data styra vilken ImageCache preset som ska användas för en viss nod. Här har jag inte så många idéer alls...
/Dag
Comments
Olika ImageCache presets som
Olika ImageCache-presets som beror på andra CCK-fält är fullt möjligt!
Det sättet som jag skulle rekommendera är att göra allt utan egen och kod med lite Views- och Views Attach-magi. Enkelt förklarat så har du en bifogad vy per preset du vill ha. Sedan bifogar du dom olika vyerna till den aktuella noden. Vad dom här vyerna sedan gör det är att dom listar precis samma nod som vyn är bifogad till. Men den listar bara noden i den vyn där alla kriterier möts. Låt säga att du valt bildstil "stor" i ett CCK-fält och laddat upp bilden i ett annat CCK-fält. Då kommer noden bara visas i den bifogade vyn där du har filtreringskriteriet "stor". Denna bifogade vyn är då även inställd att visa bilden med preset "stor".
Hängde du med? Kolla som sagt på Views Attach och klura ut hur du löser det. Har du frågor är det bara återkomma här i forumet!
Ett annat alternativ som är enklare, men inte alls lika snyggt och ballt (hehe) är att gömma det bildfältet med CCK's iställningar (admin/content/types/mytype/display) och sedan placera lite enkel logik i hook_preprocess_node() där du skapar bilden med hjälp av det "dolda" bildfältet och temafunktionen
theme('imagecache', $preset, $path, ...). Men denna lösningen är inte att rekommendera, eftersom man kan göra det utan kod i Drupal :)Två sätt att skapa CSS-klass
Om du vill använda ett CCK-fält för att styra en CSS-klass finns det säkert hundra sätt att genomföra det på. Alla kräver förmodligen lite kodande. Här är två som kan vara användbara.
1: Hämta CCK-informationen direkt i mallfilen
Detta är inte det korrekta sättet att sköta saker på, men det fungerar åtmistone på kort sikt. I node.tpl.php (eller i de flesta tpl-filer du kan hitta) går det att plocka fram data ur $node-objektet för att använda till villkor. Kombinerat med en print-rad kan du lägga in de klasser du vill i listan över CSS-klasser som används för lämpligt element på sidan.
Typ såhär:
<?PHPif ($node->field_fieldname[0]['value'] == "critical") {
print " critical"; // Leave a space in front to combine well with other listed classes
}
?>
2: Skriv en snygg Preprocess-funktion
Nackdelen med approachen ovan är att du låter mallfilen sköta villkor som egentligen borde skötas på en annan plats. (Om mallfilen laddas många gånger, exempelvis i en lista, kan man få prestandaeffekter som inte är jättekul.)
Allt utom den allra enklaste logiken borde plockas bort ur mallfiler, och istället läggas i template.php som en preprocess-funktion.
Om ditt tema inte redan har en template.php får du skapa en sån, och se till att den inleds med "<?PHP".
Nånstans i filen kan du skapa en preprocess-funktion för att göra en variabel tillgänglig i mallfilerna:
temanamn_preprocess (&$vars) {$result = "not-critical"; // Set default value for CSS class
if ($node->field_fieldname[0]['value'] == "critical") {
$result = "critical";
}
$vars['critical_flag'] = $result;
}
Detta ska göra variabeln $critical_flag tillgänglig i dina mallfiler och ge den värdet "not-critical" eller "critical", beroende på värdet i fältet field_fieldname. Sen är det bara att lägga in en <?PHP print $critical_flag; ?> på lämpligt ställe i mallfilen.
Vill du att variabeln endast ska vara tillgänglig i utvalda mallfiler kan du ändra namnet på funktionen från temanamn_preprocess till temanamn_preprocess_mallfilens_namn.
Observera
Observera att du inte vill mata ut värdet $node->field_fieldname[0]['value'] direkt på webbsidan. Fältet kan innehålla all möjlig elak kod som en användare matat in. Om du vill köra en
printdirekt på innehållet i fältet borde det vara $node->field_critical[0]['safe'] som ska matas ut – där eventuell fulkod oskadliggjorts.Det här är ungefär så komplicerad Drupalprogrammering jag någonsin gjort, så det är möjligt att det smugit sig in ett fel eller två. Men jag hoppas och tror att det stämmer, och att det hjälper på vägen.
Lycka till!
//Johan Falk, NodeOne
**
Vill du lära dig mer om Drupal? Kolla in samlingen av tips och guider!
Har du en fråga om Drupal? Missa inte FAQ-sidan på forumet!
Kolla in min senaste guide: Hundra småsteg för att självlära sig Drupal 6
Nice :)
tufft, jag ska prova dessa lösningar när jag väl kommer så långt! Det ligger inte riktigt på topp i priolistan just nu! :)
/Dag
www.meraleramtb.com
www.ml12h.com