Pregunta Agregando atributo al elemento de opción usando formularios api: drupal 7


Quiero agregar title = "icons / icon_cart.gif" para cada una de las siguientes opciones en mi lista de selección que se representa utilizando vistas.

Después de probar y leer muchos artículos, parece que no encuentro la manera de agregar este html en mi formulario.

A continuación está mi código.

function customchatter_form_alter(&$form, &$form_state, $form_id) {

$form["tid"]["#options"][1]=t("nooo chatter");
// this works to change the label of the option but how do I add title="icons/icon-  
cart.gif" ?

}

Mi código html:

<select id="edit-tid" name="tid" class="form-select">
<option value="All">- Any -</option>
<option value="1">nooo chatter</option>
<option value="2">Complaints Complaints</option>
<option value="3">Gear &amp; Gadgets</option>
</select>

Aclamaciones, Vishal

ACTUALIZAR Intenté actualizar el código según el consejo de Clive, pero los valores aún no están saliendo bien. A continuación se muestra mi historia.

Así que debajo está el resultado html que puedo lograr, pero el título siempre parece ser el número 1.

<select id="edit-select" class="form-select" name="select">
<option value="1" title="1">One</option>
<option value="2" title="1">Two</option>
</select>

Como puedes ver, el título está ahí pero el valor es incorrecto. A continuación está mi formulario y las funciones que escribí.

Mi forma:

$form['select'] = array(
'#type' => 'select',
'#options' => array(1 => 'One', 2 => 'Two'),
'#title' => array(1 => 'One', 2 => 'Two') 
// I tried many combinations but nothing seems to work.
);

Mis funciones de tema.

function kt_vusers_select($variables) {
$element = $variables['element'];
element_set_attributes($element, array('id', 'name', 'size'));
_form_set_class($element, array('form-select'));

return '<select' . drupal_attributes($element['#attributes']) . '>' .    
kt_vusers_form_select_options($element) . '</select>';
}


function kt_vusers_form_select_options($element, $choices = NULL) {

if (!isset($choices)) {
$choices = $element['#options'];
}
// array_key_exists() accommodates the rare event where $element['#value'] is NULL.
// isset() fails in this situation.
$value_valid = isset($element['#value']) || array_key_exists('#value', $element);


// @vishal  so there I have declared the variable to accept the values.
$vtitle = isset($element['#title']) || array_key_exists('#title', $element);


$value_is_array = $value_valid && is_array($element['#value']);
$options = '';
foreach ($choices as $key => $choice) {
if (is_array($choice)) {
  $options .= '<optgroup label="' . $key . '">';
  $options .= form_select_options($element, $choice);
  $options .= '</optgroup>';
}
elseif (is_object($choice)) {
  $options .= form_select_options($element, $choice->option);
}
else {
  $key = (string) $key;
  if ($value_valid && (!$value_is_array && (string) $element['#value'] === $key || 
($value_is_array && in_array($key, $element['#value'])))) {
    $selected = ' selected="selected"';
  }
  else {
    $selected = '';
  }

 // @vishal this is where the variable is being used.

 $options .= '<option title="'.$vtitle.'" value="' . check_plain($key) . '"' . $selected . 
 '>' . check_plain($choice) . '</option>';
}
}
return $options;
}

A continuación se muestra el código correcto para la última función del tema.

