Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 14-09-2011 16:54:31

nk34
Membre
Date d'inscription: 10-08-2011
Messages: 32

[Zend_Filter] Classe FileName, nom de fichier sans overwrite (contrib)

Bonjour,
encore un petite contribution.

Cette classe permet de retourner un nom de fichier inexistant, si besoin incrémenté !
pratique pour enregistrer les nom de fichier avec leur nom réel sans se overwrite !

Si vous modifiez ou apportez des fonctionnalités, merci de les partagées ici !
Si vous l'utiliser un petit merci fait toujours plaisir !!!
Des remarques sont bienvenue

utilisation :

dirname dans le constructeur :
$fileFilter         = new Nk_Filter_FileName('test/');
$fileName         = $fileFilter->filter("test-2011.txt");

ou avec des setters
$fileFilter         = new Nk_Filter_FileName();
$fileFilter->setDir('test/');
// a true, incrémente la fin numérique du fichier si elle existe, ici on aura test-2012.txt
// a false, on aura test-2011-1.txt
$fileFilter->useNumericEnd((bool));
$fileName         = $fileFilter->filter("test-2011.txt");

ou avec un tableau d'options ou Zend_config dans le constructeur :
$fileFilter         = new Nk_Filter_FileName(array('dirname' => 'test/', 'numericend' => true);
$fileName         = $fileFilter->filter("test-2011.txt");

Enjoys

Code:

<?php
/**
 *  Incremente une chaine pour un fichier
 *  par exemple si le fichier image.jpg existe le nom devient image-1.jpg ....
 * 
 * @Author Jean luc BARAT (contact sur z-f.fr : http://www.z-f.fr/forum/misc.php?email=90080) 
 * @Date 14/09/2011
 * @Lisense GNU
 * @package Nk
 * @subpackage filter
 * 
 */
class Nk_Filter_FileName implements Zend_Filter_Interface
{
    
    /*
     * string nom du fichier
     */
    private $_fileName;
    
    /*
     * string extention du fichier
     */
    private $_extName;
    
    /*
     * string chemin du dossier
     */
    private $_dirName;
    
    /*
     * bool passé a true, on tente de récupérer 
     * et d'incrémenter la fin numérique du fichier
     * Attention si une date représente la fin du fichier est sera incrémentée
     */
    private $_useNumericEnd = false;
    
    
    /**
     * Défini les options 
     * 
     * @param arrray $options
     */
    public function __construct($options = array()) 
    {
        if ($options instanceof Zend_Config) {
            $options = $options->toArray();
        } elseif (is_string($options)) {
            $options = array('dirname' => $options);
        }

        if (array_key_exists('dirname', $options)) {
            $this->setDir($options['dirname']);
        }
        if (array_key_exists('numericend', $options)) {
            $this->useNumericEnd($options['numericend']);
        }
    }
    
    /**
     * Autorise l'utilisation de la fin numérique du fichier
     * pour l'incrémentation
     * 
     * @param bool|int(0|1) $value 
     * @return object Nk_Filter_FileName pour fluent interface
     */
    public function useNumericEnd($value) 
    {
        $this->_useNumericEnd = (bool) $value;
        return $this;
    }
    
    /**
     * Retourne le nom de dossier
     * 
     * @param string $fileName nom de fichier (avec son extention)
     * @return object Nk_Filter_FileName pour fluent interface
     */
    public function setDir($dirName) 
    {
        if(!is_dir($dirName))
            throw new Zend_Filter_Exception("Dir '$dirName' is not a directory");
        
        if(strrpos($dirName, '/') + 1 != strlen($dirName))
            $dirName .= '/';

            $this->_dirName = $dirName;
        return $this;
    }
    
    /**
     * Retourne le nom de dossier
     * 
     * @throws Exception
     * @return string
     */
    private function _getDir() 
    {
        $dirName = $this->_dirName;
        
        if(!$dirName)
            throw new Zend_Filter_Exception("Undefined directory, use setDir() method");
            
        return $dirName;
    }
    
    /**
     * Assigne le nom du fichier
     * 
     * @param string $fileName nom de fichier (avec son extention)
     * @return object Nk_Filter_FileName pour fluent interface
     */
    private function _setFile($fileName) 
    {
        $this->_fileName = $fileName;
        return $this;
    }
    
    /**
    * Récupere le nom en minuscule d'un fichier sans extension
    * @var $file string : le fichier (avec son extension)
    */             
    private function _getFileName() 
    {
        $fileName = $this->_fileName;
        return strtolower(substr($fileName, 0, strrpos($fileName, '.')));
    }
    
    /**
    * Récupere l'extention en minuscule d'un fichier (avec le point)
    * 
    * @var bool|int(0|1) $dot extention avec (true|1) ou sans (false|0) point
    * @return string : l'extention en minuscule avec le point
    */             
    private function _getExt($dot = true) 
    {
        $fileName = $this->_fileName;
        return strtolower(substr($fileName, (strrpos($fileName, '.') + (int) !$dot)));
    }
    
    /**
     * Défini dans Zend_Filter_Interface
     *
     * Returns $value nom de fichier disponible
     * et au besoin incrémenté
     *
     * @param  string $value
     * @return string
     */
    public function filter($value)
    {
        $dirName         = $this->_getDir();
        $file             = $this->_setFile($value);
        $tempFileName     = 
        $fileName         = $this->_getFileName();
         $ext             = $this->_getExt();
        $numericEnd     = 0;
        
        if($this->_useNumericEnd) {
            // on tente de récuperer la fin numerique du filename
            // le problème avec ce script tient du fait que si le fichier se termine par 
            // par exemple une année, cette année est incrémentée
            $numericEnd     = substr($fileName, strrpos($fileName, '-') +1);
            if(is_numeric($numericEnd)) {
                // si la fin est numérique on redéfini le nom du fichier sans sa fin numérique
                $fileName     = substr($fileName, 0, strrpos($fileName, '-'));
            }
        }
        echo $dirName  . $tempFileName . $ext;
         // Tant que le fichier existe
        while(file_exists($dirName  . $tempFileName . $ext) == true) {
            $tempFileName = $fileName . '-' . ++$numericEnd; 
        }
            
        return $tempFileName . $ext;            
    }
}

Dernière modification par nk34 (15-09-2011 11:11:49)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages