Overblog
Suivre ce blog Administration + Créer mon blog
9 février 2016 2 09 /02 /février /2016 22:04

array_map() retourne un tableau contenant tous les éléments du tableau array1, après leur avoir appliqué la fonction callback. Ainsi, pour le script

// array map
$array = array(
  'Pomme de terre', 
  'Carotte', 
  'Tomate', 
  'Navet', 
  'Poire', 
  'Raisin'
);
$return = array_map(function($value) {
  return strtolower($value);
}, $array);
var_dump($array, $return);

Le var_dump retournera :

// $array
array (size=6)
  0 => string 'Pomme de terre' (length=14)
  1 => string 'Carotte' (length=7)
  2 => string 'Tomate' (length=6)
  3 => string 'Navet' (length=5)
  4 => string 'Poire' (length=5)
  5 => string 'Raisin' (length=6)
// $return
array (size=6)
  0 => string 'pomme de terre' (length=14)
  1 => string 'carotte' (length=7)
  2 => string 'tomate' (length=6)
  3 => string 'navet' (length=5)
  4 => string 'poire' (length=5)
  5 => string 'raisin' (length=6)

Le tableau d'origine reste inchangé, le retour de la fonction sera le résultat du tableau traité par le callback.


array_walk() exécute la fonction callback définie par l'utilisateur sur chaque élément du tableau array. Ainsi, pour le script

// array walk
$array = array(
  'Pomme de terre', 
  'Carotte', 
  'Tomate', 
  'Navet', 
  'Poire', 
  'Raisin'
);
$return = array_walk($array, function(&$value) {
  $value = strtolower($value);
});
var_dump($array, $return);

Le var_dump retournera :

// $array
array (size=6)
  0 => string 'pomme de terre' (length=14)
  1 => string 'carotte' (length=7)
  2 => string 'tomate' (length=6)
  3 => string 'navet' (length=5)
  4 => string 'poire' (length=5)
  5 => string 'raisin' (length=6)
// $return
boolean true

Le tableau d'origine est modifié, le retour de la fonction sera un booléen.

 

 

Partager cet article
Repost0
Published by nbrabant - dans PHP
9 mars 2015 1 09 /03 /mars /2015 21:26

Ou comment ajouter du référencement en Rich Snippets sous Prestashop 1.6 en ne modifiant que le template et en ajoutant une classe overidée

 

Ajout des Rich Snippets breadcrumb sur Prestashop : modification du tpl

Dans un premier temps, vous devons modifiez le template du breadbrumb. Ouvrez le template dubredcrumb de votre thème

 

<!-- Breadcrumb -->
{if isset($smarty.capture.path)}{assign var='path' value=$smarty.capture.path}{/if}
<div class="breadcrumb">
    <a href="{$base_dir}" title="{l s='Return to Home'}"><i class="icon-home"></i></a>
    {if isset($path) AND $path}
        <span class="navigation-pipe" {if isset($category) && isset($category->id_category) && $category->id_category == 1}style="display:none;"{/if}>{$navigationPipe|escape:html:'UTF-8'}</span>
        {if !$path|strpos:'span'}
            <span class="navigation_page">{$path}</span>
        {else}
            {$path}
        {/if}
    {/if}
</div>
<!-- /Breadcrumb -->

 

Et modifiez le de cette manière :

 

<!-- Breadcrumb -->
{if isset($smarty.capture.path)}{assign var='path' value=$smarty.capture.path}{/if}
<div class="breadcrumb clearfix" itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
    <span itemprop="title"><a class="home" href="{$base_dir}" title="{l s='Return to Home'}" itemprop="url"><i class="icon-home"></i></a></span>
    {if isset($path) AND $path}
        <span class="navigation-pipe" {if isset($category) && isset($category->id_category) && $category->id_category == 1}style="display:none;"{/if}>{$navigationPipe|escape:'html':'UTF-8'}</span>
        {if !$path|strpos:'itemprop="title"'}
            <span itemprop="title" class="navigation_page">{$path}</span>
        {else}
            {$path}
        {/if}
    {/if}
</div>
<!-- /Breadcrumb -->

 

A partir de ce template, vous devez overrider la génération de breadcrumb de Prestashop avec la méthode Tools::getPath()

 

Ajout des Rich Snippets breadcrumb sur Prestashop : override du Tools::getPath()

