Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-11-2007 10:43:36

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Groupware modulable, compatible MS Office/Sharepoint

Bonjour à tous,

Voilà quelques temps que je m'intérese au framework Zend. J'ai le projet de créer une bibliothèque basée sur celui-ci capabe de gérer les services Sharepoint de partage de fichers de la suite Office. Sharepoint utilise les services HTTP d'IIS, ce qui fait de PHP un langage très bien adapté au problème et Zend permet une approche simplifiée des problématiques.

Je recherche des personnes motivées pour créer une équipe capable de mener à bien ce projet.

Bonne journée smile

Edit: Mise à jour du projet

http://seadragon.tuxfamily.org

Dernière modification par Greg (07-12-2007 20:24:52)

Hors ligne

 

#2 23-11-2007 12:33:56

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Groupware modulable, compatible MS Office/Sharepoint

pour le partage de doc office il te faut implémenter en php le protocole DAV plus quelques bricoles il existe une classe PEAR (pas super bien foutue mais fonctionnelle) qui permet de faire de ton script php un service DAV
j'ai utilisé cette technique pour rendre accessible un champs d'une table sous forme de fichier avec les webfolder

en gros tu ouvre un web folder et tu vois alors des fichiers qui sont en réalité des enregistrements d'une table. lorsque tu ouvre les propriété du fichier tu modifie des champs correspondant dans la table et lorsque tu ouvre et édite un fichier tu change le contenu d'un champs.

en gros le contexte c'est comme les articles d'un CMS mais tu les vois directement dans ton explorer de fichier et tu peut les éditer et le modifier.

donc pour share point c'est le même principe sauf que share point utilise des action spécifique dans DAV pour faire son boulot, il a aussi des url particulière qu'il cherche systématiquement pour pouvoir fonctionner.

il n'y a qu'une chose que je ne parviens pas à comprendre dans son fonctionnement c'est le javascript qui te permet directement depuis un lien dans ta page d'ouvrir l'explorer de fichier sur le webfolder approprié.

tout le reste n'est que de l'échange de paquet XML dans le flux http (ni get ni post mais PUT et autre verbes http ajouté par DAV)

A+JYT

Hors ligne

 

#3 23-11-2007 19:13:52

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Re: Groupware modulable, compatible MS Office/Sharepoint

