Auteur : P.Ghiazza

Comment 1&1 ruine les métiers du web et salit Internet

Vous avez certainement dû voir à la télé, la dernière publicité de 1&1 (hébergeur, vendeur de noms de domaines), sortie il y a environ 2 mois.

Si vous vivez en ermite au fond d’une cave, ou que vous ne regardez simplement pas la télé (et là pour le coup, vous avez bien raison), la voici :

L’offre est alléchante : 1&1 vous propose un outil permettant de créer votre site en quelques clics, grâce à leur nouvel outil baptisé « My Website ».

Pour celui qui ne connait rien, ou très peu de choses au monde d’Internet et à la création de sites web, ce tarif est extrêmement attractif, à l’heure où un site web statique de quelques pages vaut 1000 € en moyenne.

En effet, voici les tarifs de l’offre de la société allemande :

Pour un peu moins de 60 € la première année (puis 120 €), vous avez un site internet avec votre propre nom de domaine. L’offre parait exceptionnelle, et comme toute offre de ce type, elle n’inspire rien de bon.

 

Pourquoi ne pas se lancer immédiatement ?

En effet, entre 120 € par an et un coût fixe de 1000 € minimum, le choix est vite fait. Mais peu se posent la question de ce qui repose derrière ce gouffre tarifaire.

Premièrement, l’offre à 10 € par an ne propose absolument aucun outil de référencement. Or, c’est bien beau d’avoir un site, mais encore faut-il avoir des visiteurs, et une chose est sûre, vous n’en trouverez aucun si vous apparaissez à la 130ème page de Google sur vos mots-clés principaux. 1&1, malin, essaie alors de combler la brèche en proposant des packs plus chers qui incluent le référencement de votre site. Mais si tout comme moi vous comprenez la notion de référencement, vous savez que cette offre est absurde.

Il est évident que 1&1 ne va pas aller faire du référencement naturel  (annuaires, articles dédiés, échange de liens) alors qu’il n’est même pas capable de proposer un outil qui réponde aux normes de validité d’un site internet.

Pour prouver ces dires, j’ai déniché un site internet fait avec cet outil, qui se veut vitrine du produit proposé par le groupe Allemand : http://mywebsitefacile.fr.

Vous pouvez ici tester sa validité (18 erreurs de validation à l’heure où j’écris, avec de surcroît, l’un des DOCTYPE les plus simples à satisfaire). Il est d’ailleurs important de noter qu’un site disposant de beaucoup d’erreurs de validation, a tendance à être repoussé par Google…

Alors posez-vous les bonnes questions : Pourquoi voulez-vous un site web ? Vous voulez un site pour disposer d’une présence sur internet, pour faire connaître votre entreprise et donc finalement, augmenter votre chiffre d’affaires et/ou votre notoriété.

Et bien une chose est sûre, c’est qu’avec le service que propose 1&1, cela n’arrivera pas pour les raisons évoquées ci-dessus (absence de référencement, erreurs de validation).

Enfin, si vous êtes allé jeter un œil sur le site évoqué plus haut, pour rappel http://mywebsitefacile.fr, vous avez du vous rendre compte qu’il est tout simplement hideux, partiellement traduit en français (dans la zone des commentaires par exemple, le texte est en anglais) et franchement ; n’avez-vous pas eu l’impression d’avoir remonté le temps jusqu’aux années 2000 ? Qui, à l’heure actuelle, peut encore proposer ce genre de choses ?

D’horribles souvenirs de WordArt me reviennent en mémoire…

 

C’est tout-de même un bon compromis financier, non ?

Oui mais non. Comme je vous le disais plus haut, avec 1&1, tout ce que vous aurez, c’est un site inconnu, inesthétique et mal conçu. La différence de tarif entre un site MyWebsite et un site développé de manière unique par un développeur compétent est certes énorme, mais au moins, vous ne jetterez pas votre argent par les fenêtres. Cet outil peut se comparer à la cigarette : c’est très cher et ne vous apporte absolument rien, si ce n’est le plaisir d’en avoir.

Pour résumer, je vous déconseille fortement de créer votre site internet grâce à cet outil, cela équivaudrait à tondre votre pelouse avec un rasoir BIC.

 

[PHP] Modifier une chaîne de caractères sur tout un serveur de BDD

Nous sommes en 2017 et ce script est dépassé (bien que toujours fonctionnel). Utilisez maintenant mysqli ou PDO, ou bien l’excellent outil clé en main Search Replace DB de Interconnecit.

Il y a quelques temps, ma société à complètement revu l’adressage IP du réseau.

J’ai donc rencontré des soucis avec tous mes sites WordPress et Prestashop, qui stockent l’URL dans la base de données.

Voici donc un petit script PHP/MySQL qui va modifier dans chaque table de chaque base une chaîne de caractères.

Il s’agit d’un script sans messages d’erreurs et non commenté, mais cela ne pose pas vraiment de soucis car il est directement exécutable : changez simplement les données en constantes (« define »).

