Grace à sebimage, je crois avoir trouvé un bug, spécifique à la 1.5, qui empêche le plugin de trouver les templates produit+<alias>.html ou produit+<ID>.html. Merci sebimage !
Voici le code corrigé du fichier Templatealaspip.class.php, en attendant qu'il soit poussé sur les contribs :
<?php
include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsClassiques.class.php");
class Templatesalaspip extends PluginsClassiques
{
const VERSION = '1.2.3';
const MODULE = 'templatesalaspip';
const NOMMODULE = 'Templatesalaspip';
const PREFIXE = 'tals_';
const TYPE_CONTENU = 1;
const TYPE_DOSSIER = 2;
const TYPE_PRODUIT = 3;
const TYPE_RUBRIQUE = 4;
public $id;
public $type;
public $idobjet;
public $alias;
const TABLE = "templatesalaspip";
public $table=self::TABLE;
var $bddvars = array('id', 'type', 'idobjet', 'alias');
private $reptpl, $post15;
public function Templatesalaspip()
{
parent::PluginsClassiques(self::MODULE);
$this->debug_on = $this->get_variable(self::PREFIXE.'debug');
}
function init()
{
$this->ajout_desc(
self::NOMMODULE,
"Plugin Templates à la Spip",
"Ce plugin permet d'utiliser vos templates à la Spip, en utilisant des templates spéfifiques aux rubriques, produits, dossiers et contenus",
1);
$query = "
CREATE TABLE IF NOT EXISTS `".self::TABLE."` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`type` INT(1) NOT NULL,
`idobjet` INT(11),
`alias` varchar(128),
PRIMARY KEY (`id`),
KEY `idobjet` (`idobjet`)
)";
$this->query($query);
// On doit se placer APRES le plugin multisquelette, s'il est là, car
// il modifie la variable globale $reptpl, que nous utilisons...
$res = $this->query("select classement from ".Modules::TABLE." where nom='multisquelettes'");
if ($res) {
$num = mysql_result($res, 0, 0);
if ($num !== false) {
$num++;
$this->query("update ".Modules::TABLE." set classement = $num where nom='".self::MODULE."'");
}
}
$this->create_variable(self::PREFIXE.'activer', true);
$this->create_variable(self::PREFIXE.'debug', false);
}
function destroy()
{
$this->query("DROP TABLE `".self::TABLE."`");
$this->delete_variable(self::PREFIXE.'activer');
$this->delete_variable(self::PREFIXE.'debug');
}
public function charger_idobjet($idobjet, $type)
{
return $this->getVars("select * from $this->table where idobjet=$idobjet and type=$type");
}
private function debug($str)
{
if ($this->debug_on) echo "<pre>$str</pre>";
}
private function get_template_dir() {
global $reptpl;
if (! isset($this->reptpl)) {
// Pour la 1.5
if (isset($reptpl))
{
$this->post15 = true;
$this->reptpl = rtrim($reptpl, '/') . "/";
$this->debug("Repertoire des template >= 1.5 : $this->reptpl");
}
else
{
$this->post15 = false;
$this->reptpl = '';
$this->debug("Repertoire des template < 1.5 : $this->reptpl");
}
}
return $this->reptpl;
}
private function trouver_template($racine, $symbole, $id_objet, $type)
{
clearstatcache();
$nom = $racine . $symbole . $id_objet;
$this->debug("Test de l'existence du template '$symbole' pour $type: ".$this->get_template_dir()."$nom.html");
if (file_exists($this->get_template_dir() . $nom . '.html'))
{
$this->debug("Trouvé !");
return $nom;
}
else
{
// Determiner si un alias existe
$tals = new Templatesalaspip();
switch($type)
{
case 'Produit':
$type = self::TYPE_PRODUIT;
break;
case 'Rubrique':
$type = self::TYPE_RUBRIQUE;
break;
case 'Contenu':
$type = self::TYPE_CONTENU;
break;
case 'Dossier':
$type = self::TYPE_DOSSIER;
break;
}
if ($tals->charger_idobjet($id_objet, $type) && $tals->alias != '')
{
$nom = $racine . $symbole . $tals->alias;
$this->debug("Test de l'existence du template avec alias ".$this->get_template_dir()."$nom.html");
if (file_exists($this->get_template_dir() . $nom . '.html'))
{
$this->debug("Trouvé !");
return $nom;
}
}
}
return false;
}
// Modifier la variable 'fond' pour y placer le répertoire du squelette
public function pre()
{
global $fond;
if (! $this->get_variable(self::PREFIXE.'activer')) return;
$vars = array('id_produit' => 'Produit', 'id_rubrique' => 'Rubrique', 'id_contenu' => 'Contenu', 'id_dossier' => 'Dossier');
$newfond = false;
$this->debug("Répertoire des templates: ".$this->get_template_dir());
foreach($vars as $var => $clazz)
{
global $$var;
if (isset($_REQUEST[$var]) || isset($$var))
{
// Le cas particulier du produit
$idr = isset($_REQUEST[$var]) ? $_REQUEST[$var] : $$var;
if ($idr == '') continue;
$this->debug("Examen de l'identifiant $clazz $var = $idr");
$obj = new $clazz();
$racine = preg_replace('/\.html$/', '', $fond);
// Profondeur max: 20 niveaux
$iteration = 0;
while ($iteration < 20)
{
$this->debug("Examen de l'objet ".get_class($obj)." ID=$idr");
$methode = is_a($obj, "Produit") ? 'charger_id' : 'charger';
if ($obj->$methode($idr))
{
// A la première itération, on recherche le template spécifique (+ID ou =ID)
if ($iteration == 0)
{
// Si on est au niveau produit / contenu, chercher le template spécifique (+ID)
if (is_a($obj, 'Contenu') || is_a($obj, 'Produit'))
{
$this->debug("Test de l'existence du template spécifique (+) contenu/produit");
$newfond = $this->trouver_template($racine, '+', $idr, get_class($obj));
if ($newfond !== false) break;
// On n'a pas trouvé ? Chercher ai niveau parent
switch(get_class($obj))
{
case 'Contenu':
$obj = new Dossier();
$idr = $obj->dossier;
break;
case 'Produit':
$obj = new Rubrique();
$idr = $obj->parent;
break;
default:
$idr = $obj->parent;
break;
}
if ($idr == 0) break;
}
$idr = $obj->id;
// Le template spécifique rubrique/dossier (=)
$this->debug("Test de l'existence du template spécifique (=) rubrique/dossier");
$newfond = $this->trouver_template($racine, '=', $idr, get_class($obj));
if ($newfond !== false) break;
}
$nom = $racine . '=' . $idr;
// Le template générique rubrique/dossier (-)
$this->debug("Test de l'existence du template générique (-) rubrique/dossier");
$newfond = $this->trouver_template($racine, '-', $idr, get_class($obj));
if ($newfond !== false) break;
// Examiner les templates génériques du parent
$idr = $obj->parent;
$iteration++;
}
else
{
$this->debug("Objet ".get_class($obj)." ID=$idr non trouvé.");
break;
}
}
}
if ($newfond !== false)
{
$fond = $newfond;
if (! $this->post15) $fond .= '.html';
break;
}
}
$this->debug("Template final: $fond");
}
public function get_variable($nom)
{
$var = new Variable();
if ($var->charger($nom))
{
return $var->valeur;
}
return false;
}
protected function create_variable($nom, $valeur)
{
$variable = new Variable();
$variable->nom = $nom;
$variable->valeur = $valeur;
$variable->protege = 1;
$variable->cache = 1;
$variable->add();
}
protected function delete_variable($nom)
{
$variable = new Variable();
if ($variable->charger($nom)) $variable->delete();
}
}
?>
sebimage, peux-tu valider que tout est OK pour toi ?
Last edited by roadster31 (06-03-2012 15:14:42)