Ce widget affiche un module d’upload, basé sur l’uploader HTML5 de la librairie Yui3. Le widget gère : - Un bouton de sélection des fichiers - Un bouton d’upload - La liste des fichiers présents dans le dataset (avec un lien “télécharger” et un lien “supprimer”)

Edit me

Hérite de WidgetBase.

Fonction

Rendu

Utilisation

Le composant est obligatoirement lié à un varset principal.

Workflow lors de la sélection d’un fichier :

  • (Pas encore implementé) Filtre sur l’extension du fichier, la taille et le nombre max (si les options correspondantes sont renseignées).
  • Mise à jour de la liste des fichiers sur le formulaire (si l’option show_filelist est à true dans le layout).
  • En fonction de l’option auto_upload :

    • false : Les fichiers sélectionnés sont dans la liste de l’uploader et sont marqués “en attente” dans la filelist
    • true : les fichiers sont ajoutés à la liste et l’upload commence immédiatement (cf. point suivant)
  • Clic sur le bouton upload (ou chargement immédiat avec l’option auto_upload):

    • Les fichiers sont enregistrés un à un côté serveur dans la base de données, avec un statut 0 (cf. chapitre Varsets)
    • Le dataset de la page courante est mis à jour avec les nouveaux fichiers ajoutés
  • Enregistrement de la page : Voozanoo ira automatiquement ajouter les enregistrements dans la table du varset cible, du varset de jointure, et mettra à jour les enregistrements du varset file, notamment en changeant le statut à 1.

.. caution:: Si la page n’est pas enregistrée, le statut du fichier reste à 0 et la jointure n’est pas créée.

.. hint:: Chaque fois que le controller upload est sollicité, une requête de “nettoyage” de la base est lancée pour supprimer les fichiers dont le statut est différent de 1.

Pré requis

Directives du fichier .ini
	voozanoo.upload.directory         = "C:\Program Files (x86)\Zend\Apache2\htdocs\voo4\storage"
	voozanoo.upload.chunk.directory   = "C:\Program Files (x86)\Zend\Apache2\htdocs\voo4\tmp"
  • voozanoo.upload.directory est le répertoire “final” d’upload, il est utilisé pour identifier un “Storage”
  • voozanoo.upload.chunk.directory est le répertoire temporaire où sont entreposés les chunks des fichiers fragmentés pour l’upload
Varset Storage

Ce varset contiendra les répertoires utilisés lors de l’upload d’un fichier, il est automatiquement géré par le système et s’auto-alimente en fonction de la directive voozanoo.upload.directory

	<varset name="storage" prefix="storage" type="sys" label="Storage">
	   <var uid="1" id="path" type="string">
	      <string length="255" />
	   </var>
	</varset>

L’utilité d’avoir ce principe de “Storage” réside dans la possibilité, à terme, d’avoir plusieurs disques et d’utiliser celui de “disponible” pour écrire nos fichiers.

Varset File

Un varset qui va contenir le détail de tous les fichiers uploadés pour le projet

	<?xml version="1.0" encoding="UTF-8"?>
	<varset name="file" prefix="file" type="sys" label="Uploaded files">
	   <var uid="1" id="status" type="integer" default_label="Status du fichier" default_short_label="Status">
	      <integer min="0" max="2" />
	   </var>
	   <var uid="2" id="date_creation" type="datetime" default_label="Date création" default_short_label="Date création" />
	   <var uid="3" id="original_name" type="string" default_label="Nom du fichier" default_short_label="Nom">
	      <string length="128" />
	   </var>
	   <var uid="4" id="generated_name" type="string" default_label="Nom généré" default_short_label="Nom généré">
	      <string length="32" />
	   </var>
	   <var uid="5" id="size" type="integer" default_label="Taille du fichier" default_short_label="Taille">
	      <integer min="1" max="9999999999"/>
	   </var>
	   <var uid="6" id="hash" type="string" default_label="Hash" default_short_label="Hash">
	      <string length="32" />
	   </var>
	   <var uid="7" id="ext" type="string" default_label="Extension" default_short_label="Ext">
	      <string length="8" />
	   </var>
	   <var uid="8" id="content_type" type="string" default_label="Content-type" default_short_label="Type">
	      <string length="100" />
	   </var>
	   <var uid="9" id="id_storage" type="fkey_varset" default_label="Dépôt" default_short_label="Dépôt">
	      <fkey_varset varset_name="storage" />
	   </var>
	   <var uid="10" id="path" type="string" default_label="Path" default_short_label="Path">
	      <string length="6" />
	   </var>
	</varset>