Effectivement, j'avais pu lire dans quelques articles qu'il utilisait WebDAV, je ne pense pas que ca soit un problème énorme, ce n'est qu'une surcouche de notre bon vieux HTTP/1.1. J'ai regardé le package PEAR, et leur classe ne me plaît pas du tout, je préfère implémenter quelquechose d'un peu plus lourd mais qui permet une plus grande évolutivité (j'avais pensé à un système de binding pour chaque méthode GET/POST/SET/...).

Pour ce qui est de la réalisation, j'ai déjà implémenté une gestion des uploads de fichiers modulable capable de stocker dans un premier temps sur le système de fichiers et/ou dans une base de données (via un BLOB ou un TEXT). Le système est évolutif, il fonctionne avec un système de drivers et peut avec une simple surcharge permettre une gestion des droits d'accès utilisateur, de mots de passe, des versions d'un même fichier (à la manière de CVS ou SVN) ou tout ce qui pourrait vous passer par la tête.

Je me doutais bien que Sharepoint pouvait utiliser des procédures qui lui sont spécifiques, comme beaucoup de logiciels propriétaires, mais la chose ne me paraît pas impossible et le vide se fait ressentir dans le monde PHP à mon goût. Les documents MS Office restent de loin les supports les plus utilisés dans beaucoup d'entreprises et Sharepoint apporte un moyen simple de partager les infos entre les différents acteurs. Recréer ce système chez PHP permettait d'ajouter rapidement ces fonctionnalités dans un intranet déjà très complet et d'éviter les solutions de substitution pas très "propres".

Hors ligne

 

#4 23-11-2007 21:03:42

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Re: Groupware modulable, compatible MS Office/Sharepoint

Voici un court exemple de code concernant l'upload de fichiers :

Code:

<?php

require_once 'Zend/Loader.php';

Zend_Loader::registerAutoload();

try
{
    $path = dirname(__FILE__) . '/upload/';

    $file = new Seadragon_Upload(new Seadragon_Upload_File_Http('uploadedFile'));
    $driver = new Seadragon_Upload_Driver_Filesystem($path);
    $file->setDriver($driver);

    $file->save();
}
catch(Seadragon_Upload_Exception $e)
{
    header('Content-type: text/plain');
    echo 'Seadragon Upload Exception: ' . "\n";
    echo $e->getMessage();
    exit;
}
catch(Exception $e)
{
    header('Content-type: text/plain');
    echo 'Unknown Exception: ' . "\n";
    echo $e->getMessage();
    exit;
}

?>

Voici la classe principale :

Code:

class Seadragon_Upload
{
    private $fileInfo = NULL;
    private $driver = NULL;

    private static $defaultDriverHandle = NULL;

/**
 * Seadragon_Upload constructor
 *
 * @param file The POST parameter name.
 * @param driver The storage driver used for this file, a @a Seadragon_Upload_File instance
 * @throws Seadragon_Upload_Exception
 */
    public function __construct($fileInfo, &$driver = NULL)
    {
        if(isset($fileInfo) && !($fileInfo instanceof Seadragon_Upload_File))
        {
            throw new Seadragon_Upload_Exception(
                sprintf('Parameter $driver isn\'t a Seadragon_Upload_File instance'));
        }

        $this->fileInfo = $fileInfo;

        if(isset($driver) && !($driver instanceof Seadragon_Upload_Driver))
        {
            throw new Seadragon_Upload_Exception(
                sprintf('Parameter $driver isn\'t a Seadragon_Upload_Driver instance'));
        }

        $this->driver = $driver;
    }

/**
 * Worker method, lauches the file storage mechanism
 */
    public function save()
    {
        if(!isset($this->driver) && !($this->driver instanceof Seadragon_Upload_Driver))
        {
            $this->driver = self::loadDriver();
        }

        $this->driver->store($this->fileInfo);
    }

/**
 * Sets up the file's storage object driver
 *
 * @param driver The storage driver, a @a Seadragon_Upload_Driver instance
 */
    public function setDriver(&$driver)
    {
        $this->driver = &$driver;
    }

/**
 * Sets up the default file storage driver object
 *
 * @param driver The storage driver, a @a Seadragon_Upload_Driver instance
 * @throws Seadragon_Upload_Exception
 */
    public static function registerDriver(&$driver)
    {
        if(!isset($driver) || !($driver instanceof Seadragon_Upload_Driver))
        {
            throw new Seadragon_Upload_Exception(
                sprintf('Parameter $driver isn\'t a Seadragon_Upload_Driver instance'));
        }

        self::$defaultDriverHandle = &$driver;
    }

/**
 * Retrieves the default file storage driver object
 *
 * @return The default storage driver object
 * @throws Seadragon_Upload_Exception
 */
    public static function &loadDriver()
    {
        if(!isset(self::$defaultDriverHandle))
        {
            throw new Seadragon_Upload_Exception('No storage driver selected');
        }

        return self::$defaultDriverHandle;
    }
}

Les drivers sont gérés par une classe abstraite qui nous permet de faire à peu près ce que l'on veut de notre fichier avant, pendant et après l'enregistrement via la méthode Seadragon_Upload_Driver_*::store() :

Code:

class Seadragon_Upload_Driver
{
    public function __construct()
    {
    }

    public function store($fileInfo)
    {
        if(!isset($fileInfo) || !($fileInfo instanceof Seadragon_Upload_File))
        {
            throw new Seadragon_Upload_Exception(
                sprintf('Parameter $fileInfo isn\'t a Seadragon_Upload_File instance'));
        }
    }
}

class Seadragon_Upload_Driver_Filesystem
    extends Seadragon_Upload_Driver
{
    protected $uploadDir = NULL;

    public function __construct($uploadDir = NULL)
    {
        parent::__construct();

        $this->setUploadDir($uploadDir);
    }

    public function setUploadDir($uploadDir)
    {
        if(!isset($uploadDir) || empty($uploadDir))
        {
            throw new Seadragon_Upload_Exception('Empty upload path');
        }

        if(!is_writable($uploadDir))
        {
            throw new Seadragon_Upload_Exception('Can\'t write data into specified upload directory');
        }

        $this->uploadDir = $uploadDir;
    }

    public function store($fileInfo)
    {
        parent::store($fileInfo);

        $newPath = $this->uploadDir . '/' . $fileInfo->fileName;

        if(file_exists($newPath))
        {
            throw new Seadragon_Upload_Exception('File already exists');
        }

        if(!move_uploaded_file($fileInfo->fileNameTmp, $newPath))
        {
            throw new Seadragon_Upload_Exception('File upload failed');
        }
    }
}

Le code est malheureusement trop long pour pouvoir le poster en entier ici, mais je tâcherais d'en poster un peu plus s'il intéresse du monde smile

Dernière modification par Greg (23-11-2007 22:58:58)

Hors ligne

 

#5 07-12-2007 01:06:39

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Re: Groupware modulable, compatible MS Office/Sharepoint

Le projet suit son cours, j'ai trouvé un hébergeur et retravaillé mon code pour arriver à une version stable et solide du sous-projet d'upload de fichiers. Je m'occuppe d'enrichir la documentation qui se trouve assez pauvre après pas mal de modifications et je prends un peu de temps pour terminer quelques exemples d'utilisation.

Je me concentre égalment sur la gestion des extensions WebDAV que je compte intégrer dans des classes dérivées du routeur et du dispatcheur de Zend très bientôt.

Vous pourrez retrouver des infos sur le site assez régulièrement : http://seadragon.tuxfamily.org/

Dernière modification par Greg (07-12-2007 01:08:31)

Hors ligne

 

#6 07-12-2007 10:14:08

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Groupware modulable, compatible MS Office/Sharepoint

Je n'ai pas trop regardé le projet, mais je me permet de faire une remarque à propos de l'upload, j'ai moi même développé un validateur que voici (ça peut tjrs servir, même comme source d'inspiration smile )