Dans un premier temps, créez la classe Tools, héritant de ToolsCore dans le dossier override/classe et copier la méthode getTools dans la nouvelle classe créée. Ensuite, juste après la vérification de la variable $context, initialisez la valeur de la variable $path comme suit :

 

$path = '<span itemprop="title">'.$path.'</span>';

 

 Dans l'itération de lecture des différentes catégories, ajoutez les attributs itemprop sur les balises de lien :

 

$full_path .=
 (($n < $n_categories || $link_on_the_item) ? '<a href="'.Tools::safeOutput($context->link->getCategoryLink((int)$category['id_category'], $category['link_rewrite'])).'" itemprop="url" title="'.htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8').'">' : '').
 htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8').
 (($n < $n_categories || $link_on_the_item) ? '</a>' : '').
 (($n++ != $n_categories || !empty($path)) ? '<span class="navigation-pipe">'.$pipe.'</span>' : '');

 

Même chose pour la partie CMS :

 

if ($path != $category->name)
  $full_path .= '<a href="'.Tools::safeOutput($category_link).'" itemprop="url">'.htmlentities($category->name, ENT_NOQUOTES, 'UTF-8').'</a><span class="navigation-pipe">'.$pipe.'</span>'.$path;
else
    $full_path = ($link_on_the_item ? '<a href="'.Tools::safeOutput($category_link).'" itemprop="url">' : '').htmlentities($path, ENT_NOQUOTES, 'UTF-8').($link_on_the_item ? '</a>' : '');
  

 

Au final, la réécriture de la méthode devrait être semblable à celà :

 

class Tools extends ToolsCore {

    public static function getPath($id_category, $path = '', $link_on_the_item = false, $category_type = 'products', Context $context = null) {
        if (!$context)
            $context = Context::getContext();

        $path = '<span itemprop="title">'.$path.'</span>';

        $id_category = (int)$id_category;
        if ($id_category == 1)
            return '<span class="navigation_end">'.$path.'</span>';

        $pipe = Configuration::get('PS_NAVIGATION_PIPE');
        if (empty($pipe))
            $pipe = '>';

        $full_path = '';
        if ($category_type === 'products') {
            $interval = Category::getInterval($id_category);
            $id_root_category = $context->shop->getCategory();
            $interval_root = Category::getInterval($id_root_category);
            if ($interval)
            {
                $sql = 'SELECT c.id_category, cl.name, cl.link_rewrite
                        FROM '._DB_PREFIX_.'category c
                        LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category'.Shop::addSqlRestrictionOnLang('cl').')
                        WHERE c.nleft <= '.$interval['nleft'].'
                            AND c.nright >= '.$interval['nright'].'
                            AND c.nleft >= '.$interval_root['nleft'].'
                            AND c.nright <= '.$interval_root['nright'].'
                            AND cl.id_lang = '.(int)$context->language->id.'
                            AND c.active = 1
                            AND c.level_depth > '.(int)$interval_root['level_depth'].'
                        ORDER BY c.level_depth ASC';
                $categories = Db::getInstance()->executeS($sql);

                $n = 1;
                $n_categories = count($categories);
                foreach ($categories as $category)
                {
                    $full_path .=
                    (($n < $n_categories || $link_on_the_item) ? '<a href="'.Tools::safeOutput($context->link->getCategoryLink((int)$category['id_category'], $category['link_rewrite'])).'" itemprop="url" title="'.htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8').'">' : '').
                    htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8').
                    (($n < $n_categories || $link_on_the_item) ? '</a>' : '').
                    (($n++ != $n_categories || !empty($path)) ? '<span class="navigation-pipe">'.$pipe.'</span>' : '');
                }

                return $full_path.$path;
            }
        } else if ($category_type === 'CMS') {
            $category = new CMSCategory($id_category, $context->language->id);
            if (!Validate::isLoadedObject($category))
                die(Tools::displayError());
            $category_link = $context->link->getCMSCategoryLink($category);

            if ($path != $category->name)
                $full_path .= '<a href="'.Tools::safeOutput($category_link).'" itemprop="url">'.htmlentities($category->name, ENT_NOQUOTES, 'UTF-8').'</a><span class="navigation-pipe">'.$pipe.'</span>'.$path;
            else
                $full_path = ($link_on_the_item ? '<a href="'.Tools::safeOutput($category_link).'" itemprop="url">' : '').htmlentities($path, ENT_NOQUOTES, 'UTF-8').($link_on_the_item ? '</a>' : '');

            return Tools::getPath($category->id_parent, $full_path, $link_on_the_item, $category_type);
        }
    }
}

 

 


Partager cet article
Repost0
7 mars 2015 6 07 /03 /mars /2015 00:30

Petit aide mémoire pour l'utilisation de Prestashop 1.6

 

Liste de modules dans un hook :

SELECT * FROM `ps_module` where id_module IN (SELECT id_module FROM `ps_hook_module` WHERE id_hook = 8);

 

Principaux hook :

- front Right Column    > 7
- front Left Column       > 8
- front header                > 10

- front footer product    > 18
- front footer                   > 22

 

Ne pas oublier de modifier le nom de domaine dans la partie shop_url (table de gestion du multiboutique) lors d'un passage en local

Partager cet article
Repost0
13 avril 2012 5 13 /04 /avril /2012 00:49

L'interface Metro de Windows Phone 7 annonçait la couleur des futures versions de l'OS Windows, Microsoft voulant unifier au fur et à mesure du temps les interfaces utilisateur. Ayant été assez curieux (intrépide?) pour tester la bétâ de la future version de son OS, je vous livre dans un premier temps mon avis personnel, un premier avis plutôt surprenant.

http://s.tf1.fr/mmdia/i/20/1/windows-8-le-nouveau-logo-de-microsoft-10654201zepgd_1713.jpg?v=1

Le 29 février dernier, Microsoft rendait la Consumer Preview de Windows 8 disponible, permettant dès lors les tests sur machine virtuelle ou, tout simplement, d'attiser la curiosité des foules (avec tout de même près d'un million de téléchargement dès les premières 24 heures). A l'heure où j'écris cet article, la version d'évaluation est toujours disponible à cette urlComme annoncé dans les divers billets sur la toile, ce Windows 8 créée une vraie rupture avec les OS précédents.

