Saludos.
Hemos estado usando Mamba para generar contenido a
partir de plantillas XHTML y producers en Python. Todo
ha
resultado muy útil para avanzar en el desarrollo de
nuestro software, pero hemos encontrado ciertas
dificultades que no
sabemos cómo resolver. Las más importantes de ellas
son la imposibilidad de seleccionar controles de
formularios HTML
generados a través de un layout.
Lo anterior implica que al intentar pintar una lista
desplegable de cuatro elementos con el tercero de ellos
seleccionado, se
debería obtener un HTML así:
<select name="p_tipo_material">
<option value="1"> Uno </option>
<option value="2"> Dos </option>
<option value="3" selected> Tres </option>
<option value="4"> Cuatro </option>
</select>
Algo similar ocurre con los botones de verificación
(checkboxes):
<form name="form_tipos_material"
mamba:producer="prTipoMaterial"
mamba:layout="opcionesTipoMaterial">
<input type="checkbox" name="p_tipo_1"
value="on" /> Uno <br/>
<input type="checkbox" name="p_tipo_2"
value="on" /> Dos <br/>
<input type="checkbox" name="p_tipo_3" value="on"
checked/> Tres <br/>
<input type="checkbox" name="p_tipo_4"
value="on" /> Cuatro <br/>
</form>
La idea es que la información provenga de un producer
y genere los controles a través de un "mamba:layout".
La forma
como intentamos hacerlo fue así:
<select name="p_tipo_material"
mamba:producer="prTipoMaterial"
mamba:layout="opcionesTipoMaterial">
<option mamba:id="opcionesTipoMaterial" value="%
(codigo)" selected="%(seleccionado)"> %(nombre)
</option>
</select>
<form name="form_tipos_material"
mamba:producer="prTipoMaterial"
mamba:layout="opcionesTipoMaterial">
<input type="checkbox"
mamba:id="opcionesTipoMaterial" name="p_tipo_%
(codigo)" value="on"
checked="%(verificado)" /> %(nombre) <br/>
</form>
Con lo anterior, obtuvimos el siguiente resultado, que es
sintáxticamente correcto en XHTML, pero que no nos
da el
resultado esperado en los navegadores que hemos
probado, que es que sólo uno de los controles quede
seleccionado.
Por el contrario, independientemente del valor, quedan
seleccionados todos:
<select name="p_tipo_material">
<option value="1" selected=""> Uno </option>
<option value="2" selected=""> Dos </option>
<option value="3" selected="selected"> Tres
</option>
<option value="4" selected=""> Cuatro </option>
</select>
<form name="form_tipos_material"
mamba:producer="prTipoMaterial"
mamba:layout="opcionesTipoMaterial">
<input type="checkbox" name="p_tipo_1" value="on"
checked="" /> Uno <br/>
<input type="checkbox" name="p_tipo_2" value="on"
checked="" /> Dos <br/>
<input type="checkbox" name="p_tipo_3" value="on"
checked="checked" /> Tres <br/>
<input type="checkbox" name="p_tipo_4" value="on"
checked="" /> Cuatro <br/>
</form>
A los navegadores les tiene sin cuidado qué valor tiene
el atributo checked o selected; si el atributo está
presente, el
navegador considera el control como seleccionado. Por
esta razón intentamos que TODO el atributo junto con
su valor,
fuera un valor ' selected="selected" ' generado por el
layout, así:
<select name="p_tipo_material"
mamba:producer="prTipoMaterial"
mamba:layout="opcionesTipoMaterial">
<option mamba:id="opcionesTipoMaterial" value="%
(codigo)" %(seleccionado)> %(nombre) </option>
</select>
Infortunadamente, Mamba identifica nuestro "truco"
como un error sintáctico de XHTML.
żTienen ustedes alguna idea de cómo podamos
resolver la situación? żQuizá con un mamba:marshall?
Agradecemos cualquier ayuda que nos puedan ofrecer.
Logged In: YES
user_id=328159
La solucion es muy sencilla.
Solo es cosa de usar los mamba:marshall y los
mamba:param.
#######################
Este es el index.py ###
########################################
###############
def option_producer(node, args):
list = []
for i in range(1,11):
d = {}
d['number'] = i*100
list.append(d)
return list
def selecter_marshall(node, args):
#leemos el parametro que indica cual preseleccionamos
selected = args['selected']
tomamos el valor del nodo hijo actual, y recortamos los
blancos
value = node.childNodes[0].value.strip()
#si es el preseleccionado, entonces lo indicamos en su
atributo
if value == selected:
node.attributes['selected'] = 'selected'
##########################
Este es el index.mamba ###
########################################
###############
<html>
<body>
<select mamba:layout="option_layout"
mamba:producer="option_producer">
<option mamba:id="option_layout"
mamba:marshall="selecter_marshall"
mamba:param:selected="500">
%(number)
</option>
</select>
</body>
</html>
########################################
###############