Étiquette : php

[Magento 2] Depuis un template PHTML, détecter si la page sur laquelle nous nous trouvons est la homepage, une page produit, une page catégorie

Source: How to check IsHomePage in Magento 2? Are we on the homepage?

[Magento 2] PHP dans les fichiers PHTML

Les conventions utilisées dans les templates PHP (PHTML) de Magento 2

  • $this no longer applies to the rendering block. Use $block or $block>getData('view_model') to obtain access to the instigating object or its data.
  • Always type hint variables that are automatically imported ($block, $viewModel).
  • Never use squiggly braces: this is a code smell that indicates your block or view model should be doing more work.
  • If you need to use a loop, use the foreach > endforeach constructs (de cette manière: <?php foreach () : ?> puis <?php endforeach ?>).
  • Keep templates to a reasonable minimum. Massive 500 line files are a code smell.
  • Magento now uses <?= instead of <?php echo.
  • Always translate strings in templates that will be displayed to user.
  • Magento templates do not use the if(){ /* … */ } constructs because squiggly braces are harder to discern amongst HTML. A la place, utiliser <?php if (): ?> suivi de <?php else: ?> ou directement de <?php endif; ?>.

Les méthodes communément disponibles pour la variable $block

  • getRootDirectory()
  • getMediaDirectory()
  • getUrl()
  • getBaseUrl()
  • getChildBlock($alias)
  • getChildHtml($alias, $useCache = true)
  • getChildChildHtml($alias, $childChildAlias = '', $useCache = true): this method returns the HTML from a grandchild block.
  • getChildData($alias, $key = ''): calls getData on a child block.
  • formatDate($date = null, $format = \ IntlDateFormatter::SHORT, $showTime = false, $timezone = null)
  • formatTime($time = null, $format = \ IntlDateFormatter::SHORT, $showDate = false)
  • getModuleName()
  • escapeHtml($data, $allowedTags = null)
  • escapeJs($string)
  • escapeHtmlAttr($string, $escapeSingleQuote = true)
  • escapeCss($string)
  • stripTags($data, $allowableTags = null, $allowHtmlEntries = false)
  • escapeUrl($string)
  • getVar($name, $module = null): locates a value from the theme’s etc/view.xml

Comment afficher un child block?

Comment afficher tous les child block?

Afficher un argument défini via un layout XML

Source: Magento 2: Adding Frontend Assets via Layout XML (Alan Storm)

La valeur de test_value sera disponible via $block->getData('test_value') ou $block->getTestValue().

Rendu sécurisé des templates, contenus HTML / JS et Urls

  • HTML: $block->escapeHtml(‘value’, $allowedTags);
  • HTML attributes: $block->escapeHtmlAttr(‘value’, $escapeSingleQuote);
  • JavaScript: $block->escapeJs(‘value’);
  • URLs: $block->escapeUrl($url);

Si la condition d’un booléen est true, afficher quelque chose…

Nous avons créé un attribut produit custom que nous avons nommé best_offer. Il s’agit d’un booléen. Nous allons commencer par stocker sa valeur dans une variable $bestOffer:

Puis, lorsque nous avons besoin d’afficher quelque chose de spécifique si la valeur de la variable $bestOffer est true (attribut configuré à oui en back-office):

Fonction PHP de gestion des variables empty()

Source: Fonctions de gestion des variables: empty().

Nous avons créé un attribut produit custom que nous avons nommé offer_content. Il s’agit d’un champ texte. Nous allons commencer par stocker sa valeur dans une variable $offerContent:

Puis, si la variable ne vaut pas 0, n’est pas vide, est définie, afficher sa valeur:

Utitiser la fonction PHP strst() pour supprimer une partie d’une chaîne de caractères jusqu’à un caractère spécifié

Ici, pour la chaîne de caractère toto-titi, je veux conserver -titi uniquement:

Utitiser la fonction PHP str_replace() pour supprimer un caractère spécifié

Ici, pour la chaîne de caractère -titi, je veux retirer le caractère - pour conserver titi uniquement:

