var Phenix = function () {

Troll du Web depuis 1996

Executer du code lorsqu’un article #SPIP est publié

Petit pipeline SPIP cool : quand un article SPIP est publié, on exécute le code.

Pratique par exemple pour envoyer une notification spéciale.

  1. <?php
  2. function prefix_post_edition($flux) {
  3.         if ($flux['args']['table'] == table_objet_sql('article')
  4.                 and $flux['args']['action'] == 'instituer'
  5.                 and $flux['args']['statut_ancien'] != 'publie'
  6.                 and $flux['data']['statut'] == 'publie'
  7.         ) {
  8.                 $id_article = $flux['args']['id_objet'];
  9.                 // Coder ici !
  10. }

Autoriser un auteur s’il est présent dans la zone d’une rubrique #SPIP (acces restreint)

Une petite fonction d’autorisation sympas : autoriser un auteur (peu importe son statut) à publier dans une rubrique, s’il est dans la zone de cette rubrique. :

  1. <?php
  2. function autoriser_accesrestreint_publiedans($faire, $type, $id, $qui, $opt) {
  3.         include_spip('accesrestreint_fonctions');
  4.         // On récupère les zones de la rubrique
  5.         $zones = accesrestreint_zones_rubrique_et_hierarchie($id);
  6.         foreach ($zones as $zone) {
  7.                 // Est-ce que l'auteur appartient à la zone ?
  8.                 if (accesrestreint_acces_zone($zone, $qui['id_auteur'])) {
  9.                         return true;
  10.                 }
  11.         }
  12.  
  13.         return false;
  14. }

Ensuite, on peut surcharger les autorisations de SPIP pour qu’elles tiennent compte de cette fonction :

  1. <?php
  2. /**
  3.  * Surcharge de l'autorisation de publication dans les rubriques. On va prendre
  4.  * en compte l'accès restreint. Si un auteur est dans la zone de la rubrique, on
  5.  * l'autorise à publier
  6.  */
  7. function autoriser_rubrique_publierdans($faire, $type, $id, $qui, $opt) {
  8.         if (autoriser('publiedans', 'accesrestreint', $id, $qui, $opt)) {
  9.                 return true;
  10.         }
  11.  
  12.         return autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt);
  13. }
  14.  
  15. /**
  16.  * Surcharge de l'autorisation de création d'article pour prendre en compte
  17.  * l'autorisation d'accesrestreint
  18.  */
  19. function autoriser_rubrique_creerarticledans($faire, $type, $id, $qui, $opt) {
  20.  
  21.         if (autoriser('publiedans', 'accesrestreint', $id, $qui, $opt)) {
  22.                 return true;
  23.         }
  24.  
  25.         return autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt);
  26. }

Du text-overflow : ellipsis et un élément à width : 100%.

J’étais en train de bricoler une div avec une largeur à 100% et un texte-overflow ellipsis.

Cela ne fonctionne pas en l’état :

  1. .ma_div {
  2.   display: block;
  3.   overflow: hidden;
  4.   white-space: nowrap;
  5.   width: 100%;
  6.   text-overflow: ellipsis;
  7. }

Pourquoi ? Je ne sais pas trop, mais avec quelques règles en plus on peut avoir le résultat que l’on attend, a savoir une div « fuilde » et un texte avec « ... » pour ce qui dépasse :

  1. .ma_div {
  2.   display: table;
  3.   overflow: hidden;
  4.   white-space: nowrap;
  5.   width: 100%;
  6.   table-layout: fixed;
  7.   text-overflow: ellipsis;
  8. }
Voir en ligne : text-overflow : ellipsis in table-cell without width

Trouver toutes les rubriques enfants d’une rubrique #SPIP

[Edit] : Comme signalé dans un commentaire, il existe bien une fonction native qui s’occupe de cela.

Il est parfois intéressant d’avoir la liste complètes des sous-rubriques d’une rubrique.

Par exemple, pour conditionner l’affichage d’un élément à une rubrique et tous ces enfants.

Il n’existe pas de fonction SPIP pour faire cela (ou en tout cas je ne l’ai pas trouvée). Voici donc un peu de code pour régler le problème.
C’est un collègue qui est à l’origine de cette fonction, je l’ai adaptée.

