Catégorie : PHP

[Change 3.6.x] Surcharger proprement un fichier .class.php

Dans un projet, j’utilise le module Survey qui sert à générer des formulaires d’enquêtes de satisfaction depuis le backoffice de Change 3.6.x.

Les différents champs de formulaire sont générés via un fichier modules/website/lib/helpers/FormHelper.class.php. Ce fichier ne se surcharge pas comme un template de bloc via override/modules/website/lib/helpers/FormHelper.class.php, mais dans le module du projet.

Convention: Pour ce tutoriel, notre projet s’appelle toto. Voici la liste des fichiers à modifier et des commandes à exécuter pour que les modifications prennent effet:

config/aop.xml

modules/toto/lib/aop/FormHelper.class.php

Copier le fichier source modules/website/lib/helpers/FormHelper.class.php et le coller à l’identique dans modules/toto/lib/aop/FormHelper.class.php, puis modifier la 2ème ligne comme suit:

Vous pourrez ensuite modifier comme bon vous semble ce fichier pour les affichages spécifiques à votre projet.

Les commandes à exécuter

  • cconf ou compile-config
  • ua ou update-autoload

[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] Afficher ou masquer des éléments du DOM en fonction d’une condition avec PHPTal

Doc officielle de PHPTal

alainflou\modules\responsive\lib\helpers\ResponsiveHelper.php

alainflou\themes\responsive\modules\website\templates\Website-Block-Xhtmltemplate-Customer-suggestion.all.all.html

[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.

[PHPTAL] Afficher sous condition un tag qui n’est pas fermé avec tal:omit-tag

Source : PHPTAL Manual – tal:omit-tag.

L’attribut tal:omit-tag, couplé à l’attribut tal:condition="", demande au parseur PHPTAL d’ignorer les tags d’ouverture et de fermeture des éléments. Son contenu enfant, quant à lui, sera toujours évalué. Le tag de fermeture sera automatiquement pris en compte.

Equivalent en PHP

[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 :