Detta är ett bonusavsnitt i guiden Sju steg mot svart bälte i att tema Drupal 6.
Den som arbetar med att tema Drupal viss förmodligen förr eller senare ändra på hur formulär i Drupal ser ut. Till viss del görs detta på samma vis som all annan theming – exempelvis när det gäller CSS. Men till stor del byggs (X)HTML-innehållet i formulär inte upp med hjälp av tippelfippar och temafunktioner, och följaktligen måste man arbeta på ett annorlunda sätt när man vill ändra i dem.
Detta är ett kort avsnitt som berättar hur man kan gå tillväga för att ändra formulär i Drupal. Avsnittet bygger i stort på kapitel 9 i boken Drupal 6 Themes.
Formulärets id
För att påverka formulär i Drupal är det mycket praktiskt att känna till formulärets id. Alla formulär på en Drupalsajt har ett id, och lättast hittar man det genom att besöka sidan som visar formuläret och leta i källkoden. Mot slutet av formuläret ska det finnas ett input-element av typen hidden och med namnet form_id. I value-fältet för elementet står formulärets id, som brukar vara av formen user_login_block.
Den som hellre letar i källkoden har stor chans att hitta formulärets id i funktionen som bygger formuläret (så som user_login_block()).
Formulärets array
En annan viktig sak att känna till med formulär man vill ändra är den array som bygger upp formuläret. I arrayen finns all information för elementen i formuläret – typ av element, namn, innehåll, med mera. För att ändra formuläret behöver man i många lägen ändra på formulärets array.
Det lättaste sättet att hitta arrayen är förmodligen gå till sidan där formuläret visas och med hjälp av Theme Developer läsa bland de arrayelement och värden som användes för att bygga upp formuläret.
En annan metod är att använda PHP-funktionen print_r för att skriva ut hela arrayen. Om du föredrar det kan du använda kodsnutten här nedan, under använd temafunktioner.
Fyra sätt att ändra i formulär
Vanliga temametoder
En hel del går att åstadkomma genom att använda CSS och/eller redigera de tippelfippar som ibland är används för att mata ut de färdiga formulären.
Använd temafunktioner
Vill man ändra inuti formuläret blir man tvungen att gå in och mecka i den array som Drupal använder för att bygga upp formuläret. Det är inte skitenkelt, men inte heller skitsvårt. För att lyckas behöver vi dels bygga en funktion som ändrar på arrayens innehåll, dels säga åt Drupal att funktionen finns och bör anropas.
Ett sätt att genomföra detta på är att lägga in följande två funktioner i template.php:
// Säg åt Drupal att en ny temafunktion finns tillgänglig
function temanamn_theme() { // Byt ut temanamn mot temats namn
return array (
'form_id' => array( // Byt ut form_id mot formulärets id
'arguments' => array('form' => NULL),
),
);
}
// Funktion för att modifiera formulärets array
function temanamn_form_id($form) { //Byt ut temanamn och form_id
// Lägg till dina ändringar här!
// print_r($form); // Skriver ut formulärets array
$output .= drupal_render($form);
return $output;
}Bygg en minimodul
Ett effektivt, men kanske något omständligt sätt att ändra formulär är att bygga en minimodul för ändamålet. Modulen bör, som alla andra custom-moduler, läggas som en underkatalog till sites/all/modules (och alltså inte till rotkatalogen modules).
I katalogen behöver du ha två filer. Dels en .info-fil, som berättar för Drupal att katalogen innehåller en modul för rätt Drupalversion, dels en fil som innehåller modulkoden. Namnet på modulens underkatalog bestämmer namnet på .info-filen och .module-filen.
.info-filen bör innehålla följande:
;$id$
name = Ändring av formulär
description = Ändrar utvalda formulär på sajten
package = other
core = 6.x.module-filen bör innehålla följande:
<?php
//$id$
/**
*
* Ändrar i utvalda formulär på sajten.
*
*/
function formmod_form_alter(&$form, $form_state, $form_id) {
// Ändra villkor och kod som du önskar.
If ($form_id == 'user_login_block') {
$form['submit']['#value'] = t('Logga in mig!');
}
}Observera funktionen t() som omsluter texten i formuläret. Den används för att kunna dra nytta av Drupals funktioner för översättningar.
Använd fiffiga genvägar
Många av de ändringar som man vill göra i formulär är sådana som andra velat göra tidigare, och det redan finns snabba lösningar för. Här är två–tre exempel:
- Om du vill dölja valda element i ett formulär (så som loggfältet när man redigerar noder) rekommenderas modulen Formfilter (http://drupal.org/project/formfilter).
- Om du vill ändra ordning på eller beskrivning av utvalda fält kan modulen Form Defaults (http://drupal.org/project/formdefaults) vara en bra lösning. (Detta är dock en rekommendation som jag gör utan att ha testat modulen själv!)
- Om du har en sajt på svenska är ett annat alternativ att utnyttja Drupals funktioner för översättningar för att ge fältet ett annat namn – men det ändrar samtidigt alla ställen där exakt samma textsträng förekommer. Översättning förutsätter att du har Locale-modulen aktiverad, och du genomför översättningen på administrera > uppbyggnad > översätt gränssnitt > sök.

Comments
Hej! är en färsk drupalista
Hej!
är en färsk drupalista (knappt en månad).
testar följande custom modul, enligt dina instruktioner:
function formmod_form_alter(&$form, $form_state, $form_id) { $result=db_query('SELECT body from {node_revisions} where nid=%d',4); //terms and conditions are fetched from database if ($form_id == 'user_login_block') { return print_r($form); $form['submit']['#value'] = t('Logga in mig!'); $form['account']['name']['#value'] = t('Namn'); } // This part changes the user login form if ($form_id == 'user_login') { // Change the text below the username field to 'Enter your username.' $form['name']['#description'] = t('Ange anv.namnet.'); $form['name']['#title'] = t('Anv.namn'); // Change the text on the submit button to 'enter' $form['submit']['#value'] = t('Login!'); } }user_login formen ändras som förväntad men inte user_login_block! har rensad cachen, kört cron, rubbet.
acquia drupal lokal installation - 6.14.
Hjälp!!!
/dmitri
return print_r?
Du har en lite oväntad return-sats överst i din funktion. Jag gissar att det är något du lagt dit tillfälligt för att se vilka variabler du har tillgängliga.
Annars vet jag inte riktigt vad som blir fel. Ett par hypoteser:
* Har du verkligen rätt form_id? (Får du ut en print_r från funktionen ovan?)
* Är det kanske någon annan funktion som ändrar i formuläret efter att du ändrat i det? (Testa att lägga till $form['test'] eller annan dummy-variabel, för att se om du får någon effekt alls.)
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
när jag tog bort return print_r
allt funkade finfint då. Är det nåt internt med hur Drupal hanterar debuguskrifter? :)
Tack för ett snabbt svar.
Return
Det var PHP och inte Drupal som var boven denna gång.
Satsen
returnavbryter den funktion som körs för tillfället och returnerar det värde som följer efter satsen -- koden under return-raden fick helt enkelt inte tillfälle att köras.//Johan Falk