Attention, il faut PHP >= 5.5 ou installer le plugin SPIP bonux, à cause de la fonction array_column.

  1. /**
  2.  * Retrouver les enfants directs d'une rubrique.
  3.  *
  4.  * @param int $id_rubrique
  5.  * @access public
  6.  * @return array tableau contenant les id_rubrique direct.
  7.  */
  8. function trouver_enfant($id_rubrique) {
  9.         include_spip('base/abstract_sql');
  10.         $sous_rubriques = sql_allfetsel('id_rubrique', 'spip_rubriques', 'id_parent='.intval($id_rubrique));
  11.         return array_column($sous_rubriques, 'id_rubrique');
  12. }
  13.  
  14. /**
  15.  * Trouver les sous-rubriques d'une rubrique.
  16.  *
  17.  * @param int $id_rubrique l'id de la rubrique
  18.  * @return array une liste d'id_rubrique
  19.  */
  20. function trouver_enfants($id_rubrique) {
  21.  
  22.         // Trouver la première série de sous-rubrique.
  23.         $sous_rubriques = trouver_enfant($id_rubrique);
  24.  
  25.         // S'il n'y a pas de sous rubriques, on sort de la boucle avec juste la rubrique de base
  26.         if (count($sous_rubriques) === 0) {
  27.                 return array($id_rubrique);
  28.         } else {
  29.                 // On cherche en profondeur.
  30.                 foreach ($sous_rubriques as $id_sous_rubrique) {
  31.                         $recur = trouver_enfant($id_sous_rubrique);
  32.  
  33.                         // Il y a des enfants, on les ajoute à la liste des sous rubrique
  34.                         // déjà trouvée.
  35.                         if ($recur) {
  36.                                 $sous_rubriques = array_merge($sous_rubriques, $recur);
  37.                         }
  38.                 }
  39.  
  40.                 // Placer la rubrique initiale en première position.
  41.                 array_unshift($sous_rubriques, $id_rubrique);
  42.  
  43.                 return $sous_rubriques;
  44.         }
  45. }

Template Joomla

Ceci est un fichier de template Joomla. Comment je suis censé comprendre ce qui ce qui ce passe ?
C’est un template fourni avec le core, il devrait servir d’exemple, être facile à comprendre.

  1. <?php
  2. /**
  3.  * @package     Joomla.Site
  4.  * @subpackage  com_content
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9.  
  10. defined('_JEXEC') or die;
  11.  
  12. // Create a shortcut for params.
  13. $params = $this->item->params;
  14. JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
  15. $canEdit = $this->item->params->get('access-edit');
  16. $info    = $params->get('info_block_position', 0);
  17. ?>
  18. <?php if ($this->item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate())
  19.                   || ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate())) : ?>
  20.         <div class="system-unpublished">
  21. <?php endif; ?>
  22.  
  23. <?php echo JLayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item); ?>
  24.  
  25. <?php if ($canEdit || $params->get('show_print_icon') || $params->get('show_email_icon')) : ?>
  26.         <?php echo JLayoutHelper::render('joomla.content.icons', array('params' => $params, 'item' => $this->item, 'print' => false)); ?>
  27. <?php endif; ?>
  28.  
  29. <?php if ($params->get('show_tags') && !empty($this->item->tags->itemTags)) : ?>
  30.         <?php echo JLayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
  31. <?php endif; ?>
  32.  
  33. <?php // Todo Not that elegant would be nice to group the params ?>
  34. <?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date')
  35.                                   || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') ); ?>
  36.  
  37. <?php if ($useDefList && ($info == 0 || $info == 2)) : ?>
  38.         <?php echo JLayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?>
  39. <?php endif; ?>
  40.  
  41. <?php echo JLayoutHelper::render('joomla.content.intro_image', $this->item); ?>
  42.  
  43.  
  44. <?php if (!$params->get('show_intro')) : ?>
  45.         <?php // Content is generated by content plugin event "onContentAfterTitle" ?>
  46.         <?php echo $this->item->event->afterDisplayTitle; ?>
  47. <?php endif; ?>
  48. <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?>
  49. <?php echo $this->item->event->beforeDisplayContent; ?>
  50.  
  51. <?php echo $this->item->introtext; ?>
  52.  
  53. <?php if ($useDefList && ($info == 1 || $info == 2)) : ?>
  54.         <?php echo JLayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'below')); ?>
  55. <?php  endif; ?>
  56.  
  57. <?php if ($params->get('show_readmore') && $this->item->readmore) :
  58. if ($params->get('access-view')) :
  59. $link = JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language));
  60. else :
  61.                 $menu = JFactory::getApplication()->getMenu();
  62. $active = $menu->getActive();
  63. $itemId = $active->id;
  64. $link = new JUri(JRoute::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false));
  65. $link->setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)));
  66. endif; ?>
  67.  
  68. <?php echo JLayoutHelper::render('joomla.content.readmore', array('item' => $this->item, 'params' => $params, 'link' => $link)); ?>
  69.  
  70. <?php endif; ?>
  71.  
  72. <?php if ($this->item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate())
  73.                   || ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate())) : ?>
  74.         </div>
  75. <?php endif; ?>
  76.  
  77. <?php // Content is generated by content plugin event "onContentAfterDisplay" ?>
  78. <?php echo $this->item->event->afterDisplayContent; ?>