Je vous suggère vivement de conserver la connexion, certes obsolète, avec mysql_connect au cas où vous avez des base de données en mysql simple (avec mysqli_connect, celles-ci ne seront pas prises en compte).

 

define('_DB_HOST_', 'localhost');
define('_DB_USER_', 'root');
define('_DB_PASS_', '');
define('_OLD_IP_', '192.168.200.155');
define('_NEW_IP_', '172.16.200.155');

$connect = mysql_connect(_DB_HOST_, _DB_USER_, _DB_PASS_);

$databases =  mysql_query("SHOW databases");
while($database = mysql_fetch_object($databases)) {
	mysql_select_db($database->Database, $connect);
	$tables = mysql_query("SHOW tables");
	if(mysql_num_rows($tables) > 0) {
		while($table = mysql_fetch_object($tables)) {
			$fieldName = 'Tables_in_'.$database->Database;
			$tableName = $table->$fieldName;
			$columns = mysql_query("SHOW columns FROM ".$tableName);
			if(mysql_num_rows($columns) > 0) {
				while($column = mysql_fetch_object($columns)) {
				    $fields = mysql_query("UPDATE ".$tableName." SET ".$column->Field." = REPLACE(".$column->Field.", '"._OLD_IP_."', '"._NEW_IP_."')");
					if(mysql_affected_rows() > 0) {
						echo '<p>Modification dans '.$database->Database.' » '.$tableName.' » '. $column->Field.'</p>';
					}
				}
			}
		}
	}
}

 

Vous pouvez bien sûr adapter le script à une seule base de données par exemple, en créant l’objet $database avec vos données et en supprimant le « while » associé.

 

[Prestashop 1.5+ | 1.6+] Ajouter un champ pour les catégories et activer l’éditeur

Pour faire suite à l’article précédent « Ajouter un champ zone de texte (textarea) sur la page produit de Prestashop« , voici maintenant la solution (cette fois-ci trouvée par mes soins) pour :

  • Ajouter un nouveau champ (dans cet exemple texte) pour les catégories
  • Activer l’éditeur de texte TinyMCE sur les textareas (zones de texte).

Pour cet exemple, j’ai souhaité ajouter un deuxième champ de description qu’on appellera ici description_2.

 

NOTE : Ce tuto fonctionne pour tous les autres contenus (sauf produits) : pages CMS, magasins, etc. Ils vous suffit d’adapter les classes et controllers à modifier.

 

I ) Modification de la base de données

Pour commencer, connectez-vous à votre base de données et rendez-vous dans la table _PREFIX_category_lang.

Ajoutez un champ « description_2 » de type « Text ».

 

II ) Modification de la classe Category

Rendez-vous dans /override/classes/Category.php et collez-y ce code :

public $description_2;

public static $definition = array(
	'table' => 'category',
	'primary' => 'id_category',
	'multilang' => true,
	'multilang_shop' => true,
	'fields' => array(			
		'nleft' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'nright' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'level_depth' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true),
		'id_parent' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'id_shop_default' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
		'is_root_category' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
		'position' => array('type' => self::TYPE_INT),
		'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
		'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),

		// Lang fields
		'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 64),
		'link_rewrite' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 64),
		'description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
		'description_2' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
		'meta_title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
		'meta_description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
		'meta_keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
	),
);

 

III ) Modification du controlleur administrateur AdminCategoriesController

Copiez les fonctions __construct(), getDescriptionClean() et renderForm() du fichier /controllers/admin/AdminCategoriesController.php.

Les coller dans : /override/controllers/admin/AdminCategoriesController.php.

 

Important : Modifiez la ligne parent::_construct() de la fonction __construct par AdminController::__construct();

 

Nous allons maintenant apporter les modifications nécessaires sur le modèle du champ « Description ».

 

Fonction __construct();

Copiez l’array « Description » (lignes 31 à 37 environ) et coller juste au dessous, en remplaçant tout par description_2:

'description' => array(
	'title' => $this->l('Description'),
	'width' => 500,
	'maxlength' => 90,
	'callback' => 'getDescriptionClean',
	'orderby' => false
),
'description_2' => array(
	'title' => $this->l('Description 2'),
	'width' => 500,
	'maxlength' => 90,
	'callback' => 'getDescription2Clean',
	'orderby' => false
),

 

Fonction getDescriptionClean()

Modifiez cette fonction comme suit :

public static function getDescription2Clean($description)
{
	return strip_tags(stripslashes($description));
}

 

Fonction renderForm()

Localisez le code suivant dans cette fonction :

array(
	'type' => 'textarea',
	'label' => $this->l('Description:'),
	'name' => 'description',
	'lang' => true,
	'rows' => 10,
	'cols' => 100,
	'hint' => $this->l('Invalid characters:').' 
),

Dupliquez-le juste au dessous et remplacez tout les « description » par description_2.

array(

	'type' => 'textarea',
	'label' => $this->l('Description 2:'),
	'name' => 'description_2',
	'lang' => true,
        'autoload_rte' => true,  
	'rows' => 10,
	'cols' => 100,
	'hint' => $this->l('Invalid characters:').' 
),

 

