<?php
// Wikisem 0.1.1 du 10/01/2006
// Charles Népote 2005, 2006.
/* MVC divides an application into three concerns:
* Model - Encapsulates core application data and functionality domain logic.
* View - obtains data from the model and presents it to the user.
* Controller - receives and translates input to requests on the model or the view.
*/
// wikisem.php (contrôleur)
// Usage :
// wikisem.php est inclus dans un autre fichier PHP qui intègre :
// // Fichier de configuration relatif à cette instance de wikisem
/* $config = array (
'wikisem_path' => '/var/www/wikisem',
'tpl_path' => '/var/www/wikisem/tpl',
'modelURI' => 'http://rn7.net/2005/05/15',
'storage' => 'file'
);*/
// include "/var/www/wiki-s/config.inc.php";
// // Bibliothèque wikisem
// include "/var/www/wikisem/wikisem.php";
// -----------------------------------------------------------------------
// --- Contrôleur
// -----------------------------------------------------------------------
// (en fonction des entrées on sélectionne telle ou telle vue)
// Entrées possibles :
// -- une action : lire, modifier, etc.
// -- un objet
// -- un identifiant utilisateur et un mot-de-passe
// -----------------------------------------------------------------------
// -- 1. Lecture des arguments
// -----------------------------------------------------------------------
define ("WKS_BASE_URL", "http://127.0.0.1/wiki-s/?s=");
define ("WKS_MODEL_BASE_URI", "http://rn7.net/s/");
// URI par défaut ; si aucun paramètre n'est entré (ex : http://example.net/wikisem/ ),
// on utilise une resource par défaut : ex : http://example.net/uri/a )
$default_uri = WKS_MODEL_BASE_URI . "a";
// Partie variable de l'URL déterminant la ressource ; ex, dans http://127.0.0.1/wiki-s/?s=a
// la partie variable est "a"
$id = isset($_GET['s']) ? $_GET['s'] : "a";
// Détermination de la ressource (URI) à partir de l'URL
$resource = isset($_GET['s']) ? WKS_MODEL_BASE_URI . $id : $default_uri;
// Détermination de l'action à réaliser sur cette ressource (URI) :
// -- show : afficher une vue HTML de la ressource (action par défaut)
// -- edit : afficher un formulaire d'édition HTML de la ressource
// -- modify : enregistrer les valeurs relatives à une ressource
// -- rdf/xml
// -- n3
// -- delete
$action = isset($_GET['action']) ? $_GET['action'] : 'show';
// Paramètre de langue utile pour l'interface utilisateur
// TODO : calculer ce paramètre :
// -- 1. selon le choix prélable de l'utilisateur
// -- 2. à défaut selon la chaîne communiquée par le navigateur
// -- 3. à défaut selon la langue spécifiée par l'administrateur
// -- 4. à défaut selon la langue spécifiée par l'auteur de ce logiciel
$lang = "fr";
// -----------------------------------------------------------------------
// --- Modèle
// -----------------------------------------------------------------------
//include $config['wikisem_path'] . "/model.inc.php";
include $config['wikisem_path'] . "/model2.inc.php";
// -----------------------------------------------------------------------
// -- 2.
// -----------------------------------------------------------------------
$wiki = new Wiki($store,$resource,$action,$lang);
// -----------------------------------------------------------------------
// -- 3. Aff. de la vue en fonction des param. du script (action, etc.)
// -----------------------------------------------------------------------
// -- Si c'est un affichage
if($resource <> '' and $action == 'show')
{
include $config['tpl_path'] . "/complete.inc.php";
exit;
}
?>
<?php
// model2.inc.php
// -----------------------------------------------------------------------
// -- Include RAP
// -----------------------------------------------------------------------
define("RDFAPI_INCLUDE_DIR", "/var/www/wikisem/rdfapi-php/api/");
include(RDFAPI_INCLUDE_DIR . "RdfAPI.php");
$store = ModelFactory::getDbStore('MySQL', 'localhost', 'wikisem', 'root', 'craven2');
//print_r($test);
// Pour créer les tables il faut avoir préalablement créé la base dans MySQL
$test = $store->createTables('MySQL');
// -----------------------------------------------------------------------
// La classe wiki permet de créer un wiki sémantique (un site) et de réaliser
// une action sur la ressource spécifiée ex : éditer la ressource
// http://example.net/ressources/a
/*
define ("WKS_BASE_URL", "http://127.0.0.1/wiki-s/?s=");
define ("WKS_MODEL_BASE_URI", "http://rn7.net/s/");
// URI par défaut ; si aucun paramètre n'est entré (ex : http://example.net/wikisem/ ),
// on utilise une resource par défaut : ex : http://example.net/uri/a )
$default_uri = WKS_MODEL_BASE_URI . "a";
// Partie variable de l'URL déterminant la ressource ; ex, dans http://127.0.0.1/wiki-s/?s=a
// la partie variable est "a"
$id = isset($_GET['s']) ? $_GET['s'] : "a";
// Détermination de la ressource (URI) à partir de l'URL
$resource = isset($_GET['s']) ? WKS_MODEL_BASE_URI . $id : $default_uri;
// Détermination de l'action à réaliser sur cette ressource (URI) :
// show, edit, modify, rdf/xml, n3, delete
$action = isset($_GET['action']) ? $_GET['action'] : 'show';
// Paramètre de langue utile pour l'interface utilisateur
// TODO : calculer ce paramètre selon cet ordre de choix :
// choix prélable de l'utilisateur, chaîne communiquée par le navigateur,
// langue spécifiée par l'administrateur, langue spécifiée par l'auteur de Wikisem
$lang = "fr";
*/
Class Wiki
{
var $rd;
var $dbModel;
var $site;
var $out;
var $resource;
var $subject;
var $lang;
function Wiki($store,$resource,$action,$lang)
{
// Ouverture du modèle dont l'URI est http://rn7.net/2005/05/15
// TODO : passage en paramètre :
// -- du tableau de modèles à charger ??
// -- du modèle de base contenant la liste des autres modèles ??
$this->dbModel = $store->getModel('http://rn7.net/2005/05/15');
// -----------------------------------------------------------------------
// -- Définition de la ressource rdfs:label
$this->label = new Resource("http://www.w3.org/2000/01/rdf-schema#label");
// -----------------------------------------------------------------------
// -- Données sur le site
// TODO : passage en paramètre :
// -- de la ressource ??
// --
$this->site = new Resource("http://rn7.net/s/");
// Titre de site (nom propre, donc non localisé)
$title = $this->getRDFSLabel($this->dbModel, $this->site);
$this->resource = $resource;
$this->lang = $lang;
// -----------------------------------------------------------------------
// -- Données sur l'objet
// -- Nom de l'objet
// Recherche la première déclaration donnant le label de cet objet
$this->subject = new Resource($resource);
$this->objectLabel = $this->getRDFSLabel($this->dbModel, $this->subject, $lang);
//$o = getRDFSLabel($dbModel, new Resource('http://rn7.net/s/b'), $lang);
//echo $o;
//$this->out = $this->dbModel->writeAsHtmlTable();
}
// -----------------------------------------------------------------------
//
// -----------------------------------------------------------------------
function getRDFSLabel($model, $resource, $lang="")
{
// Ne fonctionne pas si le modèle ne contient pas la ressource
// Si pas de label : "-- Sans label --"
// Si un label sans indication de langue : on affiche
// Si un label dans une autre langue :
// -- on affiche par défaut "-- sans label --"
// -- l'utilisateur peut vouloir les afficher par défaut
if(!empty($lang))
{
$res_model = $model->find($resource, $this->label, NULL);
// Puis itération sur le modèle pour trouver le bon
$it = $res_model->getStatementIterator();
// Traverse model and output statements
while ($it->hasNext())
{
$statement = $it->next();
$r = $statement->getObject();
//echo $r->toString();
//echo $lang;
//echo $r->getLanguage();
if($r->getLanguage() == $lang)
{
$return = $r->getLabel();
//echo $return;
return $return;
break;
}
}
}
else
{
$res = $model->findFirstMatchingStatement($resource, $this->label, NULL);
if($res) $return = $res->getLabelObject();
else $return = '';
}
return $return;
}
function resourceTypes($model, $resource)
{
// Renvoie un modèle contenant les classes d'appartenance d'une ressource
$type = new Resource("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
$res_model = $model->find($resource, $type, NULL);
return $res_model;
}
// -----------------------------------------------------------------------
// -- Content management functions (interface)
// ----------------------------------------------------------------------
function getAllResourceTypes($model, $resource, $lang)
{
// Renvoie une chaine contenant les classes d'appartenance d'un objet
$res_model = $this->resourceTypes($model, $resource);
return $this->serializeObjectsLabels($res_model, ",", $lang);
}
function getAllResourceTypesInHTML($model, $resource, $lang)
{
// Renvoie une chaine HTML contenant les classes d'appartenance d'un objet
$res_model = $this->resourceTypes($model, $resource);
$it = $res_model->getStatementIterator();
// Traverse model and output statements
while ($it->hasNext())
{
$statement = $it->next();
$r = $statement->getObject();
//echo $r->toString();
//echoResourceURL($resource, $html_id="", $css_classes="")
$result .= $this->echoResourceURL($r, $html_id="", $css_classes="");
}
return $result;
//return $this->serializeObjectsLabels($res_model, ",", $lang);
}
function serializeObjectsLabels($model, $separator, $lang)
{
// Renvoie une liste textuelle des valeurs d'une série de triplets
$it = $model->getStatementIterator();
// Traverse model and output statements
while ($it->hasNext())
{
$statement = $it->next();
$r = $statement->getObject();
//echo $r->toString();
$result .= $this->getRDFSLabel($this->dbModel, $r, $lang); //ok
}
return $result;
}
function getURLid($id)
{
// Renvoie ...
return WKS_BASE_URL . $id;
}
function echoResourceURL($resource, $html_id="", $css_classes="")
{
// Renvoie l'URL de la ressource : ie la page HTML qui décrit la ressource
echo
"<a href=\"",
$resource->getLocalName(),
"\">",
$this->getRDFSLabel($this->dbModel, $resource),
"</a>";
return;
}
function echoHTMLSelect4RangeOfAResource($resource)
{
// Renvoie le code HTML des propriétés qui peuvent
// s'appliquer à une ressource
// Exemple :
//
//
}
function htmlViewOfResource($dBmodel, $subject, $lang)
{
// Renvoie ...
// Calcule toutes les déclarations à propos de cette ressource
//$this->subject = new Resource($subject);
$res = $dBmodel->find($subject, NULL, NULL);
// Sortie HTML
$res->writeAsHtmlTable();
// TODO : comment afficher les litéraux ?
}
function htmlViewOfCurrentResource()
{
// Renvoie ...
// Calcule toutes les déclarations à propos de cette ressource
echo "****************".$this->resource."<br />";
echo "****************".$this->lang."<br />";
$res = $this->dbModel->find($this->subject, NULL, NULL);
// Sortie HTML
$res->writeAsHtmlTable();
// TODO : comment afficher les litéraux ?
}
function htmlViewOfResource3()
{
// Renvoie, pour une ressource donnée, une liste HTML des propriétés et valeurs
// correspondantes
// -- ne renvoie pas le "type" (rdfs:type) de la ressource (car déjà donné dans le titre)
// -- ne renvoie que les labels des ressources dans la langue spécifiée
$res = $this->dbModel->find($this->subject, NULL, NULL);
// Sortie HTML
// Get Iterator from model
$it = $res->getStatementIterator();
// Traverse model and output statements
while ($it->hasNext())
{
$statement = $it->next();
//echo "Statement number: " . $it->getCurrentPosition() . "<BR>";
//echo "Subject: " . $statement->getLabelSubject() . "<BR>";
echo "Predicate: " . $this->getRDFSLabel($this->dbModel, $statement->predicate(), $this->lang) . "<BR>";
echo "Object: " . $this->getRDFSLabel($this->dbModel, $statement->object(), $this->lang) . "<P>";
}
}
function getPropertiesAndValuesOf($resource,$lang)
{
// Renvoie, pour une ressource donnée, un tableau PHP des propriétés et valeurs
// correspondantes
// -- ne renvoie pas le "type" (rdfs:type) de la ressource (car déjà donné dans le titre)
// -- ne renvoie pas le "label" (rdfs:label) de la ressource (car déjà donné dans le titre)
// -- ne renvoie que les labels des ressources dans la langue spécifiée
$return = array();
$res_model = $this->dbModel->find($resource, NULL, NULL);
//print_r($res_model);
// Puis itération sur le modèle pour trouver le bon
$it = $res_model->getStatementIterator();
// Traverse model and output statements
while ($it->hasNext())
{
$statement = $it->next();
$object = $statement->getObject();
$predicate = $statement->getPredicate();
// Si la valeur est un littéral, on affiche la valeur
if (is_a($object, 'Literal'))
{
//$it->setFindLiteralWithLang($lang);
//echo $r->toString();
//echo $lang;
//echo $r->getLanguage();
//print_r($object);
if(!$object->getLanguage() or $object->getLanguage() == $lang)
{
//$return[$predicate->getLabel] = $object->getLabel();
$return[$this->getRDFSLabel($this->dbModel, $predicate)] = $object->getLabel();
//getRDFSLabel($model, $resource, $lang="")
echo "*";
}
}
// Si la valeur est un objet, on affiche la valeur du label de cet objet
//...
}
return $return;
}
function htmlViewOfCurrentResource3()
{
$return = $this->getPropertiesAndValuesOf($this->subject,$this->lang);
print_r($return);
}
}
?>
<?php
// complete.inc.php
$title = $wiki->getRDFSLabel($wiki->dbModel, $wiki->site);
$URLid = $wiki->getURLid($id);
$objectLabel = $wiki->objectLabel;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title><?php echo $title; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<style type="text/css">
body { font-family: Helvetica; font-size: 90%; }
/* --------------------- Menu ------------------------ */
#menu { font-size: 80%; margin-left: 5%; background-color: ; border-left: 4px outset; border-bottom: 0px outset; width: 15%; margin-left: 82%; padding: 0.7%; }
/* ----------- */
#menu ul { margin: 0; padding: 0; margin-left: 2%; }
#menu li { margin-left: 9%; padding: 0; }
#menu li li { margin-left: 8% ; padding-left: 1%; }
#menu h2 { margin-top: 4%; margin-bottom: 0.5%; }
#copyright { padding: 3%; border-top: 1px inset; }
.selected { color:red; text-decoration:underline; }
/* --------------------- Objet ------------------------ */
#objet { float: left; width: 80%; border-top: 4px outset; }
/* ----------- */
#objet h2 { font-style: bold; }
#id { float:right; width:20%; margin: 2%; font-size: 100%; color: #ccccdd; text-align: right; border: none; }
#id a { color: #ccccdd; }
#type { margin:2%; width:70%; }
.type { font-size:70%; }
.propriete { clear:both; margin: 2%; }
.entete { float:left; margin:0%;margin-top:0; margin-bottom:0; font-size:80%; background-color:yellow; padding:0.2% 0% 0.2% 0%; }
.action_declaration { float:right; margin:2px; font-size:80%; }
.page { border:1px dashed; }
.footer { border:1px dashed; }
.commentsheader { border:1px dashed; }
.page, .footer, .commentsheader { clear: both; width: 100%; padding:0.2% 0% 0.2% 0%; }
#menu_objet { clear:both; background-color: pink; border: 1px solid; margin: 2%; }
#menu_objet .menu_suj { width:8%; font-size:80%; }
#menu_objet .menu_prop { width:8%; font-size:80%; background-color:yellow; }
#menu_objet .champ_val { width:78% }
#menu_objet p { margin: 0px; padding: 0.3em; }
#environ { background-color: #aaffbb; border-top: 4px solid; border-bottom: 5px solid; margin: 2%; }
#environ h3 { background-color: gray; margin: 0px; padding: 0.3em; }
#environ p { padding: 0.3em; }
/*.obj { background:transparent url('http://i.a.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif') 100% 10% no-repeat;
padding-right:25px; }*/
@media screen {
.obj { background:transparent url('http://i.a.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif') 100% 10% no-repeat;
padding-right:25px; }
}
@media print {
.obj { text-decoration: none; }
.obj:after { text-decoration: none; content:" *"; }
}
</style>
</head>
<body>
<?php
// Output the model as HTML table
//echo $wiki->out;
?>
<!-- ...............Titre du site .................. -->
<h1><?php echo $title; ?></h1>
<!-- h1><?php echo Wiki::getRDFSLabel($wiki->dbModel, $wiki->site); ?></h1 -->
<!-- .................. Objet ...................... -->
<div id="objet">
<!-- Identifiant de l'objet (URI) -->
<h1 id="id">Identifiant de l'objet : <a href="<?php echo $URLid; ?>" title="<?php echo "Objet : ".$objectLabel; ?>"><?php echo $id; ?></a></h1>
<!-- Nom de l'objet -->
<h1 id="type"><a href="<?php echo $wiki->getURLid($id); ?>" class="obj"><?php echo $objectLabel; ?></a>
<!-- variable affichant les types de l'objet -->
<span class="type">(<?php echo $wiki->getAllResourceTypesInHTML($wiki->dbModel, $wiki->subject, "fr"); ?>)</span>
</h1>
<div class="propriete">
<div style="font-size: 0.8em;">
<?php //echo $wiki->htmlViewOfResource($wiki->dbModel, $wiki->subject, "fr"); ?>
</div>
<?php echo $wiki->htmlViewOfCurrentResource3(); ?>
</div>
<div class="propriete">
<p class="entete"><a href="#" class="obj">Auteur</a></p>
<div class="page">
<p class="action_declaration"><a href="#" title="éditer cette déclaration." >[modifier]</a></p>
<a href="#" class="obj">Hendrick Man</a>, <a href="#" class="obj">David Delon</a>
</div>
</div>
<div class="propriete">
<p class="entete"><a href="#" class="obj">License</a></p>
<div class="page">
<p class="action_declaration"><a href="#" title="éditer cette déclaration." >[modifier]</a></p>
<a href="#" class="obj">Licence GPL</a>
</div>
</div>
<!-- <hr style="color: red;" /> -->
<!-- menu objet -->
<div id="menu_objet">
<form action="#" method="get">
<p>
Ajouter une déclaration dont <?php $wiki->echoResourceURL($wiki->subject); ?> est le sujet (assistant) :<br />
<?php $wiki->echoResourceURL($wiki->subject); ?>
->
<input type="hidden" name="wiki" value="propriete" />
<select name="property" class="menu_prop" />
<option>...</option>
<option>auteur</option>
<option>commentaire</option>
<option>est définit par</option>
<option>label</option>
<option>licence</option>
<option>mode</option>
<option>type</option>
<option>voir également</option>
</select>
->
<input name="property" class="champ_val" />
</p>
</form>
</div>
<!-- ==================================================== -->
<!-- menu objet -->
<div id="menu_objet">
<form action="#" method="get">
<p>
Ajouter une déclaration dont <a href="#"><?php echo $objectLabel; ?></a> est l'objet (assistant) :<br />
<input type="hidden" name="wiki" value="propriete" />
<select name="property" class="menu_suj" />
<option>...</option>
</select>
->
<input type="hidden" name="wiki" value="propriete" />
<select name="property" class="menu_prop" />
<option>...</option>
<option>utilise</option>
<option>est équivalent à</option>
<option>est différent de</option>
</select>
->
<?php $wiki->echoResourceURL($wiki->subject); ?>
</p>
</form>
</div>
<!-- ==================================================== -->
<div id="environ">
<h3>Environnement <a href="#" style="text-decoration:none;">[-/+]</a></h3>
<p>
Autres logiciels : <a href="#" class="obj">...</a>, <a href="#" class="obj">...</a>
</p>
<p>
Autres outils collaboratifs : <a href="#" class="obj">...</a>, <a href="#" class="obj">...</a>
</p>
<p>
Propriétés possibles de cet objet :
<ul>
<li>En tant qu'objet : <a href="#" class="obj">commentaire</a>, <a href="#" class="obj">est définit par</a>, <a href="#" class="obj">label</a>, <a href="#" class="obj">type</a>, <a href="#" class="obj">voir également</a></li>
<li>En tant que logiciel : <a href="#" class="obj">auteur</a>, <a href="#" class="obj">licence</a>, <a href="#" class="obj">...</a></li>
<li>En tant qu'outil collaboratif : <a href="#" class="obj">mode</a>, <a href="#" class="obj">...</a></li>
</ul>
</p>
<p>
Cartographie :
<ul>
<li><a href="#" class="obj">Objet</a> --> <a href="#" class="obj">Produit</a> --> <a href="#" class="obj">Logiciel</a> --> <a href="#" class="obj">WikiNi</a></li>
<li><a href="#" class="obj">Objet</a> --> <a href="#" class="obj">Outil</a> --> <a href="#" class="obj">Outil collaboratif</a> --> <a href="#" class="obj">WikiNi</a></li>
</ul>
</p>
</div>
<!-- /menu objet -->
</div>
<!-- /Objet -->
<!-- Menu général -->
<div id="menu">
<h2>Objet</h2>
<ul>
<li>Modifier l'objet</li>
<li>Ajouter une propriété</li>
<li>Modifier les droits</li>
<li>Supprimer l'objet</li>
<li>S'approprier l'objet</li>
<li>Vue
<ul>
<li class="selected">Vue complète</li>
<li>Vue simplifiée</li>
<li>A la Wiki (par défaut)</li>
<li>Réseau FOAF</li>
<li>Historique</li>
<li>En réseau</li>
<li>RDF</li>
<li>RSS</li>
</ul>
</li>
</ul>
<h2>Outil</h2>
<ul>
<li>Présentation</li>
<li>Configuration</li>
<li>Requêtes
<ul>
<li>Historique des objets</li>
<li>Liste des objets</li>
<li>entrées de blog</li>
<li>recherche simple...</li>
<li>recherche complète...</li>
</ul>
</li>
<li>Importer</li>
<li>Exporter</li>
<li>Synchroniser</li>
<li>Créer un nouvel objet
<ul>
<li>Objet nu (assistant)</li>
<li>Classe d'objets</li>
<li>Propriété</li>
<li>Modèle de vue</li>
<li>Modèle de formulaire</li>
<li>Personne</li>
<li>Utilisateur</li>
<li>Une nouvelle entrée...</li>
</ul>
</li>
</ul>
<h2>Utilisateur</h2>
<ul>
<li>Vous êtes <a href="#">CharlesNepote</a> (<a href="#">Déconnexion</a>)</li>
<li>Mes requêtes
<ul>
<li>Nouveaux utilisateurs</li>
<li>Nouvelles web sémantiques</li>
<li>Dernières contribs</li>
<li>Gérer <em>mes requêtes</em>...</li>
</ul>
</li>
<li>Préférences</li>
<li>Style</li>
</ul>
<p id="copyright">
<a href="http://validator.w3.org/check/referer">XHTML 1.0 valide ?</a> ::
<a href="http://jigsaw.w3.org/css-validator/check/referer">CSS valide ?</a> ::
-- Maquette <a href="#">WikiSem</a> "Orandre" 2004-09-03 18:00
</p>
<!-- /Menu général -->
</body>
</head>