[Magento 2] Surcharge d’une classe PHP située dans app/code/Vendor/Module/Model/Config/Source via un namespace spécifique

La classe Width que nous souhaitons surcharger dans notre exemple définie dans le fichier app/code/MGS/ThemeSettings/Model/Config/Source/Width.php du thème payant Supro. Mais l’exemple est tout-à-fait adaptable à des classes du core code de Magento 2 ou d’autres thèmes open-source.

1. Création d’un nouveau module qui contiendra notre surcharge de classe:

2. Modification du fichier app/code/Sodifrance/Pdv/etc/module.xml comme ci-dessous.

Note: le tag sequence déclare que notre nouveau module dépend du module Supro_ThemeSettings.

3. Petit upgrade de setup en ligne de commande:

4. Modification du fichier app/code/Sodifrance/Pdv/etc/di.xml comme ci-dessous.

Ici, nous procédons à une injection de dépendances: on veut utiliser, à la place de la classe MGS\ThemeSettings\Model\Config\Source\Width, une nouvelle classe Sodifrance\Pdv\Model\Config\Source\Width.

5. Créer le dossier Model/Config/Source dans app/code/Sodifrance/Pdv.

6. Créer le fichier app/code/Sodifrance/Pdv/Model/Config/Source/Width.php sur les bases du parent app/code/MGS/ThemeSettings/Model/Config/Source/Width.php.

On va se contenter de ne rendre disponible que la valeur 1200px pour les choix de largeur de page depuis l’interface d’admin.

7. On vérifie que le nouveau module Sodifrance_Pdv est bien activé:

7b. On l’active si il est présent dans la liste des modules désactivés:

8. On compile le setup:

Résultat: depuis l’interface d’admin, dans MGS > [MGS Theme] Theme Setting v1.1.0, accodéron « Général », champ « Largeur ». Le seul choix disponible reste « 1200px ».

Il faut tout-de-même enregistrer la configuration pour que les changements soient pris en compte.

[PHP] Les fondamentaux pour développeurs front-end

Data structures

Variables

  • Prefixed by $
  • Alphanumeric characters and _

Arrays

  • Lists that map values to keys
  • Vector array: simple list of values
    array('stingray', 'telescope');
    array(0, 1);
  • Hashtable array: associative list
    array('red' => 'cherries, 'green' => 'apple');

Si nous voulons afficher le 1er élément de notre tableau :

…nous affichera « stingray ».

…nous affichera « apple ».

ou:

ou:

…nous afficheront tous « Bonjour le monde! ».

Fonction print_r() pour afficher l’ensemble des valeurs contenues dans un tableau Array

…nous affichera Array ( [0] => tab1 [1] => tab2 )

Objects

  • Properties
  • Methods

Object properties

drupal7-object_properties

…nous affichera « blog/1 ».

Les constantes

Les constantes sont des valeurs qui, une fois qu’elles ont été définies dans le code, ne peuvent plus être modifiées. C’est intéressant pour définir des accès à une BDD ou les infos sont les mêmes sur toutes les pages.

…nous affichera « I like PHP. ».

Si on essaye de redéfinir la valeur de la constante:

…on obtient une erreur ( ! ) Parse error: syntax error, unexpected ‘=’ in C:\wamp64\www\test\index.php on line 10
car une constante ne peut pas être redéfinie.

Les opérateurs

L’opérateur de concaténation

L’opérateur point ..

ou:

On obtient : hello world<br />Bonjour le monde. A noter: l’utilisation de guillemets "" par rapport aux simples quotes '' permet une interprétation des variables sans concaténation.

On obtient : « 12 ».

On ne peut pas afficher un echo d’un tableau. Pour cela, il faut utiliser print_r.

…nous affiche : « Array ( [0] => 1 [1] => 2 ) Array ( [0] => 3 [1] => 4 ) ».

Les opérateurs arithmétiques

Vont permettre d’effectuer des calculs sur les valeurs de différentes variables. Ils sont au nombre de 5 :

  • +
  • *
  • /
  • %

On obtient : « 1 ». La représentation de toto en valeur numérique est « 0 ».

On obtient : « 1 ».

On obtient : « 7 ».

On obtient : « 7 ».

var_dump()

Renvoie une type de variable et son contenu.

On obtient :

C:\wamp64\www\test\index.php:6:
array (size=3)
0 => int 1
1 => int 2
2 => int 5

On a conservé les valeurs de rang définies dans le premier tableau et on a ajouté la nouvelle valeur de rang définie dans le second tableau.

C:\wamp64\www\test\index.php:6:
array (size=3)
0 => int 3
1 => int 4
2 => int 5

On obtient le tableau d’origine puisqu’il n’y a aucune valeur à compléter dans le deuxième tableau.

Les opérateurs d’affectation

vont permettre d’affecter une valeu à une variable ou de redéfinir la valeur d’une variable.

ou:

va afficher : « 1 / 2 ».

va afficher : « 1 / 11 ».

va afficher : « 1 / 1toto ».

Post-incrémentation et pré-incrémentation

Incrémentation/décrémentation d’une unité est très utilisé en PHP, en particulier pour la gestion des boucles.

Post-incrémentation

va afficher : « 1 / 2 ».

Pré-incrémentation)