function kt_vusers_form_select_options($element, $choices = NULL, $vtitles=NULL) {
// Build up your own version of form_select_options here
// that takes into account your extra attribute needs.
// This will probably involve inspecting your custom FAPI property,
// which we'll call #extra_option_attributes

if (!isset($choices)) {
$choices = $element['#options'];
$vtitles = array();
$vtitles = $element['#title'];
}
// array_key_exists() accommodates the rare event where $element['#value'] is NULL.
// isset() fails in this situation.
$value_valid = isset($element['#value']) || array_key_exists('#value', $element);

$value_is_array = $value_valid && is_array($element['#value']);
$options = '';

//  print_r($vtitles);

mientras    (     (lista ($ clave, $ elección) = cada ($ selecciones))     && (lista ($ keytwo, $ vtitle) = cada ($ vtitles))    )    {     // printf ("% s =>% s,% s =>% s \ n", $ clave1, $ valor1, $ clave2, $ valor2);

 if (is_array($choice)) {
    $options .= '<optgroup label="' . $key . '">';
    $options .= kt_vusers_form_select_options($element, $choice);
    $i++;
    // $options .= form_select_options($element, $vtitle);
    $options .= '</optgroup>';
    } // end if if is_array

 elseif(is_object($choice)) {
  $options .= form_select_options($element, $choice->option);
  } // end of else if



else {
      $key = (string) $key;
  if ($value_valid && (!$value_is_array && (string) $element['#value'] === $key ||  
($value_is_array       && in_array($key, $element['#value'])))) {
    $selected = ' selected="selected"';
    }
  else {
    $selected = '';
  }
  // $options .= '<option title="'.$vtitle.'" value="' . check_plain($key) . '"' . 
  $selected . '>' . check_plain($choice) . '</option>';


 }

 $options .= '<option value="'. check_plain($key) .'" title="' . $vtitle . '"' . $selected 
 .'>'. check_plain($choice) .'</option>';



 } // end of choice



return $options;


} // end of function

5
2018-02-13 13:17


origen


Respuestas:


Me temo que tendrás que cavar bastante lejos para hacer esto, #options matriz se aplana en form_select_options() y actualmente no incluye ninguna forma de agregar atributos. Este es el código:

$options .= '<option value="' . check_plain($key) . '"' . $selected . '>' . check_plain($choice) . '</option>';

Como puede ver, simplemente no hay margen para los atributos allí. Sin embargo, podrá anular esto, pero implicará implementar su propia versión de theme_select() y su propia propiedad FAPI.

No tengo tiempo para concretar todo, pero en tu archivo de tema estarías haciendo algo como esto:

function MYTHEME_select($variables) {
  $element = $variables['element'];
  element_set_attributes($element, array('id', 'name', 'size'));
  _form_set_class($element, array('form-select'));

  return '<select' . drupal_attributes($element['#attributes']) . '>' . MYTHEME_form_select_options($element) . '</select>';
}


function MYTHEME_form_select_options($element) {
  // Build up your own version of form_select_options here
  // that takes into account your extra attribute needs.
  // This will probably involve inspecting your custom FAPI property,
  // which we'll call #extra_option_attributes
}

Referirse a form_select_options para construir MYTHEME_form_select_options

Y su código en el formulario sería algo así como:

$form['select'] = array(
  '#type' => 'select',
  '#options' => array(1 => 'One', 2 => 'Two'),
  '#extra_option_attributes' => array(
    1 => array('title' => 'Test title'), // Attributes for option with key "1",
    2 => array('title' => 'Test title'), // Attributes for option with key "2",
  ) 
);

En MYTHEME_form_select_options() entonces puedes inspeccionar el elemento #extra_option_attributes clave (si existe) para ver si necesita agregar físicamente más atributos en el HTML que crea.

Espero que eso ayude, sé que parece una forma locamente larga de hacer lo que necesitas, pero que yo sepa que es la única.


11
2018-02-13 17:00



No probado, pero has intentado:

$form["tid"]["#options"][1]['#attributes'] = array('title' => t('YOUR NEW TITLE'));

Es posible que deba alterar el nombre del elemento, etc. pero la etiqueta #attributes debería funcionar.

EDITAR: Como se señaló en la respuesta de Clive, esto no funcionará, pero lo dejaré en caso de que alguien quiera saber cómo agregar atributos a otros campos (cuadros de texto, etc.).


0
2018-02-13 15:20



Probado

Tratar:

$form["tid"][1]['#attributes'] = array('title' => t('nooo chatter'));

en lugar de:

$form["tid"]['#options'][1]['#attributes'] = array('title' => t('nooo chatter'));

Es posible agregar atributos arbitrarios a los elementos de esta manera. Descubrí esto después de realizar algunas pruebas basadas en esta responder.

También mencionado aquí y aquí.


0
2018-04-14 22:23