Une réinitialisation des performances et quelques heures à la découverte de cette fameuse betâ plus tard vient le temps d'une première conclusion : L'interface Metro de Microsoft colle très bien à des périphériques mobiles comme les smartphones et les tablettes, mais je suis un peu moins convaincu quant aux ordinateurs, du moins, pour les utilisateurs qui, comme moi, avait découvert des versions de Windows 3.1 lors de leurs années collèges et utilisent leur ordinateur pour d'autres utilisation que la simple navigation internet accompagnée de lecture de vidéos.

Un mode de visualisation m'a tout de même bien séduit : le snap. Il s'agit d'un outil permettant de redimensionner les fenêtres et autres applications ouvertes en les faisant glisser sur la droite ou la gauche de l'écran. Le snap rend la lecture et l'organisation des fenêtres plus vivantes.

Sinon, que dire de plus pour le moment : c'est simple, rapide, intuitif (en dehors du fait d'éteindre le poste qui est légèrement plus sportive : vous devrez glisser le curseur à gauche de l'écran, cliquer sur Paramètre, puis sur Marche/Arrêt, assez loin de notre Démarrer > Arrêter habituel). La deuxième partie contenant plus de détails (Consumer preview oblige) devrait arriver prochainement sur mon blog

Partager cet article
Repost0
10 avril 2012 2 10 /04 /avril /2012 22:09

Avant propos : Cet article est un très vieil article retrouvé dans l'un de mes fonds de tiroir, à cette époque, Windows Phone 7 vennait de pointer le bout de son nez, et par un élan de curiosité, j'ai décidé de prendre part à une conférence donnant lieu à une micro-formation d'une journée au Microsoft Innovation Center de Mons afin de voir ce que l'OS mobile de Microsoft nous réservait. Avis mitigé dans un premier temps, j'ai par la suite adopté cet OS à côté de mon Android avec la sortie du Nokia Lumia 800.


Il y a quelques temps, je recevais l'annonce d'une journée conférence sur les moyens de déployement d'applications sur la plate-forme mobile de Microsoft, Windows Phone 7, au MIC de Mons, un moyen de passer en revue les différents aspects de cet OS mobile.


http://www.microsoftmag.eu/uploads/posts/2011-03/1299524548_windowsphone7.jpg

La durabilité

Christophe Peerens, l'intervenant lors de cette journée, n'a cessé de le souligner : l'environnement WP7 a été conçu dans l'optique d'une utilisation simplifiée et stable (à l'inverse de Windows CE 6) et ce dans le but de permettre à ce système d'être durable dans le temps.

