Posted by clau_bolson on October 19, 2016 at 12:27pm
Hola,
en un sitio que estoy haciendo tengo un formulario para que se ingresen datos varios de empresas.
Hay varios campos múltiples: los teléfonos, los propietarios, etc.
Los dueños, buscando usabilidad "para tontos", me piden que reemplace el botón "Añadir otro elemento" por "Añadir otro teléfono", 'Añadir otro propietario"... y no aceptan que no se pueda hacer.
Alguna idea de como hacerlo?

Comments
Con jquery lo podrías
Con jquery lo podrías hacer...
Web developer: www.calbasi.net
Gracias calbasi, me podrías
Gracias calbasi, me podrías dar más detalles? Casi no se nada de jquery
Con jquery puedes cambiar una
Con jquery puedes cambiar una cadena de texto con otra... Podrías usar algo así: http://api.jquery.com/replacewith/
Web developer: www.calbasi.net
PHP
Creo que lo más correcto sería con un hook_forma_alter.
Saludos
Alterando el form del lado de PHP
Coincido con @jncruces, la forma correcta seria alternado el formulario del lado de PHP, mas sencillo y te evitas andar agregando javascript.
Lo podes lograr con hook_form_alter
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...
o aun mejor hook_form_FORM_ID_alter
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...
si queres tener mejor granulanidad.
Dentro de los campos con cardinalidad ilimitada vas a encontrar un form item "add_more" de tipo submit que representa el boton en cuestion. Ahi podes agregar el texto que necesites en cada caso.
Saludos.
También coincido
Yo también coincido con @emacoti y con @jncruces. Si nunca utilizaste hooks, por las dudas te comento que vas a necesitar desarrollar un custom module. Una vez que te acostumbras a desarrollar módulos, te das cuenta de la potencialidad que te da y de que podés resolver un montón de problemas fácil, rápida y correctamente. Es muy posible que en un mismo proyecto necesites implementar distintos hooks, que no necesariamente tienen que estar relacionados entre sí. A mi no me resulta cómodo en absoluto andar implementando varios custom modules, lo que hago es implementar un único módulo, llamado de modo similar al sitio web, y en ese módulo implemento los distintos hooks que necesite. Lo uso a modo de modulo "misceláneos".
Obviamente, si fuera necesario implementar un custom module para resolver un problema mayor, es muy probable que se justifique implementarlo aparte.
Saludos
Módulo para cambiar la etiqueta
Hola!
Podés usar el módulo Custom add another [0].
Te permite cambiar el label del botón por tipo de contenido. La única condición es que la cantidad de valores para el campo esté en ilimitado
Saludos
Cristian
[0] https://www.drupal.org/project/custom_add_another
--
Cristian G. Segarra
Coincidio con hacerlo con hooks
Como todo en Drupal hay mil opciones para hacer lo que decís. Sería bueno saber cómo estás creando el form (webform, entityform, eck, etc...) y qué tipo de campo es el que quieren modificar así te podríamos orientar con mayor precisión.
Si estás usando webform, acá hay una buena introducción al hook_form_alter que mencionan arriba con un ejemplo claro de cómo utilizarlo: https://www.drupal.org/node/1558246
Hola, está hecho con
Hola, está hecho con entityforms.
Perfecto, mucho más fácil para manipular :)
Primero deberías crearte un custom module (si no sabés cómo hacerlo avisá y te damos una mano).
NOTA: Para estos ejemplo estoy usando la función dpm() que viene con el 'devel' module. Deberías bajarlo y habilitarlo para que dpm no te tire error.
Si preferís no usar el devel module (cosa que desaconsejo porque es muy práctico!) reemplazá dpm() por la función nativa de php var_dump()
En tu custom module vas a agregar el hook. Podés usar hook_form_alter o hook_form_FORMID_alter. Sinceramente no sé la diferencia en cuanto a performance de estas dos funciones, tal vez alguien pueda aconsejar sobre eso.
Para saber el ID de tu form podés usar la función hook_form_alter en tu custom module. Esta función se arma así:
modulename + '_form_alter'Ejemplo:
mi módulo se llama "drofile_tweaks" modificá eso según tu caso.
<?phpfunction drofile_tweaks_form_alter (&$form, &$form_state, $form_id){
dpm($form['form_id']['#value']);
}
?>
Luego de borrar el cache y refrescando la página en donde está tu form, verás que el dpm imprimió el ID de tu form.
En términos generales los ID de los entityforms son siempre:
_form_name_entityform_edit_form.Una vez que tenés el ID, podés borrar esa función de tu módulo.
Entonces ahora que tenemos nuestro ID, podemos usar hook_form_FORMID_alter.
Primero creamos la función (que se arma así:
modulename + '_form_' + formID + '_alter'_).O sea que modulename y formID son los valores que tenés que cambiar según tu caso. En este ejemplo mi custom module se llama "drofile_tweaks" y el id de mi form (que sacamos del paso anterior) es "test_form_entityform_edit_form".
<?php
function drofile_tweaks_form_test_form_entityform_edit_form_alter (&$form, &$form_state, $form_id) {
dpm($form); //hacemos un dpm para ver el array $form
/**
* Usando la data que te tiró el dpm, tendrás la información de tus campos dentro del array $form
* En este ejemplo uso un campo que tengo yo de prueba (field_address).
* También utilicé 'LANGUAGE_NONE' para que sea más amable con sitios multilang
*/
$form['field_address'][LANGUAGE_NONE]['add_more']['#value'] = t('Agregar otra dirección');
}
?>
Salvás cambios en tu módulo, refrescás cache y recargando la página de tu form, verás que se modificó el texto del add_more por el string que usaste.
Ese sería un ejemplo muy básico de cómo modificar el valor del "add_more" para un único form.
También podrías utilizar el título del campo para remplazar la palabra 'elemento', por ejemplo:
<?php
function drofile_tweaks_form_test_form_entityform_edit_form_alter (&$form, &$form_state, $form_id){
$fieldlabel = $form['field_telephone'][LANGUAGE_NONE]['#title'];
$form['field_telephone'][LANGUAGE_NONE]['add_more']['#value'] = t('Agregar ' . $fieldlabel);
}
?>
Salvar cambios, refrescar cache, recargar página y verás que utiliza el nombre del campo para el add_more. En mi caso el texto quedó "Agregar Telephone".
Si tenés muchos campos para los que aplicar esto y el código se pone engorroso, podrías usar un foreach para iterar los campos del form y asignarle así un valor a "add_more" de forma dinámica, sin tener que estar escribiendo una línea para cada campo. Pero eso sería un poco más complejo.
Espero que esto sirva de ayuda, y avisame si tenés preguntas.
Devel module: https://www.drupal.org/project/devel
Por ooootro lado, como mencionó @tucho aparentemente hay un módulo que cubriría esto. La verdad es que no lo probé y no tengo idea si funciona bien y demás pero no está demás probarlo https://www.drupal.org/project/custom_add_another
Función ejemplo utilizando hook_form_form_id_alter y loop
Bueno, me quedé probando opciones y creo que llegué a un buen resultado para hacerlo dinámico, utilizando el nombre del cada campo para el "add_another" o "Agregar otro".
El único temita que veo es que la palabra "otro" en castellano tiene género, con lo cual "Agregar otro dirección" no sería correcto :P así que saqué el 'otro' para que sea genérico.
<?php
function modulename_form_form_id_alter (&$form, &$form_state, $form_id){
foreach(element_children($form) as $key) {
if (isset($key) && isset($form[$key][LANGUAGE_NONE]['add_more'])) {
if(isset($form[$key][LANGUAGE_NONE]['#title'])) {
$fieldlabel = strtolower($form[$key][LANGUAGE_NONE]['#title']);
$form[$key][LANGUAGE_NONE]['add_more']['#value'] = t('Agregar ' . $fieldlabel);
}
}
}
}
?>
En ese ejemplo, el resultado del botón "Agregar otro elemento" sería algo como "Agregar dirección" o "Agregar teléfono".
Referencias de funciones:
Por último decir que si el formulario tiene muchos campos ilimitados probablemente el loop traiga problemas de performance.
Saludos!
m
Muchas gracias
El lunes lo pruebo y te cuento.