Trouver les &laquo; traductions &raquo; des rubriques - commentaires Trouver les « traductions » des rubriques pour spip 1.9<small class="fine d-inline"> </small>? 2006-06-27T12:33:04Z https://files.spip.net/Trouver-les-traductions-des#comment386462 2006-06-27T12:33:04Z <p>cela n'a plus l'air de passer en SPIP 1.9... Quelqu'un a t'il un patch pour trouver ce fameux critère <code class="spip_code spip_code_inline" dir="ltr">{traduction}</code> pour les rubriques<small class="fine d-inline"> </small>?</p> > Trouver les « traductions » des rubriques 2005-09-12T09:03:26Z https://files.spip.net/Trouver-les-traductions-des#comment383368 2005-09-12T09:03:26Z <p>Salut,</p> <p>oui, ça a changé dans la 1.8.2.</p> <p>pour les codes que tu proposes, tu pourrais le faire en extension de la contrib sur le wiki (voir le lien en dessous de la contrib)</p> > Trouver les « traductions » des rubriques 2005-09-12T03:52:05Z https://files.spip.net/Trouver-les-traductions-des#comment383367 2005-09-12T03:52:05Z <p>OK, c'est encore moi.</p> <p>J'ai reprogrammé la fonction critere_traduction (et programmé deux fonctions récursives) qui font ce que j'ai décrit plus haut. L'article utilisé pour trouver l'équivalent dans l'autre langue n'est pas seulement recherché dans la rubrique, mais dans toutes ses sous-rubriques. Donc, si on a une rubrique qui ne contient que des sous-rubriques, on peut quand même avoir la «<small class="fine d-inline"> </small>traduction<small class="fine d-inline"> </small>».</p> <p>Je vous averti, cette fonction sent le hack a plein nez, et il me semble qu'elle brise le modèle de fonctionnement de l'application, et c'est très peu testé, et pas commenté, etc, etc.</p> <p>Mais, je crois qu'elle marche (SPIP 1.8.2)<small class="fine d-inline"> </small>! Est-ce que ça intéresse qqn<small class="fine d-inline"> </small>? Si oui, je pourrais la rendre un peu plus sérieuse.</p> <div class="precode"><pre class="spip_code spip_code_block" dir="ltr" style="text-align:left;"><code>function critere_traduction($idb, &$boucles, $param) { $boucle = &$boucles[$idb]; // cas des rubriques : on va chercher toutes les rubriques contenant // des trads *publiees* de nos articles *publies* if ($boucle->id_table == 'rubriques') { if ($param->op == 'traduction') { global $id_rubrique; $art_traduit = _recur_trouver_article(array('id_rubrique' => $id_rubrique, 'profondeur' => 0)); $rub_traduit = _recur_descendre_arbo($art_traduit); $boucle->where[] = "id_rubrique = {$rub_traduit[id_rubrique]}"; return; } else erreur_squelette(_T('zbug_info_erreur_squelette'), $param); } // cas normal (articles) : la table possede un champ id_trad if ($param == 'traduction') { $boucle->where[] = "((".$boucle->id_table.".id_trad > 0 AND " . $boucle->id_table.".id_trad ='\"." . calculer_argument_precedent($idb, 'id_trad', $boucles) . ".\"') OR (" . $boucle->id_table.".".$boucle->primary." ='\"." . calculer_argument_precedent($idb, $boucle->primary, $boucles) . ".\"'))"; } else erreur_squelette(_T('zbug_info_erreur_squelette'), $param); } function _recur_trouver_article($params) { $select[] = "dest.id_rubrique"; $from[] = "spip_articles AS source, spip_articles AS dest"; $where[] = " source.id_trad = dest.id_trad AND source.id_rubrique = {$params[id_rubrique]} AND dest.id_rubrique != {$params[id_rubrique]}"; $result = spip_abstract_select($select, $from, $where); if($rangee = mysql_fetch_assoc($result)) { return array('id_rubrique' => $rangee['id_rubrique'], 'profondeur' => $params['profondeur']); } else { unset($select); unset($from); unset($where); $select[] = "sous.id_rubrique"; $from[] = "spip_rubriques AS sous"; $where[] = "sous.id_parent = {$params[id_rubrique]}"; $result = spip_abstract_select($select, $from, $where); while($rangee = mysql_fetch_assoc($result)) { $res = _recur_trouver_article(array('id_rubrique' => $rangee['id_rubrique'], 'profondeur' => $params['profondeur']+1)); if($res['id_rubrique'] != -1) { return $res; } } return array('id_rubrique' => -1, 'profondeur' => $profondeur); } } function _recur_descendre_arbo($params) { if($params['profondeur'] == 0) { return $params['id_rubrique']; } else { $select[] = "id_parent"; $from[] = "spip_rubriques"; $where[] = "id_rubrique = {$params[id_rubrique]}"; $result = spip_abstract_select($select, $from, $where); if($rangee = mysql_fetch_assoc($result)) { return _recur_descendre_arbo( array('id_rubrique' => $rangee['id_parent'], 'profondeur' => $params['profondeur']-1) ); } } }</code></pre></div> > Trouver les « traductions » des rubriques 2005-09-12T02:43:12Z https://files.spip.net/Trouver-les-traductions-des#comment383366 2005-09-12T02:43:12Z <p>Bonsoir,</p> <p>Cette solution est très intéressante, surtout dans des cas où le méthode du mot-clef est peu attirante, car on va avoir un nombre constamment grandissant de rubriques.</p> <p>Je cependant eu du mal à faire fonctionner la fonction avec SPIP 1.8.2<small class="fine d-inline"> </small>; je vous explique plus en détails :</p> <hr class="spip"> <p>Ligne 7 : $not, spécifié en paramètre de fonction, n'est pas trouvé (la fonction est appelée avec 3 paramètres). Je l'ai donc enlevé.</p> <hr class="spip"> <p>Ligne 13 : $param est un objet, la propriété ->op contient la valeur 'traduction', j'ai changé en conséquence.</p> <hr class="spip"> <p>Ligne 14 à 28 : J'avais du mal à suivre la construction de la requête dans l'instance $boucle (je suis nouveau sur SPIP, c'est peut-être pour ça), alors je l'ai modifiée pour ceci :</p> <div class="precode"><pre class="spip_code spip_code_block" dir="ltr" style="text-align:left;"><code>$boucle->from[] = "spip_articles AS source, spip_articles AS dest"; $boucle->where[] = " source.id_trad = dest.id_trad AND source.id_rubrique = \"." . calculer_argument_precedent($idb, 'id_rubrique', $boucles) . ".\" AND dest.id_rubrique != \"." . calculer_argument_precedent($idb, 'id_rubrique', $boucles). ".\" AND dest.id_rubrique = rubriques.id_rubrique";</code></pre></div><hr class="spip"> <p>Une fois ces modifications faites, ça marche.</p> <p>Enfin voilà. Cette solution ne satisfait pas mon cas, car je vais me retrouver avec des rubriques ne contenant que des sous-rubriques (pas d'articles), je ne pourrai donc pas me fier sur cette fonction. Pour être vraiment solide, il faudrait une inspection récursive des sous-rubriques, s'il n'y a pas d'articles directement dans la rubrique. Mais avec si peu de connaissance (pour l'instant) sur le core de SPIP, je ne sais pas comment y arriver. Ou peut-être est-ce rêver en couleur<small class="fine d-inline"> </small>? Est-ce que qqun a déjà fait ça<small class="fine d-inline"> </small>? Qu'en pensez-vous<small class="fine d-inline"> </small>? J'aimerais beaucoup avoir de vos commentaires.</p> <p>PS : Peut-être que qqn peux me répondre ici : j'aimerais savoir si la possibilité de faire un lien de «<small class="fine d-inline"> </small>traduction<small class="fine d-inline"> </small>» entre les rubriques est une fonctionnalité qui est présentement planifiée, et sinon pourquoi<small class="fine d-inline"> </small>?</p> <p>Merci beaucoup</p> <p>François</p>