"Windows CE 6 nous permettait d'avoir un outil numérique, un genre de pc de poche, qui pouvait également servir de téléphone, pour WP7, le but est tout d'abord à l'utilisateur de téléphoner, consulter et envoyer des sms et de gérer un répertoire de contact". Vous l'aurez donc compris, Microsoft a complètement épuré son interface, rendant le tout plus intuitif pour un utilisateur lambda, à tel point que le système permettant la conservation des données en arrière-plan n'est pas nativement incluse (oui, vous avez bien lu! Si vous souhaitez déployer sur WP7 et que votre application puisse passer en arrière-plan, il ne faudra pas oublier de d'inclure une classe ainsi qu'une suite d'instruction bateau, chose pourtant déjà présente depuis longtemps dans d'autres Osmobile). Beaucoup de tutoriels explicatifs sur le Tombstoning sont disponibles sur la toile afin de remédier à ce problème, mais ce n'est pas sur ce point là que Windows Phone 7 marquera des points...

Par rapport à l'histoire de stabilité, beaucoup de choses sont également passé à la trappe. On notera, comme sous Windows Seven, la fermeture de l'accès registry qui, certes, ferme le smartphone (un peu comme le smartphone de chez Apple ^^), mais stabilise en bonne partie le système en bloquant toute modifications apportées par le user. C'est entre autre pour cette histoire de stabilité (mais également par rapport à un souci software) qu'il n'est pas possible d'effectuer du multitasking (notre intervenant nous a avoué que Microsoft ne savait, à l'heure actuelle, pas comment aborder la manière d'effectuer du multitâche).

 

L'interface

Plus ou moins surprenant, il s'agit de la ligne de conduite de l'interface et des fonctionnalités des téléphones sous la plate-forme de Microsoft : tout a été uniformisé selon une charte pré-définie (taille de l'écran : 480 x 800 ou 320 x 480, 3 boutons physiques : Back, Start et Search, 4 point tactile ou plus, smartphone équipé d'un GPS différentiel, d'un accéléromètre, d'un détecteur le luminosité, d'un détecteur de proximité,...), ce qui, contrairement à Android, laisse très peu de possibilité de fantaisie aux constructeurs d'appareils, mais permettrait au développeurs de se concentrer avant tout vers une optique applicative plutôt que de gestion des formats. Cela "Applellisation" des smartphones destinés au WP7 permet également un léger gain de temps au chargement de l'appli.

 

L'environement de développement

L'app hub

Qui dit smartphone dit forcément market où l'on peut télécharger des applications/logiciels, autant pour les WinPhone que la Xbox 360, qu'ils soient ou non payants. Jusque là pour les dev, il s'agit de la manière classique de procéder : on s'enregistre à l'année pour la modique somme de 99 euros/dollars (pas de conversion s'il vous plait!) sur http://Create.msdn.com afin de créer un LiveID (à noter que pour les étudiants dépendant du <a href="https://www.dreamspark.com/default.aspx ">Dreamspark<a>, les frais d'enregistrement sont réduits (il me semble), ils peuvent également bénéficier de tarif avantageux sur les kits de développement Microsoft Professionnal (à noter tout de même que la firme met en place des kits de développement express, afin de permettre à un quelconque développeur de tester ses applications en local, chose plutôt pas mal). Suite à l'enregistrement, un GeoTrust est effectué, puis Microsoft permet le déblocage de 3 téléphones de développement via le LiveID (les tests de déploiement peuvent, à partir de ce moment, s'effectuer avec n'importe quel ordinateur de développement).

Au moment de l'envoi vers le market, une soumission en vérification est effectuée, ce pour garantir la stabilité de l'application (des topics d'aide sont diponibles afin de passer la certification sans problème)

 

Conclusion

Cette journée nous a permis de voir les différents aspects de l'OS mobile de Microsoft... et à nous faire prendre concience de la jeunesse sur le marché du mobile. D'un point de vue natif, WP7 manque cruellement de fonctionnalités pourtant essentielles et existant depuis longtemps sur les autres plateformes et Microsoft ne réinventera pas la roue en incluant d'une manière native le mulititasking et la mémorisation des données lors des basculements des tâches en arrière plan avec la touche Start. Comme je l'ai également mentionné plus haut, Microsoft s'est un peu Applellisé dans l'âme, autant dans la manière de bloquer une partie de son système d'exploitation

Partager cet article
Repost0