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 6:40
    ...
    ...
    	              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 6:40
    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 6:40
    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 6:40
    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 6:40
    Si es solo una solucion temporal, hay que optimizarlo, la mayoria de las preguntas que me hicieron, tambien me las hice en su momento.
  • Optimicemoslo y lo subimos al svn corregido.

    Saludos
  • edited 6:40
    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 6:40
    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.
  • 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 6:40
    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.