Best practice vid hämtning av specifikt fält från en content type i node.tpl.php (D7)

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

Hej!

Jag är en front-end-junkie som har lite (läs mycket) svårt att acceptera markupen som Drupal spottar ut, så därför är jag inne och pillar ganska friskt i templatefilerna för att städa upp. Jag lyckas bra, men är för ny inom Drupal för att kunna avgöra om jag gör galet.

För att uppnå mitt mål med markupen så vill jag kunna nå varje enskilt fält i resp content type. Låt säga att jag har en content type som heter "blog_entry" och ett fält som heter "field_blog_entry_text", då använder jag mig av en syntax likt följande (saxat och nerbantat):

if($type == "blog_entry") {
  print "<p>".$field_blog_entry_text["und"][0]["value"]."</p>";
}

Detta funkar alldeles utmärkt, jag kan wrappa innehållet precis som jag vill (utan 18 onödiga klasser och oändligt antal nestlade divvar) och jag kan effektivt styra hur varje content type med dess fält visas.

Frågan är dock; gör jag rätt eller finns det mer sofistikerade lösningar? Det blir ju lite kodning, men det är min hemmaplan. Dock känns sökvägen ["und"][0]["value"] lite "ful" på något sätt, vilket gör att jag blir osäker.

Någon som har några tankar kring detta?

Tack på förhand!

/Fredrik

Comments

Upptäckte ett problem

Undoredoo's picture

Upptäckte precis ett konkret problem. Det visade sig att det endast visas korrekt när man kollar direkt på noden. Jag testade att låta den listas på startsidan, och då hänger inte fältet med, dessvärre. Tolkar det som att sökvägen inte är så universal som jag hade hoppats. ["und"] står väl troligtvis för "undefined" vilket ju inte känns helt hundra.

/Fredrik

Whut?

cato's picture

