serios bugs en select_tag

edited agosto 2007 in Bugs y Problemas
Recuerdo haber hecho un post la vez pasada acerca de esto, habia corregido uno, pero se me olvido subirlo al svn y mas adelante consegui otro bug:

El primer bug: cuando se utiliza en conjunto a "option_tag", no se obtiene el comportamiento deseado.

El segundo bug: no se generan las opciones apartir de la lista pasada como parametro.

Aqui esta la correccion:
function select_tag($name='', $data=''){

	if(func_num_args()>1){

		$opts = get_params(func_get_args());

	}

	if(is_array($opts)){

		$code.="<select id='{$opts[0]}' name='{$opts[0]}' ";

		if(is_array($opts)){

			foreach($opts as $at => $val){

				if(!is_numeric($at)){

					$code.="$at = '".$val."' ";

				}

			}

		}

		$code.=">\r\n";

		if(is_array($opts[1])){

			if(is_object($opts[1][0])){



			} else {

				foreach($opts[1] as $key => $value){

					$code.="\t<option value='{$key}'>{$value}</option>\r\n";

				}

			}
			$code.= "</select>\r\n";

		}



	} else {

		$code.="<select id='$opts' name='$opts'>";

	}

	print $code;

}

Revisenlo y vean que les parece

En lo que me indiquen lo subo al SVN, saludos.

