Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal

Search the Community

Showing results for tags 'complementos-mod'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • El núcleo de PHPost
    • Novedades e información
    • Off Topic
    • Presentaciones
  • PHPost Risus
    • Actualizaciones
    • Versión 1.1
    • Versión 1.2
  • La esquina
    • Rincón del PC
    • Rincón del móvil
  • Escuela de Actualización de Risus Phpost's PHP 7.X
  • Escuela de Actualización de Risus Phpost's Smarty
  • Escuela de Actualización de Risus Phpost's EXTRAS
  • Escuela de Actualización de Risus Phpost's Themes
  • Escuela de Actualización de Risus Phpost's Fixes
  • Escuela de Actualización de Risus Phpost's Actualizaciones

Calendars

There are no results to display.

There are no results to display.


Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


AIM


MSN


Sitio web


ICQ


Yahoo


Jabber


Skype


Localización


Intereses

Found 732 results

  1. Buenas tarde gente de phpost, a pedido de ellocoloco meta keywords y description Automaticas (Pedido) Decidí publicar este topic como dice el titulo Meta keywords y description automáticas de los posts. cap: Las tags del posts aparecerán automáticamente en el content de la etiqueta meta - keywords. Cap: Buena la instalación es muy sencilla solo van y abren el main_header.tpl y buscan esta linea: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Debajo de esa linea agregan la siguiente: <meta name="keywords" content="{foreach from=$tsPost.post_tags key=i item=tag}{$tag}{if $i < $tsPost.n_tags},{/if}{/foreach}" /> Listo con eso deberán de aparecer, bueno espero les guste y nos vemos en un próximo topic.
  2. Hola amigos de PHPost, después de bastante tiempo sin publicar, vengo con un MOD a pedido de Rengo, que consiste en que los invitados puedan comentar. A lo mejor hago una v2 que podría activar desde la admin si quieren que se pueda comentar, administrar antiflood, limite de comentarios por IP en un post... Pero esta v1 no es administrable, entre otras cosas, porque se iba a alargar demasiado la instalacion. Funciones de esta versión: - Los visitantes puede comentar los posts. - Anti-flood para visitantes (60 segundos entre cada comentario). - Deben introducir nombre y email. - Validador de email. - Solo el administrador pueden ver los emails. - Cuando un invitado comenta no aparecerá en el monitor. - Los comentarios de invitados se "fusionan" con los otros para la paginacion. - Arreglada paginacion de una manera "rustica" pero funcional. 1) Hacen esta SQL en su BD: ALTER TABLE `p_comentarios` ADD `c_anon` VARCHAR(200) NULL DEFAULT NULL ; 2) Abren el ajax.comentario.php de inc/php/ajax y buscan: 'comentario-preview' => array('n' => 2, 'p' => 'preview'), 'comentario-agregar' => array('n' => 2, 'p' => 'preview'), Y lo reemplazan por: 'comentario-preview' => array('n' => 0, 'p' => 'preview'), 'comentario-agregar' => array('n' => 0, 'p' => 'preview'), Luego buscan: $preview = array(0,$tsCore->parseBBCode($comentario),'',time(),$auser, $comentario, $_SERVER['REMOTE_ADDR']); Y reemplazas por: $preview = array(0,$tsCore->parseBBCode($comentario),'',time(),$auser, $comentario, $_SERVER['REMOTE_ADDR'], $tsCore->setSecure($_POST['na'])); 3) Abren el c.posts.php de inc/class y buscan: $q1 = mysql_fetch_row(mysql_query('SELECT COUNT(u.user_name) AS c FROM u_miembros AS u LEFT JOIN p_comentarios AS c ON u.user_id = c.c_user WHERE c.c_post_id = \''.(int)$post_id.'\' && c.c_status = \'0\' && u.user_activo = \'1\' && u.user_baneado = \'0\'')); Y lo reemplazan por: $q1 = mysql_fetch_row(mysql_query('SELECT COUNT(cid) FROM p_comentarios WHERE c_post_id = \''.(int)$post_id.'\' '.($tsUser->is_admod ? '' : ' AND c_status = \'0\'').'')); Mas abajo buscan: /* getComentarios() */ function getComentarios($post_id){ global $tsCore, $tsUser; // $start = $tsCore->setPageLimit($tsCore->settings['c_max_com']); $query = mysql_query('SELECT u.user_name, u.user_activo, u.user_baneado, c.* FROM u_miembros AS u LEFT JOIN p_comentarios AS c ON u.user_id = c.c_user WHERE c.c_post_id = \''.(int)$post_id.'\' '.($tsUser->is_admod ? '' : 'AND c.c_status = \'0\' AND u.user_activo = \'1\' && u.user_baneado = \'0\'').' ORDER BY c.cid LIMIT '.$start); // COMENTARIOS TOTALES $return['num'] = mysql_num_rows(mysql_query('SELECT cid FROM p_comentarios WHERE c_post_id = \''.(int)$post_id.'\' '.($tsUser->is_admod ? '' : 'AND c_status = \'0\'').'')); // $comments = result_array($query); // PARSEAR EL BBCODE $i = 0; foreach($comments as $comment){ // CON ESTE IF NOS AHORRAMOS CONSULTAS if($comment['c_votos'] != 0){ $query = mysql_query('SELECT voto_id FROM p_votos WHERE tid = \''.(int)$comment['cid'].'\' AND tuser = \''.$tsUser->uid.'\' AND type = \'2\' LIMIT 1'); $votado = mysql_num_rows($query); } else $votado = 0; // BLOQUEADO $return['block'] = mysql_num_rows(mysql_query('SELECT bid, b_user, b_auser FROM `u_bloqueos` WHERE b_user = \''.(int)$comment['c_user'].'\' AND b_auser = \''.$tsUser->uid.'\' LIMIT 1')); // $return['data'][$i] = $comment; $return['data'][$i]['votado'] = $votado; $return['data'][$i]['c_html'] = $tsCore->parseBadWords($tsCore->parseBBCode($return['data'][$i]['c_body']), true); $i++; } // return $return; } Y lo reemplazan por: /* getComentarios() */ function getComentarios($post_id){ global $tsCore, $tsUser; // $start = $tsCore->setPageLimit($tsCore->settings['c_max_com']); $query = mysql_query('SELECT u.user_name, u.user_activo, u.user_baneado, c.* FROM u_miembros AS u LEFT JOIN p_comentarios AS c ON u.user_id = c.c_user WHERE c.c_post_id = \''.(int)$post_id.'\' && c.c_user != \'0\' '.($tsUser->is_admod ? '' : 'AND c.c_status = \'0\' AND u.user_activo = \'1\' && u.user_baneado = \'0\'').' ORDER BY c.cid'); $comn = result_array($query); $queryanon = mysql_query('SELECT * FROM p_comentarios WHERE c_post_id = \''.(int)$post_id.'\' && c_user = \'0\' '.($tsUser->is_admod ? '' : 'AND c_status = \'0\'').' ORDER BY cid'); $comanon = result_array($queryanon); $i = 0; foreach($comanon as $coma){ $anon_datos = unserialize($coma['c_anon']); $comanon[$i]['anon'] = 1; $comanon[$i]['user_activo'] = 1; $comanon[$i]['user_name'] = $anon_datos['name']; $comanon[$i]['user_email'] = $anon_datos['email']; $i++; } // COMENTARIOS TOTALES $return['num'] = mysql_num_rows(mysql_query('SELECT cid FROM p_comentarios WHERE c_post_id = \''.(int)$post_id.'\' '.($tsUser->is_admod ? '' : ' AND c_status = \'0\'').'')); // $com = array_merge((array)$comn, (array)$comanon); // ORDENAR COMENTARIOS foreach ($com as $key => $row) { $aux[$key] = $row['cid']; } array_multisort($aux, SORT_ASC, $com); //COMO NO NOS VALIA LA FUNCION DEL SCRIPT, CREAMOS UN PROPIO SISTEMA $page = $_GET['page'] == 1 ? 0 : (int)$_GET['page']; $limits[0] = empty($page) ? 0 : (int) ((($page - 1) * $tsCore->settings['c_max_com'])); $limits[1] = $limits[0]+$tsCore->settings['c_max_com']-1; //LOS GUARDAMOS ORDENADITOS while($limits[0] <= $limits[1]){ if(!empty($com[$limits[0]])) $comments[] = $com[$limits[0]]; $limits[0]++; } // PARSEAR EL BBCODE $i = 0; foreach($comments as $comment){ // CON ESTE IF NOS AHORRAMOS CONSULTAS if($comment['c_votos'] != 0){ $query = mysql_query('SELECT voto_id FROM p_votos WHERE tid = \''.(int)$comment['cid'].'\' AND tuser = \''.$tsUser->uid.'\' AND type = \'2\' LIMIT 1'); $votado = mysql_num_rows($query); } else $votado = 0; // BLOQUEADO $return['block'] = mysql_num_rows(mysql_query('SELECT bid, b_user, b_auser FROM `u_bloqueos` WHERE b_user = \''.(int)$comment['c_user'].'\' AND b_auser = \''.$tsUser->uid.'\' LIMIT 1')); // $return['data'][$i] = $comment; $return['data'][$i]['votado'] = $votado; $return['data'][$i]['c_html'] = $tsCore->parseBadWords($tsCore->parseBBCode($return['data'][$i]['c_body']), true); $i++; } // return $return; } Por último en este archivo buscan: /* newComentario() */ function newComentario(){ global $tsCore, $tsUser, $tsActividad; // NO MAS DE 1500 CARACTERES PUES NADIE COMENTA TANTO xD $comentario = substr($_POST['comentario'],0,1500); $post_id = ($_POST['postid']); /* DE QUIEN ES EL POST */ $query = mysql_query('SELECT post_user, post_block_comments FROM p_posts WHERE post_id = \''.(int)$post_id.'\' LIMIT 1'); $data = mysql_fetch_assoc($query); /* COMPROBACIONES */ $tsText = preg_replace('# +#',"",$comentario); $tsText = str_replace("\n","",$tsText); if($tsText == '') return '0: El campo <b>Comentario</b> es requerido para esta operaci&oacute;n'; /* ------ */ $most_resp = $_POST['mostrar_resp']; $fecha = time(); // if($data['post_user']){ if($data['post_block_comments'] != 1 || $data['post_user'] == $tsUser->uid || $tsUser->is_admod || $tsUser->permisos['mocepc']){ if(empty($tsUser->is_admod) && $tsUser->permisos['gopcp'] == false) return '0: No deber&iacute;as hacer estas pruebas.'; // ANTI FLOOD $tsCore->antiFlood(); $_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'] ? $_SERVER['X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; if(!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) { die('0: Su ip no se pudo validar.'); } if(mysql_query('INSERT INTO `p_comentarios` (`c_post_id`, `c_user`, `c_date`, `c_body`, `c_ip`) VALUES (\''.(int)$post_id.'\', \''.$tsUser->uid.'\', \''.$fecha.'\', \''.$comentario.'\', \''.$_SERVER['REMOTE_ADDR'].'\')')) { $cid = mysql_insert_id(); //SUMAMOS A LAS ESTADÍSTICAS mysql_query('UPDATE w_stats SET stats_comments = stats_comments + 1 WHERE stats_no = \'1\''); mysql_query('UPDATE p_posts SET post_comments = post_comments + 1 WHERE post_id = \''.(int)$post_id.'\''); mysql_query('UPDATE u_miembros SET user_comentarios = user_comentarios + 1 WHERE user_id = \''.$tsUser->uid.'\''); // NOTIFICAR SI FUE CITADO Y A LOS QUE SIGUEN ESTE POST, DUEÑO $this->quoteNoti($post_id, $data['post_user'], $cid, $comentario); // ACTIVIDAD $tsActividad->setActividad(5, $post_id); // array(comid, comhtml, combbc, fecha, autor_del_post) if(!empty($most_resp)) return array($cid, $tsCore->parseBadWords($tsCore->parseBBCode($comentario), true),$comentario, $fecha, $_POST['auser'], '', $_SERVER['REMOTE_ADDR']); else return '1: Tu comentario fue agregado satisfactoriamente.'; } else return '0: Ocurri&oacute; un error int&eacute;ntalo m&aacute;s tarde.'; } else return '0: El post se encuentra cerrado y no se permiten comentarios.'; } else return '0: El post no existe.'; } Y lo reemplazan por: /* newComentario() */ function newComentario(){ global $tsCore, $tsUser, $tsActividad; // NO MAS DE 1500 CARACTERES PUES NADIE COMENTA TANTO xD $comentario = substr($_POST['comentario'],0,1500); $post_id = ($_POST['postid']); $anon = $tsUser->uid > 0 ? NULL : 1; /* COMENTARIOS DE VISITANTES */ if($anon){ if(filter_var($_POST['em'], FILTER_VALIDATE_EMAIL)) $anon = serialize(array('email' => $tsCore->setSecure($_POST['em']), 'name' => $tsCore->setSecure($_POST['na']))); elseif(empty($_POST['em']) || empty($_POST['na'])) return '0: Rellene todos los campos'; else return '0: Introduzca un email v&aacute;lido'; } /* DE QUIEN ES EL POST */ $query = mysql_query('SELECT post_user, post_block_comments FROM p_posts WHERE post_id = \''.(int)$post_id.'\' LIMIT 1'); $data = mysql_fetch_assoc($query); /* COMPROBACIONES */ $tsText = preg_replace('# +#',"",$comentario); $tsText = str_replace("\n","",$tsText); if($tsText == '') return '0: El campo <b>Comentario</b> es requerido para esta operaci&oacute;n'; /* ------ */ $most_resp = $_POST['mostrar_resp']; $fecha = time(); // if($data['post_user']){ if($data['post_block_comments'] != 1 || $data['post_user'] == $tsUser->uid || $tsUser->is_admod || $tsUser->permisos['mocepc']){ if(empty($tsUser->is_admod) && $tsUser->permisos['gopcp'] == false && $anon == NULL) return '0: No deber&iacute;as hacer estas pruebas.'; // ANTI FLOOD $tsCore->antiFlood(); $_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'] ? $_SERVER['X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; if(!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) { die('0: Su ip no se pudo validar.'); } if(mysql_query('INSERT INTO `p_comentarios` (`c_post_id`, `c_user`, `c_date`, `c_body`, `c_ip`, `c_anon`) VALUES (\''.(int)$post_id.'\', \''.$tsUser->uid.'\', \''.$fecha.'\', \''.$comentario.'\', \''.$_SERVER['REMOTE_ADDR'].'\', \''.$anon.'\')')) { $cid = mysql_insert_id(); //SUMAMOS A LAS ESTADÍSTICAS mysql_query('UPDATE w_stats SET stats_comments = stats_comments + 1 WHERE stats_no = \'1\''); mysql_query('UPDATE p_posts SET post_comments = post_comments + 1 WHERE post_id = \''.(int)$post_id.'\''); if($anon == NULL) mysql_query('UPDATE u_miembros SET user_comentarios = user_comentarios + 1 WHERE user_id = \''.$tsUser->uid.'\''); // NOTIFICAR SI FUE CITADO Y A LOS QUE SIGUEN ESTE POST, DUEÑO if($anon == NULL) $this->quoteNoti($post_id, $data['post_user'], $cid, $comentario); // ACTIVIDAD $tsActividad->setActividad(5, $post_id); // array(comid, comhtml, combbc, fecha, autor_del_post) if(!empty($most_resp)) return array($cid, $tsCore->parseBadWords($tsCore->parseBBCode($comentario), true),$comentario, $fecha, $_POST['auser'], '', $_SERVER['REMOTE_ADDR'], $tsCore->setSecure($_POST['na'])); else return '1: Tu comentario fue agregado satisfactoriamente.'; } else return '0: Ocurri&oacute; un error int&eacute;ntalo m&aacute;s tarde.'; } else return '0: El post se encuentra cerrado y no se permiten comentarios.'; } else return '0: El post no existe.'; } 4) Abren el c.core.php de inc/class y buscan: $limit = $tsUser->permisos['goaf']; Y lo reemplazas por: $limit = empty($tsUser->permisos['goaf']) ? 60 : $tsUser->permisos['goaf']; 5) Abren el t.posts.tpl de themes/TUTEMA/templates y buscan: {if !$tsUser->is_member} <div class="emptyData clearfix"> Para poder comentar necesitas estar <a onclick="registro_load_form(); return false" href="">Registrado.</a> O.. ya tienes usuario? <a onclick="open_login_box('open')" href="#">Logueate!</a> </div> {elseif $tsPost.block > 0} <div class="emptyData clearfix"> &iquest;Te has portado mal? {$tsPost.user_name} te ha bloqueado y no podr&aacute;s comentar sus post. </div> {/if} Y lo reemplazan por: {if $tsPost.block > 0} <div class="emptyData clearfix"> &iquest;Te has portado mal? {$tsPost.user_name} te ha bloqueado y no podr&aacute;s comentar sus post. </div> {/if} 6) Abren el m.post_comments.tpl de themes/TUTEMA/templates/modules y buscan: {elseif $tsUser->is_admod == 0 && $tsUser->permisos.gopcp == false} Y lo reemplazan por: {elseif $tsUser->is_admod == 0 && $tsUser->permisos.gopcp == false && $tsUser->is_member} Luego buscan: {elseif $tsUser->is_member && ($tsPost.post_block_comments != 1 || $tsPost.post_user == $tsUser->uid || $tsUser->is_admod || $tsUser->permisos.gopcp) && $tsPost.block == 0} Y lo reemplazan por: {elseif ($tsPost.post_block_comments != 1 || $tsPost.post_user == $tsUser->uid || $tsUser->is_admod || $tsUser->permisos.gopcp) && $tsPost.block == 0} 7) Abren el m.post_comments_form.tpl de themes/TUTEMA/templates/modules y buscan: <textarea id="body_comm" class="onblur_effect autogrow" tabindex="1" title="Escribir un comentario..." style="resize:none;" onfocus="onfocus_input(this)" onblur="onblur_input(this)">Escribir un comentario...</textarea> Y ARRIBA agregan: {if !$tsUser->is_member} <input type="text" id="na" name="na" placeholder="Nombre" /> <input type="text" id="em" name="em" placeholder="Email" /> {/if} 8) Abren el p.comentario.ajax.tpl de themes/TUTEMA/templates/t.php_files y buscan: <a href="{$tsConfig.url}/perfil/{$c.user_name}" class="nick">{$c.user_name}</a> {if $tsUser->is_admod}(<span style="color:red;">IP:</span> <a href="{$tsConfig.url}/moderacion/buscador/1/1/{$c.c_ip}" class="geoip" target="_blank">{$c.c_ip}</a>){/if} dijo Y lo reemplazan por: {if $c.anon}<b>{$c.user_name}</b> {if $tsUser->is_admod}({$c.user_email}){if $tsUser->is_admod}(<span style="color:red;">IP:</span> <a href="{$tsConfig.url}/moderacion/buscador/1/1/{$c.c_ip}" class="geoip" target="_blank">{$c.c_ip}</a>){/if}{/if}{else}<a href="{$tsConfig.url}/perfil/{$c.user_name}" class="nick">{$c.user_name}</a> {if $tsUser->is_admod}(<span style="color:red;">IP:</span> <a href="{$tsConfig.url}/moderacion/buscador/1/1/{$c.c_ip}" class="geoip" target="_blank">{$c.c_ip}</a>){/if}{/if} dijo Luego buscan: {if $tsUser->is_member} <div class="floatR answerOptions" id="opt_{$c.cid}"> Y lo reemplazan por: {if !$tsUser->is_member} <div class="floatR answerOptions" id="opt_{$c.cid}"> <ul id="ul_cmt_{$c.cid}"> {*if $tsUser->info.user_rango || $tsUser->info.user_rango_post != 3*} <li class="numbersvotes" {if $c.c_votos == 0}style="display: none"{/if}> <div class="overview"> <span class="{if $c.c_votos >= 0}positivo{else}negativo{/if}" id="votos_total_{$c.cid}">{if $c.c_votos != 0}{if $c.c_votos >= 0}+{/if}{$c.c_votos}{/if}</span> </div> </li> </ul> </div> {/if} {if $tsUser->is_member} <div class="floatR answerOptions" id="opt_{$c.cid}"> 9) Abren el p.comentario.preview.tpl de themes/TUTEMA/templates/t.php_files y buscan: <a href="{$tsConfig.url}/perfil/{$tsUser->nick}" class="nick">{$tsUser->nick}</a> {if $tsUser->is_admod}(<span style="color:red;">IP:</span> <a href="{$tsConfig.url}/moderacion/buscador/1/1/{$tsComment.6}" class="geoip" target="_blank">{$tsComment.6}</a>){/if} dijo Y lo reemplazan por: {if $tsUser->is_member}<a href="{$tsConfig.url}/perfil/{$tsUser->nick}" class="nick">{$tsUser->nick}</a>{else}<b>{$tsComment.7}</b>{/if} {if $tsUser->is_admod}(<span style="color:red;">IP:</span> <a href="{$tsConfig.url}/moderacion/buscador/1/1/{$tsComment.6}" class="geoip" target="_blank">{$tsComment.6}</a>){/if} dijo 10) Abren el funciones.js de themes/TUTEMA/js y buscan: data: 'comentario=' + encodeURIComponent(text) + '&postid=' + gget('postid') + '&mostrar_resp=' + mostrar_resp + '&auser=' + auser, Y lo reemplazan por: data: 'comentario=' + encodeURIComponent(text) + '&postid=' + gget('postid') + '&mostrar_resp=' + mostrar_resp + '&auser=' + auser + '&em=' + $('#em').val() + '&na=' + $('#na').val(), Luego buscan: data: 'comentario=' + encodeURIComponent(text) + '&auser=' + auser, Y lo reemplazan por: data: 'comentario=' + encodeURIComponent(text) + '&auser=' + auser + '&na=' + $('#na').val(), Y listoo!! Caps: Úsenlo bajo su responsabilidad. Saludos
  3. Con este mod, podremos permitir que el usuario suba imágenes a nuestro servidor, cabe aclarar que para evitar saturar el espacio donde reside el sistema operativo, es recomendable asignar el alojamiento de imágenes en una partición diferente. También recomiendo hacer un backup siempre de los archivos a editar, pasemos entonces con el tutorial: Como primer paso vamos al directorio raíz donde reside nuestra web. Tenemos que crear un directorio llamado imágenes y dentro de este otro directorio llamado tmp en la captura se muestra como debe quedar. Luego en el directorio imágenes que acabamos de generar, vamos a crear un archivo llamado subir.php y le pegamos el siguiente código: <?php $varrand = substr(md5(uniqid(rand())),0,10); $varallw = array("image/bmp","image/gif","image/jpeg","image/pjpeg","image/png","image/x-png"); $varpath = "http://192.168.1.25/imagenes/tmp/"; $varstat = ""; if (isset($_POST["action"]) == "upload") { if (is_uploaded_file($_FILES["imagen"]["tmp_name"])) { $varname = $_FILES["imagen"]['name']; $vartemp = $_FILES['imagen']['tmp_name']; $vartype = mime_content_type($vartemp); if (in_array($vartype, $varallw) && $varname != "") { $arrname = explode(".", $varname); $varname = $varrand.".".$arrname[1]; if (copy($vartemp, "tmp/".$varname)) { $varpath = $varpath.$varname; $varstat = "ok"; } else { $varstat = "Error al subir el archivo"; } } else { $varstat = "Archivo no valido"; } } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link href="cssupload.css" rel="stylesheet" type="text/css" /> </head> <body> <table width="420" border="0" align="left" cellpadding="0" cellspacing="0"> <tr> <td class="text"><b>Subir Imagen: (recomendada 800x600 caso cantrario sera redimensionada)</b></td> </tr> <tr> <form action="subir.php" method="post" enctype="multipart/form-data"> <td height="50" valign="top" class="text"> <input name="imagen" type="file" class="casilla" id="imagen" size="35" /> <input name="enviar" type="submit" class="boton" id="enviar" value="Subir" /> <input name="action" type="hidden" value="upload" /> </td> </form> </tr> <?php if ($varstat == "ok") { ?> <tr> <td class="textinf"><strong>Imagen subida satisfactoriamente, copia el codigo y puedes subir otra imagen!</strong><br> <br> <strong>Codigo para tu post: </strong><br> <input name='txt2' type='text' value='[img=<?php echo $varpath; ?>]' size='60'></td> </tr> <?php } else { ?> <?php if ($varstat != "") { ?> <tr> <td class="textinf"><strong>Error:</strong><br> <?php echo $varstat; ?>&nbsp;</td> </tr> <?php } ?> <?php } ?> </table> <?php if ($varstat == "ok") { ?> <p align="left"><img width="270" height="180" src="tmp/<?php echo $varname; ?>"></p> <?php } ?> <?php if (isset($_GET['image']) != "") { ?> <p align="left"><img src="tmp/<?php echo $_GET['image']; ?>"></p> <?php } ?> </body> </html> Observen la siguiente linea del código: $varpath = "http://192.168.1.25/imagenes/tmp/"; Deberán cambiar http://192.168.1.25 por el nombre de su dominio o IP Por ejemplo un típico caso seria este: http://www.tuweb.com/imagenes/tmp/ En el mismo directorio imágenes, vamos creamos otro archivo llamado cssupload.css y le pegamos el siguiente código tal cual está: .titulo { font-family: "Trebuchet MS", Verdana; font-size: 18px; font-weight: bolder; color: #990000; text-decoration: none; border-top-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-bottom-style: solid; border-top-color: #D4D0C8; border-bottom-color: #D4D0C8; text-align: left; padding-left: 30px; } .casilla { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: normal; color: #666666; text-decoration: none; border: 1px solid #D4D0C8; } .boton { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: normal; color: #000000; text-decoration: none; vertical-align: middle; } .subtitulo { font-family: "Trebuchet MS", Verdana; font-size: 16px; font-weight: bolder; color: #999999; text-decoration: none; text-align: left; padding-left: 30px; border-top-width: 1px; border-top-style: solid; border-top-color: #D4D0C8; } .infsub { font-family: "Trebuchet MS", Verdana; text-decoration: none; border-top-width: 1px; border-top-style: solid; border-top-color: #D4D0C8; } .text { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: normal; color: #999999; text-decoration: none; text-align: left; padding-left: 30px; padding-top: 10px; } .link { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: bolder; color: #990000; text-decoration: none; text-align: center; } a.link:hover { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: bolder; color: #990000; text-decoration: underline; text-align: center; } .linkli { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: normal; color: #0000C0; text-decoration: none; } a.linkli:hover { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: normal; color: #0000C0; text-decoration: underline; } img { border: 1px solid #D4D0C8; padding: 5px; margin: 5px; } .textinf { font-family: "Trebuchet MS", Verdana; font-size: 12px; font-weight: normal; color: #999999; text-decoration: none; text-align: left; padding-left: 30px; padding-top: 10px; border-top-width: 1px; border-top-style: solid; border-top-color: #D4D0C8; } Una vez realizado lo anterior nos disponemos a editar el archivo m.agregar_sidebar.tpl que se encuentra en /themes/TU-TEMA/templates/modules y buscamos en el código esto: <div id="fileinputs" class="inputs floatL"> <input type="file" name="img1" /> <input type="file" name="img2" /> <input type="file" name="img3" /> <input type="file" name="img4" /> <input type="file" name="img5" /> <input type="submit" class="mBtn btnYellow" value="Subir Im&aacute;genes" /> </div> Y lo remplazan por esto: <center><iframe src="/imagenes/subir.php" width="80%" height="220 "frameBorder="0" scrolling="yes"></iframe></center> En estas capturas pueden ver el archivo antes de editarlo: Y después: Eso seria todo ya con eso tendrán su propio host de imágenes funcionando. En el caso que dispongas de un servidor GNU/Linux mediante un script podemos asignarle una resolución máxima a las imágenes que estamos alojando. El código seria el siguiente: #!/bin/bash # # antes instalar imagemagick # apt-get install imagemagick # PATRON='*.[bB][mM][pP] *.[gG][iI][fF] *.[jJ][pP][eE][gG] *.[jJ][pP][gG] *.[pP][nN][gG]' RUTA='/opt/lampp/htdocs/imagenes/tmp' cd $RUTA for IMG in `ls $PATRON 2>/dev/null`; do let width=$(identify -format %w $IMG) #let height=$(identify -format %h $IMG) if [ "$width" -gt "800" ]; then convert -sample 50%X50% -quality 85 $IMG $IMG fi done Lo que hace el script en buscar en el directorio donde están las imágenes, hay que poner su ruta completa, (cada uno debe cambiar la variable RUTA acorde a su caso) y si su ancho es más de 800 píxeles la reduce a la mitad, manteniendo la proporción de la misma, y bajando la calidad a un 85%. Haciendo uso del usuario root, o otro con privilegios administrativos, creamos este script en un lugar de nuestra conveniencia, en mi caso en /root con el nombre redimensiona-v-formatos.sh y le damos permisos de ejecución. chmod u+x /root/redimensiona-v-formatos.sh Para automatizar este script agregamos una tarea en nuestro cron de manear a que el script corra cara 5 minutos. Editamos el archivo crontab nano -B /etc/crontab Y al final del archivo agregamos la tarea programada, que hace correr el script cada 5 minutos. 00 5 * * 0 root /root/redimensiona-v-formatos.sh Comprobamos los resultados: La imagen se subió con el siguiente tamaño: Y luego el script se encargo de redimensionarla correctamente: Fuentes de conocimiento: http://to-up.net/posts/modulo/13/-MOD-Host-de-imagenes-integrado-V1-0.html http://www.descubriendolinux.com.ar/2009/03/como-cambiar-la-resolucion-de-muchas-imagenes/ http://www.adslayuda.com/modules/Linux/redimensionar_imagenes_src.txt
  4. Hola, el tuto será breve es para agilizar sus webs con este plugin que carga las imágenes por ajax reduciendo considerablemente el tiempo de carga de sus webs en la home. primero se van al archivo main_header.tpl que está en templates/sections y debajo de: <script src="{$tsConfig.js}/funciones.js" type="text/javascript"></script> Agregar: <script src="{$tsConfig.js}/jquery.lazyload.min.js"></script> Un poco mas abajo buscan: $(document).ready(function(){ // {/literal} Agregan debajo: {if $tsPage == '' || $tsPage == 'home' } $("img.LL").lazyload(); {/if} Ahora se van al archivo donde tienen las portadas de los posts en la sección ultimos posts que por lo general es el archivo m.home_last_posts.tpl que se encuentra en templates/modules y buscaran ahí la etiqueta <img> que contiene la url de la portada y se fijaran en su atributo src lo reemplazarán por data-oiginal y el atributo class (si no lo tiene, agregar) le añadirán la clase LL (si le quieren colocar otro nombre a la clase también deberán cambiársela en la función jQuery del paso anterior); quedaría de la siguiente forma: Antes: <img class="Portada" src="{$p.post_portada}" width="45" height="45"> Después: <img class="Portada LL" data-original="{$p.post_portada}" width="45" height="45"> Por último descarguen este archivo y lo guardan como jquery.lazyload.min.js en la carpeta js de su theme. AQUÍ. (Click derecho > Guardar como) Y listo, con esto cuando entren solo en la home se activará el plugin y notaran que cargan las imágenes poco a poco. La demo del mod se las puedo dejar de la versión mobile que hice para este script ya que le agregué este plugin para cargas las imágenes de las portadas e imagenes de la sección "fotos". AQUÍ. PDATA: Si quieren un efecto de "desvanecido" al cargar las imágenes en el main_header cambiarían el segundo paso por esto: {if $tsPage == '' || $tsPage == 'home' } {literal} $("img.LL").lazyload({ effect : "fadeIn" }); {/literal} {/if} PDATA2: Si quieren aplicar este mod para imágenes dentro de un posts pasense por acá: http://www.phpost.net/?showtopic=27423 Bueno, esto fue a pedido de frish espero le sea de mucha ayuda y les funcione correctamente. Cualquier duda dejen su comentario y les ayudaré en cuanto pueda.
  5. Buenas a todos gente, les traigo esta V1 de la sección de archivos para sus webs. Ya varios han visto mis avances y saben mas o menos de que se trata de igual forma les explico brevemente. Esta es una nueva sección para su web donde los usuarios registrados podrán subir sus archivos a su web alojados en su hosting. AVISO IMPORTANTE Este mod puede que consuma muchos recursos de su hosting asi que recomiendo que solo lo instalen si es pago, de lo contrario no se los recomiendo. Nota: No me hago responsable de cualquier fallo en su web por alguna mala instalación, sobrecarga de hosting free o limitado, suspensión de su cuenta (ya sea por el contenido que se sube). Les recomiendo visitar este topic si quieren aumentar el tamaño máximo de archivos permitido a subir a sus hosting. 1. en la raiz de su web, el archivo .htaccess buscar: # ADMIN agregar arriba de eso: # ARCHIVOS RewriteRule ^files/$ inc/php/files.php?action=user [QSA,L] RewriteRule ^files/([0-9]+)/([A-Za-z0-9_-]+)$ inc/php/files.php?action=ver&fileid=$1 [QSA,L] RewriteRule ^files/bajar/([0-9]+)/([A-Za-z0-9_-]+)$ inc/php/files.php?action=bajar&fileid=$1 [QSA,L] RewriteRule ^files/([A-Za-z0-9_-]+)$ inc/php/files.php?action=user&userid=$1 [QSA,L] RewriteRule ^files/([A-Za-z0-9_-]+)/([0-9]+)/([A-Za-z0-9_-]+)$ inc/php/files.php?action=user&userid=$1&folderid=$2 [QSA,L] RewriteRule ^files/([A-Za-z0-9_-]+)/pagina([0-9]+)$ inc/php/files.php?action=user&userid=$1&page=$2 [QSA,L] 2. en c.core.php que está en inc/class buscar: // SOLO SMILES Agregar arriba: // FILES case 'files': // RESTRICTIONS $parser->restriction = array('url', 'quote', 'size', 'color', 'b', 'i', 'u', 'align'); // CONVERTIMOS $html = $parser->parseString($bbcode); // SMILES $html = $parser->parseSmiles($html, $this->settings['default'].'/images/smiles/'); // MENCIONES $html = $this->setMenciones($html); break; 3. Vamos a head_menu.tpl y debajo de: {if $tsConfig.c_fotos_private == '1' && !$tsUser->is_member}{else} <li class="tabbed {if $tsPage == 'fotos'}here{/if}" id="tabbedfotos"> <a title="Ir a Fotos" onclick="menu('fotos', this.href); return false;" href="{$tsConfig.url}/fotos/">Fotos <img alt="Drop Down" src="{$tsConfig.tema.t_url}/images/arrowdown.png"></a> </li> {/if} Agregamos: <li class="tabbed {if $tsPage == 'files'}here{/if}" id="tabbedfiles"> <a title="Subir archivos" onclick="menu('files', this.href); return false;" href="{$tsConfig.url}/files/">Upload <img alt="Drop Down" src="{$tsConfig.tema.t_url}/images/arrowdown.png"></a> </li> 4. En head_submenu.tpl buscamos: <div id="subMenuTops" class="subMenu {if $tsPage == 'tops'}here{/if}"> Arriba de eso agregamos: <div id="subMenuFiles" class="subMenu {if $tsPage == 'files'}here{/if}"> <ul class="floatL tabsMenu"> <li{if $tsAction == '' && $tsAction != 'favoritos' && $tsAction != 'faqs'} class="here"{/if}><a href="{$tsConfig.url}/files/">Inicio</a></li> {if $tsUser->is_member} <li{if $tsAction == 'favoritos'} class="here"{/if}><a href="{$tsConfig.url}/files/favoritos/">Favoritos</a></li> {/if} <li{if $tsAction == 'faqs'} class="here"{/if}><a href="{$tsConfig.url}/files/faqs/">FAQs</a></li> </ul> <div class="clearBoth"></div> </div> 5. Suben todos los archivos a sus respectivas carpetas, por defecto está para el tema default pero el diseño es compatible con cualquier tema y solo basta por cambiar el nombre de la carpeta "default" en la decarga por el nombre de su tema para que suban los archivos en la ubicacion correcta de su tema. 6. Hacen la consulta del archivo SQL_files.sql o la importan en su phpMyAdmin. Por ahora esa es toda la instalación, la V2 se solucionaran algunos errores y se añadiran funciones tales como: Porcentaje de carga de archivos (a ultima hora no funciona y no se cual es el problema). Notificaciones completas (incluyendo citar comentarios o responder comentario). reproductor de vídeo básico (si es posible). Administración de archivos. Permisos de usuarios para subir archivos (si lo desean). Y entre otras funciones que se me puedan ocurrir o ustedes me sugieran. DEMO Archivo público el cual pueden verlo y descargarlo sin estar registrado. Aqui Archivo de audio que se puede reproducir. Aqui Si quieren testear todas las funciones se registran y suben los archivos. Link: http://www.mega.co.nz#!25hyzaoB!trsujSyDeBynMvSRqZe6DiVWlxnQs_Kf8RrEStX7n6E Cito de nuevo : Cualquier otro problema no mencionado, coméntenmelo para mejoras de la próxima versión. Espero les sirva de mucho y les guste a todos, nos vemos en otro aporte.
  6. Bueno gente, esta vez les traigo una versión full para poder visualizar las imágenes KN3 en los posts según lo prometido, se fixeo un bbcode ya que no lo tuve en cuenta en la implementacion anterior, hay que tener en cuenta que no se recomienda usarlo en un server gratuito ya que les consumirá mas recursos de los común, se recomienda un server del tipo pago, en esta version se agrega también el archivo que genera la imagen, bueno sin mas que decir les dejo la instalacion: ATENCION 1 Es importante instalar el fix de seguridad que saco Rhuan para que funcione correctamente antes que todo, aquí les dejo el enlace: ATENCION 2 Si tienen un servidor gratuito y quieren implementarlo pueden utilizar el link de mi server, ya que es un proyecto con mucha vida por delante todavia y pueden estar tranquilos de que no se caera de un dia para el otro y al mismo tiempo es un servidor que soporta una gran cantidad de trafico, para hacer esto es facil, en el paso 2 donde dice $server=$_SERVER['SERVER_NAME']; Remplazar por: $server="http://www.mega-descarga.com"; De esta manera no hace falta realizar los pasos 7, 8 y 9. INSTALACION: 1. Abrimos bbcode.inc.php (inc/ext/bbcode.inc.php) y buscamos: /** * @name complexParse(&$st) * @access private * @description Reemplaza los BBCodes complejos */ 2. Justo arriba de esto pegamos: /** * @name check_kn3($image) * @access private * @description Visualizar Imagenes KN3 by Kocibux */ private function check_kn3($image){ if(strpos($image,"kn3.net")){ $server=$_SERVER['SERVER_NAME']; $image=$server."/image/".base64_encode($image); } return "<img src=\"$image\" onload=\"if(this.width > 735) {this.width=735}\" />"; } 3. En este mismo archivo buscamos: array("img", "/(?i)\[img\=(http|https|ftp|irc|ed2k|gopher|telnet)?(\:\/\/)?([^\<\>[:space:]]+)\]/i", "<img src=\"\\1\\2\\3\" onload=\"if(this.width > 735) {this.width=735}\" />"), 4. Lo remplazamos por: array("img", "/(?i)\[img\=(http|https|ftp|irc|ed2k|gopher|telnet)?(\:\/\/)?([^\<\>[:space:]]+)\]/e", '$this->check_kn3("\\1\\2\\3")'), 5. En este mismo archivo buscamos (Una vez Aplicada la actualizacion de Rhuan): array("img", "/(?i)(\[img\])(http|https|ftp|irc|ed2k|gopher|telnet)?(\:\/\/)?([^\<\>[:space:]]+?)(\[\/img\])/i", "<img src=\"\\2\\3\\4\" onload=\"if(this.width > 735) {this.width=735}\" />"), 6. Lo remplazamos por: array("img", "/(?i)(\[img\])(http|https|ftp|irc|ed2k|gopher|telnet)?(\:\/\/)?([^\<\>[:space:]]+?)(\[\/img\])/e", '$this->check_kn3("\\2\\3\\4")'),7. Accedemos al .htaccess y buscamos: RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([0-9]+)$ inc/php/$1.php?action=$2&id=$3 [QSA,L] 8. Abajo agregamos la siguiente linea: RewriteRule ^image/([A-Za-z0-9_-]+) inc/php/image.php?image=$1 [QSA,L] 9.Subimos el siguiente archivo a /inc/php/https://mega.co.nz/#!pYMEzKzK!GrawjUMws4KexywyW44HKNMtz95X23wd8xQVMCT4IEc y Wala... Si necesitan una demo pueden verla funcionando aca, la primer imagen que aparece en este post es KN3, veran como se visualiza correctamente (http://k33.kn3.net/0/2/6/A/9/3/DC5.png): http://www.mega-desc...-Descargas.html
  7. Hola vengo a re-subir este mod que pedían, créditos a MegaErick ya que lo saque de su theme 1) hacen lo que dice esta imagen 2) abren c.posts.php ubicado en inc/class buscan $postData = array( 'date' => time(), 'title' => $tsCore->parseBadWords($tsCore->setSecure($_POST['titulo'], true)),2, 'body' => $tsCore->setSecure($_POST['cuerpo']), 'tags' => $tsCore->parseBadWords($tsCore->setSecure($_POST['tags'], true)),true,1, 'category' => intval($_POST['categoria']), debajo agregan 'imgport' => $tsCore->setSecure($_POST['imgport']), después buscan // INSERTAMOS $_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'] ? $_SERVER['X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; if(!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) { die('0: Su ip no se pudo validar.'); } if(mysql_query('INSERT INTO `p_posts` (post_user, post_category, post_title, post_body, post_date, post_tags, post_ip, post_private, post_block_comments, post_sponsored, post_sticky, post_smileys, post_visitantes, post_status) VALUES (\''.$tsUser->uid.'\', \''.(int)$postData['category'].'\', \''.$postData['title'].'\', \''.$postData['body'].'\', \''.$postData['date'].'\', \''.$postData['tags'].'\', \''.$_SERVER['REMOTE_ADDR'].'\', \''.(int)$postData['private'].'\', \''.(int)$postData['block_comments'].'\', \''.(int)$postData['sponsored'].'\', \''.(int)$postData['sticky'].'\', \''.(int)$postData['smileys'].'\', \''.(int)$postData['visitantes'].'\', '.(!$tsUser->is_admod && ($tsCore->settings['c_desapprove_post'] == 1 || $tsUser->permisos['gorpap'] == true) ? '\'3\'' : '\'0\'').')')) { remplazan por // INSERTAMOS $_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'] ? $_SERVER['X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; if(!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) { die('0: Su ip no se pudo validar.'); } if(mysql_query('INSERT INTO `p_posts` (post_user, post_category, post_title, post_body, post_date, post_tags, post_imgport, post_ip, post_private, post_block_comments, post_sponsored, post_sticky, post_smileys, post_visitantes, post_status) VALUES (\''.$tsUser->uid.'\', \''.(int)$postData['category'].'\', \''.$postData['title'].'\', \''.$postData['body'].'\', \''.$postData['date'].'\', \''.$postData['tags'].'\', \''.$postData['imgport'].'\', \''.$_SERVER['REMOTE_ADDR'].'\', \''.(int)$postData['private'].'\', \''.(int)$postData['block_comments'].'\', \''.(int)$postData['sponsored'].'\', \''.(int)$postData['sticky'].'\', \''.(int)$postData['smileys'].'\', \''.(int)$postData['visitantes'].'\', '.(!$tsUser->is_admod && ($tsCore->settings['c_desapprove_post'] == 1 || $tsUser->permisos['gorpap'] == true) ? '\'3\'' : '\'0\'').')')) { mas abajo de lo que remplazaron buscan $postData = array( 'title' => $tsCore->parseBadWords($_POST['titulo'], true), 'body' => $tsCore->setSecure($_POST['cuerpo'], true), 'tags' => $tsCore->parseBadWords($tsCore->setSecure($_POST['tags'], true)), 'category' => $_POST['categoria'], debajo agregan 'imgport' => $_POST['imgport'], despues buscan // ACTUALIZAMOS if($tsUser->uid == $data['post_user'] || !empty($tsUser->is_admod) || !empty($tsUser->permisos['moedpo'])){ if(mysql_query('UPDATE p_posts SET post_title = \''.$postData['title'].'\', post_body = \''.$postData['body'].'\', post_tags = \''.$tsCore->setSecure($postData['tags']).'\', post_category = \''.(int)$postData['category'].'\', post_private = \''.$postData['private'].'\', post_block_comments = \''.$postData['block_comments'].'\', post_sponsored = \''.$postData['sponsored'].'\', post_smileys = \''.$postData['smileys'].'\', post_visitantes = \''.$postData['visitantes'].'\', post_sticky = \''.$postData['sticky'].'\' WHERE post_id = \''.(int)$post_id.'\'') or die(mysql_error())) { remplazan por // ACTUALIZAMOS if($tsUser->uid == $data['post_user'] || !empty($tsUser->is_admod) || !empty($tsUser->permisos['moedpo'])){ if(mysql_query('UPDATE p_posts SET post_title = \''.$postData['title'].'\', post_body = \''.$postData['body'].'\', post_tags = \''.$tsCore->setSecure($postData['tags']).'\', post_imgport = \''.$tsCore->setSecure($postData['imgport']).'\', post_category = \''.(int)$postData['category'].'\', post_private = \''.$postData['private'].'\', post_block_comments = \''.$postData['block_comments'].'\', post_sponsored = \''.$postData['sponsored'].'\', post_smileys = \''.$postData['smileys'].'\', post_visitantes = \''.$postData['visitantes'].'\', post_sticky = \''.$postData['sticky'].'\' WHERE post_id = \''.(int)$post_id.'\'') or die(mysql_error())) { buscan /*********/ $query = mysql_query('SELECT p.post_id, p.post_user, p.post_category, p.post_title, p.post_date, p.post_comments, p.post_puntos, p.post_private, p.post_sponsored, p.post_status, p.post_sticky, u.user_id, u.user_name, u.user_activo, u.user_baneado, c.c_nombre, c.c_seo, c.c_img FROM p_posts AS p LEFT JOIN u_miembros AS u ON p.post_user = u.user_id '.($tsUser->is_admod && $tsCore->settings['c_see_mod'] == 1 ? '' : ' && u.user_activo = \'1\' && u.user_baneado = \'0\'').' LEFT JOIN p_categorias AS c ON c.cid = p.post_category WHERE '.($tsUser->is_admod && $tsCore->settings['c_see_mod'] == 1 ? 'p.post_id > 0' : 'p.post_status = \'0\' && u.user_activo = \'1\' && u.user_baneado = \'0\'').' '.$c_where.' '.$s_where.' GROUP BY p.post_id ORDER BY '.$s_order.' DESC LIMIT '.$start); $lastPosts['data'] = result_array($query); // return $lastPosts; } remplazan por /*********/ $query = mysql_query('SELECT p.post_id, p.post_user, p.post_category, p.post_title, p.post_date, p.post_comments, p.post_puntos, p.post_private, p.post_sponsored, p.post_imgport, p.post_status, p.post_sticky, u.user_id, u.user_name, u.user_activo, u.user_baneado, c.c_nombre, c.c_seo, c.c_img FROM p_posts AS p LEFT JOIN u_miembros AS u ON p.post_user = u.user_id '.($tsUser->is_admod && $tsCore->settings['c_see_mod'] == 1 ? '' : ' && u.user_activo = \'1\' && u.user_baneado = \'0\'').' LEFT JOIN p_categorias AS c ON c.cid = p.post_category WHERE '.($tsUser->is_admod && $tsCore->settings['c_see_mod'] == 1 ? 'p.post_id > 0' : 'p.post_status = \'0\' && u.user_activo = \'1\' && u.user_baneado = \'0\'').' '.$c_where.' '.$s_where.' GROUP BY p.post_id ORDER BY '.$s_order.' DESC LIMIT '.$start); $lastPosts['data'] = result_array($query); // return $lastPosts; } ahora vamos a templates/modules abrimos el archivo m.home_last_posts.tpl y donde quieran agregan lo siguiente {if $p.post_imgport} <img src="{$p.post_imgport}"/> {else} <img src="LAURLDELAIMAGENQUEQUIERAQUEAPAREZCA"> {/if} luego abrimos m.agregar_form.tpl que tambien esta en modules buscan <li> <label>T&iacute;tulo</label> <span style="display: none;" class="errormsg"></span> <input type="text" tabindex="1" name="titulo" maxlength="60" size="60" class="text-inp required" value="{$tsDraft.b_title}" style="width:760px"/> <div id="repost"></div> </li> debajo agregan <li> <label>Imagen de Portada</label> <span style="display: none;" class="errormsg"></span> <input type="text" tabindex="1" name="imgport" maxlength="500" size="500" class="text-inp required" value="{$tsDraft.b_imgport}" style="width:760px"/> </li> y ya les quedaría como en la cap listo eso es todo chau pd: el diseño se lo dan ustedes
  8. Hola amigos, recien acabo de publicar este MOD: Y descubrí un bug: Al responder un ticket de alguien se marcaban como respondidos los de toda la web Y lo mismo al leerlo. Para fixearlo abren el c.soporte.php y buscan: if($tsUser->is_admod) mysql_query('UPDATE s_tickets SET estado = \'2\''); if(mysql_query('UPDATE s_tickets SET leido = \'0\'')){ Y lo reempalazan por: if($tsUser->is_admod) mysql_query('UPDATE s_tickets SET estado = \'2\' WHERE id = \''.(int)$id.'\''); if(mysql_query('UPDATE s_tickets SET leido = \'0\' WHERE id = \''.(int)$id.'\'')){ Luego buscan: if($tsUser->is_admod) mysql_query('UPDATE s_tickets SET leido = \'1\''); Y lo reemplazan por: if($tsUser->is_admod) mysql_query('UPDATE s_tickets SET leido = \'1\' WHERE id = \''.(int)$id.'\''); Disculpen los bugs Saludos
  9. Timthumb - Reduce el tamaño y peso de Images de Portadas Aqui les quiero compartir un script que les podra ser de utilidad a los que usen portadas en su web. Las portadas dan buen aspecto a una web, pero si la ingresas por URL suelen tener un tamaño indiferente a lo que seria lo óptimo para que no relentizara a la web por su uso, y aunque no este alojada en el mismo servidor y sea externo, esto retarda el tiempo de carga de la web. Asi que encontre este codigo que funciona como un thumbnail de imagenes, y su aplicación es bastante simple.. Primero suben el archivo thumbnail.php a /inc/php/ Dentro del archivo podran editar los nombres de los servidores de imagenes que quieran usar if(! isset($ALLOWED_SITES)){ $ALLOWED_SITES = array ( 'flickr.com', 'staticflickr.com', 'picasa.com', 'img.youtube.com', 'upload.wikimedia.org', 'photobucket.com', 'imgur.com', 'imageshack.us', 'tinypic.com', ); } Agregan o dejan solo los servidore permitidos.. Ahora en su web donde tengan las portadas, por ejemplo: src="{$p.post_portada}" Deberan cambiarla por: src="{$tsConfig.url}/inc/php/timthumb.php?src={$p.post_portada}&h=290&w=200" Ahora veran donde estan estos numero &h=290&w=200 Deben cambiarlos por las dimenciones que se redimencionara la imagen ( h = Altura, w=Ancho ) Y con eso ya habran redimencionado las imagenes cargadas a un tamaño menor y con menos pesos, y por ende tendran una carga mas rápida. Un ejemplo veran esta imagen Como veran es una imagen grande para una portada, y por lo general solo usamos css para acomodar el tamaño, pero no cambia el peso de la imagen. Ahora vean la misma imagen, con la misa url ​ Como veran hay una gran diferencia en las dimenciones, y obviamente esto aligera la carga de la web. Aquí les dejo el archivo https://mega.co.nz/#!IRUExRKA!q4ic9pVUMjLkiv0D5bF1ZN-U0Smej5WPFraH6I3EBrQ Espero les sea de utilidad. Hasta la Próxima..
  10. Hola a todos es el primer mod que hago y quiero dar las gracias a Midd98 por crear el archivo error404.php ya que esto al fin y al cabo es solo un nuevo diseño. Bueno vamos con ello Primero descargáis los archivos y los copiais en error404.php en inc/php t.error404.tpl en themes/tu theme/templates/ http://rapidshare.com/files/2913799867/error404.rar Segundo abrimos el archivo .htaccess y buscáis: ErrorDocument 404 reemplazáis la línea completa por: ErrorDocument 404 /inc/php/error404.php Dejo Cap Demo: http://baguira.net/asdfjhasd Visitárme en http://baguira.net
  11. Hola amigos, les traigo la v3 de este MOD ya que la v2 tenía algún fallo reportado por: eWarez ¿Que se soluciona? - Fix bug cuando hay varias URLs seguidas se ponen todas juntas - Fix bug si el enlace está al final del post no se convierte: - Fix bug si el enlace precede a un BBCode no se convierte. SI NO TIENEN LA V2 1) Abren el c.posts.php de inc/class y buscan: //VISITANTES RECIENTES if($postData['post_visitantes']){ $postData['visitas'] = result_array(mysql_query('SELECT v.*, u.user_id, u.user_name FROM w_visitas AS v LEFT JOIN u_miembros AS u ON v.user = u.user_id WHERE v.for = \''.(int)$postData['post_id'].'\' && v.type = \'2\' && v.user > 0 ORDER BY v.date DESC LIMIT 10')); } //PUNTOS if($postData['post_user'] == $tsUser->uid || $tsUser->is_admod){ $postData['puntos'] = result_array(mysql_query('SELECT p.*, u.user_id, u.user_name FROM p_votos AS p LEFT JOIN u_miembros AS u ON p.tuser = u.user_id WHERE p.tid = \''.(int)$postData['post_id'].'\' && p.type = \'1\' ORDER BY p.cant DESC')); } // CATEGORIAS $query = mysql_query('SELECT c.c_nombre, c.c_seo FROM p_categorias AS c WHERE c.cid = \''.$postData['post_category'].'\''); $postData['categoria'] = mysql_fetch_assoc($query); Y abajo añaden: //URLs automáticas $postData['post_body'] = preg_replace("@([[:space:]])(https?://([-\w.]+[-\w])+(:\d+)?(/([\w-.~:/?#\[\]\@!$&\'()*+,;=%]*)?)?)([[:space:]]?)@", '$1[url=$2]$2[/url]', $postData['post_body']); SI TIENEN LA V2 1) Abren el c.posts.php de inc/class y buscan: //URLs automáticas $postData['post_body'] = preg_replace("@([[:space:]])(https?://([-\w.]+[-\w])+(:\d+)?(/([\w-.~:/?#\[\]\@!$&\'()*+,;=%]*)?)?)([[:space:]])@", '[url=$2]$2[/url]', $postData['post_body']); Y lo reemplazan por: $postData['post_body'] = preg_replace("@([[:space:]])(https?://([-\w.]+[-\w])+(:\d+)?(/([\w-.~:/?#\[\]\@!$&\'()*+,;=%]*)?)?)([[:space:]]?)@", '$1[url=$2]$2[/url]', $postData['post_body']); Y listo!! Caps: Antes: Después: http://programu.net/posts/programu/82/-MOD-URLs-autom-ticas-en-posts-v3.html User: demo Pass: demo1234 En la demo tienen ejemplos de URLs que antes se veían mal, y la demostración de que ahora se muestran correctamente. Saludos
  12. Este mod lo que hace es poner un botón para compartir el post en WhatsApp. Claro que Android ya tiene la función por defecto pero siempre es mejor incentivar a los usuarios a hacerlo directamente. Es muy fácil, solo vamos al archivo t.posts.tpl ubicado en m/themes/TUTHEME/templates y buscamos: <div class="post_detalles clearBoth"> Agregamos arriba de eso: <a href="whatsapp://send?text=Mira: {$tsPost.post_title} - {$tsConfig.web}/posts/{$tsPost.categoria.c_seo}/{$tsPost.post_id}/{$tsPost.post_title|seo}.html" data-action="share/whatsapp/share"><img border="0"″ src="{$tsConfig.images}/sharewhats.png" width="100%" height="100%"></a> Subimos la imagen adjunta a la carpeta m/themes/TUTHEME/images y ¡listo! Nota: Esto esta hecho en la de Kmario19. Se puede hacer mas bonito con un botón en css pero odio hacer eso si alguno quiere hacerlo por favor dejelo en los comentarios. Caps
  13. Buenas Amigos como sabran hace unos Dias thespeed94 Publico unos themas geniales y el Cuales estan de Lujo.. Bueno Instalan los 2 Themes.. lego que los instalan deveran hacer lo Siguiente.. Abren el c.core.php de inc/class y buscan: var $settings; // CONFIGURACIONES DEL SITIO Abajo de esto Ponen. //Moviles Soportados private $_mobileClients = array( "midp", "240x320", "blackberry", "netfront", "nokia", "panasonic", "portalmmm", "sharp", "sie-", "sonyericsson", "symbian", "windows ce", "windows phone", "benq", "mda", "mot-", "opera mini", "philips", "pocket pc", "sagem", "samsung", "sda", "sgh-", "vodafone", "xda", "iphone", "android" ); Mas Abajo Buscan.. // INSTANCIA DE LA CLASE public static function &getInstance(){ static $instance; if( is_null($instance) ){ $instance = new tsCore(); } return $instance; } Y abajo agregan: public function isMobile($userAgent) { $userAgent = strtolower($userAgent); foreach($this->_mobileClients as $mobileClient) { if (strstr($userAgent, $mobileClient)) { return true; } } return false; } Por Ultimo en el Mismo Archivo deveran Buscar lo Suiguiente.. function getTema() { // $query = mysql_query('SELECT * FROM w_temas WHERE tid = '.$this->settings['tema_id'].' LIMIT 1'); // $data = mysql_fetch_assoc($query); $data['t_url'] = $this->settings['url'] . '/themes/' . $data['t_path']; // return $data; } Y Lo Reemplazan Por: function getTema() { // if($this->isMobile($_SERVER['HTTP_USER_AGENT'])){ $this->settings['mobile'] = true; $data = array(); $data['t_path'] = 'default_mobile'; $data['t_name'] = 'MEGABlog Móvil'; $data['t_url'] = $this->settings['url'] . '/themes/' . $data['t_path']; }else{ $query = mysql_query('SELECT * FROM w_temas WHERE tid = '.$this->settings['tema_id'].' LIMIT 1'); // $data = mysql_fetch_assoc($query); $data['t_url'] = $this->settings['url'] . '/themes/' . $data['t_path']; } // return $data; } Luego terminamos con lo Siguiente. Abren el c.smarty.php de inc/class y buscan: function tsSmarty() { global $tsCore; // Y lo reemplazan por: function deldir($dir){ $current_dir = opendir($dir); while($entryname = readdir($current_dir)){ if(is_dir("$dir/$entryname") and ($entryname != "." and $entryname!="..")){ $this->deldir("${dir}/${entryname}"); }elseif($entryname != "." and $entryname!=".."){ unlink("${dir}/${entryname}"); } } closedir($current_dir); rmdir(${'dir'}); mkdir('../../cache'); } function tsSmarty() { global $tsCore; // $this->deldir('../../cache'); Y Listo aca unas cap.. Al entrar desde una Pc http://i.imgur.com/x7nCbDQ.jpg Al entrar desde un Movil http://i.imgur.com/v9bZT3C.png Espero y les aiga servido de Mucho Mi Aporte +1 SI TE SIRVIO
  14. Este mod lo que hace es acortar los enlaces automaticamente a 3 de los acortadores mas usados actualmente, o almenos lo que muchos dicen que son lo que mejor pagan. Personalmente les doy buena fe de linkbucks, que ya me ha dado docenas de dolares y si paga a tiempo y sin demoras, con adfly tambien cobre, pero controla un poco mas los enlaces y el nuevo que dicen ser prometedor, lo he visto que muchos lo usan, asi que integre al mod estos tres acortados, Linkbucks, Adfly y Shorte.st El mod encripta las url de los enlaces internos y al entrar a ellos salen automaticamente acortados en los 3 servidores mencionamos, uno detras de otros, osea tienen que pasar por ellos primero para llegar al enlace. Esto es administrable, y pueden desactivarlo cuando quieran. No afecta a los del staff, y pueden determinar si es que gustan a determinados rangos. No afecta a enlaces internos de la misma web. Hacemos esta consulta SQL ALTER TABLE `w_configuracion` ADD `shorten_url` int(1) NOT NULL DEFAULT '0', ADD `api_adfly` int(6) NOT NULL DEFAULT '0', ADD `key_adfly` varchar(40) NOT NULL DEFAULT '0', ADD `key_shorte` varchar(40) NOT NULL DEFAULT '0', ADD `user_link` varchar(40) NOT NULL DEFAULT '0', ADD `key_link` varchar(40) NOT NULL DEFAULT '0'; En c.admin.php buscamos: 'offline_message' => $tsCore->setSecure($tsCore->parseBadWords($_POST['offline_message'])), Y agregamos abajo: 'shorten_url' => empty($_POST['shorten_url']) ? 0 : 1, 'api_adfly' => $tsCore->setSecure($_POST['api_adfly']), 'key_adfly' => $tsCore->setSecure($_POST['key_adfly']), 'key_shorte' => $tsCore->setSecure($_POST['key_shorte']), 'user_link' => $tsCore->setSecure($_POST['user_link']), 'key_link' => $tsCore->setSecure($_POST['key_link']), Mas abajo buscamos: , `offline_message` = \'' . $c['offline_message'] . '\' Y agregamos al lado: , `shorten_url` = \'' . $c['shorten_url'] . '\', `api_adfly` = \'' . $c['api_adfly'] . '\', `key_adfly` = \'' . $c['key_adfly'] . '\', `key_shorte` = \'' . $c['key_shorte'] . '\', `user_link` = \'' . $c['user_link'] . '\', `key_link` = \'' . $c['key_link'] . '\' En m.admin_configs.tpl buscamos: <dl> <dt><label for="ai_chat">Chatango ID:</label><br /><span>Por defecto puedes agregar un chat de <a href="http://chatango.com">Chatango</a> para tu web, solo crea tu grupo he ingresa el nombre. (Dejar vac&iacute;o para usar xat)</span></dt> <dd><input type="text" id="ai_chat" name="chat" maxlength="20" value="{$tsConfig.chat_id}" /> </dd> </dl> Y agregamos arriba: <hr> <dl> <dt><label for="shorten_url">Activar Acortadores:</label><br /><span>Activar los acortadores de adf.ly, shorte.st y linkbucks.com</span></dt> <dd> <label><input name="shorten_url" type="radio" id="shorten_url" value="1" {if $tsConfig.shorten_url == 1}checked="checked"{/if} class="radio"/> S&iacute;</label> <label><input name="shorten_url" type="radio" id="shorten_url" value="0" {if $tsConfig.shorten_url != 1}checked="checked"{/if} class="radio"/> No</label> </dd> </dl> <hr> <dl> <dt><label for="api_adfly">ID adf.ly:</label></dt> <dd><input type="text" id="api_adfly" name="api_adfly" maxlength="6" value="{$tsConfig.api_adfly}" /> </dd> </dl> <dl> <dt><label for="key_adfly">Key adf.ly:</label></dt> <dd><input type="text" id="key_adfly" name="key_adfly" maxlength="40" value="{$tsConfig.key_adfly}" /> </dd> </dl> <hr> <dl> <dt><label for="key_shorte">Key shorte.st:</label></dt> <dd><input type="text" id="key_shorte" name="key_shorte" maxlength="40" value="{$tsConfig.key_shorte}" /> </dd> </dl> <hr> <dl> <dt><label for="user_link">Usuario linkbucks:</label></dt> <dd><input type="text" id="user_link" name="user_link" maxlength="20" value="{$tsConfig.user_link}" /> </dd> </dl> <dl> <dt><label for="key_link">Key linkbucks.com:</label></dt> <dd><input type="text" id="key_link" name="key_link" maxlength="40" value="{$tsConfig.key_link}" /> </dd> </dl> <hr> En main_footer.tpl buscamos al final: </body> Y agregamos arriba: {if $tsConfig.shorten_url == 1 && !$tsUser->is_admod} <script src="{$tsConfig.js}/anonymize.js" type="text/javascript"></script> <script type="text/javascript"><!-- protected_links = "{$tsConfig.url}, http://www.phpost.net"; auto_anonymize(); //--></script> {/if} Subimos los archivos a sus respectivas carpetas.. http://www.firedrive.com/file/9021F3346A962592 Dentro les deje tambien tres archivos, si quieren usar solo uno de los tres acortadores, para que reemplacen segun el que quieran usar... Necesitaran los siguientes datos.. ID de adfly (http://adf.ly/account/referrals) Key de adfly (http://adf.ly/publisher/tools#tools-api) Key de shorte (http://shorte.st/tools/api) Usuario de linkbucks Key de linkbucks (https://www.linkbucks.com/Profile/) Si quieren que no les salga a determinados rangos lo pueden hacer asi.. en el codigo que se agrega a main_footer.tpl buscan: {if $tsConfig.shorten_url == 1 && !$tsUser->is_admod} Y lo cambian por: {if $tsConfig.shorten_url == 1 && !$tsUser->is_admod || $tsUser->info.user_rango==6} Donde veran el 6 es el ID del rango que no tomaran tambien los acortadores, Para los que usen la zona VIP tambien sera posible aplicar con el siguiente codigo.. {if $tsConfig.shorten_url == 1 && !$tsUser->is_admod || $tsUser->info.user_rango==6 || $tsUser->info.user_vip == 1} Si tienen duda me escriben que les respondere en cuanto pueda... No deberan tener aplicado otros sistemas, como anonimizador de enlaces que ocupen las url de los enlaces xq chocaran los codigos. DEMO Espero les sea de utilidad y saquen algun veneficio por sus web, ya que muchos no tienen una manera de ingresos, y con esto podran conseguirlo.. Si el material es bueno, los que quieran llegar al enlace no les molestra estos acortadores..
  15. Les traigo este adactacion del MOD Categorías privadas que hace que todos posts, en la categorías que elijas, sean siempre privados. bueno comenzemos Empecemos: 1) Hacen esta SQL en su BD: ALTER TABLE `p_categorias` ADD `c_private` INT( 1 ) NOT NULL DEFAULT '0'; 2) Abren el c.admin.code de inc/class y buscan: /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ } Y arriba añaden: /* SetPrivateCat() */ function SetPrivate() { global $tsCore; // $cid = (int)$_GET['cid']; // $dato = mysql_fetch_assoc(mysql_query('SELECT c_private FROM p_categorias WHERE cid = \''.(int)$cid .'\' LIMIT 1')); if ($dato['c_private'] == 0) $privatize = 1; else $privatize = 0; db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE p_posts SET post_private = \''.$privatize.'\' WHERE post_category = \''.$cid.'\''); return true; } AVISO: Dos veces en el código 3) Abren el c.posts.code de inc/class y buscan: // SOLO MODERADORES Y ADMINISTRADORES if(empty($tsUser->is_admod) && $tsUser->permisos['most'] == false) { $postData['sponsored'] = 0; $postData['sticky'] = 0; } else { $postData['sponsored'] = empty($_POST['patrocinado']) ? 0 : 1; $postData['sticky'] = empty($_POST['sticky']) ? 0 : 1; } Y abajo agregan: $psqsl = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT c_private FROM p_categorias WHERE cid = \''.(int)$postData['category'].'\''); $qs = db_exec('fetch_assoc', '$query', '$psqsl'); if($qs['c_private'] == 1){ $postData['private'] = 1; } 4) Abren el admin.php de inc/php y buscan: } elseif($act == 'change'){ if($_POST['save']){ if($tsAdmin->MoveCat()) $tsCore->redirectTo($tsCore->settings['url'].'/admin/cats?save=true'); } Y abajo añaden: }elseif($act == 'setprivate'){ if($tsAdmin->SetPrivate()) $tsCore->redirectTo($tsCore->settings['url'].'/admin/cats?save=true'); 5) Abren el m.admin_cats.tpl de themes/TUTEMA/admin_mods y buscan: <a href="?act=editar&cid={$c.cid}&t=cat"><img src="{$tsConfig.url}/themes/default/images/icons/editar.png" title="Editar Categoría"/></a> Y abajo agregan: <a href="?act=setprivate&cid={$c.cid}"><img src="{$tsConfig.url}/themes/default/images/icons/key.png" title="Activar/desactivar categoría privada"/></a> Y listo!! Cuando hagan click en la llave, todos los posts que se hagan y esten en esa categoría, serán privados. Cap:
  16. Helou! Les traigo mi primer mod (para la v5 de To-up :3) Cap del mod: Las instrucciones para instalarlo están en un rar más el archivo .tpl que deben subir! Espero que les guste! Descarga: http://www.mediafire.com/download/t216kz80pojb7qb/
  17. Hola amigos, en este caso les traigo un MOD que ordena los posts en la home como un foro, segun las categorías. Por lo que se incluye un pequeño sistema de subcategorías ¿Que tiene? - Administrar categorias "padre" desde la admin. - Seleccionar a que categoría "padre" pertenecerá cada categoría (foro). - Ultimo post de cada foro en la home - Estadisticas de cada categoría en la home - Ver categorías individualmente Empecemos: 1) Hacen esta SQL en su BD: CREATE TABLE IF NOT EXISTS `p_hcats` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; ALTER TABLE `p_categorias` ADD `c_hcat` INT(11) NOT NULL ; 2) Abren el c.admin.php de inc/class y buscan: if (mysql_query('UPDATE `p_categorias` SET c_nombre = \'' . $tsCore->setSecure($c_nombre) . '\', c_seo = \'' . $tsCore->setSecure($tsCore->setSEO($c_nombre, true)) . '\', c_img = \'' . $tsCore->setSecure($cimg) . '\' WHERE cid = \'' . (int)$cid . '\'')) Y lo reemplazan por: if (mysql_query('UPDATE `p_categorias` SET c_nombre = \'' . $tsCore->setSecure($c_nombre) . '\', c_hcat = \'' . $tsCore->setSecure($_POST['hcat']) . '\', c_seo = \'' . $tsCore->setSecure($tsCore->setSEO($c_nombre, true)) . '\', c_img = \'' . $tsCore->setSecure($cimg) . '\' WHERE cid = \'' . (int)$cid . '\'')) Luego buscan: /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ } Y arriba añaden: /* gethCats() */ function gethCats() { // $query = mysql_query('SELECT * FROM p_hcats ORDER BY id DESC'); $data = result_array($query); // return $data; } function newhCat() { global $tsCore; // //$db = $this->getDBtypes(); // VALORES $name = $tsCore->setSecure($tsCore->parseBadWords($_POST['h_nombre'])); // INSERTS if (mysql_query('INSERT INTO `p_hcats` (name) VALUES (\'' . $name . '\')')) return true; else die(mysql_error()); } function gethCat($id) { // //$db = $this->getDBtypes(); // $query = mysql_query('SELECT * FROM p_hcats WHERE id = \'' . (int)$id . '\' LIMIT 1'); $data = mysql_fetch_assoc($query); // return $data; } function savehCat($id) { global $tsCore; // // VALORES $name = $tsCore->setSecure($tsCore->parseBadWords($_POST['h_nombre'])); // INSERTS if (mysql_query('UPDATE `p_hcats` SET name = \'' . $name . '\' WHERE id = \''.(int)$id.'\'')) return true; else die(mysql_error()); } function deletehCat($id) { // // INSERTS if (mysql_query('DELETE FROM `p_hcats` WHERE id = \''.(int)$id.'\'')) return true; else die(mysql_error()); } Luego buscan: $query = mysql_query('SELECT cid, c_orden, c_nombre, c_seo, c_img FROM p_categorias WHERE cid = \'' . (int)$cid . '\' LIMIT 1'); Y lo reemplazan por: $query = mysql_query('SELECT cid, c_orden, c_nombre, c_seo, c_img, c_hcat FROM p_categorias WHERE cid = \'' .(int)$cid . '\' LIMIT 1'); 3) Abren el c.posts.php de inc/class y buscan: /* getLastPosts($category, $sticky) */ Y arriba añaden: function getLastPostsForo(){ //SELECCIONAMOS DE TODAS LAS CATEGORIAS $sql = mysql_query('SELECT * FROM p_hcats'); $hcats = result_array($sql); //CATEGORIAS foreach($hcats as $h => $n){ $hcats[$h]['cats'] = result_array(mysql_query('SELECT cid, c_nombre, c_seo, c_img FROM p_categorias WHERE c_hcat = \''.$n['id'].'\'')); //DATOS foreach($hcats[$h]['cats'] as $c => $id){ //ULTIMO POST $sql = mysql_query('SELECT p.post_title, p.post_id, p.post_user, p.post_date, u.user_id, u.user_name, u.user_rango, r.r_color FROM p_posts AS p LEFT JOIN u_miembros AS u ON p.post_user = u.user_id LEFT JOIN u_rangos AS r ON r.rango_id = u.user_rango WHERE p.post_category = \''.$id['cid'].'\' ORDER BY p.post_id DESC LIMIT 1') or die(mysql_error()); $hcats[$h]['cats'][$c]['ultimo'] = mysql_fetch_assoc($sql); //ESTADISTICAS $posts = mysql_fetch_row(mysql_query('SELECT COUNT(post_id) AS posts FROM p_posts WHERE post_category = \''.$id['cid'].'\'')); $sql = mysql_query('SELECT COUNT(post_id) AS posts, SUM(post_comments) AS comments FROM p_posts WHERE post_category = \''.$id['cid'].'\''); $posts = mysql_fetch_assoc($sql); $hcats[$h]['cats'][$c]['posts'] = $posts['posts']; $hcats[$h]['cats'][$c]['comments'] = empty($posts['comments']) ? 0 : $posts['comments']; } } return $hcats; } 4) Abren el posts.php de inc/php y buscan: $smarty->assign("tsPosts",$tsLastPosts['data']); Y abajo añaden: $smarty->assign("tsHCats", $tsPosts->getLastPostsForo()); 5) Abren el admin.php de inc/php y buscan: } elseif($action == 'pconfigs'){ if(!empty($_POST['save'])){ if($tsAdmin->savePConfigs()) $tsCore->redirectTo($tsCore->settings['url'].'/admin/pconfigs?save=true'); } Abajo añaden: } elseif($action == 'hcats'){ $id = (int)$_GET['id']; if($act == 'editar'){ if($_POST['save']){ if($tsAdmin->savehCat($id)) $tsCore->redirectTo($tsCore->settings['url'].'/admin/hcats?save=true'); } else { $smarty->assign("tsCat",$tsAdmin->gethCat($id)); } } elseif($act == 'nueva'){ if(!empty($_POST['h_nombre'])){ if($tsAdmin->newhCat()) $tsCore->redirectTo($tsCore->settings['url'].'/admin/hcats?save=true'); } } elseif($act == 'borrar'){ if($tsAdmin->deletehCat($id)) $tsCore->redirectTo($tsCore->settings['url'].'/admin/hcats?save=true'); }else{ $smarty->assign("tsCats",$tsAdmin->gethCats()); } Luego buscan: $smarty->assign("tsIcons",$tsAdmin->getExtraIcons()); Y abajo añaden: $smarty->assign("tshCats",$tsAdmin->gethCats()); 6) Abren el t.home.tpl de themes/TUTEMA/templates y buscan: {include file='modules/m.home_last_posts.tpl'} Y Arriba agregan: {if !$tsCat} {include file='modules/m.home_foro.tpl'} <br>{/if} NOTA: Solo para el theme Life. Si quieren que se elimine el bloque de ultimos posts que aparecerá debajo, en vez de el paso anterior, hagan esto: Buscan: <br> {include file='modules/m.home_last_posts.tpl'} Lo reemplazan por: {if !$tsCat} <br> {include file='modules/m.home_foro.tpl'} {else} <br> {include file='modules/m.home_last_posts.tpl'} {/if} 7) Abren el t.admin.tpl de themes/TUTEMA/templates y buscan: {elseif $tsAction == 'rangos'} {include file='admin_mods/m.admin_rangos.tpl'} Y abajo añaden: {elseif $tsAction == 'hcats'} {include file='admin_mods/m.admin_hcats.tpl'} 8) Abren el m.admin_sidemenu.tpl de themes/TUTEMA/templates/admin_mods y buscan: <li id="a_cats"><span class="cat-title"><a href="{$tsConfig.url}/admin/cats">Categor&iacute;as</a></span></li> Abajo añaden: <li id="a_cats"><span class="cat-title"><a href="{$tsConfig.url}/admin/hcats">Categor&iacute;as "padre"</a></span></li> 9) Abren el m.admin_cats.tpl de themes/TUTEMA/templates/admin_mods y buscan: <dl> <dt><label for="cat_name">Nombre de la categor&iacute;a:</label></dt> <dd><input type="text" id="cat_name"name="c_nombre" value="{$tsCat.c_nombre}" /></dd> </dl> Abajo añaden: <dl> <dt><label for="hcat">Categoría padre:</label></dt> <dd> <select name="hcat" id="hcat" style="width:164px"> {foreach from=$tshCats item=h} <option value="{$h.id}" {if $tsCat.c_hcat == $h.id}selected="selected"{/if}>{$h.name}</option> {/foreach} </select> </dd> </dl> 10) Para acabar suben este RAR como se indica: https://www.mediafire.com/?56llm6mqxuw1chy m.admin_hcats.tpl -> themes/TUTEMA/templates/admin_mods m.home_foro.tpl -> themes/TUTEMA/templates/modules Capturas: Demo: http://ap.html-5.me/phpost/ Espero que les sirva, y pronto sacaré adaptaciones para otros themes. Creditos: vellenger
  18. ¡Hola a todos! En conjunto con @Tuente , Hoy les traigo un nuevo adelanto a un proyecto de modificación al Script, el cual, les permitirá tener Risus, pero con diseño Material Design (P.R.M.D: INS). Aviso: Este instalador es una parte de nuestro proyecto; Phpost Risus Material Design. Más bien lo publicamos como un "Adelanto", por tal motivo, puede contener unos pequeños bugs o cambios minimos. Un pequeño dato Pronto estamos pensando en publicar una versión de Risus (Tuente y Yo), pero completamente hecha de Material Design. Nuestra idea es revivir Phpost, y buscamos que este proyecto sea más actualizado, como por ejemplo: Con su código y diseño. Por tal motivo, publicamos el instalador, como un adelanto del proyecto. Acá más detalles de porque usar Risus Material Design. [Ver Imagen de los detalles] y al final de la página podrán encontrar el sitio oficial. Además de esa introducción a el proyecto que estamos pensando en hacer, les voy a mencionar algunas funciones del instalador, ya que este tema va dedicado al instalador, tales como: Cambiar el Chmod de los archivos automáticamente. Borrar la carpeta "UPGRADE" e "INSTALL", después de terminar con la instalación. Las últimas versiones de librerías Javascript hasta el momento. Funciones Php que iban a estar obsoletas en un tiempo más , fueron cambiadas a unas nuevas (7.0 +). Les dejare algunas capturas del Instalador ALPHA: http://imgur.com/a/VJ6a0 GRACIAS A TODOS! Versión del instalador de Risus que usa el P.R.M.D: INS. de este adelanto: 1.2.7.000. Versión del instalador de P.R.M.D. De este adelanto: alpha. [Ir al sitio oficial del proyecto] [Descargar Instalador]
  19. Saludos A todos hoy les traigo este mod v2 porque ya sacaron uno que puede ser v1 bueno aka les dejo cap de como es el mod: Resultados por categorías: Lo Primero es subir el error404.php a inc/php/ luego abren el .htaccess y buscan ErrorDocument 404 y lo remplazan por ErrorDocument 404 /inc/php/error404.php luego suben todos los templates a su directorios buscan en estilo.css h1{ font-size:11px; font-weight:normal; } Y lo borran guardan y luego Abren cualquier hoja de estilo .css y a lo ultimo agregan: /*WARNINGS*/ p { margin: 0; font-family: Georgia; font-style: italic; color: #888; } #main { background: #FFF url(http://o1.t26.net/img/mainbg.gif) 331px 0 repeat-y; } #sidebar { float: right; *overflow: hidden; padding: 10px; width: 250px; } h1{ font-size:28px; font-weight: bold; margin: 1px; } h1 span.orange { font-weight: bold; color: #FF6600; } Y listo tendran su error404 V2 Completo! Creditos bY: Oficialphp Link: https://mega.co.nz/#!GA0zyD6S!ZwAoBkndjjnrSuxZhm4miRbBLUZy32LHgRFQWYAssWY Si la quieren para otro theme pídanlo y lo publico!
  20. Estas Saliendo V2 - Estilo T! Aqui les comparto este complemento, el cual encripta las url que estan saliendo de su web, y mostrara un mensaje que indica que estas saliendo de tu sitio web. Con la opcion de ir al enlace directo o regresar a la web. En bbcode.inc.php buscamos: "<a href=\"\\2\\3\\4\" target=\"_blank\">\\2\\3\\4</a>" Y lo cambiamos por: '<a href="'.$tsCore->settings['url'].'/go/?p=\\2\\3\\4" target="_blank" class="encoded" data-url="\\2\\3\\4">\\2\\3\\4</a>' Buscamos: "<a href=\"\\1\\2\\3\" target=\"_blank\">\\4</a>" Y lo cambiamos por: '<a href="'.$tsCore->settings['url'].'/go/?p=\\1\\2\\3" target="_blank" class="encoded" data-url="\\1\\2\\3">\\4</a>' Al final de funciones.js agregamos: function base64_encode (data) { // mozilla has this native // - but breaks in 2.0.0.12! //if (typeof this.window['btoa'] === 'function') { // return btoa(data); //} var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc = "", tmp_arr = []; if (!data) { return data; } do { // pack three octets into four hexets o1 = data.charCodeAt(i++); o2 = data.charCodeAt(i++); o3 = data.charCodeAt(i++); bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); } while (i < data.length); enc = tmp_arr.join(''); var r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); } $(document).ready(function(){ $('a.encoded').each(function(){ var new_url = $(this).data('url'); $(this).attr('href', '' + global_data.url + '/go/?p='+base64_encode(new_url)); }); }); Subimos los archivos a sus respectivas carpetas. Espero les sea de agrado el mod. Hasta la próxima.
  21. Hola amigos, a pedido de Diringax les traigo un MOD que consiste en una notificación al cambiar de rango como en T!. La instalación es fácil así que empecemos: 1) Abren el c.admin.php de inc/class y buscan: function setUserRango($user_id) { global $tsUser; Y lo reemplazan por: function setUserRango($user_id) { global $tsUser, $tsMonitor; Buscan: elseif ($tsUser->uid != 1 && $new_rango == 1) return 'Solo el primer Administrador puede crear más administradores principales'; else { if (mysql_query('UPDATE u_miembros SET user_rango = \'' . (int)$new_rango . '\' WHERE user_id = \'' . (int)$user_id . '\'')) return true; } Y lo reemplazan por: elseif ($tsUser->uid != 1 && $new_rango == 1) return 'Solo el primer Administrador puede crear más administradores principales'; else { if (mysql_query('UPDATE u_miembros SET user_rango = \'' . (int)$new_rango . '\' WHERE user_id = \'' . (int)$user_id . '\'')){ $tsMonitor->setNotificacion(75, $user_id, 0, $new_rango); return true; } } 2) Abren el c.monitor.php de inc/class y buscan: 19 => array('text' => 'te mencion&oacute; en una', 'ln_text' => 'publicaci&oacute;n', 'css' => 'blue_ball'), Y abajo agregan: 75 => array('text' => 'Tu rango ha cambiado a', 'css' => 'blue_ball'), Luego en ese archivo buscan: case 17: return 'SELECT f.foto_id, f.f_title, f.f_user, m.medal_id, m.m_title, m.m_image, a.medal_for, u.user_id, u.user_name FROM w_medallas_assign AS a LEFT JOIN f_fotos AS f ON f.foto_id = a.medal_for LEFT JOIN u_miembros AS u ON u.user_id = f.f_user LEFT JOIN w_medallas AS m ON m.medal_id = a.medal_id WHERE m.medal_id = \''.(int)$data['obj_uno'].'\' AND f.foto_id = \''.(int)$data['obj_dos'].'\' LIMIT 1'; break; Y abajo añaden: case 75: return 'SELECT r_name FROM u_rangos WHERE rango_id = \''.(int)$data['obj_uno'].'\' LIMIT 1'; break; Para terminar en este archivo buscan: case 17: $oracion['text'] = 'Tu <a href="'.$site_url.'/fotos/'.$data['user_name'].'/'.$data['foto_id'].'/'.$tsCore->setSEO($data['f_title']).'.html" title="'.$data['f_title'].'"><b>foto</b></a> tiene una nueva <span class="qtip" title="'.$data['m_title'].'"><b>medalla</b> <img src="'.$site_url.'/themes/default/images/icons/med/'.$data['m_image'].'_16.png"/></span>'; break; Y abajo añaden: case 75: $oracion['text'] = $this->monitor[$no_type]['text'].' <b>'.$data['r_name'].'</b>'; break; 3) Para acabar abren el c.posts.php de inc/class y buscan: /* subirRango() */ function subirRango($user_id, $post_id = false){ global $tsCore, $tsUser; Y lo reemplazan por: /* subirRango() */ function subirRango($user_id, $post_id = false){ global $tsCore, $tsUser, $tsMonitor; Luego buscan: //HAY NUEVO RANGO? if(!empty($newRango) && $newRango != $data['user_rango']){ // if(mysql_query('UPDATE u_miembros SET user_rango = \''.$newRango.'\' WHERE user_id = \''.$user_id.'\' LIMIT 1')) return true; Y lo reemplazan por: //HAY NUEVO RANGO? if(!empty($newRango) && $newRango != $data['user_rango']){ // if(mysql_query('UPDATE u_miembros SET user_rango = \''.$newRango.'\' WHERE user_id = \''.$user_id.'\' LIMIT 1')) { $tsMonitor->setNotificacion(75, $user_id, 0, $newRango); return true; } Y listo! Cap: Demo: http://programu.net El user demo tiene una notificación de cambio de rango. User: demo Pass: demo1234 Saludos
  22. Básicamente para los que no saben como funciona el Lazy Load lo que hace es que las imágenes en nuestra web se carguen por scroll o una detrás de la otra, acelerando esto la visualización de los posts, en fin les dejo el código, espero les sea útil: 1.Buscamos en bbcode.inc.php que se encuentra en la carpeta inc/ext : <img src=\"\\1\\2\\3\" onload=\"if(this.width > 735) {this.width=735}\" /> 2.Remplazamos la linea buscada por: <img data-original=\"\\1\\2\\3\" class=\"kocibux\" onload=\"if(this.width > 735) {this.width=735}\" /> 3.Antes de </body> en main_fotter.tpl que se encuentra en themes/tutheme/templates/section agregamos el siguiente codigo: {literal} <script charset="utf-8" type="text/javascript"> $("img.kocibux").lazyload(); </script> {/literal} 4.descargamos el siguiente archivo jquery.lazyload.js y lo subimos a theme/tutheme/js/ DEMO: MEGA DESCARGA
  23. A pedido de Xtatter en este post: modifique este sistema de puntuacion en los posts que tiene risus para que solo se pueda dar positivo y negativo como en un principio tenía este foro y en algún momento causó polémica, pero como en youtube, es una buena manera de ver cuan popular, interesante, bien hecho, puede ser un video. Bueno, empecemos... En c.posts.php que está en inc/class buscamos dentro de la funcion: function votarPost(){ esta parte: $puntos = intval($_POST['puntos']); que lo reemplazaremos por: $puntos = ($_POST['puntos'] == 2) ? 2 : 1; Mas abajo buscamos: // SUMAR PUNTOS AL POST mysql_query('UPDATE p_posts SET post_puntos = post_puntos + '.(int)$puntos.' WHERE post_id = \''.(int)$post_id.'\''); // SUMAR PUNTOS AL DUEÑO DEL POST mysql_query('UPDATE u_miembros SET user_puntos = user_puntos + \''.(int)$puntos.'\' WHERE user_id = \''.(int)$data['post_user'].'\''); // RESTAR PUNTOS AL VOTANTE mysql_query('UPDATE u_miembros SET user_puntosxdar = user_puntosxdar - \''.(int)$puntos.'\' WHERE user_id = \''.$tsUser->uid.'\''); Lo reemplazaremos por: // SUMAR PUNTOS AL POST mysql_query('UPDATE p_posts SET post_puntos = post_puntos '.(($puntos == 2) ? '- \'1\'' : '+ \'1\'').' WHERE post_id = \''.(int)$post_id.'\''); // SUMAR PUNTOS AL DUEÑO DEL POST mysql_query('UPDATE u_miembros SET user_puntos = user_puntos '.(($puntos == 2) ? '- \'1\'' : '+ \'1\'').' WHERE user_id = \''.(int)$data['post_user'].'\''); // RESTAR PUNTOS AL VOTANTE mysql_query('UPDATE u_miembros SET user_puntosxdar = user_puntosxdar - \'1\' WHERE user_id = \''.$tsUser->uid.'\''); Luego buscamos arriba: //PUNTOS if($postData['post_user'] == $tsUser->uid || $tsUser->is_admod){ $postData['puntos'] = result_array(mysql_query('SELECT p.*, u.user_id, u.user_name FROM p_votos AS p LEFT JOIN u_miembros AS u ON p.tuser = u.user_id WHERE p.tid = \''.(int)$postData['post_id'].'\' && p.type = \'1\' ORDER BY p.cant DESC')); } Lo reemplazamos por: //PUNTOS if($postData['post_puntos']){ $postData['puntos'] = result_array(mysql_query('SELECT p.*, u.user_id, u.user_name FROM p_votos AS p LEFT JOIN u_miembros AS u ON p.tuser = u.user_id WHERE p.tid = \''.(int)$postData['post_id'].'\' && p.type = \'1\' ORDER BY p.voto_id DESC')); } Luego un poco más abajo buscamos // NUEVA VISITA : FUNCION SIMPLE Arriba de eso agregamos: // YA LO VOTE? $vote = mysql_fetch_row(mysql_query('SELECT COUNT(voto_id) AS v FROM p_votos WHERE tid = \''.(int)$postData['post_id'].'\' AND tuser = \''.$tsUser->uid.'\' LIMIT 1')); $postData['vote'] = !empty($vote[0]) ? true : false; Ahora vamos al archivo c.monitor.php y buscamos: 3 => array('text' => 'dej&oacute; _REP_ puntos en tu', 'ln_text' => 'post', 'css' => 'points'), Lo reemplazamos por: 3 => array('text' => 'vot&oacute; _REP_ tu', 'ln_text' => 'post', 'css' => 'voto_'), Más abajo buscamos: if($no_type == 3) $oracion['text'] = str_replace('_REP_', '<b>'.$data['obj_dos'].'</b>', $oracion['text']); Lo reemplazamos por: if($no_type == 3) $oracion['text'] = str_replace('_REP_', '<b>'.($data['obj_dos'] == 2) ? 'negativo' : 'positivo' .'</b>', $oracion['text']); if($no_type == 3) { $voto_type = ($data['obj_dos'] == 2) ? 'negativo' : 'positivo'; $oracion['text'] = str_replace('_REP_', '<b>'.$voto_type.'</b>', $oracion['text']); $oracion['style'] = 'voto_'.$voto_type; } Ahora en el archivo c.actividad.php buscamos: 3 => array('text' => array('Dej&oacute;', 'puntos en el post'), 'css' => 'points'), Lo reemplazamos por: 3 => array('text' => array('Vot&oacute;', 'el post'), 'css' => 'voto_'), Más abajo buscamos: if($ac_type == 3) $extra_text = $data['obj_dos']; Lo reemplazamos por: if($ac_type == 3) $extra_text = ($data['obj_dos'] == 2) ? 'negativo' : 'positivo'; un poco mas abajo buscamos: $oracion['style'] = ($ac_type == 6) ? 'voto_'.$extra_text : $oracion['style']; Lo reemplazamos por: $oracion['style'] = ($ac_type == 3 || $ac_type == 6) ? 'voto_'.$extra_text : $oracion['style']; Ahora, para el tema default o similares, buscamos el archivo m.posts_metadata.tpl que está en templates/modules y vamos a borrar todo esto: {if ($tsUser->is_admod || $tsUser->permisos.godp) && $tsUser->is_member == 1 && $tsPost.post_user != $tsUser->uid && $tsUser->info.user_puntosxdar >= 1} <div class="dar-puntos"> {if $tsPunteador.rango >= 50} <center> <div align="center" style="background: #F2F2F2;width: 58px;padding: 2px;border: 1px solid #DDD;-webkit-border-radius: 4px;-moz-border-radius: 4px;border-radius: 4px;"> <input type="text" id="points" style="width:50px;height:15px;" value="{$tsPunteador.rango}"> <input type="submit" onclick="votar_post(document.getElementById('points').value); return false;" value="Votar" class="btn_g" style="width: 55px;"> </div> </center> {else} <span>Dar Puntos:</span> {section name=puntos start=1 loop=$tsUser->info.user_puntosxdar+1 max=$tsPunteador.rango} <a href="#" onclick="votar_post({$smarty.section.puntos.index}); return false;">{$smarty.section.puntos.index}</a> {if $smarty.section.puntos.index < $tsPunteador.rango}-{/if} {/section} {/if} (de {$tsUser->info.user_puntosxdar} Disponibles) </div> <hr class="divider"/> {/if} Ya que no se va a votar con puntos sino solo positivo - negativo En el archivo m.posts_content.tpl buscamos: <div class="compartir-mov" style="text-align: right; color:#888; font-size: 14px;margin: 30px 0 10px"> Y arriba de eso vamos a agregar: <div class="floatR"> {if !$tsPost.vote && $tsPost.post_user != $tsUser->uid} <a href="#" onclick="votar_post(1); return false;" id="vp_pos" title="Votar positivo"><img src="{$tsConfig.images}/v_pos.png" /></a> <a href="#" onclick="votar_post(2); return false;" id="vp_neg" title="Votar negativo"><img src="{$tsConfig.images}/v_neg.png" /></a> {/if} <a href="#" onclick="$('#vp_toggle').toggle('fast'); return false;" id="vp_total" style="background:#{if $tsPost.post_puntos < 0}B92626{else}6f8f52{/if};color:#fff;font-size:10px;padding:0px 5px;font-weight: bold;border-radius:3px;display: inline-block;vertical-align: top;" title="Total votos">{$tsPost.post_puntos}</a> </div> <div id="vp_toggle" style="display:none;margin-top: 27px;"> {foreach from=$tsPost.puntos item=v key=i} <a href="{$tsConfig.url}/perfil/{$v.user_name}" style="color:#{if $v.cant == 2}B92626{else}6f8f52{/if};" title="Vot&oacute; {if $v.cant == 2}negativo{else}positivo{/if}" class="hovercard" uid="{$v.tuser}">{$v.user_name}</a>{if $tsPost.total_votos > $i+1}, {/if} {/foreach} </div> En acciones.js que está en la carpeta js buscamos: $('#puntos_post').html(number_format(parseInt($('#puntos_post').html().replace(".", "")) + parseInt(puntos), 0, ',', '.')); Y debajo de eso agregamos: $('#vp_pos').remove(); $('#vp_neg').remove(); var total = (puntos == 2) ? parseInt($('#vp_total').html())-1 : parseInt($('#vp_total').html())+1; $('#vp_total').html(total); if(total < 0) $('#vp_total').css({'background' : '#B92626'}); Y listo, con eso tendrán algo como esto: Si ya votaron... Los que votaron negativo tendrán el nick rojo, de lo contrario será verde. Y las notificaciones Y listo, eso es todo, espero haya cumplido tu pedido Xtatter y les sirva a alguno de ustedes... Ah basta decir de que ahora desde la administración hay que limitar un poco los puntos por día, que los usuarios novatos tegan para puntuar unos 20 votos y asi... Cualquier duda comenten, adios, nos vemos en otro mod.
  24. Hola Amigos de Phpost. Por pedido de @Renguit0 He decidido adaptar una nueva versión de la marca de agua. La que originalmente publiqué era un conjunto de css y otras vainas más que no recuerdo. Esta versión consiste en javascript que por si fuera poco el momento que haces ctrl+c Copia la imagen con todo y marca de agua. Y cuando copias la url de la imagen te da algo como esto: http://pastebin.com/DaXYKzRM Además previene el Copy/paste para los repost hasta cierto modo puesto que para robar la imagen lo único que necesitan es ver el código fuente: http://t.99img.tk/posts/arte/9/http-www-phpost-net-uploads-profile-photo-thumb-1972-jpg-_.html La img original es mi avatar y la marca de agua se ve en el post con esa gotita. Bueno para no dar vueltas a darle con el mod. 1. Se bajan e archivo adjunto en el post. Verán una carpeta llamada marcas, esta carpeta la llevan a la raíz de su web. El segundo archivo es un .js el cual deben llevar a la carpeta: /themes/TUTEMA/js 2. Vamos a: /theme/TUTEMA/templates/secrions/main_footer.tpl Y Arriba de: <!--end-cuerpo--> Pegamos: <script src="{$tsConfig.js}/watermark.js" type="text/javascript"></script> <script> {literal} var load = false; window.onload = function(){ if(!load) { wmark.init({ /* config goes here */ "position": "top-right", // default "bottom-right" "opacity": 50, // default 50 "className": "watermark", // default "watermark" "path": "http://t.99img.tk/marcas/watermark.png" }); load = true; } } {/literal} </script> En donde dice t.99img.tk cambien por el nombre de su web. 2. Vamos a /inc/ext/bbcode.inc.php Y buscamos: array("img", "/(?i)\[img\=(http|https|ftp|irc|ed2k|gopher|telnet)?(\:\/\/)?([^\<\>[:space:]]+)\]/i", "<img src=\"\\1\\2\\3\" onload=\"if(this.width > 735) {this.width=735}\" />"), Y reemplazamos por array("img", "/(?i)\[img\=(http|https|ftp|irc|ed2k|gopher|telnet)?(\:\/\/)?([^\<\>[:space:]]+)\]/i", "<img class=\"watermark\" src=\"\\1\\2\\3\" onload=\"if(this.width > 735) {this.width=735}\" />"), Y eso es todo. NOTA: Si deseas agregar esa marca de agua a otras que no pertenezcan al bbcode debes agregarle el class="watermark" Visiten la demo. PD: Hay un pequeño problema y es que cuando la url de la imagen es similar a esto: http://iimganes.asd/img.png?id=12344 La marca de agua no funciona. ByAlias3glw.zip
  25. Anonimizador de Enlaces Base64 Aqui les dejo este modulo el cual les puede ser de utilidad para proteger sus enlaces dentro de su/s web, lo que hace este complemento es encriptar los links en un algoritmo de cifrado en Base64 el cual aculta el codigo fuente de los enlaces, y asi cuidar un poco lo enlaces para que no los detecten los robot de los buscadores, y tambien para cuidar el robo de enlaces.. En bbcode.inc.php buscamos: public $restriction = Array("url", "code", "quote", "quotePHPost", "font", "size", "color", "img", "b", "i", "u", "align", "spoiler", "swf", "goear", "hr", "li"); Despues de "li" agregamos : ,"crypt" Buscamos: array("li", "/(?i)\[\*\]/i","&bull; ") Y lo cambiamos por: array("li", "/(?i)\[\*\]/i","&bull; "), array("crypt", "/(?i)(\[crypt\])(http|https|ftp|irc|ed2k|gopher|telnet)(\:\/\/)([^\<\>[:space:]]+?)(\[\/crypt\])/i", "<a href=\"\\2\\3\\4\" target=\"_blank\"><center><div class=\"boton\">Descarga Aqu&iacute;</div></center></a>") En c.core.php buscamos: // RESTRICTIONS $parser->restriction = array('url', 'code', 'quote', 'quotePHPost', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 'align', 'spoiler', 'swf', 'goear', 'hr', 'li'); En esa linea despues de , 'li' Agregamos: , 'crypt' En acciones.js buscamos: lang['Upload'] = "Subir Im&aacute;genes"; Y agregamos abajo: lang['Insertar Enlace'] = "Insertar Enlace"; lang['Ingrese el Enlace que desea encriptar'] = "Ingrese el Enlace que desea encriptar"; lang['ingrese la url de url'] = "Ingrese el Enlace que desea encriptar"; Buscamos: {name:lang['Upload'], beforeInsert:function(h){ markit_upload(h); }}, Y agregamos abajo: {name:lang['Insertar Enlace'], beforeInsert:function(h){ markit_crypt(h); }}, Al final de todo agregamos: /** * * Base64 encode / decode * http://www.webtoolkit.info/ * **/ var Base64 = { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // public method for encoding encode : function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); } return output; }, // public method for decoding decode : function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, // private method for UTF-8 encoding _utf8_encode : function (string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, // private method for UTF-8 decoding _utf8_decode : function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } } function markit_crypt(h){ if(h.selection==''){ var msg = prompt(lang['Ingrese el Enlace que desea encriptar'], 'http://'); var msg = global_data.url +'/vell.php/?page=' + Base64.encode(msg); if(msg != null){ h.replaceWith = '[crypt]' + msg + '[/crypt]'; h.openWith = ''; h.closeWith = ''; }else{ h.replaceWith = ''; h.openWith = ''; h.closeWith = ''; } }else if(h.selection.substring(0,7)=='http://' || h.selection.substring(0,8)=='https://' || h.selection.substring(0,6)=='ftp://'){ h.replaceWith = ''; h.openWith='[crypt]'; h.closeWith='[/crypt]'; } } Al final de extras.css agregamos: .boton { text-decoration: none; color: #fff; font-weight: bold; padding: 12px 20px; font-size: 18px; border-radius: 10px; background-color: #00CCFF; box-shadow: 0 5px 5px #313131, 0 9px 0 #393939, 0px 9px 10px rgba(0,0,0,0.4), inset 0px 2px 9px rgba(255,255,255,0.2), inset 0 -2px 9px rgba(0,0,0,0.2); position: relative; border-bottom: 1px solid rgba(255,255,255,0.2); display: inline-block; font-family: Arial, Helvetica, sans; text-shadow: 0px -1px 0px rgba(0,0,0,0.2); margin-bottom:5px; } .boton:hover { box-shadow: 0 5px 5px #313131, 0 9px 0 #393939, 0px 9px 10px rgba(0,0,0,0.4), inset 0px 2px 15px rgba(255,255,255,0.4), inset 0 -2px 9px rgba(0,0,0,0.2); color: #fff !important; } .boton:active { top: 7px; box-shadow: 0 2px 0 #393939, 0px 4px 4px rgba(0,0,0,0.4), inset 0px 2px 5px rgba(0,0,0,0.2); color: #fff !important; } En estilo.css buscamos: .markItUp .markItUpButton17 a { background:transparent url('images/bbcodes.png') no-repeat scroll left top; background-position: left -256px; height: 10px; } Y agregamos abajo: .markItUp .markItUpButton18 a { background:transparent url('images/crypt.png') no-repeat scroll left top; height: 10px; height: 10px; } .markItUp .markItUpButton18 a:hover { background-position: -18px 0px; } .markItUp .markItUpButton18 a:active { background-position: -35px 0px; } Subimos los archivo a sus carpetas. DEMO en la Descarga Archivos Subimos los archivos a la carpeta raiz: vell.php vellenger.php Y la imagen a la carpeta /images/ Esta vercion simplemente es para encriptar los enlaces, Uds, pueden editar su estructura, pero los que quieran mostra publicidad le agregue un rotador de publicidad: En el archivo vell.php veran: $txt[1] = ' Tu Publicidad Aqui '; $txt[2] = ' Tu Publicidad Aqui '; $txt[3] = ' Tu Publicidad Aqui'; Para cambiar el tiempo de la redireccion en el mismo archivo vell.php buscar: var countdownfrom=20 Y lo cambian por el valor que deceen que se demore la redirreccion. Agregan la publicidad de Uds. el cual cambiara cada ves que el usuario refresque o se abra otro enlace,. En si esta vercion la publicidad no tiene funcion Pero podran darle sus ideas. Esta se realizo sobre el script nuevo, No utiliza la herramiente de [url*][/url*] Espero que les sea de Agrado.. Hasta la Proxima..
×