Jump to content

Clasificación


Contenido popular

Showing most liked content since 10/08/17 en todas las áreas

  1. 4 points
    Bienvenido a tu nuevo blog, basado en phpost risus holi :3 les presento un proyecto en el cual no iba a trabajar pero si regalar, le trabaje como 2 semanas si no me equivoco @Alucard bueno y por falta de tiempo y dinero decidi pausarlo, dependiendo de sus comentarios vemos si continuamos o la dejamos asi hahah la idea es un blog sensillo, donde solo puedan editar y crear administradores (autores) basado en plantillas mdb con la idea de crear un entorno al usuario mas dinamica sin que el user final tenga que tocar codigo (cosa imposible ) usando smarty 3, mdb y jquery 3, tratando de crear un sitio responsibe agradable, tratando de que el diseño del usuario se pueda usar en themes creados para el blog. bueno mejor al punto :B home posts editor el editor sube thumbnails borradores buscador cuenta administracion diseño hack de publicidad nota: de 1000 visitas solo a 500 considera (50%) luego un random entre 0 y 1 elige dentro de esos 500 a los que les caiga 0, despues solo acepta que venga de los dominios apuntados, ejemplo publicas algo lo compartes en facebook y en los dominios apuntados tienes a facebook entonces esa persona es aceptada para obligarla a darle click a la publicidad proteccion de contenido esto ultimo lo dejare activo para que puedan ver como funciona demo blog no es la version mas actual porque la que tengo aun no esta estable por lo mismo que ya no le movi y bueno gracias por pasar y espero comentarios
  2. 4 points
    El pedido: Para: @CJ23 PASO 1: Buscamos en inc/php/post.php esto // DO <= PARA EL MENU $smarty->assign("tsDo",$_GET['do']); debajo pegamos ↓ // Mod Ultimos registrados :: Reactualizado 08/09/2017 $smarty->assign("tsLastUser",$tsPosts->getLastUser()); PASO 2: Buscamos en inc/class/c.posts.php esto /* getComentarios() */ function getComentarios($post_id){ y arriba pegamos esto /* MOD Ultimos Registrados :: Reacutalizado 09/08/2017 */ function getLastUser(){ global $tsCore; // $query = db_exec(array(__FILE__,__LINE__),'query', 'SELECT * FROM u_miembros WHERE user_activo= \'1\' AND user_baneado= \'0\' ORDER BY user_id DESC LIMIT 14'); /* LIMIT 14 ← le das el numero que quieras */ if(!$query) exit( show_error('Error al ejecutar la consulta de la línea '.__LINE__.' de '.__FILE__.'.', 'db') ); $data = result_array($query); // return $data; } PASO 3: Crearemos un archivo llamado m.home_last_user.tpl en la carpeta modules, dentro del archivo pegamos esto: {if $tsConfig.c_allow_portal && $tsUser->is_member == true} <div id="webStats"> <div class="wMod clearbeta"> <span class="qtip" title="Último usuario" style="padding: 5px 2px;"> Últimos registro Live <span class="estado">Live</span> </span> <div class="box_cuerpo"> <ul> {foreach from=$tsLastUser item=m} <li> <a href="{$tsConfig.url}/perfil/{$m.user_name}"> <img src="{$tsConfig.url}/files/avatar/{$m.user_id}_120.jpg"/> </a> <span> <a href="{$tsConfig.url}/perfil/{$m.user_name}">{$m.user_name|truncate:9}</a> <i>{$m.user_lastactive|hace}</i> </span> </li> {/foreach} </ul> </div> </div> </div> {/if} {literal} <style> .estado { width:16px; height:16px; background-image: url({/literal}{$tsConfig.images}/status.png{literal}); background-repeat: no-repeat; color: transparent; float: right; } .box_cuerpo ul li { width: 100%; height: 36px; padding: 4px 2px; } .box_cuerpo ul li span { padding: 5px; } .box_cuerpo ul li span a { color: #333; font-size: 14px; font-style: normal; } .box_cuerpo ul li span i { font-size: 10px; color: #999; display: block; } .box_cuerpo ul li a { float: left; } .box_cuerpo ul li a img { width: 34px; padding:2px; } </style> {/literal} PASO 4: Buscamos templates/t.home.tpl </div> <div id="derecha"> y debajo pegamos esto {include file='modules/m.home_last_user.tpl'} PASO 5: Le das los toques de CSS que sea necesario... Esta es mi versión: En sí es más actualización del mod que otra cosa! Para hacerlo a modo LIVE [en vivo] buscas en inc/posts.php $smarty->assign("tsDo",$_GET['do']); y debajo pegas esto $_GET['online'] = true; $tsUsers = $tsUser->getUsuarios(); $smarty->assign("tsUsers",$tsUsers['data']); luego en el archivo creado buscas <ul> {foreach from=$tsLastUser item=m} y la cambias por <ul> {foreach from=$tsUsers item=m} y listo...
  3. 3 points
    Bueno este va a ser un skin, lo que quiere decir que solo afectará las css, tal vez algunos .tpl porque reemplazaré los iconos por los Font icons(Awesome, IconMoon, etc)...Lo que voy a hacer es sacar las imágenes y reemplazarlas por fuentes. ↓ ↓ SI LA IMAGEN NO SE VE ↓ ↓ Ver imagen ↑ ↑ SI LA IMAGEN NO SE VE ↑ ↑ La votación durará desde 13/08 al 13/09
  4. 3 points
    Hola, este es un mod/mini-mod/complemento que aplica un background solo en el perfil... he tratado de hacerlo con home, fotos, tops, etc. desde la cuenta, en teoría lo que quería hacer es que los usuarios eligieran las imágenes que querían poner para las secciones ya mencionadas, pero solo logré para el perfil... Si el mod ya existía pido perdón, porque no lo he visto 1) Ejecutar esta consulta ALTER TABLE `u_perfil` ADD `p_fondo` VARCHAR(200) NOT NULL; 2) Ir a c.cuenta.php y buscar function loadHeadInfo($user_id){ global $tsUser, $tsCore; // INFORMACION GENERAL y dentro de esta función buscamos p.p_socials, p.p_empresa, y agregar a lado de esto p.p_fondo, Luego buscar más abajo } // COMPROBAR PORCENTAJE $total = array(5,8,9,8,9); // CAMPOS EN CADA CATEGORIA $tid = $save - 1; y arriba agregamos case 9: // IN DB $perfilData = array( 'fondo' => $tsCore->setSecure($_POST['fondo']), //Este es para el perfil ); break; 3) Vamos a estilos.css y en body dentro de las llaves {...} agregaremos esto background-position: center center; background-repeat: no-repeat; background-attachment: fixed; background-size: cover; 4) Luego buscar tuTheme/templates/t.cuenta.tpl y debajo de <li><a onclick="cuenta.chgtab(this)">Cambiar Nick</a></li> agregamos <li><a onclick="cuenta.chgtab(this)">Fondo</a></li> un poco más abajo debajo de {include file='modules/m.cuenta_nick.tpl'} agregamos {include file='modules/m.cuenta_fondo.tpl'} 5) Crearemos el archivo m.cuenta_fondo.tpl y la colocaremos en modules <div class="content-tabs fondo" style="display:none"> <fieldset> <div class="alert-cuenta cuenta-9"></div> <div class="field" style="padding: 5px 0"> <label for="fondo" style="display: inline-block;">Fondo del Perfil:</label> <input type="text" value="{$tsPerfil.p_fondo}" maxlength="200" name="fondo" id="fondo" class="text cuenta-save-9" style="width:65%; display: inline-block;"> </div> </fieldset> <div class="buttons"> <input type="button" value="Guardar" onclick="cuenta.save(9)" class="mBtn btnOk"/> </div> <div class="clearfix"></div> </div> 6) Último paso vamos a templates/sections/main_header.tpl y buscamos </head> <body> y arriba agregamos {literal} <style> body { background-image: url({/literal}{$tsInfo.p_fondo}{literal}); } </style> {/literal} RESULTADO FINAL: Para evitar las puntas blancas busquen en estilos.css /****** Bordes Redondos ******/ debajo agregan ↓ ↓ ↓ .rtop { border-radius: 11px 11px 0 0; } .rbott { border-radius: 0 0 11px 11px; } y listo quedará más lindo Para el fondo con opaco → ir a sections/main_header.tpl y buscar <body> debajo pegamos <div id="background_transparent"></div> y en estilo.css debajo de body { ... } pegamos Fondo 1 #background_transparent { background-color: rgba(255,255,255,.6); position: fixed; height: 100%; top: 0; width: 100%; z-index: -1; } Fondo 2 #background_transparent { background-color: rgba(0,0,0,.8); position: fixed; height: 100%; top: 0; width: 100%; z-index: -1; } Fondo1 Fondo2
  5. 2 points
    Bueno les presento un complemento que lo tengo en demo32.hol.es, lo hice porque el panel de la izquierda era muy tosco y feo así que decidí cambiarlo por el de la derecha si alguien quiere este panel, se los pasaré...lo hago así porque no se si les gustará o si lo usarán o no! Para ello deben tener el conjunto de Glyphicon Halflings aunque también se los dejaré por si acaso! Si la imagen no se ve haz clic aquí Después le haré el mod para que el usuario elija la imagen del fondo desde su cuenta!...
  6. 2 points
    Isidro eres un PUTO que dejo botado el foro y script seguimos pegados en la v4 desde que nacio todo... renuevate no te quedes en el pasado PUTAZO ponte Pilas
  7. 2 points
    Hola a todos. Pues este es un Tri-plemento (tres complementos en uno XD), el cual hará que un usuario que sea suspendido o no esté activo no afecte en los números de gente registrada y que de igual manera se muestre en usuarios y se pueda ver su perfil. Ustedes eligen lo que quieran, a su gusto... Para mostrar el perfil en el caso de que la cuenta esté baneada (suspendida)/inactiva. van a perfil.php y buscan: if(empty($usuario['user_id']) || ($usuario['user_activo'] != 1 && !$tsUser->permisos['movcud'] && !$tsUser->is_admod) || ($usuario['user_baneado'] != 0 && !$tsUser->permisos['movcus'] && !$tsUser->is_admod)) { $tsPage = 'aviso'; $tsAjax = 0; $smarty->assign("tsAviso",array('titulo' => 'Opps!', 'mensaje' => (empty($usuario['user_id']) ? 'El usuario no existe' : 'La cuenta de '.$usuario['user_name'].' se encuentra inhabilitada' ), 'but' => 'Ir a p&aacute;gina principal')); y lo cambian por: if(empty($usuario['user_id'])) { $tsPage = 'aviso'; $tsAjax = 0; $smarty->assign("tsAviso",array('titulo' => 'Opps!', 'mensaje' => ('El usuario no existe'), 'but' => 'Ir a página principal')); y eso sería todo para el perfil. No descontar usuarios para las cuentas que estén baneadas (suspendidas)/inactivas. c.tops.php buscan: $q1 = db_exec('fetch_row', db_exec(array(__FILE__, __LINE__), 'query', 'SELECT COUNT(user_id) AS u FROM u_miembros WHERE user_activo = \'1\' && user_baneado = \'0\'')); y lo cambian por: $q1 = db_exec('fetch_row', db_exec(array(__FILE__, __LINE__), 'query', 'SELECT COUNT(user_id) AS u FROM u_miembros')); Mostrar todos los usuarios, es decir, las cuentas que estén baneadas (suspendidas)/inactivas también se mostrarán. Esto se encuentra dentro de la función "getUsuarios()" en c.user.php buscan: // TOTAL Y PAGINAS $query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT COUNT(u.user_id) AS total FROM u_miembros AS u LEFT JOIN u_perfil AS p ON u.user_id = p.user_id WHERE u.user_activo = \'1\' && u.user_baneado = \'0\' '.$w_online.' '.$w_avatar.' '.$w_sex.' '.$w_pais.' '.$w_rango); $total = db_exec('fetch_assoc', $query); $total = $total['total']; $pages = $tsCore->getPagination($total, 12); // CONSULTA $query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT u.user_id, u.user_name, p.user_pais, p.user_sexo, p.p_avatar, p.p_mensaje, u.user_rango, u.user_puntos, u.user_comentarios, u.user_posts, u.user_lastactive, u.user_baneado, r.r_name, r.r_color, r.r_image FROM u_miembros AS u LEFT JOIN u_perfil AS p ON u.user_id = p.user_id LEFT JOIN u_rangos AS r ON r.rango_id = u.user_rango WHERE u.user_activo = \'1\' && u.user_baneado = \'0\' '.$w_online.' '.$w_avatar.' '.$w_sex.' '.$w_pais.' '.$w_rango.' ORDER BY u.user_id DESC LIMIT '.$pages['limit']); // PARA ASIGNAR SI ESTA ONLINE HACEMOS LO SIGUIENTE while($row = db_exec('fetch_assoc', $query)){ if($row['user_lastactive'] > $is_online) $row['status'] = array('t' => 'Online', 'css' => 'online'); elseif($row['user_lastactive'] > $is_inactive) $row['status'] = array('t' => 'Inactivo', 'css' => 'inactive'); else $row['status'] = array('t' => 'Offline', 'css' => 'offline'); // RANGO $row['rango'] = array('title' => $row['r_name'], 'color' => $row['r_color'], 'image' => $row['r_image']); // CARGAMOS $data[] = $row; } y lo cambian por: // TOTAL Y PAGINAS $query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT COUNT(u.user_id) AS total FROM u_miembros AS u LEFT JOIN u_perfil AS p ON u.user_id = p.user_id'); $total = db_exec('fetch_assoc', $query); $total = $total['total']; $pages = $tsCore->getPagination($total, 12); // CONSULTA $query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT u.user_id, u.user_name, p.user_pais, p.user_sexo, p.p_avatar, p.p_mensaje, u.user_rango, u.user_puntos, u.user_comentarios, u.user_posts, u.user_lastactive, u.user_baneado, r.r_name, r.r_color, r.r_image FROM u_miembros AS u LEFT JOIN u_perfil AS p ON u.user_id = p.user_id LEFT JOIN u_rangos AS r ON r.rango_id = u.user_rango ORDER BY u.user_id DESC LIMIT '.$pages['limit']); // PARA ASIGNAR SI ESTA ONLINE HACEMOS LO SIGUIENTE while($row = db_exec('fetch_assoc', $query)){ if($row['user_lastactive'] > $is_online) $row['status'] = array('t' => 'Online', 'css' => 'online'); elseif($row['user_lastactive'] > $is_inactive) $row['status'] = array('t' => 'Inactivo', 'css' => 'inactive'); else $row['status'] = array('t' => 'Offline', 'css' => 'offline'); // RANGO $row['rango'] = array('title' => $row['r_name'], 'color' => $row['r_color'], 'image' => $row['r_image']); // CARGAMOS $data[] = $row; } Gracias , espero que les guste este nuevo tipo de complemento xD
  8. 2 points
    te vas al archivo acciones.js y buscas esto: lang['ingrese el id de yt'] = "Ingrese el ID del video de YouTube:\n\nEjemplo:\nSi la URL de su video es:\nhttp://www.youtube.com/watch?v=CACqDFLQIXI\nEl ID es: CACqDFLQIXI"; y lo cambias por esto: lang['ingrese la url de yt'] = "Ingrese la URL del video de YouTube"; luego buscas esto: function markit_yt(h){ var msg = prompt(lang['ingrese el id de yt'+(is_ie?' IE':'')], lang['ingrese solo el id de yt']); if(msg != null){ h.replaceWith = '[align=center][swf=http://www.youtube.com/v/' + msg + ']Link: [url]http://www.youtube.com/watch?v=' + msg + '[/url][/align]\n'; h.openWith = ''; h.closeWith = ''; }else{ h.replaceWith = ''; h.openWith = ''; h.closeWith = ''; } } y lo cambias por esto: function markit_yt(h){ var msg = prompt(lang['ingrese la url de yt'+(is_ie?' IE':'')], lang['ingrese la url de yt']); if(msg != null){ h.replaceWith = '[align=center][swf=' + msg + '][/align]'; h.openWith = ''; h.closeWith = ''; }else{ h.replaceWith = ''; h.openWith = ''; h.closeWith = ''; } } y ya con eso no tendrás problemas y ahora ya no sera necesario tampoco que coloques solo el id del video, y tomara la ur completa asi sea https
  9. 2 points
    es facil solo hay que hacerle llegar el titulo a los bbcode primero en inc/class/c.posts.php busca esto $postData['post_body'] = $tsCore->parseBadWords($postData['post_smileys'] == 0 ? $tsCore->parseBBCode($postData['post_body']) : $tsCore->parseBBCode($postData['post_body'], 'firma'), true); y reemplaza con $postData['post_body'] = $tsCore->parseBadWords($postData['post_smileys'] == 0 ? $tsCore->parseBBCode($postData['post_body'], 'normal', $postData['post_title']) : $tsCore->parseBBCode($postData['post_body'], 'firma', $postData['post_title']), true); si prestas atencion solo enviamos ala funcion parsebbcode el cuerpo el typo y el titulo ahora en inc/class/c.core.php buscas esto function parseBBCode($bbcode, $type = 'normal') { y reemplaza con function parseBBCode($bbcode, $type = 'normal', $t) { con esto aclaramos que ahora la funcion va a recibir el titulo en forma de variable $t falta enviarlo al bbcode entonces buscas esto $parser->setRestriction(array('url', 'code', 'quote', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 's', 'align', 'spoiler', 'swf', 'video', 'goear', 'hr', 'sub', 'sup', 'table', 'td', 'tr', 'ul', 'li', 'ol', 'notice', 'info', 'warning', 'error', 'success')); y reemplazas con $parser->setRestriction(array('url', 'code', 'quote', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 's', 'align', 'spoiler', 'swf', 'video', 'goear', 'hr', 'sub', 'sup', 'table', 'td', 'tr', 'ul', 'li', 'ol', 'notice', 'info', 'warning', 'error', 'success'), $t); aqui el titulo va hacia bbcode, contenido en la variable $t en la funcion setRestriction() que recibe el array y ahora el titulo ahora hay que buscar la funcion mencionada y aclarar que recibira el titulo en inc/ext/bbcode.inc.php buscas esto public function setRestriction($array) { $this->restriction = $array; $this->addBBcodes(); } y reemplazas con public function setRestriction($array , $t) { $this->restriction = $array; $this->addBBcodes( $title = $t); } aqui ya tenemos el titulo en el bbcode, casi terminamos de aqui mandamos el titulo a addBBcodes() ahora buscamos function addBBcodes() y reemplazas con function addBBcodes($title) para este punto ya sabras lo que esta pasando, si no, no leiste y ya para terminar busca array('tag' => 'img', 'replace' => '<img src="{param}" onload="if(this.width > 735) {this.width=735}"/>', 'parse' => false, 'validParam' => $imgValidator), y reemplaza con array('tag' => 'img', 'replace' => '<img src="{param}" onload="if(this.width > 735) {this.width=735}" title="'.$title.'" alt="'.$title.'" />', 'parse' => false, 'validParam' => $imgValidator), ahora el titulo viene contenido en la variable $title y falta usarlo como alt y title. hasta aqui termino el recorrido del titulo U_u triste bueno espero te sirva
  10. 2 points
    Hola gente de Phpost, hoy les traigo Social Locker para PHPost administrable, para los que no lo conocen, nos permite bloquear cierto contenido (en este caso con el bbcode [sociallocker]) y pedir como "pago" una acción social. Unas capturas: Instalación: En admin.php buscar: /** NOTICIAS **/ Agregar arriba: /** Social locker **/ } elseif($action == 'social-locker'){ if(!empty($_POST['save'])){ if($tsAdmin->saveSocialLocker()) $tsCore->redirectTo($tsCore->settings['url'].'/admin/social-locker?save=true'); } else { $smarty->assign('tsLocker', $tsAdmin->getLocker()); } En posts.php buscar: $smarty->assign("tsPages",$tsPages); Agregar abajo: // Social Locker $smarty->assign('tsLocker', $tsPosts->getLocker()); En c.admin.php buscar: /* savePConfigs() Agregar arriba: /* getLocker() */ function getLocker() { $query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT * FROM s_locker'); $data = db_exec('fetch_assoc', $query); $data['btn'] = unserialize($data['botones_data']); return $data; } /* saveLocker() */ function saveSocialLocker() { global $tsCore; // $s = array( 'titulo' => $tsCore->setSecure($_POST['locker_titulo']), 'body' => $tsCore->setSecure($_POST['locker_body']), 'tema' => empty($_POST['locker_tema']) ? 0 : $_POST['locker_tema'], 'modo' => empty($_POST['locker_modo']) ? 0 : $_POST['locker_modo'], 'cerrar_seg' => (int)$_POST['locker_cerrar_seg'], 'cerrar' => empty($_POST['locker_cerrar']) ? 0 : 1, 'obligar' => empty($_POST['locker_obligar']) ? 0 : 1, 'hide_members' => empty($_POST['locker_hide_members']) ? 0 : 1, 'fb_app_id' => $tsCore->setSecure($_POST['locker_fb_app_id']), 'g_client_id' => $tsCore->setSecure($_POST['locker_g_client_id']), 'contador' => empty($_POST['locker_contador']) ? 0 : 1 ); // $btns = array ( // like 'like' => $_POST['locker_like'], 'like_url' => $_POST['locker_like_url'], 'like_text' => $_POST['locker_like_text'], // FB Share 'fbshare' => $_POST['locker_fbshare'], 'fbshare_url' => $_POST['locker_fbshare_url'], 'fbshare_text' => $_POST['locker_fbshare_text'], // Tweet 'tweet' => $_POST['locker_tweet'], 'tweet_url' => $_POST['locker_tweet_url'], 'tweet_body' => $_POST['locker_tweet_body'], 'tweet_via' => $_POST['locker_tweet_via'], 'tweet_text' => $_POST['locker_tweet_text'], // Follow 'follow' => $_POST['locker_follow'], 'follow_user' => $_POST['locker_follow_user'], 'follow_text' => $_POST['locker_follow_text'], // G+1 'g' => $_POST['locker_g'], 'g_url' => $_POST['locker_g_url'], 'g_text' => $_POST['locker_g_text'], // G Share 'gshare' => $_POST['locker_gshare'], 'gshare_url' => $_POST['locker_gshare_url'], 'gshare_text' => $_POST['locker_gshare_text'], // Linkedin Share 'inshare' => $_POST['locker_inshare'], 'inshare_url' => $_POST['locker_inshare_url'], 'inshare_text' => $_POST['locker_inshare_text'], // Youtube Subscribe 'yt' => $_POST['locker_yt'], 'yt_id' => $_POST['locker_yt_id'], 'yt_text' => $_POST['locker_yt_text'] ); $btns = $tsCore->setSecure(serialize($btns)); // UPDATE if (db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE `s_locker` SET `titulo` = \'' . $s['titulo'] . '\', `body` = \'' . $s['body'] . '\', `tema` = \'' . $s['tema'] . '\', `modo` = \'' . $s['modo'] . '\', `cerrar_seg` = \'' . $s['cerrar_seg'] . '\', `cerrar` = \'' . $s['cerrar'] . '\', `obligar` = \'' . $s['obligar'] . '\', `hide_members` = \'' . $s['hide_members'] . '\', `fb_app_id` = \'' . $s['fb_app_id'] . '\', `g_client_id` = \'' . $s['g_client_id'] . '\', `contador` = \'' . $s['contador'] . '\', `botones_data` = \'' . $btns . '\' WHERE `id` = \'1\'')) return true; else exit( show_error('Error al ejecutar la consulta de la línea '.__LINE__.' de '.__FILE__.'.', 'db') ); } En c.posts.php buscar: /* getSideData($array) */ Agregar arriba: /* getLocker() */ function getLocker() { global $tsCore; $query = db_exec(array(__FILE__, __LINE__), "query", "SELECT * FROM s_locker"); $data = db_exec("fetch_assoc", $query); $data["btn"] = unserialize($data["botones_data"]); // Datos del post $dataPost = $this->getPost(); $post_id = intval($_GET["post_id"]); // Titulo del post $titulo = $dataPost["post_title"]; // Categoria $categoria = $dataPost["categoria"]; // URL del post $urlPost = $tsCore->settings["url"] . "/posts/" . $categoria["c_seo"] . "/" . $post_id . "/" . $tsCore->setSEO($titulo) . ".html"; // Fix saltos de linea $data["body"] = preg_replace("[\n|\r|\n\r]", " ", $data["body"]); // Remplazamos BBCodes $bbcodes = array("[post_title]", "[post_url]"); $bbreturn = array($titulo, $urlPost); $count = count($data); for($i = 0; $i < $count; $i++) { $data = str_replace($bbcodes, $bbreturn, $data); $data["btn"] = str_replace($bbcodes, $bbreturn, $data["btn"]); } return $data; } En c.core.php busca: // BBCodes permitidos $parser->setRestriction(array('url', 'code', 'quote', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 's', 'align', 'spoiler', 'swf', 'video', 'goear', 'hr', 'sub', 'sup', 'table', 'td', 'tr', 'ul', 'li', 'ol', 'notice', 'info', 'warning', 'error', 'success' y agrega , 'sociallocker' quedando de esta manera: // BBCodes permitidos $parser->setRestriction(array('url', 'code', 'quote', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 's', 'align', 'spoiler', 'swf', 'video', 'goear', 'hr', 'sub', 'sup', 'table', 'td', 'tr', 'ul', 'li', 'ol', 'notice', 'info', 'warning', 'error', 'success', 'sociallocker')); En bbcode.inc.php busca: array('tag' => 'success', 'replace' => '<div class="bbcmsg success">{param}</div>') Y remplaza por: array('tag' => 'success', 'replace' => '<div class="bbcmsg success">{param}</div>'), array('tag' => 'sociallocker', 'replace' => '<div id="socialloker_by_Basdower">{param}</div>') (Agregamos una coma y el nuevo bbcode) En t.posts.tpl busca: {include file='sections/main_header.tpl'} Agrega abajo: <link href="{$tsConfig.tema.t_url}/css/pandalocker.css" rel="stylesheet" type="text/css" /> <script src="{$tsConfig.js}/pandalocker.js" type="text/javascript"></script> {if $tsLocker.hide_members == 1 && $tsUser->is_member == 1}{else} <script>{literal}$(function(){if($("#socialloker_by_Basdower").length) {$('#socialloker_by_Basdower').sociallocker({ text:{header: '{/literal}{$tsLocker.titulo}{literal}',message: '{/literal}{$tsLocker.body}{literal}'},{/literal}{if $tsLocker.obligar == 1}demo: true,{/if}{literal}theme: '{/literal}{if $tsLocker.tema == 0}starter{elseif $tsLocker.tema == 1}secrets{elseif $tsLocker.tema == 2}flat{elseif $tsLocker.tema == 3}dandyish{elseif $tsLocker.tema == 4}glass{/if}{literal}',overlap:{mode: '{/literal}{if $tsLocker.modo == 0}full{elseif $tsLocker.modo == 1}transparence{elseif $tsLocker.modo == 2}blurring{/if}{literal}'},locker:{{/literal}{if $tsLocker.cerrar_seg > 0}{literal}timer: '{/literal}{$tsLocker.cerrar_seg}{literal}',{/literal}{/if}{literal}close: {/literal}{if $tsLocker.cerrar == 1}true{else}false{/if}{literal}},{/literal}{if $tsLocker.btn.like == 1 || $tsLocker.btn.fbshare == 1}{literal}facebook:{{/literal}{if $tsLocker.btn.like == 1}{literal}like:{url: '{/literal}{$tsLocker.btn.like_url}{literal}',title: '{/literal}{$tsLocker.btn.like_text}{literal}'},{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.fbshare == 1}{literal}share:{url: '{/literal}{$tsLocker.btn.fbshare_url}{literal}',title: '{/literal}{$tsLocker.btn.fbshare_text}{literal}'},{/literal}{/if}{literal}appId: '{/literal}{$tsLocker.fb_app_id}{literal}'},{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.tweet == 1 || $tsLocker.btn.follow == 1}{literal}twitter:{{/literal}{if $tsLocker.btn.tweet == 1}{literal}tweet:{url: '{/literal}{$tsLocker.btn.tweet_url}{literal}',text: '{/literal}{$tsLocker.btn.tweet_body}{literal}',via: '{/literal}{$tsLocker.btn.tweet_via}{literal}',title: '{/literal}{$tsLocker.btn.tweet_text}{literal}'},{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.follow == 1}{literal}follow:{url: '{/literal}{$tsLocker.btn.follow_user}{literal}',title: '{/literal}{$tsLocker.btn.follow_text}{literal}'}{/literal}{/if}{literal}},{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.g == 1 || $tsLocker.btn.gshare == 1}{literal}google:{{/literal}{if $tsLocker.btn.g == 1}{literal}plus:{url: '{/literal}{$tsLocker.btn.g_url}{literal}',title: '{/literal}{$tsLocker.btn.g_text}{literal}'},{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.gshare == 1}{literal}share:{url: '{/literal}{$tsLocker.btn.gshare_url}{literal}',title: '{/literal}{$tsLocker.btn.gshare_text}{literal}'}{/literal}{/if}{literal}},{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.inshare == 1}{literal}linkedin:{share:{url: '{/literal}{$tsLocker.btn.inshare_url}{literal}',title: '{/literal}{$tsLocker.btn.inshare_text}{literal}'}},{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.yt == 1}{literal}youtube:{subscribe:{channelId: '{/literal}{$tsLocker.btn.yt_id}{literal}',clientId: '{/literal}{$tsLocker.g_client_id}{literal}',title: '{/literal}{$tsLocker.btn.yt_text}{literal}'}},{/literal}{/if}{literal}buttons:{order: [{/literal}{if $tsLocker.btn.like == 1}{literal}"facebook-like",{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.fbshare == 1}{literal}"facebook-share",{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.tweet == 1}{literal}"twitter-tweet",{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.follow == 1}{literal}"twitter-follow",{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.g == 1}{literal}"google-plus",{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.gshare == 1}{literal}"google-share",{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.inshare == 1}{literal}"linkedin-share",{/literal}{/if}{literal}{/literal}{if $tsLocker.btn.yt == 1}{literal}"youtube-subscribe"{/literal}{/if}{literal}],counters: {/literal}{if $tsLocker.contador == 1}true{else}false{/if}{literal},lazy: true} }); }});{/literal}</script> {/if} En m.admin_sidemenu.tpl busca: <li id="a_ads"><span class="cat-title"><a href="{$tsConfig.url}/admin/ads">Publicidad</a></span></li> Y agrega abajo: <li id="a_social"><span class="cat-title"><a href="{$tsConfig.url}/admin/social-locker">Social Locker</a></span></li> En t.admin.tpl busca: {/if} Agrega arriba: {elseif $tsAction == 'social-locker'} {include file='admin_mods/m.admin_social_locker.tpl'} En admin.css busca: li#a_badwords {background-image: url(../images/icons/stop.png);} Y agrega abajo: li#a_social {background-image: url(../images/icons/social-locker.png);background-position: 0px -5px;} Realiza estas consultas SQL: CREATE TABLE IF NOT EXISTS `s_locker` ( `id` INT NOT NULL AUTO_INCREMENT , `titulo` VARCHAR(150) NOT NULL , `body` TEXT NOT NULL , `tema` INT NOT NULL , `modo` INT NOT NULL , `cerrar_seg` INT NOT NULL , `cerrar` INT NOT NULL , `obligar` INT NOT NULL , `hide_members` INT NOT NULL , `fb_app_id` VARCHAR(50) NOT NULL , `g_client_id` VARCHAR(100) NOT NULL , `contador` INT NOT NULL , `botones_data` TEXT NOT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; INSERT INTO `s_locker`(`titulo`, `body`, `tema`, `modo`, `cerrar_seg`, `cerrar`, `obligar`, `hide_members`, `fb_app_id`, `g_client_id`, `contador`, `botones_data`) VALUES ('¡Este contenido está bloqueado!', 'Utilice uno de los botones de abajo para desbloquear el contenido.', 0, 0, 0, 0, 0, 0, '', '', 1, 'a:26:{s:4:"like";s:1:"0";s:8:"like_url";s:0:"";s:9:"like_text";s:4:"Like";s:7:"fbshare";s:1:"0";s:11:"fbshare_url";s:0:"";s:12:"fbshare_text";s:5:"share";s:5:"tweet";s:1:"0";s:9:"tweet_url";s:0:"";s:10:"tweet_body";s:0:"";s:9:"tweet_via";s:0:"";s:10:"tweet_text";s:5:"tweet";s:6:"follow";s:1:"0";s:11:"follow_user";s:0:"";s:11:"follow_text";s:6:"follow";s:1:"g";s:1:"0";s:5:"g_url";s:0:"";s:6:"g_text";s:5:"+1 us";s:6:"gshare";s:1:"0";s:10:"gshare_url";s:0:"";s:11:"gshare_text";s:5:"share";s:7:"inshare";s:1:"0";s:11:"inshare_url";s:0:"";s:12:"inshare_text";s:5:"share";s:2:"yt";s:1:"0";s:5:"yt_id";s:0:"";s:7:"yt_text";s:9:"subscribe";}') Y finalmente sube estos archivos a sus respectivas carpetas. DEMO (No prometo que dure mucho xD) Notas: Utilizar el bbcode [sociallocker][/sociallocker] para bloquear el contenido. Debido a los límites de la API de Twitter y LinkedIn es posible desbloquear el contenido cerrando la ventana de dialogo sin compartir. Para el boton share de fb es recomendable utilizar Open Graph. Para los botones de Compartir con FB y Suscribirse a YT es necesario crear una api: Facebook App ID, Google Client ID si no los piensan usar, no es necesario. Bueno eso es todo, nos vemos en otro aporte.
  11. 2 points
    [Mini-Mod] Aumentar/Disminuir texto! V.2 Versión más simplificada... Hace lo mismo que la V.1 pero esta cuenta solamente con 2 opciones Descargaremos estas 2 imágenes, y la guardan en la carpeta de images Imagen 1 → la guardan como disminuir.png Imagen 2 → la guardan como aumentar.png 1) Vamos a sections/main_footer.tpl y arriba de </body> pegamos esto <div class="aumendim"> <a href="#" id="increaseFont"><img src="{$tsConfig.images}/aumentar.png" alt=""></a> <a href="#" id="decreaseFont"><img src="{$tsConfig.images}/disminuir.png" alt=""></a> </div> {literal} <style> .aumendim { float: left; position: fixed; bottom: 20px; left: 20px; } .aumendim a { padding: 5px; } </style> {/literal} <script src="{$tsConfig.js}/mix.js" type="text/javascript"></script> 2) Luego descargamos este archivo mix.js y lo guardamos en la carpeta tu_theme/js y listo
  12. 2 points
    hi <3 en inc/php/posts.php arriba o abajo de $tsPage = "post.aviso"; pega esto http_response_code(404); y ia
  13. 1 point
    Bueno dice N°2 porque a la N°1 la tengo que adaptar a la default ya que tenia class de bootstrap! si no se ve clic 1) Crean un archivo llamado panel.js y agregan esto dentro 2) En extras.css agregan esto 3) Ahora crearemos un archivo llamado head_usuario.tpl y lo colocaremos en sections y dentro agregaremos la parte del st-panel-footer la pueden sacar no hay problema 4) Ahora en la misma carpeta sections buscamos main_footer.tpl y agregaremos esto arriba de </body> {include file='sections/head_usuario.tpl'} <script src="{$tsConfig.js}/panel.js" type="text/javascript"></script> 5) Para los iconos descarguen esto → ICONOS FUENTES ← y lo descomprimen en css 6) Busquen en main_header.tpl y debajo de <link href="{$tsConfig.tema.t_url}/extras.css" rel="stylesheet" type="text/css" /> colocan <link rel="stylesheet" href="{$tsConfig.css}/iconfont.css"> y eso sería todo En el caso que haya error avísenme! Esta es la N°1 si no se ve clic Ver panel N°2 ir a Demo32.hol.es Usuario: Demo Pass: demouser
  14. 1 point
    Hola a todos, en colaboración con @bits4me les traemos el actualizador de Smarty 3 automático para sus paginas webs con Risus 1.2.7 y 1.2.6. Esta vez con la versión final, con pequeños cambios y mejoras! Solo lo suben a su página web por medio de ftp, admin de archivos, etc. Y lo descomprimen. Luego de eso, se van a su web y le agregan a la dirección /updater/index.php Ejemplo: Si mi web se ingresa a http://phpost.net entonces para entrar al actualizador sería http://phpost.net/updater/index.php así de simple. Luego de eso solo le dan a comenzar, elijen su versión de Smarty y el proceso será automático, les aviso que se tarda 1 minuto como máximo, así que no vayan a cancelar o reiniciar la pagina. Si tienen una carpeta /updater/ antes de subir la de este mod, borrenla. Espero que me mencionen recomendaciones o sugerencias, si alguna vez llego a publicar otra versión, es posible que sean incluidas. Descargar Por Mega. Cambios: Testeado con: Php 5.4, 7.0 y Risus 1.2.7. Los que tengan versiones anteriores se les avisará por el mismo mod mediante el sistema de feed. Captura:
  15. 1 point
    Hola a todos, muchas gracias a todos los que se han unido y se seguirán uniendo . Hoy les traigo los avances que hay para la primera release oficial de Risus 2, la versión 0.2 Alpha. La primera, es decir, la 0.1 Alpha pues desapareció misteriosamente de mi disco duro, así que he vuelto a programar una nueva con más mejoras que la anterior. Esta versión actualmente trae: -Bootstrap 4 -Jquery 3 + Migrador (por el momento, @Altffenser esta colaborando con la actualización de ciertas funciones, muchas gracias!). -Smarty 3 -Eliminación y optimización de código. -Nueva carpeta llamada "Engine" donde estará el config.inc.php y la carpeta /inc/ y /cache/. -Nuevo install. -Los recursos de los temas serán desde ahora desde /themes/default/res/etcetc/. -El archivo "install.php" es incluido en el theme default. -Se diseña una herramienta para crear temas online. Por el momento, el upgrade estará deshabilitado hasta que se pueda sacar una versión estable y re-estructurar todo. Luego de lanzar la primera versión, se necesitan diseñadores que puedan hacer un theme basado en esta versión, hasta el momento, se estarían incluyendo más funciones, así que no se puede diseñar en base a Phpost Risus 1.2.
  16. 1 point
    Para que quiera entrar a la zeronet sin descargar nada, ahí tienen mi proxy https://zero.l0y.us/
  17. 1 point
  18. 1 point
    Parece que es Smarty en sí. Un amigo lo instalo con Php 7.1 y dañó todo su sitio. Yo sigo trabajando con Php 7.0 y 5.6, por eso quizás no lo alcancé a mencionar. Gracias por tu aporte topu.
  19. 1 point
    cuando una imagen no se puede cargar se muestra un texto mostrando de que trata la imagen y eso a google le divierte
  20. 1 point
    Que tienes en mente? :6 Cackear PHPost y banear a Isidro por su antigua ausencia Welcome to world
  21. 1 point
    Es facil lo que quieres hacer, solo usa la función truncate en la plantilla smarty, y para lo del aliniamiento basta con agregar: display: inline-block; O float: left; pero me imagino que es como hablarte en chino no entiendes donde agregarlo cierto? asi que me da paja agregar todo el rollo por aca. mandame un mp y te explico.
  22. 1 point
    Hola a todos, este post es para mostrarles en lo que he estado trabajando. He estado trabajando en Risus 2, por lo tanto, algo de lo que he podido actualizar fueron los dialogs por defecto de Risus. El problema es que tuve algunos problemas de compatibilidad, para empezar hay que usar Jquery 3 para que el archivo de Bootstrap.js (4.0.0) funcione. Lo segundo, si hago eso, los: hovercard y plugins se van a la basura, así que habrá que actualizarlos también para que funcionen. Y tercero, podría usar el migrador pero con eso el mydialog, es decir, los archivos de acciones.js, no toman como funciones a los modals. Si alguien le interesa probar, aquí se los dejo: Usando Jquery 3 [SIN MIGRATOR] y Bootstrap 4.0.0-beta (la última hasta la fecha: 13/08/2017). En el archivo acciones.js buscamos: /* mydialog */ var mydialog = { is_show: false, class_aux: '', mask_close: true, close_button: false, show: function(class_aux){ if(this.is_show) return; else this.is_show = true; if($('#mydialog').html() == '') //Primera vez $('#mydialog').html('<div id="dialog"><div id="title"></div><div id="cuerpo"><div id="procesando"><div id="mensaje"></div></div><div id="modalBody"></div><div id="buttons"></div></div></div>'); if(class_aux==true) $('#mydialog').addClass(this.class_aux); else if(this.class_aux != ''){ $('#mydialog').removeClass(this.class_aux); this.class_aux = ''; } if(this.mask_close) $('#mask').click(function(){ mydialog.close() }); else $('#mask').unbind('click'); if(this.close_button) $('#mydialog #dialog').append('<span onclick="mydialog.close()">X</span>'); else $('#mydialog #dialog .close_dialog').remove(); $('#mask').css({'width':$(document).width(),'height':$(document).height(),'display':'block'}); if(jQuery.browser.msie && jQuery.browser.version < 7) //Fix IE<7 <- fack you $('#mydialog #dialog').css('position', 'absolute'); else $('#mydialog #dialog').css('position', 'fixed'); $('#mydialog #dialog').fadeIn('fast'); }, close: function(){ //Vuelve todos los parametros por default this.class_aux = ''; this.mask_close = true; this.close_button = false; this.is_show = false; $('#mask').css('display', 'none'); $('#mydialog #dialog').fadeOut('fast', function(){ $(this).remove() }); this.procesando_fin(); }, center: function(){ if($('#mydialog #dialog').height() > $(window).height()-60) $('#mydialog #dialog').css({'position':'absolute', 'top':20}); else $('#mydialog #dialog').css('top', $(window).height()/2-$('#mydialog #dialog').height()/2); $('#mydialog #dialog').css('left', $(window).width()/2-$('#mydialog #dialog').width()/2); }, title: function(title){ $('#mydialog #title').html(title); }, body: function(body, width, height){ if(!width && (jQuery.browser.opera || (jQuery.browser.msie && jQuery.browser.version<7))) width = '400px'; $('#mydialog #dialog').width(width?width:'').height(height?height:''); $('#mydialog #modalBody').html(body); }, buttons: function(display_all, btn1_display, btn1_val, btn1_action, btn1_enabled, btn1_focus, btn2_display, btn2_val, btn2_action, btn2_enabled, btn2_focus){ if(!display_all){ $('#mydialog #buttons').css('display', 'none').html(''); return; } if(btn1_action=='close') btn1_action='mydialog.close()'; if(btn2_action=='close' || !btn2_val) btn2_action='mydialog.close()'; if(!btn2_val){ btn2_val = 'Cancelar'; btn2_enabled = true; } var html = ''; if(btn1_display) html += '<input type="button" class="btn btn-success'+(btn1_enabled?'':' disabled')+'" style="display:'+(btn1_display?'inline-block':'none')+'"'+(btn1_display?' value="'+btn1_val+'"':'')+(btn1_display?' onclick="'+btn1_action+'"':'')+(btn1_enabled?'':' disabled')+' />'; if(btn2_display) html += ' <input type="button" class="btn btn-danger'+(btn1_enabled?'':' disabled')+'" style="display:'+(btn2_display?'inline-block':'none')+'"'+(btn2_display?' value="'+btn2_val+'"':'')+(btn2_display?' onclick="'+btn2_action+'"':'')+(btn2_enabled?'':' disabled')+' />'; $('#mydialog #buttons').html(html).css('display', 'inline-block'); if(btn1_focus) $('#mydialog #buttons .btn.btn-success').focus(); else if(btn2_focus) $('#mydialog #buttons .btn.btn-danger').focus(); }, buttons_enabled: function(btn1_enabled, btn2_enabled){ if($('#mydialog #buttons .btn.btn-success')) if(btn1_enabled) $('#mydialog #buttons .btn.btn-success').removeClass('disabled').removeAttr('disabled'); else $('#mydialog #buttons .btn.btn-success').addClass('disabled').attr('disabled', 'disabled'); if($('#mydialog #buttons .btn.btn-danger')) if(btn2_enabled) $('#mydialog #buttons .btn.btn-danger').removeClass('disabled').removeAttr('disabled'); else $('#mydialog #buttons .btn.btn-danger').addClass('disabled').attr('disabled', 'disabled'); }, alert: function(title, body, reload){ this.show(); this.title(title); this.body(body); this.buttons(true, true, 'Aceptar', 'mydialog.close();' + (reload ? 'location.reload();' : 'close'), true, true, false); this.center(); }, error_500: function(fun_reintentar){ setTimeout(function(){ mydialog.procesando_fin(); mydialog.show(); mydialog.title('Error'); mydialog.body(lang['error procesar']); mydialog.buttons(true, true, 'Reintentar', 'mydialog.close();'+fun_reintentar, true, true, true, 'Cancelar', 'close', true, false); mydialog.center(); }, 200); }, procesando_inicio: function(value, title){ if(!this.is_show){ this.show(); this.title(title); this.body(''); this.buttons(false, false); this.center(); } $('#mydialog #procesando #mensaje').html('<i class="fa fa-spinner fa-pulse fa-4x fa-fw"></i>'); $('#mydialog #procesando').fadeIn('fast'); }, procesando_fin: function(){ $('#mydialog #procesando').fadeOut('fast'); } }; document.onkeydown = function(e){ key = (e==null)?event.keyCode:e.which; if(key == 27) mydialog.close(); }; Y lo cambiamos por: /* MYDIALOG (USANDO BOOTSTRAP (4.0 Y 3.0) (JQUERY 3) | MOD: v0.1 ALPHA) */ /* ADAPTADO POR: CALMBEFPHP (https://www.phpost.net/foro/perfil/8214-calmbefphp/) */ var mydialog = { is_show: false, class_aux: '', close_button: false, show: function(class_aux){ //GENERAMOS LA MODAL $('#mydialog').html('<div class="modal fade" id="dialogmodalbs" role="dialog"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"> <button type="button" class="close" onclick="mydialog.close();">&times;</button><h4 class="modal-title"></h4></div><div class="modal-body" id="cuerpo"><div class="modalad-procesando"><div class="modalad-procesando-mensaje"></div></div><div class="modalad-modalBody"></div></div><div class="modal-footer"></div></div></div></div>'); //LA LLAMAMOS CON SU FUNCION RESPECTIVA $("#dialogmodalbs").modal(); //NI IDEA PARA QUE SERA ESTO PERO LO DEJO IGUAL XD if(class_aux==true) $('#mydialog').addClass(this.class_aux); else if(this.class_aux != ''){ $('#mydialog').removeClass(this.class_aux); this.class_aux = ''; } }, close: function(){ //CERRAR MODAL //setTimeout(function(){ $('#dialogmodalbs').modal('toggle'); //}, 200); //ELIMINARLA //setTimeout(function(){ //$("#mydialog").html(""); //}, 600); }, closefull: function(){ //CERRAR MODAL setTimeout(function(){ $('#dialogmodalbs').modal('toggle'); }, 200); //ELIMINARLA setTimeout(function(){ $("#mydialog").html(""); }, 600); }, title: function(title){ $('.modal-title').html(title); }, body: function(body, width, height){ $('.modalad-modalBody').html(body); }, buttons: function(display_all, btn1_display, btn1_val, btn1_action, btn1_enabled, btn1_focus, btn2_display, btn2_val, btn2_action, btn2_enabled, btn2_focus){ if(!display_all){ $('.modal-footer').css('display', 'none').html(''); return; } if(btn1_action=='close') btn1_action='mydialog.close()'; if(btn2_action=='close' || !btn2_val) btn2_action='mydialog.close()'; if(!btn2_val){ btn2_val = 'Cancelar'; btn2_enabled = true; } var html = ''; if(btn1_display) html += '<input type="button" class="btn btn-success'+(btn1_enabled?'':' disabled')+'" style="display:'+(btn1_display?'inline-block':'none')+'"'+(btn1_display?' value="'+btn1_val+'"':'')+(btn1_display?' onclick="'+btn1_action+'"':'')+(btn1_enabled?'':' disabled')+' />'; if(btn2_display) html += ' <input type="button" class="btn btn-danger'+(btn1_enabled?'':' disabled')+'" style="display:'+(btn2_display?'inline-block':'none')+'"'+(btn2_display?' value="'+btn2_val+'"':'')+(btn2_display?' onclick="'+btn2_action+'"':'')+(btn2_enabled?'':' disabled')+' />'; $('.modal-footer').html(html).css('display', 'inline-block'); if(btn1_focus) $('.modal-footer .btn.btn-success').focus(); else if(btn2_focus) $('.modal-footer .btn.btn-danger').focus(); }, buttons_enabled: function(btn1_enabled, btn2_enabled){ if($('.modal-footer .btn.btn-success')) if(btn1_enabled) $('.modal-footer .btn.btn-success').removeClass('disabled').removeAttr('disabled'); else $('.modal-footer .btn.btn-success').addClass('disabled').attr('disabled', 'disabled'); if($('.modal-footer .btn.btn-danger')) if(btn2_enabled) $('.modal-footer .btn.btn-danger').removeClass('disabled').removeAttr('disabled'); else $('.modal-footer .btn.btn-danger').addClass('disabled').attr('disabled', 'disabled'); }, alert: function(title, body, reload){ this.show(); this.title(title); this.body(body); this.buttons(true, true, 'Aceptar', 'mydialog.close();' + (reload ? 'location.reload();' : 'close'), true, true, false); this.center(); }, error_500: function(fun_reintentar){ setTimeout(function(){ mydialog.procesando_fin(); mydialog.show(); mydialog.title('Error'); mydialog.body(lang['error procesar']); mydialog.buttons(true, true, 'Reintentar', 'mydialog.close();'+fun_reintentar, true, true, true, 'Cancelar', 'close', true, false); mydialog.center(); }, 200); }, procesando_inicio: function(value, title){ if(!this.is_show){ this.show(); this.title(title); this.body(''); this.buttons(false, false); this.center(); } $('.modalad-procesando-mensaje').html('<div class="alert alert-info" style="width:100%;height:100%;">Procesando...</div>'); $('.modalad-procesando').fadeIn('fast'); }, procesando_fin: function(){ $('.modalad-procesando').fadeOut('fast'); } }; //CERRAR X ESC document.onkeydown = function(e){ key = (e==null)?event.keyCode:e.which; if(key == 27) //TECLA ESC Y CERRAMOS Y ELIMINAMOS DIALOG mydialog.closefull(); }; //ELIMINAR MASK ANTIGUA $( document ).ready(function() { $("#mask").remove(); }); /****** FIN MODAL ********/ Espero que puedan aportar con algo, ya que no sé que más hacerle para que funcione . Gracias!
  23. 1 point
    Hola a todos, en este complemento podrán mostrar en detalle la IP que estén buscando en el buscador de IP del panel de moderación. En m.mod_buscador.tpl buscan: {elseif $tsAct == 'search'} y agregan abajo: {if $tsContenido.tipo == 1} <hr class="separator" /><h2>Datos de la IP:</h2>Tu IP: {$smarty.server.REMOTE_ADDR}.<br/>Datos de la IP ({$tsContenido.contenido}):<br/> {php}/** DETALLES DE LA IP SOLICITADA | BY: CALMBEFPHP (http://phpost.net/foro/perfil/8214-calmbefphp/) **/ $ipfind_json_string = 'http://ipinfo.io/'.$_GET['texto'].'/json'; $ipfind_jsondata = file_get_contents($ipfind_json_string); $ipfind_obj = json_decode($ipfind_jsondata,true); if($ipfind_obj != '') { for ($i = 0; $i < count($ipfind_obj); $i++) { $ipfind_key= key($ipfind_obj); $ipfind_val= $ipfind_obj[$ipfind_key]; if ($ipfind_val<> ' ') { echo ''.$ipfind_key.' : '. $ipfind_val .' </br>'; } next($ipfind_obj); } } else { echo 'No se pudo obtener informacion de la IP solicitada para la IP '.$_GET['texto'].'<br/>'; } {/php} <small>Agradecimientos a <a href="http://ipinfo.io" target="blank">IPInfo.io</a>.</small><hr class="separator" />{/if} Captura: Ip que existe: Ip que no existe o no salen datos desde la API: Eso sería todo, espero que les guste!
  24. 1 point
    Hola a todos, hoy les traigo este mini-mod que es para mostrar los modos del perfil mediante la url. Esto es muy parecido al sistema de T!, por ejemplo si vamos a : http://MI_WEB/perfil/USUARIO/posts/ Nos llevará a los posts. Esto se basa en los nombres de T! así que bueno.. Instalación: 1.- Nos vamos a .htaccess y buscamos: #PERFIL RewriteRule ^perfil/([A-Za-z0-9_-]+)$ engine/inc/php/perfil.php?user=$1 [QSA,L] RewriteRule ^perfil/([A-Za-z0-9_-]+)/$ engine/inc/php/perfil.php?user=$1 [QSA,L] RewriteRule ^perfil/([A-Za-z0-9_-]+)/([0-9]+)$ engine/inc/php/perfil.php?user=$1&pid=$2 [QSA,L] 2.- Lo cambiamos por: #PERFIL RewriteRule ^perfil/([A-Za-z0-9_-]+)$ engine/inc/php/perfil.php?user=$1 [QSA,L] RewriteRule ^perfil/([A-Za-z0-9_-]+)/$ engine/inc/php/perfil.php?user=$1 [QSA,L] RewriteRule ^perfil/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/$ engine/inc/php/perfil.php?user=$1&mode=$2 [QSA,L] RewriteRule ^perfil/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)$ engine/inc/php/perfil.php?user=$1&mode=$2 [QSA,L] RewriteRule ^perfil/([A-Za-z0-9_-]+)/([0-9]+)$ engine/inc/php/perfil.php?user=$1&pid=$2 [QSA,L] 3.- Vamos a perfil.php y buscamos }else{ $smarty->assign("tsMuro",$tsMuro->getWall($usuario['user_id'])); $smarty->assign("tsType","wall"); } } 4.- Y agregamos abajo: //MODOS DEL PERFIL //CREADO POR CALMBEFPHP -> https://www.phpost.net/foro/perfil/8214-calmbefphp/ $mode = $_GET['mode']; if($mode == 'actividad' || $mode == 'wall' || $mode == 'info' || $mode == 'posts' || $mode == 'seguidores' || $mode == 'siguiendo' || $mode == 'medallas') { $modeEnable = true; $tsMode = $mode; $smarty->assign("tsMode",$mode); } 4.5 - Buscamos en el mismo archivo: $tsTitle = 'Perfil de '.$tsInfo['nick'].' - '.$tsTitle; 4.9 - Y lo cambiamos por: if($modeEnable == true) { $tsTitle = ucfirst($mode).' de '.$tsInfo['nick'].' - '.$tsTitle; } else { $tsTitle = 'Perfil de '.$tsInfo['nick'].' - '.$tsTitle; } 5.- Por último, vamos al t.perfil.tpl y buscamos: {include file='sections/main_header.tpl'} 6.- Y agregamos abajo: {if $tsMode}<script type="text/javascript">{literal}$(document).ready(function(){ perfil.load_tab('{/literal}{$tsMode}{literal}', this); }); {/literal}</script>{/if} Y eso sería todo. Ojalá les guste y les sirva
  25. 1 point
    esta muy bueno, como no entendia para que servia y no hay captura (quizas porque no hace falta) lo unico que me quedo fue probarlo en localhost y esta bueno, seria algo asi como para poner un link donde querramos y que ese link lleve directamente a la informacion especifica del perfil que queremos mostrar y no que si hacen clic en "ver mas informacion del usuario" por ejemplo, lo lleve al perfil pero a su muro, con este metodo lo lleva directamente al perfil pero a la informacion del usuario. me gusto, gracias.
  26. 1 point
    te sonara un poco descabellado pero copea y pega de nuevo los plugins de mi descarga y reemplaza todo lo que encuentre, talvez estes usando un plugin que es para smarty 2
  27. 1 point
    Osea, me estas diciendo que estas modificando un theme ya modificado. No era lo mismo hacerlo desde la versión default y ya? y por que usar icomoon y fontawesome? si ya con uno te alcanza.
  28. 1 point
    Hola,deja la url de tu web para verlo. Hola,el logo es un icono de fontawesome,está en el archivo head_menu.tpl --> themes/Carbon/templates/sections/head_menu.tpl logo --> <i class="fa fa-anchor"></i> head_menu.tpl <div class="nav-left"> <a class="nav-item title is-active" href="{$tsConfig.url}"> <i class="fa fa-anchor"></i> {$tsConfig.titulo} </a> </div>
  29. 1 point
  30. 1 point
    En el caso que no hayas visto el mensaje acá te lo dejó: populares.tpl Se me olvido que si te da error cambies truncate por limit.
  31. 1 point
    Ve al archivo moderacion.php que está en inc/php y al lado de: $action == 'fotos' Agrega: || $action == 'temas' || $action == 'comunidades' Esto debe solucionar tu problema ya que este paso me hizo falta indicarlo en las instrucciones de la instalación.
  32. 1 point
    Lo que podes hacer es ir a inc/php/pages.php case 'dmca': break; y debajo agregas case 'tupagina': break; luego vas a default/templates/t.pages.tpl y buscas {elseif $tsAction == 'dmca'} {include file='modules/m.pages_dmca.tpl'} debajo agregas {elseif $tsAction == 'tupagina'} {include file='modules/m.pages_tupagina.tpl'} después vas a sections en head_submenu.tpl buscas <div class="clearBoth"></div> </ul> {include file='sections/head_categorias.tpl'} y arriba colocas <li{if $tsSubmenu == 'tupagina'} class="here"{/if}><a class=vctip title="titulo " href="{$tsConfig.url}/pages/tupagina/">Nombre</a></li> creas un archivo en modules llamado m.pages_tupagina.tpl y dentro le pones el contenido que quieras...obviamente donde dice tupagina le das el nombre que quieras esto es más rápido! para los php tienes que crear c.tupagina.php en class, tupagina.php en php obviamente mirás los otros modelos de los php
  33. 1 point
  34. 1 point
    Hola,la misma versión que el script original,la versión 2.6.28 , puedes ver la versión en el archivo.
  35. 1 point
    @KillerJohn y para que los que lo deseen Para visualizar los usuarios que están la página CHAT haces lo siguiente: En t.localizacion.tpl buscas: {elseif $l.tipo == 13} {$l.titulo} <a href="{$tsConfig.url}/{$l.url}/" title="Mi">Portal</a> Debajo agregas {elseif $l.tipo == 17} {$l.titulo} <a href="{$tsConfig.url}/pages/{$l.url}/" title="Chat">Chat</a> En c.localizacion.php buscas case 16: $titulo = "Viendo la página de moderación"; $url = ""; break; Debajo pegas case 17: $titulo = "Viendo la página del chat"; $url = "chat"; break; En pages.php buscas switch($action){ case 'ayuda': break; Arriba colocas // ↓ ↓ Localizando usuarios en el chat function Localizacion() { global $tsLoc, $tsUser; $tsLoc->setLocalizacion(17, 0, $tsUser->uid); } Localizacion(); // ↑ ↑ Localizando usuarios en el chat
  36. 1 point
    Seguramente el theme no es compatible con la sección al 100%. No tengo cómo comprobar el diseño ya que no tengo ni el theme ni las secciones instaladas, si puedes subir alguna demo para verificar, sería genial. Por el momento puedes utilizar la función inspeccionar de tu navegador en los botones del editor al agregar posts para ver desde qué archivo se está cargando el diseño (estilos.css o agregar.css, etc.) y verificar que en las comunidades ese mismo archivo esté cargado.
  37. 1 point
    Lo probare, esta bueno el complemento.. +1
  38. 1 point
  39. 1 point
    Que miedo poner eso en una web no responsive xD Buen mod +1
  40. 1 point
    no, existe hasta ahora tal modulo, pero dudo que sea bueno hacer eso porque los servidores que no estan adaptados para streamin son poco utiles y a la larga te dan mas fallos que soluciones, porque no simplemente usas youtube si no es pornografia o algo asi.
  41. 1 point
    Que tal les dejo este modulo que muestra una lista de todos los usuarios registrados por país en su sitio espero les gusto, ya esta @unfernacho Instrucciones de Instalación: Nota: El diseño esta creado para la V5 1) Se van al archivo c.posts.php ubicado en la ruta inc/class y hasta abajo antes del ultimo } agregan esto: //TOTAL USUARIOS REGISTRADOS POR PAIS function getTotalUsuariosPais() { $query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT COUNT(u.user_pais) AS total, u.user_pais FROM u_perfil AS u GROUP BY u.user_pais ORDER BY total DESC LIMIT 15'); $array = result_array($query); // PAISES include(TS_EXTRA."datos.php"); $i = 0; foreach($array as $dato) { $data['data'][$i] = $dato; $data['data'][$i]['pais'] = $tsPaises[$dato['user_pais']]; $i++; } return $data; } 2) Se van al archivo posts.php y buscan: $smarty->assign("tsAfiliados",$tsAfiliado->getAfiliados()); y abajo de eso colocan esto: //TOTAL USUARIOS REGISTRADOS POR PAIS $smarty->assign('tsTotalPaises',$tsPosts->getTotalUsuariosPais()); 3) En el archivo estilo.css agrega esto hasta el ultimo: .com_list_element:nth-child(2n+1){border-top:#FFF 1px solid;background:#FFF}.com_list_element{padding:5px 10px;border-top:#e0e0e0 1px solid;position:relative;z-index:1;background:#f5f5f5}.com_list_element .cle_number{float:right;margin:0;font-weight:700;text-shadow:0 1px 0 #FFF;color:#69900f} 4) Se van al archivo t.home.tpl y agregan el modulo donde quieran de esta forma: {include file='modules/m.home_registrados_pais.tpl'} 5) Suben el modulo que les dejo para descargar va en la carpeta modules y por si se llega a caer este es su contenido: <div class="boxposts separa"> <div class="titular"> <h2>Registrados</h2> </div> <div class="com_new_box"> <div class="com_box_body"> {if $tsTotalPaises.data} {foreach from=$tsTotalPaises.data item=p} <div class="com_list_element"> <img src="{$tsConfig.tema.t_url}/images/flags/{$p.user_pais|lower}.png" style="margin: 3px 10px 0 0;float: left;"/> <a href="{$tsConfig.url}/usuarios/?pais={$p.user_pais}">{$p.pais|limit:30}</a> <span class="cle_number">{$p.total}</span> </div> {/foreach} {else} <div class="nada-gris">No hay usuarios registrados</div> {/if} </div> </div> </div> m.home_registrados_pais.tpl
  42. 1 point
    Baia baia, funcionó 100% Que cosa extraña, mi chrome mobile está actualizado sin embargo tuve que hacer lo que dices, pero otras personas pudieron. Gracias 1000!!!
  43. 1 point
  44. 1 point
    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:
  45. 1 point
    Esta versión solo corrige algunos bugs... Si lo quieren instalar, primero instalen la primera version y despues replazen estos archivos (Van en /inc/php).... steam-finish.php steam-login.php
  46. 1 point
    Hay una opción administrativa en Risus que puede pasar desapercibida si no se revisa expresamente y es la sección donde se muestran las solicitudes de cambios de nick enviadas por los usuarios. Con este pequeño MOD se avisará automáticamente al primer administrador cuando se realice una petición de cambio. El proceso es muy sencillo. Abrimos inc/class/c.cuenta.php y buscamos: if(!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) return array('error' => 'Su IP no se pudo validar');Añadimos debajo: //*********************************************************************** // Enviar aviso al 1er admin si hay solicitud de cambio de nick (DEmEntE) //*********************************************************************** $aviso = 'Hay una solicitud de cambio de nick del usuario: @<a href="'.$tsCore->settings['url'].'/perfil/'.$tsUser->nick.'"><b>'.$tsUser->nick.'</b></a> esperando aprobaci&oacute;n.<br/><br/>Puede acceder al panel de gesti&oacute;n de nicks <b><a href="'.$tsCore->settings['url'].'/admin/nicks">pulsando aqu&iacute;</a></b>'; db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO `u_avisos` (`user_id`, `av_subject`, `av_body`, `av_date`, `av_type`) VALUES (\'1\', \'Cambio de nick\', \''.$aviso.'\', \''.time().'\', \'2\')');Y listo, a partir de ahora el primer administrador recibirá una notificación en su panel de avisos cuando haya alguna solicitud de cambio de nick pendiente. Ahí va una captura. La modificación es válida para cualquier tema-skin que estés utilizando.
  47. 1 point
    Hola a todos gente. Aún ando sin internet así que apenas puedo publicar esto brevemente. Es el mod de encuesta que había desarrollado pero por razones ya explicadas no había podido publicarlo. los otros mods ya están listos y el tema también pero como tengo que explicar varias cosas no tengo mucho tiempo para publicarlos. Bueno el mod consiste en administrar las encuestas desde la administración pero solo sera activa una sola. Pueden poner todas las opciones de encuesta que quieran, solo usuarios registrados pueden votar y sera solo una vez por encuesta. En admin.php debajo de $tsAdmin =& tsAdmin::getInstance(); Agregar // CLASE ENCUESTA include("../class/c.encuesta.php"); $tsEncuesta =& tsEncuesta::getInstance(); Luego arriba de /** NOTICIAS **/ Agregar /* ESCUESTA */ } elseif($action == 'enc'){ if(empty($act)) $smarty->assign("tsEncuesta",$tsEncuesta->getEncuesta()); } elseif($action == 'opc') { if(empty($act)) $smarty->assign("tsOpciones",$tsEncuesta->getOpciones()); En t.admin.tpl debajo de {include file='admin_mods/m.admin_noticias.tpl'} Agregar {elseif $tsAction == 'enc' || $tsAction == 'opc'} {include file='admin_mods/m.admin_encuesta.tpl'} En t.home.tpl debajo de {include file='modules/m.home_stats.tpl'} Agregar {include file='modules/m.home_encuesta.tpl'} En m.admin_sidemenu.tpl Debajo de <li id="a_news"><span class="cat-title"><a href="{$tsConfig.url}/admin/news">Noticias</a></span></li> Agregar <li id="a_{if $tsAction == opc}opc{else}enc{/if}"><span class="cat-title"><a href="{$tsConfig.url}/admin/enc">Encuesta</a></span></li> Generan esta consulta: CREATE TABLE IF NOT EXISTS `e_encuesta` ( `e_id` int(11) NOT NULL AUTO_INCREMENT, `e_titulo` varchar(150) NOT NULL, `e_autor` int(11) NOT NULL, `e_fecha` int(10) NOT NULL, `e_estado` int(1) NOT NULL, PRIMARY KEY (`e_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `e_opciones` ( `opc_id` int(11) NOT NULL AUTO_INCREMENT, `o_encuesta` int(11) NOT NULL, `o_titulo` varchar(150) NOT NULL, `o_votos` int(11) NOT NULL, PRIMARY KEY (`opc_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `e_votos` ( `voto_id` int(11) NOT NULL AUTO_INCREMENT, `v_user` int(11) NOT NULL, `v_opcion` int(11) NOT NULL, `v_encuesta` int(11) NOT NULL, `v_fecha` int(10) NOT NULL, PRIMARY KEY (`voto_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; Actualizado: Aunque Kmario19 no ha proporcionado esta edición porque no está, tras hacerla no he notado ningún problema. Al parecer, se ha saltado un paso: Mostrar las encuestas en la página principal. Para hacerlo, abran el archivo inc/php/posts.php y encima de: // CLASE TOPS Coloquen: include TS_CLASS . 'c.encuesta.php'; $smarty->assign('tsEncuesta', tsEncuesta::getInstance()->homeEncuesta()); Y listo, ahora descargan y suban todos los archivos a sus respectivas carpetas (por defecto tema default), no olviden cambiar el nombre de la carpeta themes/default si tienen un tema diferente para que se guarden los archivos en su respectiva carpeta del tema que están utilizando. MOD Encuesta administrable en la home Kmario19.zip.zip] Por si acaso hago el inventario: c.encuesta.php -> inc/classç ajax.encuesta.php -> inc/php/ajax m.admin_encuesta.tpl -> tutema/templates/admin_mods encuesta.js -> tutema/js encuesta.css -> tutema/css Espero les guste el mod y les sea útil, pronto volvere con los otros mods y el tema que tanto esperan. Les traigo otros adelantos del mod de archivos que ya termine Todas las funciones son en ajax, subir archivos, modificarlos-eliminarlos, crear carpetas, favoritos, comentarios y algunas mas Debería vender este mod pero todos me caen bien así que se los regalare la próxima que me conecte la instalación sera muy fácil. Bueno eso es todo, nos vemos en otro mod, si tienen problemas o se me olvida algo háganmelo saber por fb (Está en mi perfil) para enterarme más rápido hasta pronto, disfrútenlo.
  48. 1 point
    Estoy de acuerdo con respecto a tu punto de vista, aún así, podrías decirlo de mejor manera en vez de criticar con ese tono. Por otro lado, les dejo la lista completa de los niveles de acceso: 0: Cualquiera 1: Sólo visitantes 2: Sólo registrados 3: Sólo moderadores 4: Sólo administradores Un cordial saludo y +1 por la info, alex!
  49. 0 points
  50. 0 points
×