Afin d’activer l’affichage de l’éditeur de texte riche TinyMCE sur ces pages, rajoutez aux champs description et description_2 (toujours dans la fonction renderForm), la ligne suivante :

'autoload_rte' => true,

 

Depuis la version 1.5.5, il faut remplacer la dernière ligne de la fonction (return parent::renderForm();) par return AdminController::renderForm();.

Merci à Kaby et Guillaume qui ont trouvés la solution.

 

IV) Appel dans le template

Pour finir, appelez simplement ce nouveau champ dans /themes/votre_theme/category.tpl comme suit et à l’endroit souhaité :

{$category->description_2}

Voilà, votre nouveau champ texte est créé ! N’hésitez pas à laissez un commentaire ci-dessous si vous rencontrez un problème.

[Prestashop 1.5+ | 1.6+] Ajouter un champ zone de texte (textarea) produit

Voici aujourd’hui une solution pour ajouter un champ de type « textarea » dans la gestion des produits sur Prestashop 1.5+.

Cette technique fonctionne à partir de la version 1.5.3 de Prestashop. Pour les versions 1.4.x, consultez ce tutoriel : Ajouter un champ avec éditeur sur la page produit de Prestashop 1.4.x

Ce tuto est fonctionnel pour les versions 1.5 et 1.6.

Voici donc comment nous allons pouvoir rajouter un champ « Points Forts » sur les fiches produit.

 

I ) Ajout du champ dans la base de données

Rendez-vous dans votre base de données et ajoutez un champ « pointsforts » de type « Text » dans la table PREFIX_product_lang.

 

II ) Modification de la classe Product

Versions 1.5.3.x : Rendez-vous dans /override/classes/Product.php. Ajoutez-y les lignes suivantes :

public $pointsforts;

public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
{
  Product::$definition['fields']['pointsforts'] = array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString');
  parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
}

 

Versions 1.5.4+ : Si vous avez une version de Prestashop supérieure ou égale à celle-ci, vous devez créer le fichier d’override « Product.php » dans /override/classes/. Son contenu doit ressembler à cela dans le cas présent :

<?php

class Product extends ProductCore
{
	public $pointsforts;

	public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
	{
	  Product::$definition['fields']['pointsforts'] = array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString');
	  parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
	}

}

 

III ) Modifier la vue backoffice

Rendez-vous dans admin/themes/default/template/controllers/products/informations.tpl et copiez ce fichier.

Collez-le ensuite dans /override/controllers/admin/templates/products/informations.tpl

En s’inspirant de la ligne 290, collez le code suivant, qui va créer le champ texte :

<tr>
	<td class="col-left">
		{include file="controllers/products/multishop/checkbox.tpl" field="pointsforts" type="tinymce" multilang="true"}
		<label>{$bullet_common_field} {l s='Points forts :'}<br /></label>
		<p class="product_description">({l s='Les points forts du produit'})</p>
	</td>
	<td style="padding-bottom:5px;">
		{include file="controllers/products/textarea_lang.tpl" languages=$languages
			input_name='pointsforts'
			input_value=$product->pointsforts
		}
		<p class="clear"></p>
	</td>
</tr>

 

IV ) Affichage en front-office

Il ne vous reste plus qu’à afficher ce champ en front-office. Pour ce faire, modifiez le fichier /themes/votre_theme/product.tpl et ajoutez ce qui suit à l’endroit que vous souhaitez :

{$product->pointsforts}

Si vous souhaitez afficher la valeur de votre nouveau champ sur la page des catégories, rendez-vous dans /classes/Category.php et copiez la fonction getProducts() (ligne 742 approximativement).

Collez cette fonction dans le fichier /override/classes/Category.php (à créer s’il n’existe pas), et modifiez-y la requête ($sql) , en rajoutant pl.pointsforts dans le SELECT.

 

Çà ne fonctionne pas ?

Solution 1

En cas de problème, vérifiez que la compilation est bien désactivée.

Pour cela, rendez-vous dans Paramètres avancés > Performances et modifiez les options suivantes :

  • Cache des templates : Forcer la compilation à chaque appel
  • Cache : Non (X)
  • Pour les versions 1.5.6, cliquez aussi sur le bouton « Effacer le cache de Smarty et le cache de l’Autoload ».

Une fois cela fait, réessayez. Cela devra fonctionner.

Si tout est bon, pensez cependant à re-modifier ces informations et de les remettre sur :

  • Cache des templates : Ne jamais recompiler les fichiers de templates
  • Cache : Oui

Sans quoi, votre site va se mettre à ramer horriblement.

 

Solution 2

De plus, si vous venez de créer les fichiers overridés spécifiquement pour ce tuto, il est impératif de vider le cacher de l’autoload.

Pour ce faire, vous pouvez :

  • supprimer le fichier class_index.php dans le dossier /cache
  • en 1.5.5+, aller dans Préférences > Performances et en cliquant sur « Vider le cache » dans la toolbar

Si vous rencontrez toujours un problème, n’hésitez pas à laisser un commentaire ci-dessous.