Détail des variables :

  • status : statut du fichier :

    • 0 : nouveau fichier en attente : fichier uploadé mais le formulaire n’a pas été enregistré
    • 1 : fichier valide : la page a été enregistrée, le fichier est présent et la jointure a été créée
    • 2 : fichier supprimé (pas utilisé ?)
  • date_creation : date d’envoi du fichier (YYYY-mm-dd HH:mm:ss)
  • orignal_name : nom du fichier d’origine
  • generated_name: nom du fichier sur le disque (généré aléatoirement)
  • size : taille du fichier (en octets)
  • hash: hash du fichier (Md5)
  • ext : extension (sans le ‘.’)
  • content_type : type de contenu (Mime Type)
  • id_storage : Identifie le Storage utilisé (répertoire) pour l’upload
  • path : Contient le chemin (imbrication de répertoires) depuis le Path du Storage jusqu’au fichier (Exemple : fd/92)
Varset de jointure

Ce varset fait le lien entre le fichier uploadé et la fiche (record) liée au fichier uploadé.

Son nom dépendra du contexte métier du projet, mais les variable id_ext et id_file seront systématiquement présentes

    <varset name="lecture1_file" prefix="05_file" type="join" label="Corres L1 Fichiers">
        <var uid="1" id="id_ext" type="fkey_varset">
            <fkey_varset varset_name="lecture1" />
        </var>
        <var uid="2" id="id_file" type="fkey_varset">
            <fkey_varset varset_name="file" />
        </var>
    </varset>

Détail des variables :

  • id_ext : identifiant du varset cible
  • id_file : identifiant du varset file

Il est possible de se passer de ce varset dans le cas où on souhaite seulement mettre à jour le varset file (+storage). Ce cas de figure peut par exemple survenir si le fichier est uploadé puis traité dans la foulée par un processus, sans pour autant être lié à un varset métier.

Dataquery à définir pour le widget upload:
		<dataquery id="file" table_name="{pj}_file_data" varset_name="file" table_alias="f">
			<column_simple field_name="id_data" table_name="f" />
			<column_simple field_name="original_name" table_name="f"/>
			<column_simple field_name="status" table_name="f"/>

			<!-- Permet l'ajout et la modification -->
			<condition sql="{id_data}={param_id_data}">
				<field alias="id_data" field_name="id_data" table_name="f"/>
				<variable alias="param_id_data" default="NULL">
					<entry type="param" name="id_data" />
				</variable>
			</condition>
		</dataquery>	
	

Exemple de dataquery exploitant l’uploader

    <!-- Dataset fichiers upload -->
        <dataquery id="upload" table_name="ndmt_05_file_data" varset_name="lecture1_file" table_alias="upload">
            <condition sql="{id_l1}={id}">
                <field field_name="id_ext" table_name="upload" alias="id_l1"/>
                <variable alias="id" default="NULL">
                    <entry type="dataset" name="lecture_1" field="id_data" row="current" />
                    <entry type="param" name="id_lecture1" />
                </variable>
            </condition>

            <join detail_table="ndmt_file_data" detail_varset_name="file" detail_alias="f" sql="{id_file}={id_data}" type="left" mode="rw">
                <field table_name="upload" field_name="id_file" alias="id_file"/>
                <field table_name="f" field_name="id_data" alias="id_data"/>
            </join>

            <column_simple field_name="id_data" table_name="upload"/>
            <column_simple field_name="id_ext" table_name="upload"/>
            <column_simple field_name="id_file" table_name="upload"/>

            <column_simple field_name="original_name" table_name="f"/>
            <column_simple field_name="status" table_name="f"/>

            <variables>
                <variable alias="idl1" default="NULL" target_column="id_ext">
                    <entry type="dataset" name="lecture_1" field="id_data" row="current"/>
                </variable>
            </variables>