va générer : « 2
2″.

Les opérateurs de comparaison et les conditions

On obtient : « a est égal à b ».

On obtient aussi : « a est égal à b ». PHP va essayer de rendre les types compatibles et de faire la comparaison sur des types compatibles.

On obtient aussi : « a est égal à b » car pour PHP, ‘toto’ est égal à 0.

Comparer non seulement la valeur des variables mais aussi leurs types

Rajouter un troisième signe = :

On obtient : « a est différent de b ».

On obtient : « a est différent de b ».

on obtient : « a est inférieur à b ».

On obtient: « a est supérieur ou égal à b ».

on obtient: « a est différent de b ».

La non égalité avec !=

Tester la non égalité sans prendre en compte le type :

nous donne: « a est égal à b »

Tester la non égalité en prenant en compte le type. On rajoute un caractère = :

nous donne: « a est différent de b »

Comparer des nombres décimaux avec la fonction bccomp()

nous donne: « a est égal b ».

nous donne: « a et b sont différents ».

nous donne: « a est égal b ».

Les opérateurs logiques ou booléens

Un booléen est un type particulier en informatique, dont la valeur ne peut être que vrai ou faux.

nous affiche: « Je pense que Dieu existe ».

nous affiche: « Je pense que Dieu n’existe pas ».

L’opérateur de comparaison et (&& et and)

nous affiche: « Condition non vérifiée ».

nous affiche: « Condition vérifiée ».

nous affiche: « Condition non vérifiée ». Pour que une expression et une autre soient vérifiées, il faut que les deux expressions aient un équivalent booléen égal à vrai.

nous affiche: « Condition vérifiée », puisque l’équivalent d’une chaîne de caractères non vide est vrai et que l’équivalent booléen d’un nombre non nul est vrai.

nous affiche: « Condition non vérifiée », puisque l’équivalent booléen d’un nombre nul est false.

nous affiche: « Condition vérifiée ».

Attention: && et and ne donnent pas toujours les mêmes résultats:

on obtient: « Condition non vérifiée ».

on obtient: « Condition vérifiée ».

Le and correspondrait à une notation ($c = $a) and $b.

Le &&& correspondrait à une notation $c = ($a && $b).

L’opérateur de comparaison ou (|| et or)

Attention au cas particulier xor qui est une expression exclusive : il faut uniquement que l’un des booléens soit vrai.

On obtient: « Condition vérifiée ».

L’opérateur de négation (!)

Va renvoyer l’inverse de la valeur donné (not false va donner true).

Va donner: « Condition vérifiée ».

Conditionals

if/else

on obtient: « a est égal à b ».

Variations on a theme: « colon » notation

drupal7-colon_notation

