mirko-pagliai / cakephp-thumber

cakephp-thumber is a CakePHP plugin to create thumbnails
MIT License
7 stars 4 forks source link

path image #74

Closed JRobich closed 3 years ago

JRobich commented 3 years ago

Ciao Mirko, sto usando cakephp-thumber (prima di tutto grazie!) ma ho un problema che credo puoi risolvere facilmente.

Spiego meglio, se ho delle img in /webroot/uploads/ sono costretto a passare ogni volta WWW_ROOT prima della stringa img:

echo $this->Thumb->fit(
  WWW_ROOT . $user['profile_img'],
  [
    'height' => 50,
    'width' => 50
  ],
  [
    'class' => 'img-thumbnail rounded-circle'
  ]
);

mentre preferirei usare l'helper semplicemente cosi:

echo $this->Thumb->fit(
  $user['profile_img'],
  [
    'height' => 50,
    'width' => 50
  ],
  [
    'class' => 'img-thumbnail rounded-circle'
  ]
);

per far questo ho modificato il costruttore in php-thumber/src/TumbCreator.php in questo modo (l'ho fatto in maniera veloce per farti capire bene cosa voglio dire):

public function __construct(string $path)
{
      try {
          Exceptionist::isReadable($path);
      } catch (\Throwable $th) {
          if(!is_url($path)) {
              $path = Router::url('/', true) . $path;
          }
      }
      $this->path = $path;
      // $this->path = is_url($path) ? $path : Exceptionist::isReadable($path);
      $this->Filesystem = new Filesystem();
      $this->ImageManager = new ImageManager(['driver' => THUMBER_DRIVER]);
      $this->arguments[] = $path;
}

in questo modo controlla se l'img si trova in maniera assoluta sul server, o se si trova in remoto...

che ne pensi?

fammi sapere se puoi implementare questa cosa, altrimenti estenderò il tuo helper e farò la modifica da solo.

mirko-pagliai commented 3 years ago

Ciao @JRobich

l'idea di base è quella di seguire, dove possibile, le convenzioni stabilite da CakePHP. In particolare, in questo caso il comportamento è quello stabilito dal metodo HtmlHelper::img(), ovvero, le path relative fanno riferimento alla directory webroot/img/.

Anche perché capisci che, diversamente, utenti diversi potrebbero usare directory diverse come riferimento per le path relative. Nonché lo stesso utente potrebbe voler creare miniature da directory diverse ed è impensabile usare sempre una path relativa. Viene mantenuta dunque quella più diffusa.

Io non modificherei il costruttore di ThumbCreator (che comunque fa riferimento a un altro pacchetto, php-thumber, pensato per funzionare con qualsiasi libreria php, mentre questo pacchetto è l'adattamento per CakePHP), anche perché ad occhio la tua modifica rischia di inficiare altre cose.

Io lascerei le path assolute, anche perché come già spiegato la path relativa attesa dovrebbe essere un'altra, ed è bene che sia chiaro che invece la tua è una path diversa (quindi espressa come assoluta). Se proprio invece vuoi procedere in questa direzione, l'idea esatta è proprio quella di creare dentro la tua app un helper che estenda ThumbHelper. Qualcosa del genere (abbozzato al volo, potrebbero esserci errori):

namespace App\View\Helper;

use Thumber\Cake\View\Helper\ThumbHelper as BaseThumbHelper;

class ThumbHelper extends BaseThumbHelper
{

    protected function runUrlMethod(string $name, string $path, array $params = [], array $options = []): string
    {
        // qui viene cambiata la path come desiderato...

        return parent::runUrlMethod($name, $path, $params, $options);
    }
}
JRobich commented 3 years ago

Ciao Mirko,

perfetto allora farò un mio helper!

grazie mille ;)

JRobich commented 3 years ago

Nel caso qualcuno voglia fare la stessa cosa, ecco il mio helper:

<?php
declare(strict_types=1);

namespace App\View\Helper;

use Thumber\Cake\View\Helper\ThumbHelper as BaseThumbHelper;
use Cake\Routing\Router;

class ThumbHelper extends BaseThumbHelper
{
    protected function runUrlMethod(string $name, string $path, array $params = [], array $options = []): string
    {
        if(!is_url($path)) {
            //check if file exist
            if(!file_exists($path)) {
                $url = Router::url('/', true);
                if($path[0] == '/') { //check if first char is /, in this case i have to remove it
                    $path = substr($path, 1);
                }
                $path = $url . $path;
            }
        }

        return parent::runUrlMethod($name, $path, $params, $options);
    }
}
mirko-pagliai commented 3 years ago

@JRobich puoi semplificare molto:

        if(!is_url($path) && !file_exists($path)) {
                $path = Router::url('/', true) . ltrim($path, '/');
        }

Più che verificare che il file non esista, io verificherei che esista nella directory che userai come relativa. Per rimuovere carattere all'inizio alla fine di una stringa, puoi usare le funzioni ltrim() e rtrim().

Ciao, grazie per il contributo.

JRobich commented 3 years ago

Si vero! l'ho fatto al volo e non ci ho pensato. Molto comodo ltrim() e rtrim() grazie ancora