</dataquery>

Exemple d’utilisation

	<upload dataset="lecture1_file">
	  <option output="html" option_name="auto_upload" value="true" />
	  <option output="html" option_name="btn_select_label" value="Attach a file..." />
	  <option output="html" option_name="btn_send_label" value="Send" />
	  <option output="html" option_name="show_filelist" value="true" />
	  <option output="html" option_name="download_link" value="true" />
	  <option output="html" option_name="max_size" value="200" />
	  <option output="html" option_name="max_files" value="1" />
	</upload>

Attributs

Options

auto_upload

Lorsque l’option vaut true les fichiers sont chargés dans la base dès qu’ils sont sélectionnés, le bouton d’upload n’appraîtra pas.

  • Version : >=2.15

  • Valeurs possibles : Boolean

  • Valeur par défaut : false

<option output="html" option_name="auto_upload" value="false" />

show_filelist

Lorsque l’option vaut true affiche la liste des fichiers présents dans le dataset (attribut dataset du widget) dans un tableau.

  • Version : >=2.15

  • Valeurs possibles : Boolean

  • Valeur par défaut : true

<option output="html" option_name="show_filelist" value="true" />

Lorsque l’option vaut true le lien de téléchargement du fichier est présent dans la colonne “Action” du tableau de la liste des fichiers, sinon le lien est directement sur le nom du fichier.

  • Version : >=2.15

  • Valeurs possibles : Boolean

  • Valeur par défaut : true

<option output="html" option_name="download_link" value="true" />

btn_select_label

Libellé à afficher sur le bouton de sélection des fichiers

  • Version : >=2.15

  • Valeurs possibles : String

  • Valeur par défaut : Parcourir…

<option output="html" option_name="btn_select_label" value="Parcourir..." />

btn_send_label

Libellé à afficher sur le bouton d’upload

  • Version : >=2.15

  • Valeurs possibles : String

  • Valeur par défaut : Envoyer

<option output="html" option_name="btn_send_label" value="Envoyer" />

read_only

Active le mode read-only

  • Version : >=2.15

  • Valeurs possibles : Boolean

  • Valeur par défaut : false

<option output="html" option_name="read_only" value="false" />

max_files

Nombre maximal de fichiers à uploader par manifeste.

  • Version : >=2.15

  • Valeurs possibles : Integer

<option output="html" option_name="max_files" value="{max_files_value}" />

max_size

Taille maximale d’un fichier à uploader (en mega-octets).

  • Version : >=2.15

  • Valeurs possibles : Integer

<option output="html" option_name="max_size" value="{max_size_value}" />

select_multifile

Lorsque l’option vaut true permet de sélectionner plusieurs fichiers dans la fenêtre de sélection.

  • Version : >=2.15

  • Valeurs possibles : Boolean

  • Valeur par défaut : true

<option output="html" option_name="select_multifile" value="true" />

extensions


  • Version : >=2.15

  • Valeurs possibles : Array

<option output="html" option_name="extensions" value="{extensions_value}" />

additional_params

Paramètres additionnels passés à upload/upload/uploadfile ou upload/upload/uploadchunk. Exemple : key1/value1/key2/value2

  • Version : >=2.24

  • Valeurs possibles : String

<option output="html" option_name="additional_params" value="{additional_params_value}" />

Options groupées