Code:

<?php
/**
 * Rewix extension for Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://www.rewix.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to contact@rewix.com so we can send you a copy immediately.
 *
 * @category   Rx
 * @package    Rx_Controller_Action_Helper_ViewRenderer
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */

require_once 'Zend/Validate/Abstract.php';

/**
 * Rx_Validate_UploadedFile
 * Validator for uploded file
 *
 * @category   Rx
 * @package    Rx_Validate_UploadedFile
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */
class Rx_Validate_UploadedFile extends Zend_Validate_Abstract {

    const NO_FILE = 'noUploadedFile';
    const TOO_SMALL = 'FileSizeIsTooSmall';
    const TOO_BIG = 'FileSizeIsTooBig';
    const PARTIAL = 'uploadedPartially';
    const SERVER = 'serverError';
    const MIME_TYPE = 'mimeType';
    const EXTENSION = 'extension';

    /**
     * @var array
     */
    protected $_messageTemplates = array(
        self::NO_FILE => "There is no uploaded file",
        self::TOO_SMALL => "The file '%value%' is too small (minimum size is: %min%o)",
        self::TOO_BIG => "The file '%value%' is too big (maximum size is: %max%o)",
        self::PARTIAL => "The file '%value%' was uploaded partially.",
        self::SERVER  => "The server encounter a problem with the file '%value%'",
        self::MIME_TYPE  => "The file '%value%' is not authorized (wrong type)",
        self::EXTENSION  => "The file '%value%' has been stopped for security reason (extension not authorized)"
    );

    /**
     * @var array
     */
    protected $_messageVariables = array(
        'min' => '_minSize',
        'max' => '_maxSize'
    );

    protected $_pathToMove;
    protected $_minSize;
    protected $_maxSize;
    protected $_authorizedMimeType;
    protected $_authorizedExt;

    public function __construct($options=null) {
        //Building options
        $this->_pathToMove = $options['path'];
        $this->_minSize = $options['minsize'];
        $this->_maxSize = (isset($options['maxsize']))?$options['maxsize']:UPLOAD_MAX_FILE_SIZE;
        $this->_authorizedMimeType = $options['mime'];
        $this->_authorizedExt = $options['ext'];
    }

    public function isValid($file) {
        if (is_string($file)) {
            $file = $_FILES[$file];
        }

        $this->_setValue($file['name']);

        if ($file['error']) {
            switch($file['error']) {
            case UPLOAD_ERR_OK: //Aucune erreur, le téléchargement est correct
                break;
            case UPLOAD_ERR_INI_SIZE: //Le fichier téléchargé excède la taille de upload_max_filesize, configurée dans le php.ini.
            case UPLOAD_ERR_FORM_SIZE: //Le fichier téléchargé excède la taille de MAX_FILE_SIZE, qui a été spécifiée dans le formulaire HTML.
                $this->_error(self::TOO_BIG);
                break;
            case UPLOAD_ERR_PARTIAL: //Le fichier n'a été que partiellement téléchargé.
                $this->_error(self::PARTIAL);
                break;
            case UPLOAD_ERR_NO_FILE: //Aucun fichier n'a été téléchargé.
                $this->_error(self::NO_FILE);
                break;
            case UPLOAD_ERR_EXTENSION: //L'envoi de fichier est arrêté par l'extension. Introduit en PHP 5.2.0.
                $this->_error(self::EXTENSION);
                break;
            case UPLOAD_ERR_NO_TMP_DIR: //Un dossier temporaire est manquant. Introduit en PHP 4.3.10 et PHP 5.0.3.
            case UPLOAD_ERR_CANT_WRITE: //Échec de l'écriture du fichier sur le disque. Introduit en PHP 5.1.0.
            default:
                $this->_error(self::SERVER);
            }
        }

        if (!is_null($this->_authorizedMimeType)) {
            if (!in_array($file['type'],$this->_authorizedMimeType)) {
                $this->_error(self::MIME_TYPE);
            }
        }

        if (!is_null($this->_authorizedExt)) {
            if (!in_array($this->_getExtension($file),$this->_authorizedExt)) {
                $this->_error(self::EXTENSION);
            }
        }

        //Is it useless?
        if (!is_null($this->_minSize) && $file['size'] < $this->_minSize) {
            $this->_error(self::TOO_SMALL);
        }

        if (!is_null($this->_maxSize) && $file['size'] > $this->_maxSize) {
            $this->_error(self::TOO_BIG);
        }

        if (count($this->_messages)) {
            return false;
        } else {
            return true;
        }
    }

