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

Control de imágenes [cat, med, ran] desde la administración v.1.0

Recommended Posts

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.
rBPrIZo.png

D4G3BAP.png

2qGUTvf.png


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 rancat 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.

  • Like 3

Share this post


Link to post
Share on other sites

  • Similar Content

    • By Miguel92
      Bueno como dice el titulo "Mostrar titulo de los posts Anterior y Siguiente v2", ya que este es una actualización mejorada!
       
      Topic de la v1
       
      Básicamente se puede realizar tranquilamente desde cero:
      1 - Buscan en inc/class/c.posts.php y van hasta la última llave }
      /* OBTENER LOS TITULOS DE LOS POSTS ANTERIOR/SIGUIENTE */ public function getTitles($from) { global $tsCore; $pid = (int)$_GET["post_id"]; $pid = $from ? $pid - 1 : $pid + 1; $opt = $from ? "<" : ">"; if($pid < 0) return false; // Post $sql = db_exec([__FILE__, __LINE__], "query", "SELECT post_id, post_title, c_seo FROM p_posts LEFT JOIN p_categorias ON post_category = cid WHERE post_id = {$pid}"); // Existe? if(db_exec('num_rows', $sql) === 0) { $sql = db_exec([__FILE__, __LINE__], "query", "SELECT post_id FROM p_posts WHERE post_id {$opt} {$pid} ORDER BY post_id DESC LIMIT 1"); } $data = db_exec('fetch_assoc', $sql); if(!empty($data)) { $data["post_title"] = $tsCore->setSEO($data["post_title"]); $data["post_url"] = "{$tsCore->settings["url"]}/posts/{$data["c_seo"]}/{$data["post_id"]}/{$data["post_title"]}.html"; } return !empty($data) ? $data : false; }  
      2 - En inc/php/posts.php buscan
                  $tsPages['autor'] = $tsPost['post_user']; y debajo agregan
                  $smarty->assign("tsAnterior", $tsPosts->getTitles(true));             $smarty->assign("tsSiguente", $tsPosts->getTitles(false));  
      3 - Luego buscan en tema/templates/modules/m.posts_content.tpl y buscan
      {if $tsPost.user_firma && $tsConfig.c_allow_firma} y arriba agregan (o donde deseen), obviamente ustedes lo tendrían que adaptar a su theme... Pero si usan bootstrap no tiene que hacer tantos cambios.
      <div class="post-antsig"> <div class="post-anterior"> <a href="{$tsAnterior.post_url}" class="d-flex justify-content-start align-items-center"> <div class="icon ml-2"> <!-- Acá puede ir un icono o imagen, deciden ustedes --> <i class="icon-angle-left"></i> </div> <div class="titulo"> <small class="text-uppercase">No te piedas</small> <span>{$tsAnterior.post_title|truncate:34}</span> </div> </a> </div> <div class="post-siguiente"> <a href="{$tsSiguente.post_url}" class="d-flex justify-content-end align-items-center t-end"> <div class="titulo"> <small class="text-uppercase">A continuación</small> <span>{$tsSiguente.post_title|truncate:34}</span> </div> <div class="icon mr-2"> <!-- Acá puede ir un icono o imagen, deciden ustedes --> <i class="icon-angle-right"></i> </div> </a> </div> </div> Así quedaría terminado!

    • By Miguel92
      Instalador automático de themes!
      Es completamente básico y no requiere de mucha instalación.
       
      1 - Abren header.php y al final agregan
      include TS_ROOT . "/inc/InstallAutomaticTheme.php";  
      2 - Descargan "InstallAutomaticTheme.php" y lo agregan en inc/
       
      y listo todos los themes que agregues en "themes" y que contengan el archivo "install.php" los va a instalar, primero comprobará si lo tienen instalado en caso que si lo tengan, no lo va a agregar otra vez.
    • By Miguel92
      Hola a todos, no se si les interesa, pero les dejó este mod!  (No sé si era la idea que tenía)
       
      Mod iniciado por: KMario19 
      Topic: [Desarrollo] BBCode file para archivos
       
      No lo he encontrado terminado, así que supongo que para usar este mod, deben tener:
      [SECCIÓN] Archivos V1.2
      [SECCIÓN] Archivos V2
       
      [SECCIÓN] Archivos v2.2 (Actualizado a 1.3) [ZIP]
      Topic: Sección archivos v2.2
       
      Iniciamos con la instalación
      1 - Buscamos en .htaccess y buscamos
      RewriteRule ^mod-history/([A-Za-z0-9_-]+)/ inc/php/mod-history.php?ver=$1 [QSA,L] debajo agregaremos
      # Descargar RewriteRule ^download/([0-9_-]+)$ inc/php/download.php?id=$1 [QSA,L]  
      2 - Luego vamos a inc/class/c.core.php y buscamos
      public function setMenciones($html) { arriba de la función (también puede ir arriba de la última })
      # Extraemos el nombre del archivo public function parseFiles($content) {     preg_match_all('/\[file\=(\d+)\]/i', $content, $files);     foreach ($files[0] as $id => $file) {         $dato = db_exec('fetch_assoc', db_exec([__FILE__, __LINE__], 'query', "SELECT file_id, f_nombre, f_descargas, f_ext FROM a_files WHERE file_id = {$files[1][$id]} LIMIT 1"));         if($dato["file_id"] > 0) {             $replace = "<a href=\"{$this->settings["url"]}/download/{$dato["file_id"]}\">{$dato["f_nombre"]}.{$dato["f_ext"]} <span style=\"color:#aaa\">{$dato["f_descargas"]} descargas</span>";         } else $replace = "<span style=\"color:#f00\">Archivo eliminado...</span>";         $content = str_replace($file, $replace, $content);     }     return $content; }  
      3 - Después buscamos en inc/class/c.posts.php 
      $postData['user_firma'] = $tsCore->parseBadWords($tsCore->parseBBCodeFirma($postData['user_firma']),true); arriba agregamos
      $postData['post_body'] = $tsCore->parsefiles($postData['post_body']);  
      4 - Subimos este archivo "download.php" en inc/php
       
      5 - Luego en tema/js/wysibb.js buscan
      smilebox: "Emoticonos", y debajo pegan
      file: "Descargar archivo",
      un poco más abajo buscan
      modal_link_title: "Insertar enlace", y arriba agregan
      modal_link_id: "Inserta el ID del archivo",
      luego buscan
      strike,sup,sub,| y a lado agregan
      ,file
      más abajo buscan
      img : { y arriba pegan (en buttonHTML lo pueden definir ustedes)
      file : {     title: CURLANG.file,     buttonHTML: '<span class="fa-solid fa-paperclip"></span>', // Pueden agregar imagen o lo que deseen     modal: {         title: CURLANG.modal_link_id,         width: "500px",         tabs: [             {                 input: [                     {param: "FILE",title:CURLANG.modal_link_id}                 ]             }         ]     },     transform : {         '<a href="{FILE}">{FILE}</a>':"[file={FILE}]"     } },  
      bueno, eso todo... espero no olvidarme de nada!
    • By Miguel92
      Actualizar a Smarty 4.0
       
      1 - Deben descargar la última versión de smarty del repositorio en github.
       
      2 - Luego van a inc/smarty y eliminan todo el contenido (Aviso, si tienen archivos agregados en plugins les recomiendo hacer una copia)
       
      3 - Abren el archivo descargado "smarty-master.zip", acceden a la carpeta que contiene y luego buscan la carpeta "libs" y extraen el contenido dentro de "inc/smarty"
       
      4 - Ahora vamos a la raíz de nuestro sitio y abrimos "header.php" y sigan los siguientes pasos:
        A Buscan  
      define('TS_FILES', TS_ROOT.'/files/');   y debajo agregamos
      define('TS_SMARTY', TS_ROOT.'/inc/smarty/'); B Arriba de "include 'config.inc.php';" agregan  
      # Definimos donde estan los temas   define('TS_THEMES', TS_ROOT . '/themes/');   # Definimos donde se estan los plugins adicionales   define('TS_PLUGINS', TS_EXTRA . 'plugins/');   # Tiempo de vida del cache antes de ser eliminado [5hs] (3600 equivale 1hs)   define('CACHE_LIFE_TIME', 3600 * 5);   define('CACHE_CHECKED', TRUE);   # Solo usar las carpetas agregadas en $smarty->setTemplateDir()   define('SECURITY', TRUE);   # Para comprimir el html y que sea más rápido   define('COMPRESS_HTML', FALSE);   C En inc/ext crean una carpeta llamada plugins y descargar plugins.zip y la descomprimen en "inc/ext"
           Contenido del comprimido zip: fecha, getUrl, hace, kmg, nl2br, quot, rtrim, seo, strlen, trim y ucfirst
        
        D Un poco más abajo buscamos y lo borramos 
      // Smarty   include TS_CLASS.'c.smarty.php';   E Más abajo buscamos
      // Smarty $smarty = new tsSmarty(); y reemplazamos por
        # Todas las instrucciones de smarty comienzan   include TS_ROOT . "/inc/smarty.config.php";   F Al no existir el archivo "smarty.config.php" lo crean dentro de "inc"
       
      5 - Ahora buscamos "/inc/smarty.config.php" y empezaremos la configuración.
        A - Abrimos la etiqueta de <?php y luego agregan estas instrucciones
       
      6 - Ahora vamos a la raíz de nuestro sitio y abrimos "footer.php":
        A - Borramos todo el contenido del archivo y la reemplazaremos con esto 
       
      PD: Se me olvido mencionar que deben ir a inc/php/ajax_files.php y borrar lo siguiente, ya que no lo usaremos
      $smarty->template_ts = false;   // SMARTY SETTINGS  
      NOTA:

      Como verán en el array $_ACCESO_TPL_PHP_ = [...items...], es el acceso a esas carpetas. ¿Por que incluí esto?, fácil es para simplificar más, antes para incluir un archivo se tenía que agregar de la siguiente manera
      {include file='sections/main_header.tpl'} pero como en este ejemplo, al estar la ruta de la carpeta "sections" en el array se puede usar así
      {include file='main_header.tpl'} sin tener que hacer referencia a la carpeta a la que se tenga que acceder, también se puede usar de la forma corta
      {include 'main_header.tpl'} En la parte que accede al tema, css, js e images es para el funcionamiento de los plugins que había realizado, si desean lo pueden borrar... A no ser que quieran el plugin al que llame phpost, ¿Cuál es su función?: Es agregar todos los css, js sin tener que escribir toda la ruta
      para acceder a dicho archivo y en caso de que este archivo no exista, no agregará nada(no va a ser una linea vacía)
      este sería un ejemplo:
      Agregará la fuente "Roboto" desde google y los estilos que estén mencionados en los parámetros
      y lo que que sería cache es como esto "archivo.css?{$smarty.now}", así cuando se hace un cambio
      lo apliquen los cambios
      {phpost fonts=["Roboto"]     css=[       "tema" => ["estilo.css", "css" => ["live.css", "wysibb.css", "$tsPage.css"]],       "cache" => true    ] ... ETC ... } Al tener la carpeta plugins dentro de inc/ext, puedes agregar más sin problemas
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Patrocinador



  • ×