* 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:
- 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.
- 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_build
funció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:
El HTML del formulario representado es el siguiente: