Programacion

Publicado por gemisu, Septiembre 09, 2005, 21:33:48

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Predicador

A ver, creo haber entendido que queres obtener un menu del tipo dropdown que tenga como index ID y muestre el numero (ID), la categoria y la descripcion, si es asi, el siguiente codigo lo haria (puse que cambiaria y que sacaria).
    echo "<select name=\"categoria\" id=\"categoria\">";
    $cate = mysql_query("select id, nombre, Descr from ".$prefix."_partidas_nacimiento_cat where id > 1 order by id", $dbi);
    while (list($numero, $categoria, $descr) = mysql_fetch_array($cate, MYSQL_NUM)) {
// (1)**** Realmente no entiendo la razon de este codigo, $descr es cargado...
//         durante la evaluacion de la condicion del while
//             $var1 = mysql_query("select descr from ".$prefix."_partidas_nacimiento_cat", $dbi);
//             $veremos = var_dump($var1);
//             $descr = $var1;
// (1) end ****

// (2) **** Segun lo que entiendo que queres...
//          yo cambiaria echo "<option value=\"$numero\">$numero - $categoria </option>"; por:
      echo "<option value=\"$numero\">$numero - $categoria - $descr</option>";
// (2) end ****
    }
    echo "</select>";

Si no es esto, seria bueno que expliques las tablas implicadas con sus campos y las relaciones entre ellas, asi seria mas entendible.

Me preocupa que en algunos lugares uses sql_query() ya que tal funcion no es standard de php, quizas sea una funcion wrapper definida en algun modulo, ya que deberias usar mysql_query() las consultas (o pg_query() en caso que uses un postgressql server).

Para algun Admin: en algunos foros el bbcode [code] permite formas del estil [code="php"] para decir que el codigo es PHP y hace el resaltado de syntaxis especifico a ese lenguaje, seria lindo si pudiesemos tener algo asi aca tambien (o en la futura seccion Programacion). Gracias.
Baii y exitos gemisu, y si no sale... seguiremos intentando.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

gemisu

Mira te explico..!!
Cita de: PredicadorA ver, creo haber entendido que queres obtener un menu del tipo dropdown que tenga como index ID y muestre el numero (ID), la categoria y la descripcion, si es asi, el siguiente codigo lo haria (puse que cambiaria y que sacaria).

Bueno casi casi, que tenga como index ID y muestre el numero (ID), la categoria pero  la descripcion, la carge en una variable para despues incertarla en un campo texto un (textarea), pero lo que me esta matando es que no cargo la descripcion en la variable.. el campo descr es la descripcion de la categoria (que es una plantilla) y es tipo "text" poe eso no la pongo con el id y la categoria (imagina la pantalla de grande??)


Cita de: PredicadorSi no es esto, seria bueno que expliques las tablas implicadas con sus campos y las relaciones entre ellas, asi seria mas entendible.

la tabla partidas_nacimiento digamos que es la maestra donde se almacenan todos los datos... y los campos estan en el script que puse completo..

la tabla partidas_nacimiento_cat es el catalogo de categorias, esto no es mas que plantillas creadas por el usuario para no hacer trancripciones en la partida de nacimiento y los campos son id, nombre, descr (text)


Cita de: PredicadorMe preocupa que en algunos lugares uses sql_query() ya que tal funcion no es standard de php, quizas sea una funcion wrapper definida en algun modulo, ya que deberias usar mysql_query() las consultas (o pg_query() en caso que uses un postgressql server).

Si es una funcion que tengo definida en otro modulo junto con muchas otras ej. un datacontrol creado con todas la funciones..

Bueno ojala me entiendas, hoy no he tocado la maquina para ver si la mente se despeja.
Bueno Mil gracias y Saludos ,espero ver otras sugerencias... jajaja

El_Pablo

Voy a ver si mañana puedo ver bien este topic... sino el miercoles...
Salu2

Predicador

Cita de: gemisuBueno casi casi, que tenga como index ID y muestre el numero (ID), la categoria pero  la descripcion, la carge en una variable para despues incertarla en un campo texto un (textarea), pero lo que me esta matando es que no cargo la descripcion en la variable.. el campo descr es la descripcion de la categoria (que es una plantilla) y es tipo "text" poe eso no la pongo con el id y la categoria (imagina la pantalla de grande??)
Realmente sigo sin enteder entonces que es lo que queres, lo siento. Ademas recorda que no vas atener una descripcion, sino una por cada item del menu.
Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Predicador

Bueno, estuve dandole vueltas a tu post... luego de hacer una pagina completa con tu codigo e intentar ver lo que querias lograr, se me ocurrio algo. A mi (nuevo) entender queres seleccionar una de las opciones cargadas en el dropdown box y que la descripcion correspondiente a esa categoria seleccionada aparezca en un inputbox mas abajo. Bien, si eso es lo que queres, este codigo lo haria:


// <b>ESTA ES LA PARTE DEL CODIGO ME ME INTERESA...<b>

          <table width="450" border="0" cellspacing="5" cellpadding="1">
               <tr>
                 <td>Plantilla:</td>
                 <td>
<?php
// el onchange&#40;&#41; hace que cada vez que cambies el dropdown asigne el atributo label al inputobox descr
// NO SE CUANTOS CARACTERES SOPORTA EL ATRIBUTO LABEL, asi que podria fallar para textos largos.
// La otra solucion es ya usar AJAX para resolver este problema.
echo "<select name=\"categoria\" id=\"categoria\" onchange=\"this.form.descr.value = this.options[this.selectedIndex&#93;.label\">";
     
$cate mysql_query&#40;"select id, nombre, Descr from ".$prefix."_partidas_nacimiento_cat where id > 1 order by id", $dbi&#41;;
     
while &#40;list&#40;$numero, $categoria, $descr&#41; = mysql_fetch_array&#40;$cate, MYSQL_NUM&#41;&#41; &#123;
        
echo "<option value=\"$numero\" label=\"$descr\">$numero - $categoria</option>";
     &
#125;
     
echo "</select>";
?>

                     </td>
               </tr>
             <tr>
                <!-- Agrego este inputbox para recibir la descripcion desde la plantilla  -->
                <td>Descripcion:</td>
                <td><input name="descr" type="text" id="descr" size="40" maxlength="100"></td>
             </tr>
             </table>

Fijate que agregue el input box "descr" al final que es el que va a recibir las descripcion de la plantilla y permitirte hacer el cambio que se quiera hacer, luego ese input box es el que usaras para hacer el INSERT en la base de datos.

Para ver como funcionaria pueden guardar el siguiente codigo en un archivo con extension .html y abrirlo en su browser de preferencia:

<html>
<body>
     <form name="form2" method="post" action="">
          <table width="450" border="0" cellspacing="5" cellpadding="1">
               <tr>
                 <td>Plantilla:</td>
                 <td>
                  <!-- Cambios hechos por mi -->
                     <select name="categoria" id="categoria" onchange="this.form.descr.value = this.options[this.selectedIndex].label">
                         <option value="1" label="Argento">1 - Tipo 1 </option>
                         <option value="2" label="peer to peer">2 - Tipo 2 </option>
                         <option value="3" label="rulz">3 - Tipo 3 </option>
                     </select>
                 <!-- Fin cambio -->

                </td>
               </tr>
             <tr>
                <!-- Agrego este inputbox para recibir la descripcion desde la plantilla  -->
                <td>Descripcion:</td>
                <td><input name="descr" type="text" id="descr" size="40" maxlength="100"></td>
             </tr>
             </table>
       </form>
</body>
</html>


El efecto final se usa haciendo un pequeño hack al usar de repositorio de informacion a un atributo que no es necesario para el funcionamiento de la pagina y que no afecta en nada, de ese modo nos salva las papas bastante.
Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

gemisu

Perfecto !!!!!

Captastes la idea 100%


