¡Bienvenido a PHPost!

Para participar en el foro, descargar complementos y acceder al chat, es necesario tener una cuenta activa. Por favor, regístrate utilizando un correo electrónico válido para completar la activación.

Usamos BanaHosting para alojar tanto la demo oficial como este mismo foro de Risus Nova. Cumple todos los requisitos del script (PHP 8, mod_rewrite, SSL gratis) — si quieres usar el mismo hosting que nosotros, aquí tienes el enlace.

⚠️ Aviso de seguridad

Risus Nova solo se distribuye de forma segura y verificada a través de phpost.es. Hemos detectado copias modificadas en sitios de terceros que contienen código malicioso, backdoors y funciones ocultas diseñadas para el robo de credenciales y datos sensibles. No confíes en descargas provenientes de foros, canales de Telegram o webs externas; no podemos garantizar la integridad de esos archivos. Tu seguridad es nuestra prioridad: Descarga siempre la versión oficial desde el botón inferior para asegurar una instalación limpia y libre de amenazas.

🔄 Mantente actualizado

Al estar en desarrollo activo, recibe cambios constantes — échale un vistazo de vez en cuando al changelog y a las notas de administración para estar al día de qué ha cambiado.

Risus Nova 2.0 Estable En desarrollo activo Actualizado: 24/06/2026 - 14:00 h (Hora España) Desarrollo Tema: 75% (Ver notas de la versión) (Ver Demo)

Descargar desde phpost.es
Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

COMPLEMENTOS Subir avatar mejorado 12.04.24
#1

6
Mejor respuesta del mensaje Subir avatar mejorado 12.04.24En este caso se usará CDN para que sea mejor

1 - En tema/templates/modules/m.cuenta_sidebar.tpl y reemplazamos todo por esto
 
<div class="sidebar-tabs *****">
   <h3>Mi Avatar</h3>
   <div class="avatar-big-cont">
      <div style="display: none" class="avatar-loading"></div>
      <img width="120" height="120" alt="" src="{$tsConfig.url}/files/avatar/{if $tsPerfil.p_avatar}{$tsPerfil.user_id}_120{else}avatar{/if}.jpg?t={$smarty.now}" class="avatar-big" id="avatar-img"/>
   </div>
   <ul class="change-avatar" id="change">
      <li class="local-file" id="pc" style="width: 50%;text-align:center;"><span>Local</span></li>
      <li class="url-file" id="url" style="width: 50%;text-align:center;"><span>Url</span></li>
   </ul>
   <div class="clearfix"></div>
   <a href="javascript:avatar.subir()" class="avatar-next edit" >Editar</a>
</div>
<div class="clearfix"></div>
<link rel="stylesheet" href="Registrate o inicia tu sesión para ver este contenido@2.3.1/dist/croppr.min.css" integrity="sha256-Bbkel8+0sOmrvX75oDwNElgbmrAP+Pw+XXKKUwoKiVE=" crossorigin="anonymous">
<script src="Registrate o inicia tu sesión para ver este contenido@2.3.1/dist/croppr.min.js" integrity="sha256-VPADQYvd0gjLaeduvmP9/UZAdNW3D2sJieeJ3a3PX64=" crossorigin="anonymous"></script>

<script src="{$tsConfig.js}/subir-avatar.js?{$smarty.now}"></script>


2 - Creamos un archivo llamado "subir-avatar.js" y lo agregamos en tema/js 12.04.2024
const next = $(".avatar-next");
const sizeImg = 120;

function cambiarFile(){
   const input = $('#file-avatar')[0];
   if(input.files && input.files[0]) {
       let name_file = decodeURIComponent(input.files[0].name);
      document.querySelector(".drop-message").innerHTML = name_file;
      next.removeClass('btn-disabled')
   }   
}
$("#url-avatar").on('keyup', () => {
   if($("#url-avatar").val().length > 5) next.removeClass('btn-disabled')
})
$("#change > li, #change > li span").on('click', event => {
    const block = $("#change")
    block.attr('class', '')
    var tipo = event.target.textContent
    if(tipo === 'Local') {
        block.html(`<div id="drop-region">
         <input type="file" name="local" id="file-avatar" onchange="return cambiarFile();" class="browse"/>
         <div class="drop-message">
            Arrastra y suelta la imagen o haz clic para subir
         </div>
      </div>`)
    } else {
        block.html(`<div style="margin: 0 auto 10px auto;">
         <input type="text" name="url" autocomplete="off" id="url-avatar" placeholder="Url de la imagen" class="browse form-control"/>
      </div>`)
    }
})

var avatar = {
    size: 120,
    uid: false,
    key: false,
   ext: false,
    informacion: '',
    current: false,
    success: false,
    subir: async () => {
        $(".avatar-loading").show().css('display', 'flex');
        inputs = [].slice.call(document.querySelectorAll(".browse"))
        inputs.forEach(input => {
            const datoUrl = new FormData();
            datoUrl.append('url', (input.name == 'url') ? input.value : input.files[0])
            
            if(!empty(input.value)) {
                fetch(global_data.url + '/upload-avatar.php', {
                    method: 'POST',
                    body: datoUrl
                })
                .then(response => response.json())
                .then(blobData => {
                   avatar.subida_exitosa(blobData)
                });
            }
        })
    },
    subida_exitosa: rsp => {
        if (rsp.error == 'success') avatar.success = true;
        else if (rsp.msg) {
         avatar.key = rsp.key;
         avatar.ext = rsp.ext;
         avatar.cortar(rsp.msg);
        } else cuenta.enviar_alerta(rsp.error, 0);
        $(".avatar-loading").hide();
    },
    cortar: img => {
        img = img + '?t=' + new Date();
        mydialog.show(true);
        mydialog.title("Cortar avatar");
        mydialog.body(`<img class="avatar-cortar" src="${img}" />`);
        mydialog.buttons(true, true, 'Cortar', "avatar.guardar()", true, false, true, 'Cancelar', 'close', true, true);
        /*mydialog.buttons([
            {mostrar: true, texto: 'Cortar', accion: `avatar.guardar()`, activo: true}, 
            {mostrar: true, texto: 'Cancelar', accion: 'cerrar', activo: true}
        ]);*/
        mydialog.center();
        $("#avatar-img, #avatar-menu").attr("src", img).on('load', () => {
            let sizes = [avatar.size, avatar.size, 'px'];
            var croppr = new Croppr('.avatar-cortar', {
               aspectRatio: 1, // Mantemos el tamanio cuadrado 1:1
               startSize: sizes,
               minSize: sizes,  
                // Enviamos las coordenadas para cortar la imagen
                // Tiene la funcion onCropEnd ya que es como va a quedar
                onCropEnd: data => avatar.informacion = data,
               onCropMove: avatar.vistaPrevia
            });
        });
    },
    vistaPrevia: function (coords) {
        let rx = avatar.size / coords.width;
        let ry = avatar.size / coords.height;
        $('#avatar-img').css({
            width: Math.round(rx * coords.width) + 'px',
            height: Math.round(ry * coords.height) + 'px',
            marginLeft: '-' + Math.ceil(rx * coords.x) + 'px',
            marginTop: '-' + Math.round(ry * coords.y) + 'px'
        });
    },
    recargar: () => $("#avatar-img").attr("src", avatar.current + '?r' + new Date()),
    guardar: () => {
        if (empty(avatar.informacion)) 
            cuenta.enviar_alerta('Debes seleccionar una parte de la foto', 0);
        else {
            const coordenadas = new FormData();
            coordenadas.append('key', avatar.key)
            coordenadas.append('ext', avatar.ext)
            coordenadas.append('x', avatar.informacion.x)
            coordenadas.append('y', avatar.informacion.y)
            coordenadas.append('w', avatar.informacion.width)
            coordenadas.append('h', avatar.informacion.height)
            fetch(global_data.url + '/upload-crop.php', {
                method: 'POST',
                body: coordenadas
            })
            .then(response => response.json()) 
            .then(blobData => {
               if(blobData.error == "success") {
                   mydialog.body("Tu avatar se ha creado correctamente, ahora espera que recargue la p&aacute;gina");
                   mydialog.buttons(true, true, 'Aceptar', 'close', true, true, false);
                   $("#input_add").hide();
                   $(`input[name="url"]`).attr({
                        value: ''
                   })
               }
            });
        }
    }
}


3 - Luego en tema/js/cuenta.js buscar
 
var avatar = { .....

y borran todo hasta el final del archivo

4 - Luego van a inc/php/ajax.upload.php y lo reemplazan por esto
 
<?php if ( ! defined('TS_HEADER')) exit('No se permite el acceso directo al script');
/**
 * Controlador AJAX
 *
 * @name    ajax.upload.php
 * @author  PHPost Team
*/
/**********************************\

*    (VARIABLES POR DEFAULT)        *

\*********************************/

    // NIVELES DE ACCESO Y PLANTILLAS DE CADA ACCIÓN
    $files = array(
      'upload-avatar' => array('n' => 2'p' => ''),
      'upload-crop' => array('n' => 2'p' => ''),
        'upload-images' => array('n' => 2'p' => ''),
    );

/**********************************\

* (VARIABLES LOCALES ESTE ARCHIVO)    *

\*********************************/

    // REDEFINIR VARIABLES
    $tsPage 'php_files/p.upload.'.$files[$action]['p'];
    $tsLevel $files[$action]['n'];
    $tsAjax = empty($files[$action]['p']) ? 0;

/**********************************\

*    (INSTRUCCIONES DE CODIGO)        *

\*********************************/
    
    
// DEPENDE EL NIVEL
    $tsLevelMsg $tsCore->setLevel($tsLeveltrue);
    if($tsLevelMsg != 1) { echo '0: '.$tsLevelMsg['mensaje']; die();}
    // CLASE
    require('../class/c.upload.php');
    $tsUpload = new tsUpload();
    // CODIGO
    switch($action){
      case 'upload-avatar':
         // <--
         $tsUpload->image_scale true;
         $tsUpload->image_size['w'] = 640;
         $tsUpload->image_size['h'] = 480;
         //
         $tsUpload->file_url $_POST['url'];
         //
         $result $tsUpload->newUpload(3);
         echo json_encode($result);
         // -->
      break;
      case 'upload-crop':
         // <--
         echo json_encode($tsUpload->cropAvatar($tsUser->uid));
            // PARA EL PERFIL
            db_exec(array(__FILE____LINE__), 'query''UPDATE u_perfil SET p_avatar = 1 WHERE user_id = ' $tsUser->uid);
          // -->
      break;
        case 'upload-images':
         echo json_encode($tsUpload->newUpload(1));
        break;
    

Eso es todo...
Responder
#2

0
Gracias funciono bien, solo quedo muy abajo pero ya busco como subirlo. Muchas gracias
Responder
#3

0
(04-12-2024, 10:53 PM)Krsh escribió: Debes agradecer para ver el contenido...Gracias funciono bien, solo quedo muy abajo pero ya busco como subirlo. Muchas gracias

¿Puedes mandarme una captura de como queda?
Responder
#4

3
(04-14-2024, 12:06 PM)York0x escribió: Debes agradecer para ver el contenido...¿Puedes mandarme una captura de como queda?

De hecho ya lo tiene aplicado la demo de Syntaxis Lite
Registrate o inicia tu sesión para ver este contenido
Responder
#5

0
(04-14-2024, 01:43 PM)Miguel92 escribió: Debes agradecer para ver el contenido...
(04-14-2024, 12:06 PM)York0x escribió: Debes agradecer para ver el contenido...¿Puedes mandarme una captura de como queda?

De hecho ya lo tiene aplicado la demo de Syntaxis Lite

Muy bueno, y puedo poner otros avatares?
Responder
#6

0
(04-14-2024, 02:13 PM)York0x escribió: Debes agradecer para ver el contenido...Muy bueno, y puedo poner otros avatares?

Supongo que te refieres al 20 avatares que tiene para elegir... eso creo que lo tome de avatar aleatorio cuando se registra un usuario... luego lo modifique.
Responder


Compartir en:

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)