Dotclear

Vous n'êtes pas identifié(e).

Annonce

#451 2018-04-08 20:27:04

pierrevg
Membre
Inscription : 2005-04-13
Site Web

Re : [ plugin menu ] menu deroulant jquery

Oh laaa, c'est que j'ai vieilli moi entre temps...

Hors ligne

#452 2018-04-09 13:36:04

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : [ plugin menu ] menu deroulant jquery

@ pierrevg, et autres utilisateurs potentiels :
J'ai commencé à étudier le code, mais je me pose quelques questions de réflexion sur le comportement souhaité:

Actuellement, mis à part le bug avec sqlite il me semble, que ce soit dans le cas d'un import "Blog simple" ou bien "Tous les blogs", que la table du menu est vidée de son contenu puis remplie avec le contenu du fichier de sauvegarde.

Dans le cas de "Tous les blogs" c'est un comportement que je conçois, avec quelques bémols  toutefois,
mais dans le cas d'un "Blog simple", est-ce vraiment le comportement  souhaitable?

En effet, dans ce deuxième cas on peux vouloir conserver le menu du blog courant, qui, avec le comportement actuel, sera remplacé et donc perdu.

Ton avis la-dessus?

Dernière modification par adjaya (2018-04-09 13:37:07)


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#453 2018-04-09 13:47:48

pierrevg
Membre
Inscription : 2005-04-13
Site Web

Re : [ plugin menu ] menu deroulant jquery