<table width="450" border="0" cellspacing="5" cellpadding="1">
<tr>
<td>Plantilla:</td>
<td>
<?php 
echo "<select name=\"categoria\" id=\"categoria\" onchange=\"this.form.descr.value = this.options[this.selectedIndex&#93;.label\">"
$cate mysql_query&#40;"select id, nombre, Descr from ".$prefix."_partidas_nacimiento_cat where id > 1 order by id", $dbi&#41;; 
while &#40;list&#40;$numero, $categoria, $descr&#41; = mysql_fetch_array&#40;$cate, MYSQL_NUM&#41;&#41; &#123; 
echo "<option value=\"$numero\" label=\"$descr\">$numero - $categoria</option>"
&
#125; 
echo "</select>"
?>

</td>
</tr>
<tr>
<!-- Agrego este inputbox para recibir la descripcion desde la plantilla  -->
<td><input name="descr" type="text" id="descr" size="80" maxlength="100"></td>
</tr>
</table>


Lo hace perfecto, pero cambie la linea del input name por textarea que seria como va!! pero no obtengo el mismo resultado ??

seria asi...
<td><textarea name="descr" cols="80" rows="15" id="descr">
</textarea></td>


Sin embargo asi si va!!!


<html>
<body>
     <form name="form2" method="post" action="">
          <table width="450" border="0" cellspacing="5" cellpadding="1">
               <tr>
                 <td>Plantilla:</td>
                 <td>
                  <!-- Cambios hechos por mi -->
                     <select name="categoria" id="categoria" onchange="this.form.descr.value = this.options[this.selectedIndex].label">
                         <option value="1" label="Argento">1 - Tipo 1 </option>
                         <option value="2" label="peer to peer">2 - Tipo 2 </option>
                         <option value="3" label="rulz">3 - Tipo 3 </option>
                     </select>
                 <!-- Fin cambio -->
                </td>
               </tr>
             <tr>
                <!-- Agrego este inputbox para recibir la descripcion desde la plantilla  -->
               
                <td><textarea name="descr" cols="80" rows="15" id="descr">
                </textarea></td>
             </tr>
             </table>
       </form>
</body>
</html>

Predicador

