Drupal 7 - Conditional fields. Hjälp

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

Conditional Fields för drupal 6 är fantastiskt bra och enkel. Däremot är versionen för 7:an mer komplicerad.

Möjligheten att ett fält kan vara beroende av flera fält är något jag saknar. Ett exempel.

Jag har ett select-fält som heter field_varden. Den innehåller värdena. 1,2,3 och 4.

Jag har ett fält som heter field_name. Det fältet ska synas om mitt field_varden har värdet 1 och 4. Detta fungerar i drupal 6 genom att select-fältet är av multiple-variant. (det står multiple="multiple" i select-taggen).

I Drupal 7-versionen finns inte detta, men det måste gå att tweaka på något sätt? Är det möjligt att lägga till multiple="multiple" i select-taggen och hur gör man?

Comments

Till Drupal 7 finns #states

pontus_nilsson's picture

Till Drupal 7 finns #states med i core Form API. Se denna bloggpost.

//Pontus Nilsson, Digitalist

Tack för det snabba svaret.

jocken's picture

Tack för det snabba svaret. Men jag får det inte att funka alls. Som vanligt för mig ;P

Jag försöker göra det till en modul och kör hook_form($form, &$form_state). Det ser ut såhär:

function sicf_form($form, &$form_state) {
$form['objekt-node-form'] = array(
    '#type' => 'text-field',
  '#name' => 'Passnummer',
        '#states' => array(
              'visible' => array(
              ':input[name="field_category[und]"]' => array('value' => t('Pass')),
      ),
    ),
  );

  return $form;
}

Form name är objekt-node-form. Namnet på inputfältet som ska synas är 'Passnummer' och select-fältet field_category[und] har ett val som heter Pass.

Men det är nåt som fattas? Kan man lägga detta i template.php och få det att funka?

Det var nog inte så fel det

pontus_nilsson's picture

Det var nog inte så fel det där. Detta ska ligga i en custom modul. Om det är ett befintligt formulär du ändrar på så ska du byta ut funktionen till hook_form_alter().

Value ska vara det värdet som finns i select-elementet som nyckel. Inspektera med firebug för att få reda på value. Du ska alltså inte använda t() här.

/**
* Implementation of hook form().
*/
function sicf_form($form, &$form_state) {
  $form['objekt-node-form'] = array(
      '#type' => 'text-field',
      '#name' => 'Passnummer',
      '#states' => array(
          'visible' => array(
              ':input[name="field_category[und]"]' => array('value' => 'pass'),
          ),
      ),
  );

  return $form;
}

//Pontus Nilsson, Digitalist

Händer absolut ingenting och

jocken's picture

Händer absolut ingenting och jag kör en hook form alter, då jag försöker ändra en befintlig.

function sicf_form_alter(&$form, &$form_state, $form_id) {
 
  $form['objekt-node-form'] = array(
      '#name' => 'field_passport_number[und][0][value]',
      '#states' => array(
          'visible' => array(
              ':input[name="field_category[und]"]' => array('value' => 'Pass'),
          ),
      ),
  );
 
  return $form;
}

Ingenting händer. Formuläret har bara ett id men inget name (alla inputfält har däremot name). Kan det vara det?

Eftersom formuläret redan

pontus_nilsson's picture

Eftersom formuläret redan finns så ska du inte definera någon ny array. Du vill ju bara lägga till states på ett befintligt element.

sicf måste också vara namnet på din modul.

Använd modulen devel och lägg till dpm($form); inne i funktionen för att ta reda på hur formulär arrayen ser ut i ditt fall.

function sicf_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'DITT FORMULÄR ID') {
  $form['DITT FÄLT']['#states'] => array(
    'visible' => array(
      ':input[name="field_category[und]"]' => array('value' => 'Pass'),
    ),
  );
}

  return $form;
}

//Pontus Nilsson, Digitalist

Pontus, ditt tålamod och

jocken's picture

Pontus, ditt tålamod och kunskap har lönat sig :). Stort tack! Fungerar perfekt!

Uppdatering: . Den löste inte mitt första problem kom jag på. Hur gör jag med OR eller AND. Möjligheten att ett fält ska vara synligt om jag har värdet 1 eller 2 i min selectbox?

Chansar lite men detta kanske

pontus_nilsson's picture

Chansar lite men detta kanske går
      ':input[name="field_category[und]"]' => array('value' => array('1', '2')),

function sicf_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'DITT FORMULÄR ID') {
  $form['DITT FÄLT']['#states'] => array(
    'visible' => array(
      ':input[name="field_category[und]"]' => array('value' => array('1', '2')),
    ),
  );
}

  return $form;
}

alternativt så här

function sicf_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'DITT FORMULÄR ID') {
  $form['DITT FÄLT']['#states'] => array(
    'visible' => array(
      ':input[name="field_category[und]"]' => array('value' => '1'),
      ':input[name="field_category[und]"]' => array('value' => '2'),
    ),
  );
}

  return $form;
}

//Pontus Nilsson, Digitalist

Redan provat dom. Försökte

jocken's picture

Redan provat dom. Försökte även med en switch som jag trodde skulle funka

switch($form['field_category']['und']['#options']){
case 'Bilar':

$form['DITT FÄLT']['#states'] => array(
    'visible' => array(
      ':input[name="field_category[und]"]' => array('value' => '1'),
    ),
  );

case 'Motorcyklar';

$form['DITT FÄLT']['#states'] => array(
    'visible' => array(
      ':input[name="field_category[und]"]' => array('value' => '2'),
    ),
  );

}

Har försökt leta på internet och kollat i conditional_fields-modulen, men hittar inget om OR alternativ. Borde case fungera?

Okej lyckades lösa det med

jocken's picture

Okej lyckades lösa det med hjälp av dessa trådar:

http://drupal.org/node/1149078
http://drupal.org/node/735528

function sicf_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'DITT FORMULÄR ID') {
  $form['DITT FÄLT']['#states'] => array(
    'visible' => array(

':input[name="field_category[und]"]' => array(array('value' => 1'), array('value' => '2'))

    ),
  );
}

  return $form;
}

Sjukt krångligt men förhoppningsvis är det fixat i 8:an :)