Pour moi, une sauvegarde sert à restaurer à un instant "t".
Que ce soit un blog ou un multi importe peu.
Le but est de retrouver les données qui ont été perdues (ou corrompues ou issues d'un ailleurs (cas d'un changement d'hébergement), pas de se retrouver avec des doublons.
Si tu veux absolument pouvoir avoir des doublons, ne peux-tu pas prévoir un export/import dans l'admin du plugin qui se chargerait, lui, de surcharger les tables existantes ?
Quelle que soit la solution que tu retiendras, il faudra bien l'expliquer dans l'aide...

Hors ligne

#454 2018-04-09 15:26:17

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : [ plugin menu ] menu deroulant jquery

Si je me base sur comportement par défaut de dotclear est le suivant:

Pour un import de type "Tous les blogs", tout le contenu est remplacé.

Pour un import de type "Blog simple", le contenu est ajouté à celui existant du blog courant.

La logique naturelle me parait donc de m'aligner sur ce comportement.

Toutefois, je ne suis pas sûr qu'ajouter des liens de menus hiérarchisés dans le cas d'un import "Blog simple" soit opportun:
cela risque de casser la hiérarchie, d'importer des liens dont les urls ne correspondent plus à rien, et des doublons.

Une solution pour convenir à la plupart des cas de figures serait à mon sens d'ajouter dans l'admin plugin une option d'activation de d'import single et/ou full du menu désactivée par défaut, avec mise en garde de l'utilisateur en cas d'activation.


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#455 2018-04-09 15:55:07

pierrevg
Membre
Inscription : 2005-04-13
Site Web

Re : [ plugin menu ] menu deroulant jquery

Je sais que le comportement de l'import blog simple est de créer des doublons. Jamais compris cette "logique".
Je pense que dans l'esprit des utilisateurs, l'export/import est compris comme une sauvegarde/restauration.
Du coup, si une sauvegarde consiste à oublier des éléments présents, perso j'appelle pas ça une sauvegarde...

Hors ligne

#456 2018-04-09 17:22:55

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : [ plugin menu ] menu deroulant jquery

Quoi qu'il en soit le propos de ce topic n'est pas de discourir sur la logique de dotclear...

La solution que je compte retenir pour menu devrait te convenir, soit :

1. Permette un remplacement du contenu du blog courant de la table menu lors d'un  import "Blog simple", a condition que l'option de ce comportement soit  activée.

2. Permette par activation également un import de la table menu lors d'un import  "Tous les blogs".


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#457 2019-07-01 06:31:12

WT
Membre
Inscription : 2019-01-09

Re : [ plugin menu ] menu deroulant jquery

Bonjour,

Actuellement utilisant le plugin dc_menu au moment de l’insertion d’une nouvelle valeur j’ai l’erreur suivante :
Erreur :

ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « dc_pk_menu » DETAIL: La clé « (link_id)=(18) » existe déjà.

J’ai été faire un tour rapide dans le code pour l’insertion et j’ai refait la requete que j ai trouvée :

SELECT MAX(link_id), MAX(link_position) FROM  dc_menu ;
max | max
-----+-----
  18 |  17

Je peux entrer l’info a la main mais je ne suis pas le seul a utiliser le blog et les autres non pas les compétence de le faire de cette manière.

Hors ligne

#458 2019-07-05 11:43:56

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : [ plugin menu ] menu deroulant jquery

Bonjour
Je ne vois qu'une raison possible à cela, un autre utilisateur a fait une insertion d'un nouvel item de menu qui s'est intercalée avec la tienne.
il faudrait ajouter un "writeLock" a la fonction "addLink" ce qui donnerais :

	public function addLink($title, $href, $level, $auto, $limit, $desc='', $lang='', $class='')
	{
		$cur = $this->con->openCursor($this->table);
		
		$cur->blog_id = (string) $this->blog->id;
		$cur->link_title = (string) $title;
		$cur->link_href = (string) $href;
		$cur->link_level = (integer) $level;
		$cur->link_auto = (integer) $auto;
		$cur->link_limit = (integer) $limit;
		$cur->link_desc = (string) $desc;
		$cur->link_lang = (string) $lang;
		$cur->link_class = (string) $class;
		
		if ($cur->link_title == '') {
			throw new Exception(__('Label and URL of menu item are mandatory.'));
		}
		
		if ($cur->link_href == '') {
			throw new Exception(__('Label and URL of menu item are mandatory.'));
		}

		$this->con->writeLock($this->table);
		try
		{		
			$strReq = 'SELECT MAX(link_id), MAX(link_position) FROM '.$this->table;
			$rs = $this->con->select($strReq);
			$cur->link_id = (integer) $rs->f(0) + 1;
			$cur->link_position = (integer) $rs->f(0) + 1;
		
			$cur->insert();
			$this->con->unlock();
		} catch (Exception $e) {
		    $this->con->unlock();
		    throw $e;
		}

		$this->blog->triggerBlog();
	}

Dernière modification par adjaya (2019-07-28 10:51:58)


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#459 2019-09-06 10:03:07

WT
Membre
Inscription : 2019-01-09

Re : [ plugin menu ] menu deroulant jquery

Merci pour la réponse,
j’ai mis a jour le code mais cela ne change rien.

Erreur :

ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « dc_pk_menu » DETAIL: La clé « (link_id)=(19) » existe déjà.

les select dans la base me donnent :

select link_id from dc_menu;
 link_id 
---------
       1
       2
       3
      10
       9
      16
      12
      18
      13
      14
      15
      11
      19
      17
       4
       5
       6
       7
select link_position from dc_menu;
 link_position 
---------------
             1
             2
             3
             4
             5
             6
             7
             8
             9
            10
            11
            12
            13
            14
            15
            16
            17
            18
(18 lignes)

Sur la base la requète exécutée directement :

SELECT MAX(link_id), MAX(link_position) FROM dc_menu;
 max | max 
-----+-----
  19 |  18
(1 ligne)


L’ajout de d’un var_dump confirme que le max est 18.

   echo '<pre>';
   var_dump($rs);
   echo '</pre>';
   exit;

la partie $rs :

 object(record)#46 (7) {
  ["__link":protected]=>
  resource(3) of type (pgsql link)
  ["__result":protected]=>
  resource(22) of type (pgsql result)
  ["__info":protected]=>
  array(4) {
    ["con"]=>
    object(pgsqlConnection)#3 (7) {
      ["__driver":protected]=>
      string(5) "pgsql"
      ["__syntax":protected]=>
      string(10) "postgresql"
      ["utf8_unicode_ci":protected]=>
      string(7) ""fr_FR""
      ["__version":protected]=>
      string(6) "9.6.15"
      ["__link":protected]=>
      resource(3) of type (pgsql link)
      ["__last_result":protected]=>
      resource(22) of type (pgsql result)
      ["__database"]=>
      string(7) "thedatabasename"
    }
    ["cols"]=>
    int(2)
    ["rows"]=>
    int(1)
    ["info"]=>
    array(2) {
      ["name"]=>
      array(2) {
        [0]=>
        string(3) "max"
        [1]=>
        string(3) "max"
      }
      ["type"]=>
      array(2) {
        [0]=>
        string(4) "int8"
        [1]=>
        string(4) "int4"
      }
    }
  }
  ["__extend":protected]=>
  array(0) {
  }
  ["__index":protected]=>
  int(0)
  ["__row":protected]=>
  array(2) {
    ["max"]=>
    &string(2) "18"
    [0]=>
    &string(2) "18"
  }
  ["__fetch":"record":private]=>
  bool(false)
}

