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

    • By Miguel92
      Hola a todos esto lo pueden aplicar si lo desean, es una modificación completa del mydialog que trae en tema/js/acciones.js, es bastante "viejo"(por decirlo de alguna forma), lo que hice fue quitar el código que tenía y que no hacía nada, mejore la parte del footer del modal al agregar los botones, ahora se puede entender mejor...
       
      Algunas capturas de como va a quedar... (Esto puede llegar a cambiar si es que exista un elemento css que modifique el existente)
       
      El modal es sus 3 versiones "Default", "Pequeño" y "Grande"

       
      Modal alerta

       
      Modal reintentar y error


       
      Bueno, a lo que vinieron jajaja
      1 - Buscan en js/acciones.js 
      var mydialog = { ... TODO EL CODIGO .. } document.onkeydown = function(e){    key = (e==null)?event.keyCode:e.which;    if(key == 27) mydialog.close(); }; y lo reemplazan por
      /* MyDialog 1.0 */ var mydialog = new function() {    // Opciones por defecto    this.options = {       fixed: true,       size: ''    },    this.close_button = true,    this.mask_close = true,    this.class_aux = '',    // Generamos la plantilla    this.template = `<div id="dialog">       <div id="title"></div>       <div id="cuerpo">          <div id="procesando"><div id="mensaje"></div></div>          <div id="modalBody"></div>       </div>       <div id="buttons"></div>    </div>`,    // Iniciamos    this.show = () => {       // Agregamos al body       $("#mydialog").html(this.template);       // Agregamos clases, si contiene       if(!empty(this.class_aux) || !empty(this.options.size)) {           $('#mydialog').addClass(this.class_aux + ' ' + this.options.size)       }       // Opciones de la mascara       $("#mydialog").prepend('<div id="mask"></div>')       if(this.mask_close) $("#mydialog > #mask").click(() => this.close())       // Agregamos los extras       if(this.options.fixed) $("body").attr("modal-open", true)       $('#mydialog #dialog').fadeIn('fast');       // Botón cerrar       if(this.close_button) {          $('#mydialog #dialog').append('<span class="close_dialog" onclick="mydialog.close()">&times;</span>');       }    },    this.close = () => {       $('#mydialog #dialog, #mydialog #mask').fadeOut('fast', () => $(this).remove());       if(this.options.fixed) $("body").removeAttr("modal-open")       this.procesando_fin();    },    this.center = () => {       var centrado = $("#dialog");       centrado.css({          'left': Math.round($(window).width() / 2) - Math.round(centrado.width() / 2),          'top': Math.round($(window).height() / 2) - Math.round(centrado.height() / 2)       })    },    this.title = string => $("#title").html(string)    this.body = string => $("#modalBody").html(string),    this.buttons = (all, display1, val1, action1, enabled1, focus1, display2, val2, action2, enabled2, focus2) => {       var buttons_add = $("#buttons")       // Con este mostramos los botones       if(all === true) {          // Accion close"          var close = 'mydialog.close()'          if(action1 === 'close') action1 = close;          if(action2 === 'close' || !val2) action2 = close;          if(!val2) {             val2 = 'Cancelar';             enabled2 = true;          }          // Mostramos boton 1          if(display1) buttons_add.append(`<input type="button" class="mBtn btnOk" onclick="${action1}" value="${val1}"` + (enabled1 ? '' : ' disabled') + `>`)          // Mostramos boton 2          if(display2) buttons_add.append(`<input type="button" class="mBtn btnCancel" onclick="${action2}" value="${val2}"` + (enabled2 ? '' : ' disabled') + `>`)          // Enfocamos          if(focus1) $('#mydialog #buttons .mBtn.btnOk').focus();          else if(focus2) $('#mydialog #buttons .mBtn.btnCancel').focus();       } else buttons_add.remove()    },    this.alert = (title, body, reload) => {       this.class_aux = 'modal-alert'       this.close_button = false       this.show();       this.title(title);       this.body(body);       this.buttons(true, true, 'Aceptar', 'mydialog.close();' + (reload ? 'location.reload();' : ''), true, true, false);       this.center();    },    this.error_500 = fun_reintentar => {       mydialog.procesando_inicio('Procesando...', 'Reintentando');       setTimeout(() => {          mydialog.procesando_fin();          mydialog.show();          mydialog.title('Error');          mydialog.body('Error al intentar procesar lo solicitado');          mydialog.buttons(true, true, 'Reintentar', 'mydialog.close();'+fun_reintentar, true, true, true, 'Cancelar', 'close', true, false);          mydialog.center();       }, 2000);    },    this.procesando_inicio = (value, title) => {       if(!this.is_show){          this.show();          this.title(title);          this.buttons(false);          this.center();       }       $('#mydialog #procesando #mensaje').html('<img src="'+global_data.img+'images/loading_bar.gif" />');       $('#mydialog #procesando').fadeIn('fast');    },    this.procesando_fin = () => $('#mydialog #procesando').fadeOut('fast') } document.onkeydown = function(e){    key = (e==null)?event.keyCode:e.which;    if(key == 27) mydialog.close(); };  
      2 - En estilo.css buscan todos los #mask, #mydialog que existan y lo borran, ya que puede interferir con el nuevo estilo... Pero si quieren evitarlo pueden incluirlo directamente en extras.css o phpost.css
      body[modal-open=true] {     overflow: hidden; } #mydialog #mask {     width: 100%;     height: 100vh;     position: fixed;     top: 0;     left: 0;     z-index: 1;     background-color: rgba(50, 50, 50, .7); } #mydialog #dialog {     --radius: 0.375rem;     --shadow: 0 0 .5rem rgba(49, 49, 49, .3);     --bordermodal: 1px solid rgba(150, 150, 150, .3);     background-color: var(--base-color-body);     color: var(--base-color-texto);     border: var(--bordermodal);     z-index: 99;     position: fixed;     width: 560px;     box-shadow: var(--shadow);     border-radius: var(--radius)!important; } #mydialog.small #dialog {     width: 300px; } #mydialog.large #dialog {     width: 700px; } #mydialog #dialog .close_dialog {     --whlh: 1.2rem;    position: absolute;    top: 0.76rem;    right: 0.66rem;    display: grid;    width: var(--whlh);    height: var(--whlh);    color: white;    background-color: red;    place-items: center;    line-height: 1rem;    font-size: var(--whlh);    cursor: pointer;    border-radius: .32rem; } #mydialog #dialog #title {     display: block;     padding: 0.82rem 1rem;     font-weight: 600;     border-bottom: var(--bordermodal);     position: relative; } #mydialog #dialog #mensaje img {     position: relative;     margin: 1rem auto;     display: block; } #mydialog #dialog #modalBody {     padding: 1rem;     max-height: 320px;     overflow-y: auto; } #mydialog #dialog #buttons {     display: flex;    justify-content: space-around;    align-items: center;     padding: .654rem 0;     border-top: var(--bordermodal);     width: 100%; } #mydialog #dialog #buttons .mBtn {     padding: .6rem 1.4rem; } #mydialog.modal-alert #dialog #title, #mydialog.modal-alert #dialog #buttons {     border: none;     padding: 1rem; } #mydialog.modal-alert #dialog #modalBody {     padding: 0.4rem 1rem; } #mydialog.modal-alert #dialog #buttons {     display: block;     text-align: right; }  
      Nota:
      Para activar el modal "pequeño" o "grande" deben buscar el modal que quieren modificar y buscan 
      mydialog.show(true); y arriba agregan
      mydialog.options = {     size: 'tipo del modal' // Tipos: small o large }  
      Eso sería todo!
    • By Miguel92
      Bueno como ya había mencionado, ya esta la "herramienta" para crear copias de seguridad completa o parcial de la base de datos y podrás restaurar dicho copia, el problema será que no tengas acceso a la administración del sitio y allí necesitarás una herramienta externa pero que funcione dentro del sitio.
       
      Solo tengo que hacerle algunos cambios a la herramienta que ya tengo creada desde hace 1 año.
      Capturas:




       
       
      Antes de comenzar, si tienes Ejecutar SQL desde la administración [Arreglado] tendrás que quitarlo o eliminar archivos
       
      Bueno comencemos con la integración, los archivos para descargar están al final.
       
      1 - Este archivo "c.database.php" y lo agregan a
       
      2 - En inc/php/admin.php buscamos
         /** NOTICIAS **/    } elseif($action == 'news'){ arriba agregarán
          } elseif($action == 'execute' OR $action == 'backup') {        # Incluimos el archivo necesario         include("../class/c.database.php");         $tsDataBase = new tsDataBase();         # Todas las opciones de la copia de seguridad         if($action == 'backup') {             if(empty($act)) {                 $smarty->assign('tsListBackup', $tsDataBase->listBackup());             # Creamos el backup completo             } elseif($act === 'new_backup') {                 if(!empty($_POST["nombre_copia"])) {                     if($tsDataBase->createBackUp()[0]) $tsCore->redirectTo($tsCore->settings['url'].'/admin/backup?save=true');                     else $smarty->assign("tsError", $tsDataBase->createBackUp()[1]);                 }             # Creamos el backup seleccionando tablas             } elseif($act === 'new_backup_select') {                 $smarty->assign('tsTablas', $tsDataBase->show_tables());                 if(!empty($_POST["nombre_copia"])) {                     if($tsDataBase->seletedTables()[0]) $tsCore->redirectTo($tsCore->settings['url'].'/admin/backup?save=true');                     else $smarty->assign("tsError", $tsDataBase->seletedTables()[1]);                 }             # Descargamos el fichero             } elseif($act === 'download') {                 if(isset($_GET["code"])) {                     $smarty->assign('tsDownload', $tsDataBase->downloader());                 }             }         }  
      3 - Ahora en inc/php/ajax/ajax.php buscan
            'admin-badwords-delete' => array('n' => 4, 'p' => ''), debajo agregan
            'admin-eliminar-sql' => array('n' => 4, 'p' => ''),       'admin-restaurar-sql' => array('n' => 4, 'p' => ''),       'admin-ejecutar-sql' => array('n' => 4, 'p' => ''), más abajo buscan
          include("../class/c.admin.php");    $tsAdmin = new tsAdmin(); y agregan
         if($action === 'admin-eliminar-sql' OR $action === 'admin-restaurar-sql' OR $action === 'admin-ejecutar-sql') {        include("../class/c.database.php");         $dbase = new tsDataBase();    } por último buscan
            default:          die('0: Este archivo no existe.');       break; y arriba agregan
              case 'admin-eliminar-sql':             echo $dbase->delete_file_sql();         break;         case 'admin-restaurar-sql':             echo $dbase->restore_file_sql();         break;         case 'admin-ejecutar-sql':             echo $dbase->executeSQL();         break;  
      4 - Ahora en tema/templates/t.admin.tpl buscan
      {include file='admin_mods/m.admin_rangos.tpl'} y debajo pegan
      {elseif $tsAction == 'execute' || $tsAction == 'backup'} {include file='admin_mods/m.admin_database.tpl'}  
      5 - En tema/templates/admin_mods/m.admin_sidemenu.tpl buscan
      <h4>Configuración de PHPost</h4> y arriba agregan
      <h4>Seguridad</h4> <ul class="cat-list">     <li id="a_configs"><span class="cat-title"><a href="{$tsConfig.url}/admin/execute">Ejecutar consultas</a></span></li>     <li id="a_main"><span class="cat-title"><a href="{$tsConfig.url}/admin/backup">Crear copia</a></span></li> </ul>  
      6 - Este archivo "m.admin_database.tpl" y lo agregan a tema/templates/admin_mods/
       
      7 - Por último en tema/ja/admin.js al final del archivo agregan
      /**   * Database  * para ejecutar consultas y crear copias */ var database = new function() {     this.execute = () => {         var SQL = 'sql=' + $("#sql").val();         $.post(global_data.url + '/admin-ejecutar-sql.php', SQL, h => {             switch (h.charAt(0)) {                 case '0':                     mydialog.alert('Error', h.substring(3), false)                 break;                 case '1':                     mydialog.alert('Bien', h.substring(3), true)                 break;             }         })     },    this.delete = (id, file, gew) => {       if(!gew) {          mydialog.show()          mydialog.title('Eliminar')          mydialog.body(`Estas seguro que quieres eliminar este archivo: ${file}`)           mydialog.buttons(true, true, 'Borrar SQL', `database.delete(${id}, '${file}', true)`, true, false, true, 'Cancelar', 'close', true, true);          /*mydialog.buttons([             {mostrar:true,texto:'Borrar SQL',accion:`database.delete(${id}, '${file}', true)`,activo:true},             {mostrar:true,texto:'Cancelar',accion:'cerrar',activo:true}          ]); */         mydialog.center()       } else {          $.post(global_data.url + '/admin-eliminar-sql.php', {id,file}, e => {             switch (e.charAt(0)) {                case '0':                   mydialog.alert('Error', e.substring(3));                break;                case '1':                   mydialog.close();                   $("#sql" + id).remove();                break;             }          })       }    },    this.restore = (file, gew) => {       if(!gew) {          mydialog.show()          mydialog.title('Restaurar')          mydialog.body(`Estas seguro que quieres restaurar esta copia: ${file}`)           mydialog.buttons(true, true, 'Restaurar SQL', `database.restore('${file}', true)`, true, false, true, 'Cancelar', 'close', true, true);          /*mydialog.buttons([             {mostrar:true,texto:'Restaurar SQL',accion:`database.restore('${file}', true)`,activo:true},             {mostrar:true,texto:'Cancelar',accion:'cerrar',activo:true}          ]);*/          mydialog.center()       } else {          mydialog.procesando_inicio('', "Espere");          mydialog.buttons(false);          mydialog.center()          $.post(global_data.url + '/admin-restaurar-sql.php', {restore: file}, e => {             switch (e.charAt(0)) {                case '0':                   mydialog.procesando_fin();                   mydialog.alert('Error', e.substring(3), false);                break;                case '1':                   mydialog.procesando_fin();                   mydialog.alert('Bien', e.substring(3), false);                break;             }          })       }    } }  
      Descargar los archivos "-#- Justo aquí -#-"
       
      En caso que tengan problemas al querer crear las copias de seguridad, comprueben que se haya creado la carpeta "database" en files/ y que tenga los permisos 0777 aplicados, en caso contrario deberán crearlo y darle los permisos correspondientes
    • By Miguel92
      Bueno lo que trate de hacer es simplificar un poco, quieres agregar una imagen a "rangos", "categorías" o "medallas" y no quieres entrar desde el FTP o CPanel, bueno con esta herramienta deberías poder realizar esta tarea desde la administración de tu sitio.

      Les mostraré algunas imágenes, pero no esta realizado con el default, si no que es una versión que estoy realizando.




      Bueno comenzamos...
      1 - En inc/class/c.admin.php lo pueden agregar al final o donde quieran.
         # Obtenemos todas las imagenes de la carpeta    public function obtener_paquete($dir) {       global $tsCore, $smarty;       # Aplicamos los permisos si no los tiene       foreach (["cat", "med", "ran"] as $carpeta) chmod($smarty->template_dir["images"] . 'icons/' . $carpeta, 0777);       # Creamos un arreglo       $data = [];       # Buscamos en la carpeta...       $carpeta = $smarty->template_dir["images"] . 'icons/' . $dir;       $imagenes = opendir( $carpeta );       # Recorremos la carpeta       while ($icono = readdir($imagenes)) {          if($icono != '.' && $icono != '..'):             # Obtenemos información del archivo             $inf = getimagesize($carpeta . '/' . $icono);             $arr = [                "hash" => substr(md5(explode('.', $icono)[0]), 0, 6),                "icon" => explode('.', $icono)[0],                "url" => $tsCore->settings["images"] . '/icons/' . $dir . '/' .$icono,                "width" => $inf[0],                "height" => $inf[1],                "type" => $inf["mime"]             ];             if(isset($_GET["size"]) or isset($_GET["type"])) {                if(intval($_GET["size"]) === $inf[0] or 'image/'.$_GET["type"] === $inf["mime"]) {                   array_push($data, $arr);                }             } else array_push($data, $arr);          endif;       }       closedir( $imagenes );       # Retornamos el arreglo       return $data;    }    public function eliminar_icono_paquete() {       global $tsCore, $smarty;       # Buscamos en la carpeta...       $carpeta = $smarty->template_dir["images"] . 'icons/' . $tsCore->setSecure($_POST["path"]);       # Eliminamos si son la misma imagen con difente tamaño       foreach($this->obtener_paquete($_POST["path"]) as $eliminar) {          if($eliminar["hash"] === $_POST["hash"]) {             if($_POST["path"] === 'med') {                $sizes = [16, 32];                foreach ($sizes as $size) {                   $nimg = "{$eliminar["icon"]}_{$size}." . substr($eliminar["type"], 6);                   unlink($carpeta . '/' .  $nimg);                }                return true;             } else {                $nimg = "{$carpeta}/{$eliminar["icon"]}." . substr($eliminar["type"], 6);                return (unlink($nimg)) ? true : false;             }          }       }    }    public function subir_icono() {       global $smarty;       # Mover a...       $mover = $smarty->template_dir["images"] . 'icons/' . $_POST["path"] . DIRECTORY_SEPARATOR;       //       if (($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/png") || ($_FILES["file"]["type"] == "image/gif")) {          # Agregamos la imagen, si existe, esta será reemplazada por la nueva                   return (move_uploaded_file($_FILES["file"]["tmp_name"], $mover . $_FILES['file']['name'])) ? '1: Imagen agregada correctamente...' : '0: No se pudo subir la imagen!';       } else return false;    } 
      Este código es para Smarty 4, si no lo tienes actualizado, lo que debes hacer es lo siguiente, buscas esto
      $smarty->template_dir["images"] . 'icons/'  y lo reemplazas por
      TS_ROOT . '/themes/' . $tsCore->settings["tema"]['t_path'] . '/images/icons/'  y borrar el de las funciones, excepto el que lleva $tsCore, allí solo eliminas , $smarty
      global $smarty; 
      2 - En inc/php/admin.php buscan
      } elseif($action == 'creditos'){  y arriba agregan
      # PACKS  } elseif($action == 'packs') {     $smarty->assign('tsDir', $_GET["path"]);     if($act === 'abrir') {         $smarty->assign('tsPack', $tsAdmin->obtener_paquete($_GET["path"]));     } 
      3 - En inc/php/ajax/ajax.admin.php buscan
      'admin-badwords-delete' => array('n' => 4, 'p' => ''),  y debajo pegan
      'admin-eliminar-icono' => array('n' => 4, 'p' => ''), 'admin-subir-icono' => array('n' => 4, 'p' => ''),  más abajo
      default:        die('0: Este archivo no existe.');       break; 
      arriba agregan
              case 'admin-eliminar-icono':             echo $tsAdmin->eliminar_icono_paquete();         break;         case 'admin-subir-icono':             echo $tsAdmin->subir_icono();         break; 
      4 - En tema/templates/admin_mods/ crean un archivo llamado "m.admin_packs.tpl" y dentro agregan, les recuerdo que lo pueden adaptar a su theme
      <div class="boxy-title">    <h3>Control de paquetes de imagenes</h3> </div> <div id="res" class="boxy-content">     <p class="alerts ok">Desde aquí podrás ver, agregar, eliminar las imagenes e iconos que estan guardados en "<a href="{$tsConfig.url}/admin/packs?act=abrir&path=ran">ran</a>", "<a href="{$tsConfig.url}/admin/packs?act=abrir&path=med">med</a>", "<a href="{$tsConfig.url}/admin/packs?act=abrir&path=cat">cat</a>".</p>    {if $tsSave}<div class="alerts ok">Tus cambios han sido guardados.</div>{/if}    <hr class="separator">    {if $tsAct === ''}        <div style="display:grid;gap:10px;grid-template-columns: repeat(3, 1fr);">            <a href="{$tsConfig.url}/admin/packs?act=abrir&path=cat" class="block text-center">                <img width="140" height="140" src="{$tsConfig.images}/category.svg" alt="Categorías">                <strong style="margin-top:4px;display: block;">Categorías</strong>            </a>            <a href="{$tsConfig.url}/admin/packs?act=abrir&path=med" class="block text-center">                <img width="140" height="140" src="{$tsConfig.images}/award.svg" alt="Medallas">                <strong style="margin-top:4px;display: block;">Medallas</strong>            </a>            <a href="{$tsConfig.url}/admin/packs?act=abrir&path=ran" class="block text-center">                <img width="140" height="140" src="{$tsConfig.images}/ran.svg" alt="Rangos">                <strong style="margin-top:4px;display: block;">Rangos</strong>            </a>        </div>    {elseif $tsAct === 'abrir'}        {if $tsDir === 'med' || $tsDir === 'ran'}            <span>Filtros:</span>            {if $tsDir === 'med'}                <a href="{$tsConfig.url}/admin/packs?act=abrir&path=med" style="text-align:center;">Todos</a> -                <a href="{$tsConfig.url}/admin/packs?act=abrir&path=med&size=16" style="text-align:center;">16x16</a> -                <a href="{$tsConfig.url}/admin/packs?act=abrir&path=med&size=32" style="text-align:center;">32x32</a>            {/if}            {if $tsDir === 'ran'}                <a href="{$tsConfig.url}/admin/packs?act=abrir&path=ran" style="text-align:center;">Todos</a> -                <a href="{$tsConfig.url}/admin/packs?act=abrir&path=ran&type=gif" style="text-align:center;">GIF</a> -                <a href="{$tsConfig.url}/admin/packs?act=abrir&path=ran&type=png" style="text-align:center;">PNG</a>            {/if}        {/if}        <table class="admin_table">            <thead>                <tr>                    <th>Icono</th>                    <th>Nombre</th>                    <th>Dimensiones</th>                    <th>Tipo</th>                    <th>Acciones</th>                </tr>            </thead>            {foreach $tsPack item=ic}                <tr class="{$ic.hash}">                    <td style="text-align:center;"><img src="{$ic.url}" alt="{$ic.icon}"></td>                    <td style="width: max-content">{$ic.icon}</td>                    <td>{$ic.width}x{$ic.height}</td>                    <td>{$ic.type}</td>                    <td class="admin_actions flex jcsaround aicenter">                   <a href="javascript:packs.borrar('{$tsDir}', '{$ic.hash}')" title="Eliminar"><i class="fas fa-trash"></i></a>                </td>                </tr>            {/foreach}        </table>        <hr class="separator">        <div style="text-align:center;">            <a href="{$tsConfig.url}/admin/packs?act=agregar&path={$tsDir}" class="mBtn">Agregar icono en {$tsDir}</a>        </div>       {elseif $tsAct === 'agregar'}                    <form method="post" enctype="multipart/form-data">               <input type="hidden" name="path" id="path" value="{$tsDir}">           <div class="form-line">                 <label for="image">Sube una imagen...</label>              <input type="file" class="form-control-file" name="image" id="image">           </div>               <p><a href="javascript:packs.subir()" class="mBtn btnOk">Agregar</a></p>        </form>    {/if} </div>
      5 - En tema/templates/admin_mods/m.admin_sidemenu.tpl buscan
      <li id="a_badwords"><span class="cat-title"><a href="{$tsConfig.url}/admin/badwords">Censuras</a></span></li> y debajo agregan
      <li id="a_main"><span class="cat-title"><a href="{$tsConfig.url}/admin/packs">Control de iconos</a></span></li>
      6 - En tema/js/admin.js al final del archivo agregan
      /** * Control de paquete * para agregar, editar y eliminar iconos */ var packs = new function() {    this.reload = path => location.href = global_data.url + '/admin/packs?act=abrir&path=' + path,    this.subir = () => {       var formData = new FormData();       formData.append('file', $('#image')[0].files[0]);       formData.append('path', $('#path').val());       $.ajax({          url: global_data.url + '/admin-subir-icono.php',          type: 'post',          data: formData,          contentType: false,          processData: false,          success: response => {             switch(response.charAt(0)) {                case '0':                   mydialog.alert('Error', response.substring(3), false);                   mydialog.center();                break;                case '1':                   mydialog.show()                   mydialog.title('Bien!')                   mydialog.body(response.substring(3))                   mydialog.buttons(true, true, 'Continuar', 'packs.reload(' + carpeta + ')', true, false, false);                   /*mydialog.buttons({mostrar:true,texto:'Continuar',accion:`packs.reload('${path}')`,activo:true});*/                   mydialog.center()                break;             }          }       });       return false;    },    this.borrar = (carpeta, hash, status) => {       if(!status) {          mydialog.show()          mydialog.title('¿Deseas eliminar ' + (carpeta == 'med' ? 'estos iconos' : 'este icono') + '?')          mydialog.body('Esto eliminará el/los iconos de su tema')          mydialog.buttons(true, true, 'Continuar', 'packs.borrar(' + carpeta + ', ' + hash + ', true)', true, false, true, 'No', 'close', true, true);          /*mydialog.buttons([             {mostrar:true,texto:'Continuar',accion:`packs.borrar('${carpeta}', '${hash}', true)`,activo:true},             {mostrar:true,texto:'No',accion:'cerrar',activo:true}          ]);*/          mydialog.center()       } else {          var params = ['path=' + carpeta, 'hash=' + hash].join('&')          $.post(global_data.url + '/admin-eliminar-icono.php', params, del => {             mydialog.close();             if(del) {                if(carpeta === 'med') {                   $("tr." + hash).each( (inx, trh) => trh.remove())                } else $("tr." + hash).remove()             }          })       }    } }
      7 - Suben estas 3 imágenes a tema/images/

      Para la próxima le quiero agregar un paginador, y la subida de múltiples imágenes...

      NOTA: Para que funciones correctamente, el complemento le asignará a las carpetas ran, cat y med los permisos necesarios para que funcione, en caso que tenga error o no suba las imágenes a dichas carpetas lo que deben hacer es darle permisos 0777 manualmente a las carpetas mencionadas.
    • By Miguel92
      En este caso se usará CDN para que sea mejor

      1 - En inc/class/c.admin.php buscamos
      function saveOrden() { ... todo ... }  y lo reemplazamos por
      public function saveOrden() {    global $tsCore;    #     $ordenado = [];    # Obtenemos lista con el nuevo orden    $nuevo_orden = 1;    foreach (explode(',', $_POST["cats"]) as $orden) {       db_exec([__FILE__, __LINE__], 'query', "UPDATE p_categorias SET c_orden = ".$nuevo_orden." WHERE cid = ".$orden);       array_push($ordenado, $nuevo_orden);       $nuevo_orden++;    } } 
      2 - En inc/php/ajax/ajax.admin.php buscan
      'admin-badwords-delete' => array('n' => 4, 'p' => ''),  y debajo agregan
      'admin-ordenar-categorias' => array('n' => 4, 'p' => ''),  más abajo buscan
      case 'admin-badwords-delete':     //<---       echo $tsAdmin->deleteBadWord();     //---> break;  y debajo agregan
      case 'admin-ordenar-categorias':     //<---       echo $tsAdmin->saveOrden();     //---> break; 
      3 - Luego en tema/templates/admin_mods/m.admin_cats.tpl y buscamos, puedes eliminar jquery.tablednd.js si quieres
      <script type="text/javascript" src="{$tsConfig.js}/jquery.tablednd.js"></script> y lo reemplazamos por, se usa la condicional ya que solo es donde se muestra la lista de categorías
      {if $tsAct == ''}    <script src="https://cdn.jsdelivr.net/npm/[email protected]/Sortable.min.js"></script> {/if} abajo de eso buscamos 
      <script type="text/javascript">     // {literal}     $(function(){         // {/literal} {if $tsAct == ''} {literal}         $('#cats_orden').tableDnD({             onDrop: function(table, row) {                 $.ajax({                        type: 'post',                         url: global_data.url + '/admin/cats?ajax=true&ordenar=true',                         cache: false,                         data: $.tableDnD.serialize()                 });             }         });         // {/literal} {/if} {literal}         $('#cats_orden').tableDnD({             onDrop: function(table, row) {                 $.ajax({                        type: 'post',                         url: global_data.url + '/admin/cats?ajax=true&ordenar=true&t=cat',                         cache: false,                         data: $.tableDnD.serialize()                 });             }         });         //         $('#cat_img').change(function(){             var cssi = $("#cat_img option:selected").css('background');             $('#c_icon').css({"background" : cssi});         });         //     });     //{/literal} </script>
      y lo reemplazamos por
      {if $tsAct == '' || $tsAct == 'editar' || $tsAct == 'nueva'} <script> $(() => {    /* {if $tsAct == ''} */    new Sortable(document.getElementById('cats_orden'), {       animation: 150,       dragClass: "arrastrar", // Clase que puedes modificar       selectedClass: "seleccionado", // Clase que puedes modificar       store: {          // Guardar orden          set: sortable => $.post(global_data.url + '/admin-ordenar-categorias.php', 'cats=' + sortable.toArray().join(','))       }    });    /* {/if} */    $('#cat_img').on('change', () => {       $('#c_icon').css({           "background": $("#cat_img option:selected").css('background')        })    }); }) </script> {/if} más abajo buscan y le borran id="cats_orden" de
      <table cellpadding="0" cellspacing="0" border="0" width="500" align="center" class="admin_table" id="cats_orden"> un poco más abajo buscan y le añaden id="cats_orden" a
      <tbody> abajo buscan
      <tr id="{$c.cid}"> y lo reemplazan por
      <tr id="{$c.cid}" data-id="{$c.cid}">
      Si quieres puedes añadir estas líneas en tema/css/admin.css
      .arrastrar {     background-color: #EEE; } .seleccionado {     background-color: #CCC; }
      Si quieres obtener más información sobre el complemento "SortableJS", puedes acceder a la página que contiene la documentación para que puedas hacer los cambios que desees!
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Patrocinador



  • ×