Si la valeur de $a est égale à la valeur de $b, afficher la mention « It’s equal »; autrement, ne rien imprimer.

L’intérêt de cette syntaxe réside dans le fait qu’on peut y insérer du markup HTML.

Switch statement

Multiple statements could match. That’s why we use break;.

Loops

While

Commence à 0. Va looper jusqu’à atteindre 10, puis s’arrêtera. « She loves you » sera affiché 10 fois de suite.

for

Pareil que while. Commence à 0. Va looper jusqu’à atteindre 10, puis s’arrêtera. « She loves you » sera affiché 10 fois de suite.

foreach

…nous affichera :

stingraytelescope

…nous affichera :

stingray
telescope

Functions

  • Encapsulate frequently repeated tasks
  • Accept parameters as input ($a et $b dans notre exemple)
  • Give a return value as output ($c)

…nous affiche « 10 ».

…nous affiche « 4 ».

Pass parameters by reference

Un « & » avant le paramètre « $a »:

…nous affiche toujours « 10 ».

…nous affiche « 5 ».

Précisions sur l’affichage des chaînes de caractères

Utiliser des anti-slashes \ pour que les double-quotes (guillemets) " soient interprêtées correctement côté client:

ou:

…nous afficheront « La langue affichée est stockée dans la variable $affiche ».

…nous afficheront « La langue affichée est stockée dans la variable fr » (ou fr est la valeur stockée dans la variable $affiche.

Syntaxe rdoc

A noter:

  • on utilise EOT dans notre exemple, mais on peut mettre n’importe quoi d’autre pourvu que la chaîne de caractères ouvrante et fermante correspondent
  • j’ai l’impression que cette méthode ne fonctionne pas si le contenu rdocké se trouve imbriqué dans le même bout de code PHP (<?php ... ?>).

[RBS Change 3.x] Effectuer une boucle tal:repeat qui rapporte l’ensemble des informations contenues dans une fonction

\\change30\alainflou\modules\project\persistentdocument\frame.class.php

\\change30\alainflou\themes\responsive\modules\project\templates\Project-Block-ProductItem-List.all.all.html


Récupérer une propriété contenue dans un objet

Dans Change, chaque module a un dossier persistentdocument/. Ce dossier contient un ou plusieurs fichiers XML listant un ensemble de propriétés contenues dans un objet.

Par exemple, dans /modules/parking/persistentdocument/parking.xml, sont listées toutes les propriétés de l’objet parking :

Si, dans mon template de bloc, je souhaite récupérer l’information de nom de l’objet parking, je procède comme suit :

[RBS Change 3.x] Utiliser var_dump pour récupérer en front l’ensemble des informations qu’un bloc est capable d’afficher

Tout au long de ce tuto, nous allons assumer que nous travaillons sur un bloc nommé Pushoffre appartenant à un module nommé responsive du projet nommé alainflou.

Pour commencer, nous allons localiser le bloc Pushoffre dans alainflou\modules\responsive\lib\blocks\BlockPushoffreAction.class.php. Une fois ouvert dans un éditeur, localiser la ligne $request->setAttribute('pushoffre', $this->getDocumentParameter()); et, juste en-dessous, placer notre var_dump var_dump($this->getDocumentParameter());.

Rendez-vous dans votre navigateur préféré et chargez une page qui contient le bloc Pushoffre. Le var_dump a normalement pour effet d’afficher tout un tas d’informations de ce type :

object(responsive_persistentdocument_pushoffre)#213 (27) { ["m_author":"responsive_persistentdocument_pushoffrebase":private]=> string(8) "wwwadmin" ["m_authorid":"responsive_persistentdocument_pushoffrebase":private]=> int(45063) ["m_creationdate":"responsive_persistentdocument_pushoffrebase":private]=> string(19) "2016-08-16 14:41:47" ["m_modificationdate":"responsive_persistentdocument_pushoffrebase":private]=> string(19) "2016-08-16 14:41:47" ...

Nous allons maintenant tenter d’afficher proprement en front certaines informations contenues dans ce bloc (libellé du bloc, cible d’une image associée à ce bloc, texte de contenu de ce bloc, et URL du lien associé au texte de ce bloc). Les informations affichées via le var_dump qui nous intéressent sont :

  • ["m_label":"responsive_persistentdocument_pushoffreI18n":private]=> string(29) "ezrr dffvds sdgrezgzthrytht r"
  • ["m_media":"responsive_persistentdocument_pushoffrebase":private]=> int(1370814)
  • ["m_text":"responsive_persistentdocument_pushoffreI18n":private]=> string(24) "ez grehggbhn-zrnggngn nn" } }
  • ["m_textLink":"responsive_persistentdocument_pushoffrebase":private]=> string(20) "http://www.google.fr"

