Alfresco: une GED presque parfaite

Une GED (gestion électronique de documents) doit vous aider à organiser vos contenus (pdf, powerpoint, word…) et à les versionner. Elle peut en plus, vous permettre d’automatiser des actions comme par exemple: une personne ajoute un appel d’offre dans un répertoire, et cela envoie un mail aux équipes concernées. Par dessus, vous pouvez également avoir tout un tas d’options: wiki, agenda, blog…

Quelle est la meilleure GED ?

Comme à chaque fois sur ce type de question, il n’y a pas une solution, mais plusieurs. Cela dépend surtout de vos besoins, et de vos contraintes. Ici, je vais faire l’impasse sur les différentes présentations, et vous donnerais directement la solution que j’ai choisi: Alfresco Community Edition.
Alfresco est une GED open source et gratuite qui propose toutes les fonctions de base, et qui en plus se connecte au LDAP de l’entreprise (ce qui évite de refaire des comptes utilisateurs). L’interface permet d’uploader ses documents via drag n drop; ils sont ensuite indexés via Solr4, et on peut les retrouver facilement comme sur cet exemple.

Alfresco: l’interfaçe est vraiment facile à prendre en main.

Si on valide la recherche, on verra alors le mot cherché surligné dans les différents documents trouvés.

La surbrillance est vraiment une option qui fait gagner du temps.

Vous avez même une fonctionnalité de synchronisation des dossiers sur votre poste (CMIS) qui est vraiment remarquable pour pouvoir travailler offline.

Le principal problème d’Alfresco, c’est JAVA

Peut-être que ça vient de moi, mais JAVA, j’aime pas. Vous voulez modifier une simple date, et ça devient très très vite la galère. Par exemple, les dates de création/modification ne peuvent être modifiées facilement comme les autres données (il faut désactiver un behaviour, faire la modification, puis le remettre). Et ça, c’est si vous savez déjà ou mettre votre code. Car les fichiers de configuration XML, et les classes JAVA sont encapsulés dans des fichiers Jar (c’est comme des zip) dans le serveur Tomcat. Et lorsque vous modifiez une ligne, il faut redémarrer le serveur (5 minutes) pour voir si cela fonctionne ou non. Bref, je passe mon chemin.

Modifier la date de création des documents d’Alfresco en PHP, c’est possible !

Ce n’est pas standard, et c’est encore moins propre, mais au moins ça fonctionne. Ici, j’utilise les API CMIS pour me connecter à Alfresco, et lister l’arborescence des documents. Puis avec une requête SQL sur la base Postgres, je parviens à modifier la date du contenu. Celle ci est ensuite réindéxée dans les 5 minutes et s’affiche dans l’outil. Certes c’est moche, mais comme je n’en ai besoin qu’au lancement de ma GED, ça fera le travail.

Pour les puristes qui auraient une meilleure solution, n’hésitez pas à la poster ci-dessous. Perso, je n’ai aucune envie de retourner dans le monde Java, des beans et co, donc je ne perdrais pas mon temps à essayer une alternative.

Le code:

Installer d’abord le code disponible ici sur votre Apache. Installez ensuite les dépendances composer à l’aide d’un « composer update ». Renommez le fichier examples/conf/Configuration.sample en Configuration.php (et modifier le avec vos codes).

Ensuite, remplacez le contenu du fichier ListFoldersAndFiles.php avec ce code.
Modifier également votre LOGIN_DB et PASSWORD_DB d’accès à la base données en conséquence.

<?php
Const URL = "http://URL_DE_VOTRE_ALFRESCO:8080";
/**
 * This example will list the children of the CMIS root folder.
 * The list is created recursively but is limited to 5 items per level.
 */

require_once(__DIR__ . '/../vendor/autoload.php');
if (!is_file(__DIR__ . '/conf/Configuration.php')) {
    die("Please add your connection credentials to the file \"" . __DIR__ . "/conf/Configuration.php\".\n");
} else {
    require_once(__DIR__ . '/conf/Configuration.php');
}

$httpInvoker = new \GuzzleHttp\Client(
    [
        'auth' => [
            CMIS_BROWSER_USER,
            CMIS_BROWSER_PASSWORD
        ]
    ]
);

$parameters = [
    \Dkd\PhpCmis\SessionParameter::BINDING_TYPE => \Dkd\PhpCmis\Enum\BindingType::BROWSER,
    \Dkd\PhpCmis\SessionParameter::BROWSER_URL => CMIS_BROWSER_URL,
    \Dkd\PhpCmis\SessionParameter::BROWSER_SUCCINCT => false,
    \Dkd\PhpCmis\SessionParameter::HTTP_INVOKER_OBJECT => $httpInvoker,
];

$sessionFactory = new \Dkd\PhpCmis\SessionFactory();

// If no repository id is defined use the first repository
if (CMIS_REPOSITORY_ID === null) {
    $repositories = $sessionFactory->getRepositories($parameters);
    $parameters[\Dkd\PhpCmis\SessionParameter::REPOSITORY_ID] = $repositories[0]->getId();
} else {
    $parameters[\Dkd\PhpCmis\SessionParameter::REPOSITORY_ID] = CMIS_REPOSITORY_ID;
}

$session = $sessionFactory->createSession($parameters);

// Get the root folder of the repository
$rootFolder = $session->getRootFolder();

?>
<html>
<head>
	<link href="<?php echo URL;?>/share/res/themes/lightTheme/presentation.css" rel="stylesheet" />
	<style>
		 .ygtvlm{width:19px;display:inline-block;margin-right:5px;}
		 ul{list-style:none}
		 li{padding-left:5px;}
		 ul{padding-left:10px;}
		.doc{background:url(<?php echo URL;?>/share/res/components/documentlibrary/actions/document-edit-properties-16.png) !important;width:16px;display:inline-block;margin-right:5px;}
		.edit{background:url(<?php echo URL;?>/share/res/components/documentlibrary/actions/document-edit-offline-16.png) !important;width:16px;display:inline-block;margin-right:5px;margin-left:5px;border:0;}
	</style>
</head>
<body class="yui-skin-lightTheme">
<div id="wrapper" class="treeview" >
<?php
$req = "";
if (isset($_GET["dir"])){
	$req = $_GET["dir"];
}

if (isset($_POST["update_date"])){
	$date = $_POST["update_date"];
	
	$document = $session->getObjectByPath($_POST["docpath"]);
	if ($document){
		$connexion = new PDO('pgsql:host=localhost;port=5432;dbname=alfresco', 'LOGIN_DB', 'PASSWORD_DB');
		$ids = explode(";",$document->getId());
		$sql = "update alf_node SET audit_created ='".$date."T12:42:22.564Z', audit_modified ='".$date."T12:42:22.564Z' where uuid = '".$ids[0]."' ";
		
		$resultset = $connexion->prepare($sql);
		$resultset->execute();

		//Avec ces lignes, on ne peut pas modifier les dates (les proprietes sont figees par ALfresco)
		//$properties = [\Dkd\PhpCmis\PropertyIds::CREATION_DATE => $date."T12:42:22.564Z", \Dkd\PhpCmis\PropertyIds::LAST_MODIFICATION_DATE => $date."T12:42:22.564Z", \Dkd\PhpCmis\PropertyIds::DESCRIPTION => 'Updated on ' . time()];
		//$document->updateProperties($properties, true);
		echo "La mise à jour de la date sera effectuée d'ici 5 minutes.<br/>";
	}
}


printFolderContent($session, $rootFolder,'  ',"",$req);



function printFolderContent($session, \Dkd\PhpCmis\Data\FolderInterface $folder, $levelIndention = ' ', $path = "", $req)
{
	$sDir = "";
	if (isset($_GET["dir"])){
		$sDir = $_GET["dir"];
	}
	echo "<ul>";
    $i = 0;
    foreach ($folder->getChildren() as $children) {
		/*
		echo $levelIndention;
        $i++;
        
		if ($i > 10) {
            echo "| ...\n";
            break;
        }
		*/
		$field ="cmis:creationDate";
		$newPath = $path."/".$children->getName();
        if ($children instanceof \Dkd\PhpCmis\Data\FolderInterface) {
			echo "<li><a href='?dir=".$newPath."'><span  class='ygtvlm'> </span>" . $newPath . "</a></li>\n";
			if ($newPath == $req or stripos($req,$newPath) !== false){
				printFolderContent($session, $children, $levelIndention . ' ', $newPath, $req);
			}
			
            
        } elseif ($children instanceof \Dkd\PhpCmis\Data\DocumentInterface) {
            if (stripos($newPath, $req) !== false){
				$document = $session->getObjectByPath($newPath);
				$dates = $document->getProperty("cmis:creationDate")->getValues()[0];
				//echo $document->getId();
				//echo var_dump($dates);
				echo '<li><span  class="doc"> </span>' . $children->getName() ."
					<form method='post' style='display:inline'>
						<input type='hidden' name='docpath' value='".$newPath."' />
						<input type='text' maxlength='10' style='width:80px' name='update_date' value='".$dates->format('Y-m-d')."' /><button class='edit'> </button>
					</form>
				</li>\n";
			}
        } else {
			if (stripos($newPath, $req) !== false){
				echo '<li><span class="doc"> </span>' . $children->getName() . "</li>\n";
			}
        }
    }
	echo "</ul>";
}
?>
</body>
</html>

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.