var Phenix = function () {

Troll du Web depuis 1996

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; ?>

Formulaire générique d’édition de méta #SPIP

L’idée derrière ce formulaire est assez simple, pouvoir gérer n’importe quelle valeur de la table spip_metas et la modifiée. Si elle n’existe pas, la méta sera crée.

Il convient de prendre en compte qu’il y a 2 types de méta dans spip :

  • les métas simples, le casier ne contient qu’une seul valeur .
  • les métas plus complexent qui sont des tableaux php sérialisé.

Cela couvre un besoin similaire à Identité Extra, mais de manière plus générique.

L’idée finale serait d’avoir un plugin de gestion des métas du site (et donc des options des plugins) plus générique et plus facile d’accès. Je trouve qu’il pourrait être plus simple de déclarer des options de plugin sans avoir a déclaré systématiquement un CVT complet.

Fichier formulaires/editer_meta.html :

  1. <div class="formulaire_spip formulaire_#FORM">
  2.  
  3.         [<p class="reponse_formulaire reponse_formulaire_erreur">
  4.     (#ENV*{message_erreur})
  5.         </p>]
  6.         [<p class="reponse_formulaire reponse_formulaire_ok">
  7.                 (#ENV*{message_ok})
  8.         </p>]
  9.  
  10.         [(#EDITABLE|oui)
  11.     <form action="#ENV{action}" method="post">
  12.                 #ACTION_FORMULAIRE{#ENV{action}}
  13.  
  14.                 #GENERER_SAISIES{#ENV{_saisies}}
  15.  
  16.                 <p class="boutons">
  17.                         <input type="submit" class="submit" value="<:pass_ok:>" />
  18.                 </p>
  19.     </form>
  20.         ]
  21. </div>

fichier formulaires/editer_meta.php :

  1. <?php
  2.  
  3. if (!defined('_ECRIRE_INC_VERSION')) {
  4.         return;
  5. }
  6.  
  7. /**
  8.  * Fonction saisie pour le formulaire d'édition générique de méta
  9.  *
  10.  * @param string $casier nom du meta casier
  11.  * @param string $meta nom de l'éventuel sous-méta
  12.  * @param array $options tableau d'options :
  13.  *
  14.  * ```php
  15.  * $options_defaut = array(
  16.  *              'type_saisie' => 'input',
  17.  *              'label' => 'label'
  18.  * );
  19.  * ```
  20.  *
  21.  * @access public
  22.  * @return array
  23.  */
  24. function formulaires_editer_meta_saisies_dist($casier, $meta = null, $options = array()) {
  25.  
  26.         // option par défaut
  27.         $options_defaut = array(
  28.                 'type_saisie' => 'input',
  29.                 'label' => 'label'
  30.         );
  31.         // Fusionner les options par défaut avec les options de l'utilisateur
  32.         $options = array_merge($options_defaut, $options);
  33.  
  34.         // Récupérer le meta casier et créer sa saisie
  35.         $casier = ($meta) ? $casier.'/'.$meta : $casier;
  36.         $saisies = array(
  37.                 array(
  38.                         'saisie' => $options['type_saisie'],
  39.                         'options' => array(
  40.                                 'nom' => $casier,
  41.                                 'label' => $options['label']
  42.                         )
  43.                 )
  44.         );
  45.  
  46.         return $saisies;
  47. }
  48.  
  49. /**
  50.  * Fonction charger pour le formulaire d'édition générique de méta
  51.  *
  52.  * @param string $casier nom du meta casier
  53.  * @param string $meta nom de l'éventuel sous-méta
  54.  * @param array $options tableau d'options :
  55.  *
  56.  * ```php
  57.  * $options_defaut = array(
  58.  *              'type_saisie' => 'input',
  59.  *              'label' => 'label'
  60.  * );
  61.  * ```
  62.  *
  63.  * @access public
  64.  * @return array
  65.  */
  66. function formulaires_editer_meta_charger_dist($casier, $meta = null, $options = array()) {
  67.         // Récupérer le casier
  68.         $casier = ($meta) ? $casier.'/'.$meta : $casier;
  69.  
  70.         // Lire la configuration
  71.         include_spip('inc/config');
  72.         $contexte = lire_config($casier, array());
  73.  
  74.         // Dans le cas d'une saisie simple, on s'assure de renvoyer un tableau
  75.         // valide pour la fonction charger
  76.         if (!is_array($contexte)) {
  77.                 $contexte = array($casier => $contexte);
  78.         }
  79.  
  80.         return $contexte;
  81. }
  82.  
  83. /**
  84.  * Fonction traiter pour le formulaire d'édition générique de méta
  85.  *
  86.  * @param string $casier nom du meta casier
  87.  * @param string $meta nom de l'éventuel sous-méta
  88.  * @param array $options tableau d'options :
  89.  *
  90.  * ```php
  91.  * $options_defaut = array(
  92.  *              'type_saisie' => 'input',
  93.  *              'label' => 'label'
  94.  * );
  95.  * ```
  96.  *
  97.  * @access public
  98.  * @return array
  99.  */
  100. function formulaires_editer_meta_traiter_dist($casier, $meta = null, $options = array()) {
  101.  
  102.         // Enregistrer la méta
  103.         include_spip('inc/config');
  104.  
  105.         // Récupérer l'ancienne configuration du casier
  106.         $old_config = lire_config($casier);
  107.         if (is_array($old_config)) {
  108.                 // Dans le cas d'une méta complexe, on va fusionner les fusionner avec
  109.                 // la nouvelle
  110.                 $new_config = _request($casier);
  111.                 $new_config = array_merge($old_config, $new_config);
  112.         } else {
  113.                 // Cas d'une saisie simple, on enregistre simplement la meta
  114.                 $new_config = _request($casier);
  115.         }
  116.  
  117.         // Ecrire la nouvelle méta
  118.         $ecrire = ecrire_config($casier, $new_config);
  119.  
  120.         // Retour du formulaire
  121.         if ($ecrire) {
  122.                 return array(
  123.                         'editable' => true,
  124.                         'message_ok' => _T('info_modification_enregistree')
  125.                 );
  126.         } else {
  127.                 return array(
  128.                         'editable' => true,
  129.                         'message_erreur' => _T('erreur')
  130.                 );
  131.         }
  132. }

Quand tu n’as pas comprit le principe des clés primaire en AUTO_INCREMENT

J’ai trouvé ceci dans le code d’un plugin Joomla.
Je ne comprenais pas pourquoi j’avais une erreur de clé primaire dupliquée. Voilà pourquoi :

  1. $db->setQuery("SELECT MAX(  `extension_id` ) as id FROM  `#__extensions` WHERE  `type` =  \"plugin\" AND (`extension_id` > 8000 AND `extension_id` < 10000)");
  2. $id = $db->loadResult();
  3. if (empty($id) or $id='') $id = 9998;
  4. $id = $id + 1;
  5. // Enable mod_
  6. $db->setQuery("INSERT INTO #__extensions (extension_id, name, type, element, folder, enabled, access, protected, manifest_cache, params)
  7. VALUES (".((int)$id).", '******', 'plugin', 'cp', 'system', 1, 1, 1, '{\"name\":\"******\",\"type\":\"plugin\",\"creationDate\":\"December 2006\",\"author\":\"*******\",\"copyright\":\"**********\",\"authorEmail\":\"********\",\"authorUrl\":\"*******\",\"version\":\"3.0.0\",\"description\":\"*******_COPYRIGHT_DESCRIPTION\",\"group\":\"\"}', '{}')");
  8. $db->query();

Visiblement, le concept de clé primaire en AUTO_INCREMENT est - j’espère plutôt « était » - inconnu du créateur de ce plugin.


Un fichier sourcemap SASS pour Foundation

Un de mes collègues a trouvé une solution pour avoir un fichier source map quand on compile Foundation.

Son fichier fait d’autres trucs, je n’ai extrait que la partie source map.

On commence par installer gulp-sourcemap :

  1. npm install gulp-sourcemaps --save-dev

Ensuite on adapte le fichier gulpfile.js pour qu’il génère le sourcemap :

  1. var gulp = require('gulp');
  2. var $ = require('gulp-load-plugins')();
  3.  
  4. var sassPaths = [
  5.         'bower_components/foundation-sites/scss',
  6.         'bower_components/motion-ui/src'
  7. ];
  8.  
  9. gulp.task('sass', function() {
  10.         return gulp.src('scss/app.scss')
  11.                 .pipe($.sourcemaps.init())
  12.                 .pipe($.sass({
  13.                         includePaths: sassPaths,
  14.                         outputStyle: 'compressed' // if css compressed **file size**
  15.                 }).on('error', $.sass.logError))
  16.                 .pipe($.autoprefixer({
  17.                         browsers: ['last 2 versions', 'ie >= 9']
  18.                 }))
  19.                 .pipe($.sourcemaps.write('../css'))
  20.                 .pipe(gulp.dest('css'));
  21. });
  22.  
  23. gulp.task('default', ['sass'], function() {
  24.         gulp.watch(['scss/**/*.scss'], ['sass']);
  25. });

Menu responsive avec foundation

Depuis la version 6 du framework SASS/CSS Foundation, le composant qui sert à créer le menu principal du site, à savoir la « top bar » n’est plus un menu responsif « out of the box ».

C’est a vous d’en construire un avec les composants, comme l’explique la documentation.

Voici une structure html qui devrait couvrir la majorité des besoins. N’ont pas que c’est bien compliqué à réaliser, mais j’en ai marre de la refaire encore et toujours.

  1. <div class="title-bar" data-responsive-toggle="main-menu" data-hide-for="medium">
  2.         <button class="menu-icon" type="button" data-toggle></button>
  3.         <div class="title-bar-title">Menu</div>
  4. </div>
  5. <div class="top-bar" id="main-menu">
  6.         <div class="top-bar-left">
  7.                 <ul class="vertical medium-horizontal menu dropdown" data-responsive-menu="drilldown medium-dropdown" data-parent-link="true">
  8.                         <li>
  9.                                 <a href="#">Lien</a>
  10.                                 <ul class="menu vertical">
  11.                                         <li>
  12.                                                 <a href="">Lien</a>
  13.                                                 <ul class="menu vertical">
  14.                                                         <li>
  15.                                                                 <a href="">Lien</a>
  16.                                                         </li>
  17.                                                         <li>
  18.                                                                 <a href="">Lien</a>
  19.                                                         </li>
  20.                                                         <li>
  21.                                                                 <a href="">Lien</a>
  22.                                                         </li>
  23.                                                 </ul>
  24.                                         </li>
  25.                                         <li>
  26.                                                 <a href="">Lien</a>
  27.                                         </li>
  28.                                         <li>
  29.                                                 <a href="">Lien</a>
  30.                                         </li>
  31.                                 </ul>
  32.                         </li>
  33.                         <li><a href="#">Lien</a></li>
  34.                         <li><a href="#">Lien</a></li>
  35.                         <li><a href="#">Lien</a></li>
  36.                         <li><a href="#">Lien</a></li>
  37.                         <li><a href="#">Lien</a></li>
  38.                 </ul>
  39.         </div>
  40. </div>