Pour ce faire, localiser le template alainflou\modules\responsive\templates\Responsive-Block-Pushoffre-Success.all.all.html.

La manière de réexploiter les données du var_dump dans un tmplate de bloc est la suivante :

  • <h1>${pushoffre/getLabel}</h1>
  • <img class="one-offre-image" change:media="document pushoffre/getMedia; format 'modules.catalog.frontoffice/medium'" />
  • <p class="one-offre-text">${pushoffre/getText}</p>
  • <a class="link" href="${pushoffre/getTextLink}"></a>

Autre façon de récupérer et d’afficher des informations contenues dans une fonction :

\\change30\alainflou\modules\project\persistentdocument\framedeclination.class.php

\\change30\alainflou\modules\responsive\templates\Responsive-Block-MetricBox-Success.all.all.html

[PHP] Les opérateurs de comparaison et les opérateurs logiques

Source : Manuel PHP : Opérateurs de comparaison et Manuel PHP : Les opérateurs logiques.

Faire (stores) c’est le raccourci de (stores == true) et faire (!stores) c’est le raccourci de (stores != true) ou (stores == false).

Si stores répond true OU noSearch répond true, tu auras no-background. Donc si stores répond false et noSearch répond true, tu auras no-background. Il suffit que l’un des deux réponde true.

En gros, quand tu mets le ! ça veut dire contraire, donc si tu mets !false ça fera true et le premier argument après le ? est exécuté si ce qu’il y a dans les parenthèses vaut true.

[Magento] Récupérer et afficher les propriétés d’un objet (d’un produit, par exemple)

Récupérer et afficher les propriétés d’un objet (ici l’objet $currentproduct qui est un produit) :

Afficher le libellé et l’ID de l’objet $currentproduct :

[Magento] Afficher l’ensemble des propriétés d’un objet

Exemple : l’objet $item est appelé dans le template summary.phtml.
Ce tableau stocke et permet d’afficher tout un ensemble d’informations sur un produit ajouté au panier.

Pour afficher les propriétés de l’objet $item :

Résultat en front :

Array
(
[item_id] => 70
[quote_id] => 51
[created_at] => 2015-01-30 09:08:42
[updated_at] => 2015-01-30 09:08:42
[product_id] => 2
[store_id] => 1
[parent_item_id] =>
[is_virtual] => 0
[sku] => test_b_produit
[name] => testB
[description] =>
[applied_rule_ids] =>
[additional_data] =>
[free_shipping] =>
[is_qty_decimal] => 0
[no_discount] => 0
[weight] => 10.0000
[qty] => 1
[price] => 8
[base_price] => 8
[custom_price] =>
[discount_percent] => 0
[discount_amount] => 0
[base_discount_amount] => 0
[tax_percent] => 0
[tax_amount] => 0
[base_tax_amount] => 0
[row_total] => 8
[base_row_total] => 8
[row_total_with_discount] => 0.0000
[row_weight] => 10
[product_type] => simple
[base_tax_before_discount] =>
[tax_before_discount] =>
[original_custom_price] =>
[redirect_url] =>
[base_cost] =>
[price_incl_tax] => 8
[base_price_incl_tax] => 8
[row_total_incl_tax] => 8
[base_row_total_incl_tax] => 8
[hidden_tax_amount] => 0
[base_hidden_tax_amount] => 0
[gift_message_id] =>
[weee_tax_disposition] => 0
[weee_tax_row_disposition] => 0
[base_weee_tax_disposition] => 0
[base_weee_tax_row_disposition] => 0
[weee_tax_applied] => a:0:{}
[weee_tax_applied_amount] => 0
[weee_tax_applied_row_amount] => 0
[base_weee_tax_applied_amount] => 0
[base_weee_tax_applied_row_amnt] =>
[stock_id] => 1
[image_url] =>
[image] => /c/h/charlotte-pirroni-miss-cote-dazur.jpg
[qty_options] => Array
(
)

[product] => Array
(
[entity_id] => 2
[entity_type_id] => 4
[attribute_set_id] => 4
[type_id] => simple
[sku] => test_b_produit
[has_options] => 0
[required_options] => 0
[created_at] => 2014-11-24 13:36:52
[updated_at] => 2014-12-10 15:07:46
[name] => testB
[image] => /c/h/charlotte-pirroni-miss-cote-dazur.jpg
[small_image] => /c/h/charlotte-pirroni-miss-cote-dazur.jpg
[thumbnail] => /c/h/charlotte-pirroni-miss-cote-dazur.jpg
[url_key] => testb
[url_path] => testb.html
[msrp_enabled] => 2
[msrp_display_actual_price_type] => 4
[gift_message_available] =>
[status] => 1
[visibility] => 4
[tax_class_id] => 0
[is_recurring] => 0
[weight] => 10.0000
[price] => 8.0000
[special_price] =>
[msrp] =>
[special_from_date] =>
[special_to_date] =>
[batch_prices] => Array
(
)

[website_batch_prices] => Array
(
)

[initial_price] => 8.0000
[final_price] =>
[batch_special_prices] => Array
(
)

[website_batch_special_prices] => Array
(
)

[initial_special_price] =>
[is_salable] => 1
[stock_item] => Array
(
[item_id] => 2
[product_id] => 2
[stock_id] => 1
[qty] => 19.0000
[min_qty] => 0.0000
[use_config_min_qty] => 1
[is_qty_decimal] => 0
[backorders] => 0
[use_config_backorders] => 1
[min_sale_qty] => 1.0000
[use_config_min_sale_qty] => 1
[max_sale_qty] => 0.0000
[use_config_max_sale_qty] => 1
[is_in_stock] => 1
[low_stock_date] =>
[notify_stock_qty] =>
[use_config_notify_stock_qty] => 1
[manage_stock] => 0
[use_config_manage_stock] => 1
[stock_status_changed_auto] => 0
[use_config_qty_increments] => 1
[qty_increments] => 0.0000
[use_config_enable_qty_inc] => 1
[enable_qty_increments] => 0
[is_decimal_divided] => 0
[type_id] => simple
[stock_status_changed_automatically] => 0
[use_config_enable_qty_increments] => 1
[product_name] => testB
[store_id] => 1
[product_type_id] => simple
[product_status_changed] => 1
[product_changed_websites] =>
[ordered_items] => 1
)

[stock_tax_class_ids] => Array
(
)

[do_not_use_category_id] => 1
[request_path] => testb.html
[tier_prices] => Array
(
)

[tier_price] => Array
(
)

[is_in_stock] => 1
[store_id] => 1
[customer_group_id] => 0
[group_price] => Array
(
)

[group_price_changed] => 0
)

[tax_class_id] => 0
[is_recurring] => 0
[has_error] =>
[calculation_price] => 8
[original_price] => 8
[is_nominal] =>
[base_calculation_price] => 8
[converted_price] => 8
[base_original_price] => 8
[taxable_amount] => 8
[base_taxable_amount] => 8
[is_price_incl_tax] =>
[base_weee_tax_applied_row_amount] => 0
[discount_tax_compensation] => 0
)

Admettons qu’on souhaite afficher la propriété [sku] de l’objet $item :

Admettons qu’on souhaite afficher la propriété [created_at] de l’objet $item :

Autre méthode possible :