    private function _getExtension($file) {
        return array_pop(explode(".", $file['name']));
    }

    public function setMinSize($minsize) {
        $this->_minSize = (int) $minsize;
        return $this;
    }

    public function setMaxSize($maxsize) {
        $this->_maxSize = (int) $maxsize;
        return $this;
    }

    public function setAuthorizedMimeType($mimetypes) {
        $this->_authorizedMimeType = (is_string($mimetypes))?array($mimetypes):$mimetypes;
        return $this;
    }

    public function setAuthorizedExt($exts) {
        $this->_authorizedExt = (is_string($exts))?array($exts):$exts;
        return $this;
    }
}

Hors ligne

 

#7 07-12-2007 16:31:02

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Re: Groupware modulable, compatible MS Office/Sharepoint

Je viens de lire le code de ta classe, c'est vrai que je n'avais pas pensé intégrer des limitations de tailles ou de types mimes/extensions.

Mais amha, tes tests sur le type mime et l'extension sont très dépendants de ce que veut bien t'envoyer le client, ca ne serait pas plus prudent d'utiliser les fonctions de mime_magic?

Hors ligne

 

#8 10-12-2007 13:53:50

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Groupware modulable, compatible MS Office/Sharepoint

Tu as peut être raison. Je ne sais pas comment est détécté le mimetype par php lors de l'upload.
Mais je sais que mime_magic est déprécié et qu'il vaut mieux utiliser les fonctions Fileinfo.

Hors ligne

 

#9 10-12-2007 15:03:41

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Re: Groupware modulable, compatible MS Office/Sharepoint

Mr.MoOx a écrit:

Tu as peut être raison. Je ne sais pas comment est détécté le mimetype par php lors de l'upload.

PHP ne fait que renvoyer ce que contient la requête, ces traitements doivent être gérés par le programme :

http://fr.php.net/manual/fr/features.file-upload.php

$_FILES['userfile']['type']

Le type MIME du fichier, si le navigateur a fourni cette information. Par exemple, cela pourra être "image/gif". Ce type mime n'est cependant pas vérifié du côté de PHP et, donc, ne prend pas sa valeur pour se synchroniser.

Mr.MoOx a écrit:

Mais je sais que mime_magic est déprécié et qu'il vaut mieux utiliser les fonctions Fileinfo.

Je m'en vais voir ce Fileinfo alors smile

Hors ligne

 

#10 10-12-2007 15:12:27

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Groupware modulable, compatible MS Office/Sharepoint

Ok je prendrais donc le temps de modifier mon code smile, car c'est vrai que pour le coup, ma vérification n'est pas top!
Préviens moi si tu le modifie avant moi smile

Hors ligne

 

#11 18-12-2007 12:05:24

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Re: Groupware modulable, compatible MS Office/Sharepoint

Je n'ai pas encore eu le temps d'implémenter les checks dans mon architecture, mais j'ai regardé le fonctionnement de l'extension fileinfo. C'est une extension PECL qui nécessite le package file (j'ai trouvé un build chez GNUWin32 ici) et utiliser un fichier de définitions magiques.

Après, l'utilisation est très simple :

Code:

<?php
/*
 * Paramètre 1 : options fileinfo
 * Paramètre 2 : chemin vers le fichier de définitions magiques
 */
$info = Finfo(FILEINFO_NONE, './magic.mime');

/*
 * Paramètre 1 : chemin vers le fichier à vérifier
 */
echo $info->file('test.doc');

$data = file_get_contents('test.doc');
/*
 * Paramètre 1 : données brutes stockées dans une variable
 */
echo $info->buffer($data);

?>

Dernière modification par Greg (18-12-2007 12:07:59)

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