Hola gemisu, una cosa que se me paso nombrar y que estimo que es el problema, es que este metodo no soporta descripciones que contengan retornos de carro (o sea, que contengan caracteres correspondientes a la tecla "enter").
Ya para soportar el caracter de la tecla enter se deberia de crear un sistema un poco mas complejo simulando AJAX (o sea, realizar una consulta en tiempo real cada vez que se elige una opcion diferente en el menu drop-down.
Si podes presumir de los enter, solo se haria el stripping de caracteres enter a la variable $descr antes de imprimirla, esto es:
echo "<option value=\"$numero\" label=\"". strtr($descr,"\n"," "). "\">$numero - $categoria</option>";


Sino se deberia eliminar este hack y usar un esquema alternativo.

Vos decidis, de todos modos voy a ver si te armo un ejemplo del esquema alternativo.
Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

gemisu

Ok. ya lo tengo funcionando.... con el textarea en vez del input

Que bien..

El problema lo tenia en el editor tinyMCE con el que trabajo en java..

Pero ahora te pregunto..
Cual es la diferencia de una variable a el campo textarea ???

O bien para que me entiendas..

en el campo descr esta escrito por ejemplo.
Yo el funcionario xxxx estoy presentando a una niña de nombre $infante_nombre_1 $ infante_nombre_2 y la mama se llama $presenta_nombre_1


y la idea es que cuando lo muestre en el text area las variables tengan el valor correspondiente.. Me entiendes ???

Gracias

Predicador

Cita de: gemisuen el campo descr esta escrito por ejemplo.
Yo el funcionario xxxx estoy presentando a una niña de nombre $infante_nombre_1 $ infante_nombre_2 y la mama se llama $presenta_nombre_1
El ejemplo que pones no tiene nada que ver con que sea un textarea o un input box, la diferencia es que ambos corren en instancias totalmente distintas, las variables que vos decis funcionan en PHP, o sea, en el momento en que la pagina se genera y del lado del servidor, en tal caso, deberias hacer el reemplazo de las variables or su respectivo valor durante el echo (o re evaluarlo), por ejemplo:
Si dentro de descr en la tabla vos tenes guardado el texto:
CitarYo el funcionario xxxx estoy presentando a una niña de nombre $infante_nombre_1 $ infante_nombre_2 y la mama se llama $presenta_nombre_1
Y queres que esas variables sean reemplazadas por los valores correspondientes a los asigandos en esa instancia de ejecucion, el codigo:
echo "<option value=\"$numero\" label=\"". strtr($descr,"\n"," "). "\">$numero - $categoria</option>";
deberias cambiarlo por:
echo "<option value=\"$numero\" label=\"". eval(strtr($descr,"\n"," ")). "\">$numero - $categoria</option>";
De esa manera, la cadena se reevaluara de acuerdo al entorno y la cadena de salida sera de la forma:
CitarYo el funcionario xxxx estoy presentando a una niña de nombre Josefina Pepita y la mama se llama Anne-Gry
Siendo que en ese contexto de ejecucion....
$infante_nombre_1 era Josefina
$infante_nombre_1 era Romina
$presenta_nombre_1 era Anne-Gry
Me explico o medio confuso?
Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

gemisu

ok el codigo que tengo actual mente es este


echo "<option value=\"$numero\" label=\"$descr\">$numero - $categoria</option>";


Y funciona de maravillas, con la diferencia que no veo el valor de las variables!!

Y este, que me dices que ponga..

echo "<option value=\"$numero\" label=\"". eval(strtr($descr,"\n"," ")). "\">$numero - $categoria</option>";


No muestra nada en absoluto... te pongo el codigo completo..


<table width="327" border="0" cellspacing="5" cellpadding="1">
<tr>
  <td width="153">Plantilla:</td>
  <td width="278">
  <?php 
      
echo "<select name=\"categoria\" id=\"categoria\" onchange=\"this.form.descr.value = this.options[this.selectedIndex&#93;.label\">"
      
$cate mysql_query&#40;"select id, nombre, Descr from ".$prefix."_partidas_nacimiento_cat where id > 1 order by id", $dbi&#41;; 
      
while &#40;list&#40;$numero, $categoria, $descr&#41; = mysql_fetch_array&#40;$cate, MYSQL_NUM&#41;&#41; &#123; 
          
echo "<option value=\"$numero\" label=\"$descr\">$numero - $categoria</option>"
       &
#125; 
       
echo "</select>"
   
?>

</td>
</tr>
</table>
<table width="450" border="0" cellspacing="5" cellpadding="1">
 <tr>
<td><textarea name="descr" cols="80" rows="15" id="descr">
</textarea></td>
</tr>
</table>


Asi funciona pero sin el valor de las variables...

Gracias

Predicador

Bueno, separemos un poco las cosas.
PHP corre en el servidor, o sea, del otro lado del cliente (la persona que usa el browser) y javascript corre del lado del cliente (lejos o cerca del servidor, pero normalmente en una computadora aparte).
Si mal no entiendo (luego de recapitular), vos queres reemplazar esas variables (que a decir verdad en el planteo que hago serian solo pseudo variables) por lo que los nombres que la persona tipeo mas arriba en el formulario. En ese caso, ya el codigo php se ejecuto y ademas los valores de los textbox no son alcanzables, entonces debes hacer el reemplazo con javascript, esto es....

<textarea name="descr" cols="80" rows="15" id="descr"" onChange="
/*
Reemplaza una subcadena de una string por otra.
Funcion sacada de la red, no me hago responsable por que ande o no
*/
function replace(s, t, u) {
 /*
 **  Replace a token in a string
 **    s  string to be processed
 **    t  token to be found and removed
 **    u  token to be inserted
 **  returns new String
 */
 i = s.indexOf(t);
 r = "";
 if (i == -1) return s;
 r += s.substring(0,i) + u;
 if ( i + t.length < s.length)
   r += replace(s.substring(i + t.length, s.length), t, u);
 return r;
}
/* Y aca la llamamos y hacemos los reemplazos */
TempDesc = new String(this.label);
TempDesc = replace(TempDesc,'$infante_nombre_1',this.form.infante_nombre_1);
TempDesc = replace(TempDesc,'$infante_nombre_2',this.form.infante_nombre_2);
TempDesc = replace(TempDesc,'$presenta_nombre_1',this.form.presenta_nombre_1);

this.form.descr.value = TempDesc">


Una vez que el textarea cambia, hace el reemplazo de las cadenas $infante_nombre_1 por lo que contiene el input box infante_nombre_1 y lo mismo con los otros dos, luego almacena ese valor en el textarea.
Si quieres puede implementar todo es codigo como una funcion aparte de modo que quede mas ordenado, eso si, deberias pasarle como parametro el this.form asi sabe a que formulario se refiere y dentro de la funcion cambiar el this.form por el parametro de entrada.
Baii y espero que ande, realmente no pude testear el codigo, pero creo que es correcto.
Cualquier cosa sigo a disposicion.
Perdon cualquier typo que pude haber cometio, me pasa al escribir rapido.

EDIT: lo demas deberias dejarlo como esta.
Realmente el codigo creo que va a degradar la performance, ya que segun me parece, intentara hacer el reemplazo por cada vez que presione una tecla sobre el textarea, quizas seria mejor hacer el reemplazo al momento de aplicar el hack, o sea, en el onchange del dropdown menu, eso lo haria mas eficiente, eso si, deberas ajustar la forma de acceder el textarea.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Predicador

Bueno, al final deje el post anterior para que se vea otra froma de lograrlo  (menos optima) y aca la forma que segun creo seria mas optima, esto es hacer el reemplazo de los patrones por los valores del formulario al momento de copiar la plantilla en el textarea:

Entonces, reemplazar:
echo "<select name=\"categoria\" id=\"categoria\" onchange=\"this.form.descr.value = this.options[this.selectedIndex].label\">";
Por:
echo "<select name=\"categoria\" id=\"categoria\" onchange=\"
/*
Reemplaza una subcadena de una string por otra.
Funcion sacada de la red, no me hago responsable por que ande o no
*/
function replace(s, t, u) {
 /*
 **  Replace a token in a string
 **    s  string to be processed
 **    t  token to be found and removed
 **    u  token to be inserted
 **  returns new String
 */
 i = s.indexOf(t);
 r = "";
 if (i == -1) return s;
 r += s.substring(0,i) + u;
 if ( i + t.length < s.length)
   r += replace(s.substring(i + t.length, s.length), t, u);
 return r;
}
/* Y aca la llamamos y hacemos los reemplazos */
TempDesc = new String(this.options[this.selectedIndex].label);
TempDesc = replace(TempDesc,'$infante_nombre_1',this.form.infante_nombre_1);
TempDesc = replace(TempDesc,'$infante_nombre_2',this.form.infante_nombre_2);
TempDesc = replace(TempDesc,'$presenta_nombre_1',this.form.presenta_nombre_1);

this.form.descr.value = TempDesc\">";


Y podrias dejar el textarea como estaba antes, o sea, solo
<textarea name="descr" cols="80" rows="15" id="descr">
Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Flequi

me imagino q cuando haya seccion de programacion , predicador va a ser el moderador no??

gemisu

:D
Bueno dejame ver el codigo y analizarlo un poco para poder entenderlo al 100%, lo que pasa es que estoy en otra actividad que me ocupò totalmente en tiempo en relacion a mi familia, y mañana retomare nuevamente el pc, estaba observando algo, 193 lecturas en apenas dos dias, jajaja, parece que la comunidad nos va siguiendo para ver el resultado, eso es algo lindo que deben mantener, y los comentarios son bastante buenos, y Si deberian mantener un hilo de Programacion para consulta de inquietudes y problemas de la comunidad, que es la idea, creo.

Bueno uns Saludo a todos y especialmente a ti Predicador, que me has dado tremenda mano, bueno ya nos falta poquitico jajajja.

Continuamos mañana en lo que se recupere mi hijo....

Saludos a todos. bay   :wink:

Predicador

Antes que nada espero que se recupere tu hijo, y si, la familia antes que el coding  ;)
De todos modos este tiempo me vino bien para poder dormir, y ya desde la oficina pero aun sin cafe (que llegara en 5 minutos) me di cuenta que habia cometido unos pequeños errores en el codigo anterior, asi que hice una version alternativa y mas ordenada (pero con el mismo efecto final y sin los errores claro).

Debes agregar entre </header> y <body> lo siguiente:
<script type="text/javascript">
/*
Reemplaza una subcadena de una string por otra.
Funcion sacada de la red, no me hago responsable por que ande o no, pero si, anda :D
*/
function replace(s, t, u) {
 /* Replaces token t by u in string s  */
 i = s.indexOf(t);
 r = "";
 if (i == -1) return s;
 r += s.substring(0,i) + u;
 if ( i + t.length < s.length)
   r += replace(s.substring(i + t.length, s.length), t, u);
 return r;
}
</script>

Esta es la funcion que se encarga de hacer los reemplazos y que llamaremos desde el onchange.

Y luego el echo del select seria tan solo asi:
echo "<select name=\"categoria\" id=\"categoria\" onchange=\"TempDesc = new String(this.options[this.selectedIndex].label); TempDesc = replace(TempDesc,'$infante_nombre_1',this.form.infante_nombre_1.value); TempDesc = replace(TempDesc,'$infante_nombre_2',this.form.infante_nombre_2.value); TempDesc = replace(TempDesc,'$presenta_nombre_1',this.form.presenta_nombre_1.value); this.form.descr.value = TempDesc\">";
Para los que quieran probar como se siente, pueden pegar el siguiente codigo en un archivo de extension .html
<html>
<script type="text/javascript">
/*
Reemplaza una subcadena de una string por otra.
Funcion sacada de la red, no me hago responsable por que ande o no, pero si, anda :D
*/
function replace(s, t, u) {
 /* Replaces token t by u in string s  */
 i = s.indexOf(t);
 r = "";
 if (i == -1) return s;
 r += s.substring(0,i) + u;
 if ( i + t.length < s.length)
   r += replace(s.substring(i + t.length, s.length), t, u);
 return r;
}
</script>
<body>
     <form name="form2" method="post" action="">
          <table width="450" border="0" cellspacing="5" cellpadding="1">
               <tr>
                 <td><input name="infante_nombre_1" type="text" size="40" maxlength="100"></td>
               </tr>
               <tr>
                 <td><input name="infante_nombre_2" type="text" size="40" maxlength="100"></td>
               </tr>
               <tr>
                 <td><input name="presenta_nombre_1" type="text" size="40" maxlength="100"></td>
               </tr>

               <tr>
                 <td>Plantilla:</td>
                 <td>
                     <select name="categoria" id="categoria" onchange="TempDesc = new String(this.options[this.selectedIndex].label); TempDesc = replace(TempDesc,'$infante_nombre_1',this.form.infante_nombre_1.value); TempDesc = replace(TempDesc,'$infante_nombre_2',this.form.infante_nombre_2.value); TempDesc = replace(TempDesc,'$presenta_nombre_1',this.form.presenta_nombre_1.value); this.form.descr.value = TempDesc">
                         <option value="1" label="Yo $infante_nombre_1, le vendo mi alma a $infante_nombre_2.">1 - Tipo 1 </option>
                         <option value="2" label="$infante_nombre_1 y $infante_nombre_2 me recomendaron Ap2p">2 - Tipo 2 </option>
                         <option value="3" label="$presenta_nombre_1 no sabe lo que dice!!!!">3 - Tipo 3 </option>
                     </select>
                </td>
               </tr>
             <tr>
                <td>Descripcion:</td>
                <td><input name="descr" type="text" id="descr" size="40" maxlength="100"></td>
             </tr>
             </table>
       </form>
</body>
</html>

Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen