Foros del Web » Programando para Internet » PHP »

Transformar variable en amigable

Estas en el tema de Transformar variable en amigable en el foro de PHP en Foros del Web. Hola a todos, llevo tiempo intentando realizar una cosa y no hay manera. He buscado información en internet y tampoco la encuentro así que me ...
  #1 (permalink)  
Antiguo 03/11/2008, 15:24
 
Fecha de Ingreso: noviembre-2008
Mensajes: 25
Antigüedad: 15 años, 5 meses
Puntos: 0
Transformar variable en amigable

Hola a todos, llevo tiempo intentando realizar una cosa y no hay manera. He buscado información en internet y tampoco la encuentro así que me he decidido a enviarlo aqui con la esperanza de que alguno de vosotros pueda ayudarme.

El problema es el siguiente:

Tengo el siguiente código en la parte superior:

$sql_nav = "select cat_sub,cat_name from inl_cats where cat_id=$categoria_padre";
$categorias_nav = mysql_db_query($sql_db,$sql_nav);
$navbar[0] = $categoria_padre;
$c=1;
while(mysql_num_rows($categorias_nav) > 0){
$papa = mysql_result($categorias_nav,0,"cat_sub");
$navbar[$c] = $papa;
$sql_nav = "select cat_sub,cat_name from inl_cats where cat_id=$papa";
$categorias_nav = mysql_db_query($sql_db,$sql_nav);
$c++;
}
function dame_nombre($id){
global $cont , $sql_db;
$SQL = "select cat_name from inl_cats where cat_id=$id";
$categoria = mysql_db_query($sql_db,$SQL);
return mysql_result($categoria,0,"cat_name");
}

y luego tengo el siguiente código que muestra las categorías del directorio desde Inicio | Artes | Pintura etc. cada uno con su URL. Esto funciona correctamente.


<?
$arr = array_reverse ($navbar);
foreach($arr as $val){
if($val >0)
echo " | <a href=\"/empresas.php?cat=$val&title=".dame_nombre($val)."\ " class=\"navbar\">".dame_nombre($val)."</a> ";
}
?>


El problema esta en que no sé donde poner la variable .dame_nombre($val). en el código de debajo para que me la traduzca a amigable. (va apoyado junto con un .htaccess que funciona bien en otras partes del código).

$i = 0;
$total_subcat = intval(mysql_num_rows($subcategorias) / 3);
while($row = mysql_fetch_row($subcategorias)){
$ok = strtolower(strtr($row[0], "áéíóúñÁÉÍÓÚÑ", "aeiounaeioun"));
$find = array(' ', '&', '\r\n', '\n', '+');
$ok = str_replace ($find, '-', $ok);
$ok=str_replace("-de-", "-", $ok);
$ok=str_replace("-del-", "-", $ok);
$ok=str_replace("-en-", "-", $ok);
$ok=str_replace("-l-", "-", $ok);
$ok=str_replace("-y-", "-", $ok);
$ok=str_replace("-/-", "-", $ok);
$ok=str_replace("/.", ".", $ok);
$ok=str_replace("--","-",$ok);


No sé si me he explicado bien, el tema esta en que la variable .dame_nombre($val). sea filtrada nada más. Si lo hubiera echo con una variable &var si me funciona pero al tener puntos antes no sé que hacer.

Muchas gracias de antemano, espero hacerme entender.
  #2 (permalink)  
Antiguo 04/11/2008, 21:50
 
Fecha de Ingreso: septiembre-2006
Ubicación: Buenos Aires
Mensajes: 53
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Transformar variable en amigable

La verdad no entendí muy bien lo que queres hacer, pero por qué no pones tu sistema de traducción a url amigable en una función aparte:
function url2amigable($entrada){
$ok = strtolower(strtr($entrada, "áéíóúñÁÉÍÓÚÑ", "aeiounaeioun"));
$find = array(' ', '&', '\r\n', '\n', '+');
$ok = str_replace ($find, '-', $ok);
$ok=str_replace("-de-", "-", $ok);
$ok=str_replace("-del-", "-", $ok);
$ok=str_replace("-en-", "-", $ok);
$ok=str_replace("-l-", "-", $ok);
$ok=str_replace("-y-", "-", $ok);
$ok=str_replace("-/-", "-", $ok);
$ok=str_replace("/.", ".", $ok);
$ok=str_replace("--","-",$ok);
return $ok;
}

Así todo texto que necesites filtrar para luego expresarlo lo haces pasar por la función:
url2amigable(dame_nombre($val))
url2amigable($row[0])

Tal vez no era a lo que te referías, en ese caso te podríamos ayudar más si explicaras un poco más lo que pretendes hacer, como: cómo pensas expresar el resultado, etc.
__________________
mysql_query("SELECT * FROM Intenet WHERE "Una pagina de verdad" ORDER BY id ASC");
  #3 (permalink)  
Antiguo 05/11/2008, 11:36
 
Fecha de Ingreso: noviembre-2008
Mensajes: 25
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Transformar variable en amigable

Muchas gracias por la ayuda aenet, entre otras cosas tengo el problema de que lo que has convertido a función lo tenía repetido 6 veces, por lo que creo que la carga de la página se hacía mucho más pesada. Esta noche pruebo los cambios y comento haber si ha ido bien. Muchas gracias nuevamente!
  #4 (permalink)  
Antiguo 05/11/2008, 17:22
 
Fecha de Ingreso: noviembre-2008
Mensajes: 25
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Transformar variable en amigable

Buenas noches aenet, he intentado integrar la función que me comentas pero no lo consigo. Adjunto envío un ejemplo real que me funciona para ver como podría integrar la función. He buscado información sobre funciones en internet pero aún y todo no lo consigo realizar.


<?
$i = 0;
$total_subcat = intval(mysql_num_rows($subcategorias) / 3);
while($row = mysql_fetch_row($subcategorias)){
$ok = strtolower(strtr($row[0], "áéíóúñÁÉÍÓÚÑ", "aeiounaeioun"));
$find = array(' ', '&', '\r\n', '\n', '+');
$ok = str_replace ($find, '-', $ok);
$ok=str_replace("-de-", "-", $ok);
$ok=str_replace("-del-", "-", $ok);
$ok=str_replace("-en-", "-", $ok);
$ok=str_replace("-l-", "-", $ok);
$ok=str_replace("-y-", "-", $ok);
$ok=str_replace("-/-", "-", $ok);
$ok=str_replace("/.", ".", $ok);
$ok=str_replace("--","-",$ok);

if(mysql_num_rows($subcategorias) > 2){
if($i==0)echo "<td width=240 valign=\"top\">";
echo "<a href=\"/$row[2]/$ok.html \" class=\"cat\">$row[0]</a><SPAN class=\"cat-no\">&nbsp;($row[1])</span><br><br>";
if($i == $total_subcat ){echo "</td>";$i = -1;}
}else{
echo "<td width=240 valign=\"top\">";
echo "<a href=\"/$row[2]/$ok.html \" class=\"cat\">$row[0]</a><SPAN class=\"cat-no\">&nbsp;($row[1])</span>";
if($i == 2){echo "</tr>";$i = -1;}
}
$i++;
}
?>
  #5 (permalink)  
Antiguo 08/11/2008, 22:09
 
Fecha de Ingreso: septiembre-2006
Ubicación: Buenos Aires
Mensajes: 53
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Transformar variable en amigable

Mhh... qué raro, trabajé siempre con funciones y nunca tuve problemas con eso.
¿Estas poniendo la función fuera de todo while o if? para mayor seguridad pone la función al comienzo de la pagina, después del <?php al menos que tengas un session_start() por supuesto, iría después de éste, ja.

Código PHP:
<?php
function url2amigable($entrada){
$ok strtolower(strtr($entrada"áéíóúñÁÉÍÓÚÑ""aeiounaeioun"));
$find = array(' ''&''\r\n''\n''+'); 
$ok str_replace ($find'-'$ok);
$ok=str_replace("-de-""-"$ok);
$ok=str_replace("-del-""-"$ok);
$ok=str_replace("-en-""-"$ok);
$ok=str_replace("-l-""-"$ok);
$ok=str_replace("-y-""-"$ok);
$ok=str_replace("-/-""-"$ok);
$ok=str_replace("/.""."$ok);
$ok=str_replace("--","-",$ok);
return 
$ok;
}
 
$i 0;
$total_subcat intval(mysql_num_rows($subcategorias) / 3);
while(
$row mysql_fetch_row($subcategorias)){
if(
mysql_num_rows($subcategorias) > 2){
if(
$i==0)echo "<td width=240 valign=\"top\">";
echo 
"<a href=\"/$row[2]/".url2amigable($row[0]).".html \" class=\"cat\">$row[0]</a><SPAN class=\"cat-no\">&nbsp;($row[1])</span><br><br>";
if(
$i == $total_subcat ){echo "</td>";$i = -1;}
}else{
echo 
"<td width=240 valign=\"top\">";
echo 
"<a href=\"/$row[2]/".url2amigable($row[0]).".html \" class=\"cat\">$row[0]</a><SPAN class=\"cat-no\">&nbsp;($row[1])</span>";
if(
$i == 2){echo "</tr>";$i = -1;}

$i++;
}
?>
Supongo que con esto debería funcionar, y si no... me deja perplejo.

Otra cosa, generalmente lo que yo hago para transformar el texto en url amigable, si es que en el texto puedan aparecer signos raros aparte de ñ o acentos, como: " ? !%# y cosas así, para hacerla más corta, ya que la lista de signitos es interminable para reemplazarlos uno por uno, solo extraigo lo que sean palabras y números.
Mi función url2amigable() seria así:


Código PHP:
function url2amigable($entrada){
 
$sinegne=strtr($entrada,"áéíóúñÁÉÍÓÚÑ""aeiounaeioun");
       
preg_match_all("/([a-z0-9]+)/i"$sinegne$coincidenciasPREG_SET_ORDER);
   
$theWord="";
       foreach (
$coincidencias as $val) {
      
$theWord.=$val[1]."-";
       }
//end foreach
     
$theWord=preg_replace("/[\-]+/","-",$theWord);
     
$theWords=preg_replace("/-$/","",$theWord);
 return 
$theWords;

__________________
mysql_query("SELECT * FROM Intenet WHERE "Una pagina de verdad" ORDER BY id ASC");
  #6 (permalink)  
Antiguo 10/11/2008, 16:38
 
Fecha de Ingreso: noviembre-2008
Mensajes: 25
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Transformar variable en amigable

Buenas noches aenet, he probado el código que me has enviado y me funciona de maravilla. Lo único que tengo el siguiente código que tengo que transformar en amigable y no sé como ponerle la función que ya he creado para que lo transforme también. La variable que hay que transformar es: .dame_nombre($val).
Perdona por todas las molestias y muchisimas gracias por tu ayuda.

<?
$arr = array_reverse ($navbar);
foreach($arr as $val){
if($val >0)
echo " | <a href=\"/empresas.php?cat=$val&title=".dame_nombre($val)."\ " class=\"navbar\">".dame_nombre($val)."</a> ";
}
?>
  #7 (permalink)  
Antiguo 12/11/2008, 07:19
 
Fecha de Ingreso: septiembre-2006
Ubicación: Buenos Aires
Mensajes: 53
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Transformar variable en amigable

Así como está le agregas la función y listo, debería de funcionar.

echo " | <a href=\"/empresas.php?cat=$val&title=".url2amigable(dame_nombre($val))."\ " class=\"navbar\">".dame_nombre($val)."</a> ";

Igual el resto de esta url no esta en url amigable. Este es mi consepto de url amigable http://www.tufuncion.com/urls_amigables

Si lo único que queres es que los caracteres raros que ponga el usuario no interfieran con la correcta interpretacion de la url para el navegador, por qué no usas la función
urlencode() de php, que codifica la todos los signitos raros, acentos, ñ y toda la cosa.

Si bien esto no clasifica como url amigable, sirve para que el navegador interprete bien la url, pasa que no le veo el sentido solo codificar parte de la cadena en amigable, pero seguir usando la sintaxis del ?variable=valor
__________________
mysql_query("SELECT * FROM Intenet WHERE "Una pagina de verdad" ORDER BY id ASC");
  #8 (permalink)  
Antiguo 12/11/2008, 13:39
 
Fecha de Ingreso: noviembre-2008
Mensajes: 25
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Transformar variable en amigable

Funciona perfectamente!

No tengo palabras para agradecerte tu ayuda desinteresada,

muchisimas gracias aenet!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:03.