Las casillas de verificación seleccionadas (taxonomía) llenan una nueva lista de selección con valores de cuadros seleccionados

7

* pregunta respondida: se necesita ayuda con hook_node_submit en el módulo personalizado para guardar datos *


En Drupal 7, tengo un tipo de contenido personalizado. En esto, hay una referencia de término de selección múltiple para seleccionar categorías para ese contenido.

Ahora necesito poder seleccionar uno de la categoría previamente seleccionada y marcarlo de alguna manera como la categoría 'principal'.

Digamos que tengo un campo de referencia de término de selección múltiple con las siguientes opciones:

Apples
Bananas
Pears
Oranges
Grapes
Pineapples

El usuario selecciona manzanas, peras y uvas. Ahora necesito:

  1. Cree programáticamente otro campo para cada uno de estos seleccionados, tal vez con una devolución de llamada ajax, y tenga botones de opción para que solo pueda seleccionar uno de los términos seleccionados, cuál es mi categoría principal.
  2. Cree un campo de radio junto a los elementos marcados, tal vez también con ajax, donde pueda seleccionar el principal de los seleccionados.

¿Alguien tiene alguna idea con respecto a esto?

Para ser más claro, tengo muchas de estas listas en un tipo de contenido. Repetir cada lista como una lista de valores únicos no es una opción.

Supongo que mi mejor opción es usar el hook_form_alter()con algún tipo de devolución de llamada AJAX para crear un solo botón de radio junto a la casilla de verificación que el usuario acaba de marcar, o crear programáticamente una nueva lista de campos de radio para cada elemento marcado en la lista especificada.

Actualización: Ok, he decidido que la mejor manera de hacerlo sería crear un módulo personalizado que use ajax para crear un botón de opción para cada casilla de verificación marcada, lo que permite seleccionar el elemento que debe usarse como elemento principal.

Por lo tanto, solía hook_form_alter()agregar una #after_buildfunción, ya que debemos esperar a que se presente el formulario antes de poder acceder a los valores de los términos impositivos.

Aquí está mi módulo hasta ahora. Utilizo muchos comentarios, por lo que debe quedar claro lo que estoy tratando de hacer:

MYMODULE.module

/**
 * Implementation of HOOK_form_alter()
 * Do the ajax form alteration
 */
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {

  // 1.CONTENT FORM
  // I created a custom content type 'content' and added a term
  // reference to it 
  if($form_id == 'content_node_form') {

    // tax term ref is the main part, so let us
    // remove title and body fields
    unset($form['body']);
    unset($form['title']);

    // do our stuff after the form has been rendered ...
    $form['#after_build'][] = 'MYMODULE_after_build';

  }
}

/**
 * after_build function for content_node_form
 */
function MYMODULE_after_build(&$form, &$form_state) {

    dsm($form);  

    // In the after_build call we can now actually use the 
    // element_children function to grab the values of the fields that
    // don't start with a hash tag #
    // in this test case 1,2,3,4 and 5

    // wrap each of the elements rendered ...
    foreach(element_children($form['field_taxonomy']['und']) as $key) {

      $form['field_taxonomy']['und'][$key] += array(

        // this is added before the element and then replaced by our callback ..
        // we use the $key value in the id so that we know which div to replace 
        // depending on which checkbox is checked ...
        '#prefix' => '<div class="taxonomy_term_wrapper">
                        <div id="callback_replace_'.$key.'">Replace Me ' . $key . '</div>',

        // this is added after the element so we basically wrap around it ..
        '#suffix' => '</div>',

        // add some ajax stuff here ...
        '#ajax' => array(
          // name of the callback function to call upon change
          'callback' => 'MYMODULE_callback',
          // the id of the element that will be replaced
          'wrapper' => 'callback_replace_'.$key,
          // replace the wrapper
          'method' => 'replace',
          // what kind of effect do we want ...
          'effect' => 'fade',
          // show progress on callback
          'progress' => array('type' => 'throbber'),
        ),
      ); 



      if (!empty($form_state['values']['field_taxonomy']['und'][$key])) {
        // the form to show upon change ...
        $form['field_taxonomy']['und']['main_cat'] = array(
          // we want a radio button
          '#type' => 'radio',
          '#title' => t('Test Title'),
          '#description' => t('Test Description ...'),
          '#default_value' => empty($form_state['values']['field_taxonomy']['und'][$key]) ?
                              $form_state['values']['field_taxonomy']['und'][$key] :
                              $form_state['values']['field_taxonomy']['und'][$key],
        );
      }

    }

  return $form;
} 

function MYMODULE_callback($form, $form_state) {
 return $form['field_taxonomy']['und']['main_cat'];
}

Así es como se ve actualmente antes de marcar una casilla:

Así es como se ve actualmente antes de marcar una casilla

El HTML del formulario representado es el siguiente:

captura de pantalla

tecjam
fuente
Realmente no es una respuesta como tal, pero intente echar un vistazo al módulo de Ejemplos. Tiene algunos ejemplos de forma ajax que pueden ayudarte en tu camino :) drupal.org/project/examples
Chapabu
Hola Chapabu, gracias por tu respuesta. He usado los ejemplos de ajax, pero mi problema radica en el hecho de que necesito usar after_build para agregar mi código y ahora estoy perplejo en cuanto a que no hace nada ... He agregado mucho más código arriba, incluido mi progreso Hasta ahora con el módulo. Tal vez pueda ver los errores
tecjam
hmm ... lo único que puedo (rápidamente) ver diferente en after_build es el formato. En los documentos de Drupal dice que debería verse así: $ form ['# after_build'] => array ('MYMODULE_after_build');
Chapabu
Creo que $ form ['# after_build'] => array ('MYMODULE_after_build'); es lo mismo que $ form ['# after_build'] [] = 'MYMODULE_after_build'; - Tenga en cuenta el []
tecjam
Además, la función after_build parece funcionar bien, ya que ajusta mis términos de taxonomía en mi div personalizado y agrega mis divs de reemplazo. Sólo la devolución de llamada Por qué no funciona ..
tecjam

Respuestas:

1

crear los elementos como casillas de verificación. después de que se seleccionen, muestre una lista desplegable con estos elementos u otro botón de radio para seleccionar la categoría principal. puede ocultar el segundo menú desplegable usando el siguiente código hasta que se seleccionen las primeras casillas de verificación.

'#states' => array(
'visible' => array(
':input[name="your checkbox"]' => array('checked' => TRUE),
 ),
)

agregue esto al elemento que desea ocultar. Esto será visible solo cuando la casilla esté marcada.

ana
fuente
0

¿Qué tal dos listas, una titulada primaria que toma una selección, la otra múltiple? Aún deberá abordar la segunda lista o selección para eliminar las duplicaciones.

Sillar
fuente
Hola y gracias por tu respuesta. Sí, por supuesto que funcionaría. Sin embargo, tengo muchísimas listas en la página de creación de contenido y tenerlas todas dos veces no es una opción. Simplemente respondí la pregunta anterior por el bien de un ejemplo.
tecjam