Comentarios

  • edited 10:30
    ...
    ...
    	              if(is_object($opts[1][0])){
    
    
    
    	              } 
    

    OK, dos cosas:

    Por que hay un if vacio?

    Por que imprime el codigo resultante, si la convencion es retornarlo?
  • edited 10:30
    Y ya que nos ponemos quisquillosos... <!-- s:twisted: --><img src="{SMILIES_PATH}/icon_twisted.gif" alt=":twisted:" title="Twisted Evil" /><!-- s:twisted: -->
    ¿Para qué sirve el segundo if en este fragmento?
    ...
    	if&#40;is_array&#40;$opts&#41;&#41;&#123;
    
    		$code&#46;=&quot;&lt;select id='&#123;$opts&#91;0&#93;&#125;' name='&#123;$opts&#91;0&#93;&#125;' &quot;;
    
    		if&#40;is_array&#40;$opts&#41;&#41;&#123;
    
  • edited 10:30
    Ese es el codigo que venia en tags.php

    Yo solo corregi las partes inherentes a los bugs, es decir yo no escribi el codigo completo, por lo tanto no conozco todo su funcionamiento.

    Con respecto a la convencion, creo que deberia ser aplicada cuando se cambie a 0.5 a los tags correspondientes, para evitar problemas. Tambien fui de los primeros que hablo de la convencion para los helpers en el foro (cuchillo para mi garganta).

    Si lo comparas con el codigo del actual tags.php notaras que no hay muchos cambios

    Saludos.
  • edited 10:30
    Ese es el codigo que venia en tags.php

    Yo solo corregi las partes inherentes a los bugs, es decir yo no escribi el codigo completo, por lo tanto no conozco todo su funcionamiento.

    Con respecto a la convencion, creo que deberia ser aplicada cuando se cambie a 0.5 a los tags correspondientes, para evitar problemas. Tambien fui de los primeros que hablo de la convencion para los helpers en el foro (cuchillo para mi garganta).

    Si lo comparas con el codigo del actual tags.php notaras que no hay muchos cambios

    Saludos.

    Ok Emilio, tranquilo, sin "cosquillas" jeje.

    Nos queda pendiente seguir corrigiendo ese metodo.
  • edited 10:30
    Si es solo una solucion temporal, hay que optimizarlo, la mayoria de las preguntas que me hicieron, tambien me las hice en su momento.
  • edited 10:30
    Optimicemoslo y lo subimos al svn corregido.

    Saludos
  • edited 10:30
    Optimicemoslo y lo subimos al svn corregido.

    Saludos

    Aqui dejo una version optimizada.
    function select_tag&#40;$name='', $data=''&#41;&#123;
       if&#40;func_num_args&#40;&#41;&gt;1&#41;&#123;
          $opts = get_params&#40;func_get_args&#40;&#41;&#41;;
          $code = &quot;&lt;select id='&#123;$opts&#91;0&#93;&#125;' name='&#123;$opts&#91;0&#93;&#125;' &quot;;      
    	  foreach&#40;$opts as $at =&gt; $val&#41;&#123;
    		 if&#40;!is_numeric&#40;$at&#41;&#41;&#123;
    		    $code&#46;= &quot;$at = '&quot;&#46;$val&#46;&quot;' &quot;;
    		 &#125;
    	  &#125;
          $code&#46;=&quot;&gt;\r\n&quot;;
          if&#40;is_array&#40;$opts&#91;1&#93;&#41;&#41;&#123;
             if&#40;!is_object&#40;$opts&#91;1&#93;&#91;0&#93;&#41;&#41;&#123;
                foreach&#40;$opts&#91;1&#93; as $key =&gt; $value&#41;&#123;
                   $code&#46;= &quot;\t&lt;option value='&#123;$key&#125;'&gt;&#123;$value&#125;&lt;/option&gt;\r\n&quot;;
    			&#125;
             &#125;
             $code&#46;= &quot;&lt;/select&gt;\r\n&quot;;
          &#125;
       &#125; else &#123;
          $code = &quot;&lt;select id='$opts' name='$opts'&gt;&quot;;
       &#125;
       return $code;
    &#125;
    
  • edited agosto 2007
    Detecte un pequeño bug, pero de resto esta muy bien.

    Bug: cuando se pasa solo un parametro, el que corresponde al id y name del select, como no se ha cargado opts y opts es un array siempre, entonces no sustituye correctamente.

    Aqui esta la correccion:
    function select_tag&#40;$name='', $data=''&#41;
    &#123;
    	if&#40;func_num_args&#40;&#41;&gt;1&#41;
    	&#123;
    		$opts = get_params&#40;func_get_args&#40;&#41;&#41;;
    		$code = &quot;&lt;select id='&#123;$opts&#91;0&#93;&#125;' name='&#123;$opts&#91;0&#93;&#125;' &quot;;     
    		
    		foreach&#40;$opts as $at =&gt; $val&#41;
    		&#123;
    			if&#40;!is_numeric&#40;$at&#41;&#41;
    			&#123;
    				$code&#46;= &quot;$at = '&quot;&#46;$val&#46;&quot;' &quot;;
    			&#125;
    		&#125;
    		
    		$code&#46;=&quot;&gt;\r\n&quot;;
    		
    		if&#40;is_array&#40;$opts&#91;1&#93;&#41;&#41;
    		&#123;
    			if&#40;!is_object&#40;$opts&#91;1&#93;&#91;0&#93;&#41;&#41;
    			&#123;
    				foreach&#40;$opts&#91;1&#93; as $key =&gt; $value&#41;
    				&#123;
    					$code&#46;= &quot;\t&lt;option value='&#123;$key&#125;'&gt;&#123;$value&#125;&lt;/option&gt;\r\n&quot;;
    				&#125;
    			&#125;
    			$code&#46;= &quot;&lt;/select&gt;\r\n&quot;;
    		&#125;
    	&#125;
    	else
    	&#123;
    		$code = &quot;&lt;select id='$name' name='$name'&gt;&quot;;
    	&#125;
    	
    	return $code;
    &#125;
    

    Muy buen trabajo roger. Saludos
  • edited 10:30
    Ok. Te recomiendo que coloques las llaves al lado de los if, ya que si pones la llave debajo incrementarás el numero de lineas espureamente, ademas colocar la llave al lado es casi un standard en muchos lenguajes.
  • edited 10:30
    Lo he revisado y me parece bien. Subelo al SVN. Recuerda que ya que esta el branch 0.5 en el SVN es necesario corregir los bugs tanto en la 0.4.x como en la 0.5.x por lo menos durante un buen tiempo hasta que 0.5 este estable.

    Saludos y buen trabajo
  • edited 10:30
    Gracias por las recomendaciones, lo de las llaves fue solo para hacerlo legible, lo estandarizare.

    Corregire entonces en las dos versiones.

    Saludos.
Sign In or Register to comment.