Donc le problème viendrait de la différence entre les deux.


Pour moi il y a un problème dans l’objet record. Ne devrions nous pas avoir un 18 et un 19, comme dans la requete ? 
Le code ne devrait’il également pas utiliser chacune des colonnes en lieu et place de la même ?

$cur->link_id = (integer) $rs->f(0) + 1;
$cur->link_position = (integer) $rs->f(0) + 1;

Je ne connais pas assez le code mais ne vaudrait’il pas mieux utiliser les fonctionnalités (certe récente) de postgresql pour la gestion des "autoinc".

Hors ligne

#460 2019-09-08 09:07:56

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : [ plugin menu ] menu deroulant jquery

WT a écrit :

Le code ne devrait’il également pas utiliser chacune des colonnes en lieu et place de la même ?

$cur->link_id = (integer) $rs->f(0) + 1;
$cur->link_position = (integer) $rs->f(0) + 1;

Effectivement, ça doit être çà:
essaye de replacer les deux ligne de code précédente par

$cur->link_id = (integer) $rs->f(0) + 1;
$cur->link_position = (integer) $rs->f(1) + 1;

La fonction complète devient donc :

	public function addLink($title, $href, $level, $auto, $limit, $desc='', $lang='', $class='')
	{
		$cur = $this->con->openCursor($this->table);
		
		$cur->blog_id = (string) $this->blog->id;
		$cur->link_title = (string) $title;
		$cur->link_href = (string) $href;
		$cur->link_level = (integer) $level;
		$cur->link_auto = (integer) $auto;
		$cur->link_limit = (integer) $limit;
		$cur->link_desc = (string) $desc;
		$cur->link_lang = (string) $lang;
		$cur->link_class = (string) $class;
		
		if ($cur->link_title == '') {
			throw new Exception(__('Label and URL of menu item are mandatory.'));
		}
		
		if ($cur->link_href == '') {
			throw new Exception(__('Label and URL of menu item are mandatory.'));
		}

		$this->con->writeLock($this->table);
		try
		{		
			$strReq = 'SELECT MAX(link_id), MAX(link_position) FROM '.$this->table;
			$rs = $this->con->select($strReq);
			$cur->link_id = (integer) $rs->f(0) + 1;
			$cur->link_position = (integer) $rs->f(1) + 1;
		
			$cur->insert();
			$this->con->unlock();
		} catch (Exception $e) {
		    $this->con->unlock();
		    throw $e;
		}

		$this->blog->triggerBlog();
	}

Dernière modification par adjaya (2019-09-08 09:11:54)


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#461 2019-09-24 09:18:21

WT
Membre
Inscription : 2019-01-09

Re : [ plugin menu ] menu deroulant jquery

Hummm,

Malgrés les modifications j ai toujours l’erreur.

Dernière modification par WT (2019-09-24 09:18:32)

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map