I node.tpl.php har du bara tillgång till den specifika nodens fält.
Och $field_text[0]['value] är det.

Edit: Vill du ha ut fält från flera noder på t.ex. startsidan så kan du göra det genom att göra en vy (med Views) och sen kan du anpassa mallar för den vyn.

Läs gärna http://stackoverflow.com/questions/77694/how-to-quickly-theme-a-view för mer info kring hur du jobbar med att tema vyer.

Seniledit 2: Vill du veta vilka fält som finns i noden så kör print_r($node) i din nodmall.

Njaa...

Undoredoo's picture

Eftersom fältet de facto heter "blog_entry_text" och inte "text" så funkar inte $field_text. Men det är ju egentligen inte intressant, för däri låg inte problemet.

Och bara [0][value] funkar inte heller, eftersom arrayen ser ut så här:

    [field_blog_entry_text] => Array
        (
            [und] => Array
                (
                    [0] => Array
                        (
                            [value] => Text text text
                            [format] =>
                            [safe_value] => Text text text

                        )
                )
        )

Jag kan tema vyer, men i det här fallet prövade jag bara "promote to front page" och det är då någonting händer.

Oh well

cato's picture

Jag vet inte hur du har skapat dina fält men när jag kör print_r($field_text) så ser det ut så här:

Array
(
    [0] => Array
        (
            [value] => Test text test
            [safe] => Test text test
            [view] => Test text test
        )

)

Så var ditt "und" kommer ifrån är vad jag und-rar.

Intressant

Undoredoo's picture

Ett långskott kanske, men är det skillnad mellan 6:an och 7:an i det här fallet? Vilken kollar du med?

Fälten är för övrigt skapade på helt vanligt manér i en helt vanlig content type. Inga konstigheter.

Jag kör D6. Kör du 7?

cato's picture

Jag kör D6. Kör du 7?

Svar ja. Jag angav det i

Undoredoo's picture

Svar ja. Jag angav det i rubriken, men skulle nog varit tydligare med det. Det kan ju förklara varför vi får olika resultat.

Skumt

Undoredoo's picture

Ok, har nu klurat ut varför innehållet i fältet visas resp inte visas beroende på var noden visas.

Går jag direkt på noden via /node/xx så ger print_r($field_blog_entry_text):

Array
(
    [und] => Array
        (
            [0] => Array
                (
                    [value] => Text text text
                    [format] =>
                    [safe_value] => Text text text
                )
        )
)

Vid listning av samma nod på startsidan så ger print_r($field_blog_entry_text) följande:
Array
(
    [0] => Array
        (
            [value] => Text text text
            [format] =>
            [safe_value] => Text text text
        )
)

[und]-nivån (som verkar språkrelaterad) existerar alltså inte när noden listas på startsidan. Det känns ju ganska stökigt. I just det här fallet har jag egentligen inget behov av att lista detta på startsidan, men jag kommer med stor sannolikhet bråka med detta i andra sammanhang. En enkel if-sats för att kolla av om det är startsidan man är på funkar ju, men det känns inte optimalt. Måste finnas någon hemlighet bakom det här.

Alltså exakt hur listar du

cato's picture

Alltså exakt hur listar du dem på förstasidan? Iom att det är D7 (vilket jag inte såg i slutet av din rubrik) så är inte Views 100% och är det så att du listar detta med Views så kan, jag säger kan, det vara så att Views inte visar ditt fält som du har skapat det.

Sen kan jag tänka mig att den extra nivån i Arrayen kommer från D7:s inbyggda multispråkstöd vilket kanske läggs på i en senare hook. För - nu får någon gärna rätta mig om jag har fel - D7 har inbyggt att fälten kan existera i flera olika varianter på samma gång dvs en för svenska, en för norska etc.

Att fältet fungerar på det viset när du befinner dig inom kontexten av din nod beror väl isåfall på att din nod renderats och vissa hookar har applicerats - just de hookarna verkar inte köras i din listning.

I D6 kan man ju gå in och ändra på vilka fält som visas och hur de visas per content-type. Finns motsvarande i D7 så finns kanske lösningen där?

Inte views

Undoredoo's picture

Listningen på förstasidan är D7 default, och jag har ännu inte hittat var/hur den görs. Det ligger inte i temat, vad jag kan se.

Får kolla upp hur jag kan hooka bort den nivån i så fall.

Normalt skriver man inte hur

frjo's picture

Normalt skriver man inte hur råa värde från fält. Istället Låter använder man Drupal-funktioner så de körs via formaterare, text format etc.

Tänk på att Drupal endast filtrerar vid utmatning så kör åtminstone check_plain() eller liknade på värdet ifall det är användargenererat.

Läs mer här: Drupal 7 version of content_format? (drupal.org)

Förvisso, men jag står

Undoredoo's picture

Förvisso, men jag står fortfarande inför problemet med olika beteenden vad gäller sökvägen.

Och det är ju när Drupal får rendera själv som misshandeln av markupen sker, och det tänker jag aldrig finna mig i.

Om du t.ex vill styra hur ett

blackdog's picture

Om du t.ex vill styra hur ett Field skrivs ut finns det, som för det mesta i Drupal, templatefiler. All (den mesta?) markup som ett Field kommer med, kan ändras i filen field.tpl.php, som du hittar i modules/field/theme/field.tpl.php. Kopiera den till ditt tema, töm cachen, och rensa.

Det mesta går att ändra med liknande filer, eller theme-funktioner. Se: http://api.drupal.org/api/drupal/modules--system--theme.api.php/group/themeable/7.

Tänk på när du ändrar i filer och templatefunktioner att du behöver ta hänsyn till gränssnittets valmöjligheter, så du inte tar bort saker i kod som har stöd i gränssnittet.

// Hans Nilsson, Kodamera AB
www.kodamera.se

Kolla också bastemat

blackdog's picture

Kolla också bastemat Mothership, som gör en rejäl upprensning av markup och stilar.

// Hans Nilsson, Kodamera AB
www.kodamera.se

Sweden

Group notifications

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