Total : 90 résultats trouvés.
Page 4 sur 5
Certains utilisateurs d'iOS 9 ont pu voir leur consommation de données s'envoler, c'est dû à la nouvelle fonction WiFi Assist activée par défaut, qui pourrait fortement impacter vos factures de téléphone !
Pour désactiver cette fonction, il suffit d'aller dans Réglages --> Données cellulaires et désactiver l'Assistance Wi-Fi tout en bas.
Une simple mise à jour xCode peut parfois donner de belles sueurs froides au démarrage de notre chère application ! Pas de panique (si possible) la solution peut-être très simple aussi. L'application en question s'est présentée comme une page blanche au démarrage, pas de publicité interstitielle, pas de contenu, juste l'UINavigationBar.. Il faut dire que l'application repose sur un service web, une base de données qui contient tout.
Sur une application j'ai eu droit à :
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist
Et sur une autre :
HTTP FAILED with error : Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection."
La solution est toute simple, il faut aller dans le fichier info.plist et ajouter une ligne Dictionary nommée NSAppTransportSecurity avec une autre ligne nommée Boolean NSAllowsArbitraryLoads avec la valeur YES.
Suite à un petit piratage de formulaire de contact, j'ai eu un gros souci de serveur qui était fortement ralenti, et qui n'allait pas tarder à se voir blacklisté pour spam. La gestion de ce serveur CentOS se faisait via Plesk, et l'accès de la mail queue était très instable voire impossible. Il a fallu utiliser une solution radicale, tout vider avec ligne de commande ssh.
En se connectant avec Terminal au serveur, il faut alors taper la ligne de commande :
#/etc/init.d/qmail stop && cd /var/qmail/queue && find intd todo local remote mess info bounce -type f -print |xargs rm && /etc/init.d/qmail start
On stoppe le service, on vide les message, et on redémarre le service.
Rich Snippets va vous aider à optimiser votre référencement et vos partages sur réseaux sociaux en ajoutant en entête de page de multiples indications.
Il faut commencer par ouvrir le fichier app/design/frontend/default/VotreTheme/template/page/html/head.php pour y ajouter la ligne :
<?php echo $this->getChildHtml('rich-snippets'); ?>
qui se chargera d'appeler un fichier rich-snippets.phtml que nous allons créer.
Puis, dans le fichier app/design/frontend/default/VotreTheme/layout/local.xml, il faut trouver le paragraphe :
<reference name="head">
...
</reference>
pour y ajouter la ligne :
<block type="core/template" name="rich.snippets" template="page/html/header/rich-snippets.phtml" />
Enfin, il faut créer le fichier app/design/frontend/default/VotreTheme/template/page/html/header/rich-snippets.php :
<?php
/**
*
* Copyright (c) 2013 Studio Boz
*
* @project_name Studio Boz
* @copyright Copyright (c) 2013 Studio Boz (http://studioboz.com.br)
* @author Rick Benetti <Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.>
*
**/
?>
<?php
$_storeId = Mage::app()->getStore()->getId();
$_helper = $this->helper('catalog/output');
$product = Mage::registry('product');
//$productUrl = $product->getUrlModel()->getUrl($product, array('_ignore_category' => true));
$currency = Mage::app()->getLocale()->currency(Mage::app()->getStore()->getCurrentCurrencyCode())->getSymbol();
$_twitter_username = Mage::getModel('core/variable')->setStoreId($_storeId)->loadByCode('twitter_username')->getValue('plain');
if ($product):
$productUrl = $product->getProductUrl();
?>
<meta itemprop="url" content="<?php echo $productUrl; ?>" />
<meta itemprop="sku" content="<?php echo $product->getSku() ?>" />
<meta itemprop="price" content="<?php echo number_format($product->getPrice(), 2);?>" />
<meta itemprop="priceCurrency" content="<?php echo Mage::app()->getStore()->getCurrentCurrencyCode();?>" />
<?php if ($this->getReviewsCount()) : ?>
<meta itemprop="ratingValue" content="<?php echo $product->getRatingSummary(); ?>"/>
<meta itemprop="reviewCount" content="<?php echo $product->getReviewsCount(); ?>" />
<meta itemprop="bestRating" content="100"/>
<meta itemprop="worstRating" content="0"/>
<?php endif; ?>
<!-- Facebook - Open Graph -->
<meta property="og:title" content="<?php echo Mage::app()->getWebsite()->getName(); ?>" />
<meta property="og:type" content="product" />
<meta property="og:url" content="<?php echo $productUrl; ?>" />
<meta property="og:price:amount" content="<?php echo Mage::helper('tax')->getPrice($product, $product->getFinalPrice(), true); ?>" />
<meta property="og:price:currency" content="<?php echo Mage::app()->getStore()->getCurrentCurrencyCode() ?>" />
<meta property="og:image" content="<?php echo $this->helper('catalog/image')->init($product, 'image')->resize(996,1490); ?>" />
<meta property="og:description" content="<?php echo strip_tags($product->getShortDescription()); ?>" />
<meta property="og:site_name" content="<?php echo Mage::app()->getWebsite()->getName(); ?>" />
<!-- Twitter - Card -->
<meta name="twitter:site" content="@<?php echo $_twiter_username; ?>" />
<meta name="twitter:card" content="product">
<meta name="twitter:url" content="<?php echo $productUrl; ?>">
<meta name="twitter:title" content="<?php echo Mage::app()->getWebsite()->getName(); ?>">
<meta name="twitter:description" content="<?php echo strip_tags($product->getShortDescription()); ?>">
<meta name="twitter:image" content="<?php echo $this->helper('catalog/image')->init($product, 'image')->resize(996,1490); ?>" />
<!-- Google Plus -->
<meta itemprop="description" content="<?php echo strip_tags($product->getShortDescription()); ?>">
<meta itemprop="image" content="<?php echo $this->helper('catalog/image')->init($product, 'image')->resize(996,1490); ?>" />
<meta itemprop="name" content="<?php echo Mage::app()->getWebsite()->getName(); ?>">
<meta itemprop="url" content="<?php echo $this->helper('catalog/product')->getProductUrl($product); ?>">
<?php else: ?>
<!-- Facebook - Open Graph -->
<meta property="og:title" content="<?php echo $this->getLayout()->getBlock('head')->getTitle() .' « '. Mage::app()->getWebsite()->getName(); ?>" />
<meta property="og:type" content="store" />
<meta property="og:url" content="<?php echo Mage::helper('core/url')->getCurrentUrl();?>" />
<meta property="og:image" content="<?php echo $this->getSkinUrl('images/logo.png') ?>" />
<meta property="og:description" content="<?php echo htmlspecialchars($this->getDescription()) ?>" />
<meta property="og:site_name" content="<?php echo Mage::app()->getWebsite()->getName(); ?>" />
<!-- Twitter - Card -->
<meta name="twitter:site" content="@<?php echo $_twitter_username; ?>" />
<meta name="twitter:card" content="summary">
<meta name="twitter:url" content="<?php echo Mage::helper('core/url')->getCurrentUrl();?>">
<meta name="twitter:title" content="<?php echo $this->getLayout()->getBlock('head')->getTitle() .' « '. Mage::app()->getWebsite()->getName(); ?>">
<meta name="twitter:description" content="<?php echo htmlspecialchars($this->getDescription()) ?>">
<meta name="twitter:image" content="<?php echo $this->getSkinUrl('images/logo.png') ?>">
<!-- Google Plus -->
<meta itemprop="description" content="<?php echo htmlspecialchars($this->getDescription()) ?>">
<meta itemprop="image" content="<?php echo $this->getSkinUrl('images/logo.png') ?>">
<meta itemprop="name" content="<?php echo Mage::app()->getWebsite()->getName(); ?>">
<meta itemprop="url" content="<?php echo Mage::helper('core/url')->getCurrentUrl();?>">
<?php endif; ?>
Il est à noter de vérifier régulièrement le code source de la page en cas de mise à jour majeure dans les systèmes d'indexation Google, ou de partage des réseaux sociaux.
Ce tuto a été testé sur Magento ver. 1.9.1.0.
Source : Studio Boz (http://studioboz.com.br)
Selon son site Web, CocoaPods est "la meilleure façon de gérer les dépendances des bibliothèques dans des projets Objective-C."
CocoaPods est souvent très utile pour travailler sur des projets mis en ligne sur des sites comme GitHub, et il est vrai que cela peut s'avérer très pratique pour les projets incluant de nombreux frameworks.
Pour commencer, il faut démarrer Terminal et taper la ligne de commande :
sudo gem update --system
Votre mot de passe administrateur va vous être demandé, et l'update peut durer quelques minutes. Terminal va vous afficher les étapes du process. Ensuite, on peut installer CocoaPods avec la commande :
sudo gem install cocoapods
Il se peut que Terminal vous affiche :
rake's executable "rake" conflicts with /usr/bin/rake
Overwrite the executable? [yN]
Dans ce cas, tapez y et entrée, il s'agit d'un avertissement d'une opération d'update que vous pouvez ignorer en toute sécurité.
Depuis le passage à El Captain, l'installation de CocoaPods donne l'erreur ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod pour des raisons de sécurité. Pour y remédier, il faut installer CocoaPods avec la ligne de commande :
sudo gem install -n /usr/local/bin cocoapods
Pour finaliser l'installation de CocoaPods, il faudra la ligne de commande :
pod setup
Maintenant que CocoaPods est installé, quand vous téléchargez un projet via GitHub, vous verrez souvent dans le dossier un fichier Podfile. Il détermine les packages à installer. Ici aussi nous aurons besoin de terminal pour saisir la ligne de commande :
cd "/chemin absolu du répertoire/"
afin d'aller dans le dossier où se trouve ce fichier Podfile, puis il faut taper :
pod install
pour faire l'installation.
Ensuite vous pouvez démarre votre application avec xCode en prenant bien soin à sélectionner VotreApplication.xcworkspace et non VotreApplication.xcodeproj.
Un basique pour créer de nouvelles positions de contenu dans votre thème WordPress, il suffit d'éditer 2 fichiers.
Dans un premier temps, ouvrez wp-content/themes/VotreTheme/functions.php, vous y trouverez la fonction function VotreTheme_widgets_init() :
register_sidebar( array(
'name' => __( 'Widget Area', 'VotreTheme' ),
'id' => 'sidebar-1',
'description' => __( 'Add widgets here to appear in your sidebar.', 'VotreTheme' ),
'before_widget' => '<aside id="%1$s" class="widget %2$s">',
'after_widget' => '</aside>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
) );
On voit ici comment la sidebar est intégrée au thème de base. Pour y ajouter une nouvelle zone, il suffit de rajouter dans la fonction un paragraphe similaire :
register_sidebar( array(
'name' => __( 'Slideshow Area', 'VotreTheme' ),
'id' => 'slideshow',
'description' => __( 'Ajoutez un widget ici pour faire apparaitre votre slideshow.', 'VotreTheme' ),
'before_widget' => '<div id="slideshow">',
'after_widget' => '</div>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
) );
L'id doit être unique et ne doit pas comporter de majuscules (tout semblera bien fonctionner, mais la sauvegarde en base de données ne se fera pas).
Les lignes before_widget, after_widget, before_title et after_title vous servirons à styliser les éléments dans votre feuille de style css.
Une fois le fichier édité et uploadé, vous verrez cette nouvelle zone dans le panneau d'aministration WordPress, et vous pourrez y assigner un widget.
Pour ensuite afficher cette zone en frontend, il vous suffit d'une ligne de code ajoutée à l'endroit où vous voulez afficher cette zone. Ici, j'intègre un slideshow sous le menu, donc j'édite le fichier wp-content/themes/VotreTheme/header.php.
<?php if(is_active_sidebar('slideshow')){dynamic_sidebar( 'slideshow' );} ?>
Actualisez votre page et le widget devrait s'afficher.
Pas de panique ! Il ne s'agit pas d'un virus ou d'un problème avec votre téléphone.
Des centaines de personnes se demandent sur Twitter et Yahoo Answers quel est le problème, mais la solution est toute simple : de nombreux appareils utilisent une page de test pour vérifier si la connexion internet est bien active en vérifiant qu'une page se charge bien en arrière-plan. Il semble que la majorité d'entre eux utilisent un lien mis en place par Apple, qui est rompu aujourd'hui. Habituellement, si votre appareil accède bien à la page en question, elle est automatiquement masquée par votre téléphone.
Ce qui est intéressant est que cette erreur impacte une grande variété de téléphones et ordinateurs portables - pas seulement ceux issus de la firme à la pomme.
Il semble que même les autres constructeurs de téléphones utilisent la page d'Apple pour vérifier la connexion à internet.
Il y a une solution, mais cela dépend du type de téléphone que vous avez. Sur les appareils Android, si vous accéder à votre configuration dans WiFi, puis «avancé», vous devriez trouver une option pour «connexion automatique» ou «connexion optimisée», qui peut être désactivée.
Pour les appareils iOS il ne semble pas y avoir de solution pour le moment... Affaire à suivre.
Après avoir subi les foudres de Apple avec Steve Jobs, suivi de près par Bill Gates et Android, Flash se voit déprécié par le navigateur Firefox de Mozilla, et ce, jusqu'à nouvel ordre, pour des raisons de sécurité, raison qui avait également été invoquée par les Apple, Windows et Android avec le souci d'économie d'énergie en sus, pointant Flash comme trop gourmand.
Et si cela ne suffisait pas, le chef de la sécurité chez facebook, Alex Stamos, connu pour avoir pointé diverses failles des services Yahoo (pousant l'entreprise à y remédier), aurait aussi pris le relai, demandant l'exécution pure et dure du célèbre plugin !
"It is time for Adobe to announce the end-of-life date for Flash and to ask the browsers to set killbits on the same day. (...) Nobody takes the time to rewrite their tools and upgrade to HTML5 because they expect Flash to live forever. We need a date to drive it."
"Il est temps pour Adobe d'annoncer la date de fin de vie pour Flash et de demander aux navigateurs de mettre les "bits d'arrêt" le même jour. (...) Personne ne prend le temps de réécrire leurs outils et de passer à HTML5 parce qu'ils s'attendent à ce que Flash soit éternel. Nous avons besoin d'une date pour mettre cette transition en route."
Les utilisateurs de Firefox qui veulent néanmoins continuer à accéder à du contenu basé sur Flash, comme des vidéos, publicités ou divers outils de web complexes reposant sur cette technologie, pourront le faire après s'être acquitté d'un avertissement indiquant que "Flash est connu pour être vulnérable. Utiliser avec prudence", car la configuration par défaut du navigateur s'y refusera.
Après que leur version bêta parue en février dernier ait attiré 40.000 utilisateurs de 162 pays différents, Livecoding.tv fait son apparition officielle. Pour les gamers connaissant Twitch, le concept est très proche, les codeurs peuvent diffuser leur travail en direct. Même si le site dispose de tutoriels pour les codeurs débutants, le site est plus accès sur des codeurs professionnels diffusant leur travail au stade de production, en cours de développement de produits réels. Les abonnés du site pourront même poser des questions en temps réel, voire accéder au code source !
Un concept de partage et d'échange qui correspond bien à une certaine idée du web que beaucoup d'entre nous partagent !
Retrouvez le site de Livecoding.tv.
Suivez l'actualité de Livecoding.tv sur facebook.
"Vous venez de perdre votre téléphone et que vous voulez effacer vos informations personnelles ?
Vous assistez à un événement, et que vous souhaitez partager vos photos avec certaines personnes (mais pas tout le monde) ?
Vous hésitez à télécharger une autre application trop gourmande en d'informations ?"
Google annonce des améliorations dans la gestion et la sécurisation de vos données pour la rendre plus simple et plus efficace.
La nouvelle page "Mon compte" vise à fournir plus de contrôle concernant les données et la confidentialité lors de votre utilisation des différents services Google. Vous pourrez y faire un check-up des traces que vous avez laissées ou de votre historique YouTube par exemple.
Google inclus un accès rapide à un outil de paramétrage publicitaire, qui vous permet d'adapter les annonces qui vous seront diffusées.
En parallèle, Google a également lancé aujourd'hui un nouveau site privacy.google.com centralisant les pratiques et questions concernant la politique confidentialité de l'entreprise.
C'est une bonne manoeuvre pour une entreprise vivant de la publicité et souvent décriée pour ses pratiques de collecte de données et leur utilisation.
Retrouvez plus d'informations sur le blog officiel de Google (en anglais).
Le site 9to5Mac rapporte que les systèmes d'exploitation de la prochaine génération d'Apple, à la fois pour les appareils mobiles et les ordinateurs, seraient fortement axés sur le règlement de bugs et l'amélioration de la la stabilité. Apple travaillerait sur l'amélioration du soutien pour les anciens périphériques iOS - y compris ceux qui ne sont même plus à la vente.
Le rapport de 9to5Mac dit que iOS 9 présentera une nouvelle méthode d'optimisation afin d'étendre la compatibilité iOS aux dispositifs de quelques générations antérieures (y compris le mini iPad et l'iPhone 4S), ce qui n'a pas toujours été le cas, les plaintes des utilisateurs rapportent régulièrement des ralentissements significatifs de performance post-mise à jour.
Cette fois, Apple se concentrerait spécifiquement sur l'efficacité de la performance avec un système de base efficace et des fonctions ajoutées sous condition qu'elles ne nuisent pas la qualité de l'expérience utilisateur et du système d'exploitation.
Pour Apple de se concentrer sur ce type d'optimisation signale une forte volonté de soutenir son écosystème, et de récompenser les utilisateurs de longue date. Cela signifie que les développeurs auront à se concentrer sur des cibles matérielles plus variées en termes de résolutions et capacités. Mais cette politique pourrait aussi aider Apple à élargir le pool de clients potentiels pour son nouveau service de streaming (même si celui-ci n'en est encore qu'au stade de rumeur).
Nous aurons à coup sûr plus d'informations le 8 Juin quand Apple révèlera les premiers détails officiels sur iOS 9 lors de sa keynote.
Switch se présente comme le Tinder de la recherche d'emploi et convainc les investisseurs à hauteur de 2 millions de dollars.
L'application disponible pour iOS - et bientôt pour Android - permet aux utilisateurs de rechercher anonymement des emplois à travers un algorithmique et une interface utilisateur similaire au célèbre Tinder, permettant de visualiser les offres d'un glissement de doigt, puis sur une entente mutuelle, d'engager une conversation avec différents employeurs.

L'anonymat du service permet de faire sa recherche en toute tranquillité sans que l'employeur actuel de l'utilisateur puisse en être informé. Une fois l'intérêt pour un emploi exprimé, l'employeur potentiel peut voir les informations complètes du candidat, y compris la photo, le nom, l'expérience professionnelle, etc...
L'entreprise affirme qu'elle a neuf des cinquante sites les plus importants aux États-Unis enregistrés comme employeurs sur le service (Facebook, Amazon, Wikipedia, eBay, Imgur, New York Times...), avec 400.000 demandes d'emploi.
Pour l'instant, le service est gratuit pour tout le monde, mais la société prévoit sur l'ajout d'un modèle d'abonnement pour les employeurs qui cherchent à trouver des candidats sur la plate-forme.
Espérons que le service se développe rapidement pour l'Europe également !
Il arrive souvent dans le développement iPhone que certaines fonctions soient déclarées obsolètes par les différentes évolutions de Xcode et des versions iOS. Parfois cela donne lieu à de simples avertissements, mais cela peut aussi engendrer des erreurs qui empêcheront le build.
Ici, il s'agit d'un simple warning, mais c'est toujours plus propre de faire évoluer son code.
Par exemple :
NSDictionary *textTitleOptions = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor, [UIColor whiteColor], UITextAttributeTextShadowColor, nil];
[[UINavigationBar appearance] setTitleTextAttributes:textTitleOptions];
Donne donc depuis iOS 7 l'avertissement "UITextAttributeTextColor is deprecated in IOS 7".
Il suffit ici de changer UITextAttributeTextColor par NSForegroundColorAttributeName.
Un fonctionnalité très pratique m'a souvent été indiquée comme manquante dans le back office de Magento, la liste des produits n'affiche pas d'images, et il est vrai que sur de gros catalogues, avec des noms de produits similaires, ou des boutiques avec plusieurs administrateurs, ce petit détail peut être un véritable gain de temps et d'énergie dans la gestion des produits. Pour ajouter cette fonction, sans modifier un seul fichier du core, ce qui est très fortement conseillé dans le développement de sites sous Magento - ne serait-ce que pour pouvoir faire les mises à jour système - il suffit de créer un petit module à uploader ensuite via ftp.
Le module s'articule autour de 4 fichiers :
app --> code --> community --> Shapes --> Gridimages --> Adminhtml --> Block --> Catalog --> Product --> Grid.php
app --> code --> community --> Shapes --> Gridimages --> Block --> Adminhtml --> Template --> Grid --> Renderer --> Image.php
app --> code --> community --> Shapes --> Gridimages --> etc --> config.xml
app --> etc --> modules --> Shapes_Gridimages.xml
Dans le premier fichier, Grid.php, on vient étendre les fonctionnalités de app --> code --> core --> Mage --> Adminhtml --> Block --> Catalog --> Product --> Grid.php :
<?php
class Shapes_Gridimages_Adminhtml_Block_Catalog_Product_Grid extends Mage_Adminhtml_Block_Catalog_Product_Grid
{
protected function _prepareCollection()
{
$store = $this->_getStore();
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('sku')
->addAttributeToSelect('name')
->addAttributeToSelect('attribute_set_id')
->addAttributeToSelect('type_id');
if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) {
$collection->joinField('qty',
'cataloginventory/stock_item',
'qty',
'product_id=entity_id',
'{{table}}.stock_id=1',
'left');
}
if ($store->getId()) {
//$collection->setStoreId($store->getId());
$adminStore = Mage_Core_Model_App::ADMIN_STORE_ID;
$collection->addStoreFilter($store);
$collection->joinAttribute(
'name',
'catalog_product/name',
'entity_id',
null,
'inner',
$adminStore
);
$collection->joinAttribute(
'custom_name',
'catalog_product/name',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'status',
'catalog_product/status',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'visibility',
'catalog_product/visibility',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'price',
'catalog_product/price',
'entity_id',
null,
'left',
$store->getId()
);
}
else {
$collection->addAttributeToSelect('price');
$collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
}
$collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left');
$this->setCollection($collection);
Mage_Adminhtml_Block_Widget_Grid::_prepareCollection();
$this->getCollection()->addWebsiteNamesToResult();
return $this;
}
protected function _prepareColumns()
{
$this->addColumn('image', array(
'header' => Mage::helper('catalog')->__('Image'),
'align' => 'left',
'index' => 'image',
'width' => '70',
'renderer' => 'Shapes_Gridimages_Block_Adminhtml_Template_Grid_Renderer_Image'
));
return parent::_prepareColumns();
}
}
Dans le deuxième fichier Image.php on vient ajouter la fonction d'appel de l'image dans la colonne des produits, en extension de app --> code --> core --> Mage --> Adminhtml --> Block--> Widget --> Grid --> Column --> Renderer --> Abstract.php
<?php
class Shapes_Gridimages_Block_Adminhtml_Template_Grid_Renderer_Image extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
public function render(Varien_Object $row)
{
return $this->_getValue($row);
}
protected function _getValue(Varien_Object $row)
{
$val = $row->getData($this->getColumn()->getIndex());
$val = str_replace("no_selection", "", $val);
$url = Mage::getBaseUrl('media') . 'catalog/product' . $val;
$out = "<img src="/. $url ." width='60px'/>";
return $out;
}
}
Dans les 2 derniers fichiers on vient écrire la config du module, soit dans config.xml :
<?xml version="1.0"?>
<config>
<modules>
<Shapes_Gridimages>
<version>1.0</version>
</Shapes_Gridimages>
</modules>
<global>
<blocks>
<adminhtml>
<rewrite>
<catalog_product_grid>Shapes_Gridimages_Adminhtml_Block_Catalog_Product_Grid</catalog_product_grid>
</rewrite>
</adminhtml>
</blocks>
</global>
</config>
Et dans Shapes_Gridimages.xml :
<?xml version="1.0"?>
<config>
<modules>
<Shapes_Gridimages>
<active>true</active>
<codePool>community</codePool>
</Shapes_Gridimages>
</modules>
</config>
Une fois les fichiers écris et enregistrés avec la bonne structure de dossiers écrite ci-dessus, il suffit d'uploader le tout via ftp et d'aller voir le rendu en back office.
J'ai utilisé ce module sur plusieurs sites, de versions Magento allant de 1.7.0.2 à 1.9.1.0.
Un défaut notable est qu'il n'affichera pas les images des produits simples lorsque l'on n'en met pas dans l'administration et que l'on n'utilise que les images des produits parents, donc on a un lien brisé à la place, pas très joli. Peut-être l'occasion de se pencher sur une future mise à jour que je ne manquerai pas de venir poster ici si je viens à la faire.
Facebook debugger s'avère très utile lorsque l'on veut contrôler ses posts avant de les publier, ou quand on veut remettre le cache de facebook à jour après avoir modifié du contenu déjà partagé, après une petite faute de frappe par exemple. Il vous suffit de vous rendre à l'adresse developers.facebook.com/tools/debug pour ensuite copier / coller l'url à partager dans la case dédiée et de cliquer sur le bouton "Debug".
On peut à l'occasion voir que facebook a parfois du mal à bien aller chercher toute l'info du premier coup, pas de panique, et nul besoin d'appeler votre web designer pour lui indiquer qu'il a mal fait son travail, il suffit alors de cliquer sur "Fetch new scrape information" pour que tout rentre dans l'ordre !
Vous pourrez ensuite tranquillement partager votre post avec votre profil ou votre page facebook, la publication sera conforme à l'affichage du debugger.
On a souvent annoncé la photo comme le meilleur vecteur de clic et de visibilité sur facebook, mais la société d'analyses de réseaux sociaux Socialbakers a étudié plus de 670 000 messages sur 4445 pages pour constater que les messages vidéo avaient une portée organique de 8,71%, soit beaucoup plus que de 5,8% pour les statuts, 5,29% pour les liens et seulement 3,73% pour les photos !
Le conseil le plus important étant ici de diffuser la vidéo en natif : les publier directement sur Facebook semble donner de meilleurs résultats que de publier depuis des sites tiers tels que YouTube, Vimeo ou DailyMotion.
En vue de la conférence annuelle des développeurs WWDC en juin prochain, Apple a ouvert l'accès bêta à un nouveau service d'analyse destiné aux développeurs iOS. Le portail iTunes Connect invite les développeurs à demander un accès bêta au service. Si vous êtes connecté, vous pouvez accéder directement à l'adresse analytics.itunes.apple.com, même s'il est à noter que "l'accès au service sera accordé sur une base du premier arrivé, premier servi", tout le monde n'aura donc pas droit au sésame.
Les informations sur ce service d'analyses sont maigres, mais Apple affirme qu'il offrira aux développeurs la possibilité de suivre combien de fois les clients visite la page d'une application sur l'App Store, savoir combien d'utilisateurs ouvrent l'application, suivre les ventes apps et in-apps, créer des liens de campagne personnalisées et suivre le succès des campagnes de marketing, et de comprendre quels sites confuisent la plupart des utilisateurs vers l'App Store et l'application.
Apple suit sa logique d'acquisition des différents services destinés aux développeurs tels que Burstly ou TestFlight. Des services tiers permettaient déjà de suivre l'activité des utilisateurs, mais l'avantage pour les développeurs d'utiliser un service Apple est un accès direct aux données, donc plus d'informations et de feedback. Autre avantage à noter, il ne sera donc plus nécessaire d'installer un SDK dédié, le service sera directement accessible via iTunes Connect.
Il pourra s'avérer tentant pour de nombreux développeurs d'abandonner des services tels que Google Analytics et leur compte premium, mais ces sociétés d'analyse offrent aujourd'hui des fonctionnalités avancées, et se verront bien obligées de tenir leurs technologies à niveau pour attirer et fidéliser leurs clients.
On peut facilement changer la classe d'un élément CSS grâce à jQuery pour dynamiser le design, comme par exemple changer la taille de certains blocs pour dévoiler tout leur contenu en cliquant sur un bouton. Dans l'exemple ci-dessous on a donc un bloc où l'on peut voir le début d'un texte, avec un bouton fixé en position absolue en bas du bloc qui aura pour action de changer la hauteur du div pour afficher tout le texte.
La partie html :
<div id="blocDynamique" class="blocContenu">
<div class="texte">
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
</div>
<div class="bouton">
<button>Voir +</button>
</div>
</div>
La partie JavaScript (il faut également appeler jQuery si ce n'est pas déjà fait dans la page) :
<script>
jQuery( "button" ).on( "click", function() {
jQuery('#blocDynamique').toggleClass('collapsed open');
jQuery(this).text(function(i, v){
return v === 'Voir +' ? 'Voir -' : 'Voir +'
});
});
</script>
La partie CSS :
.blocContenu {
position: relative;
background: #666;
color: #FFF;
margin-top: 0px;
padding: 20px 20px 40px 20px;
height: 110px;
overflow: hidden;
width: 100%;
transition: height 1s ease;
}
.bouton {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 30px;
}
.bouton button {
background: #666;
border: 0;
width: 100%;
height: 30px;
color: #FFF;
}
.bouton button:hover {
color: #ac9762;
}
.blocContenu.collapsed {
height: 110px;
}
.blocContenu.open {
height: 380px;
overflow: hidden;
}
Le bloc va maintenant s'agrandir lorsque l'on clique dessus pour laisser apparaître tout le texte de contenu avec une petite animation CSS3 grâce à transition: height 1s ease.
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Comme on change la classe de CSS de l'élément, bien d'autres choses son possibles telles que le changement de couleur de fond, de texte, de taille de texte... bref, tout ce que l'on peut appliquer en CSS.
ATTENTION, CET ARTICLE EST DESTINÉ AUX ADMINISTRATEURS AYANT UN MINIMUM DE CONNAISSANCES MYSQL.
La phase de test est terminée, et vous êtes prêt à ouvrir votre boutique sous Magento, mais les tests ont laissé pas mal de traces dans la base de données ? Magento ne dispose malheureusement pas d'outil admin pour effacer cela, à moins d'installer des composants tierces. Et c'est peut-être pas plus mal de ne pas pouvoir effacer tout cela par mégarde. Lorsque votre phase de tests est terminée, vous pouvez néanmoins effacer le tout en vous connectant directement via phpMyAdmin et en exécutant la requête :
SET FOREIGN_KEY_CHECKS=0;
##############################
# TABLES COMMANDES
##############################
TRUNCATE `sales_flat_creditmemo`;
TRUNCATE `sales_flat_creditmemo_comment`;
TRUNCATE `sales_flat_creditmemo_grid`;
TRUNCATE `sales_flat_creditmemo_item`;
TRUNCATE `sales_flat_invoice`;
TRUNCATE `sales_flat_invoice_comment`;
TRUNCATE `sales_flat_invoice_grid`;
TRUNCATE `sales_flat_invoice_item`;
TRUNCATE `sales_flat_order`;
TRUNCATE `sales_flat_order_address`;
TRUNCATE `sales_flat_order_grid`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sales_flat_order_payment`;
TRUNCATE `sales_flat_order_status_history`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_quote_payment`;
TRUNCATE `sales_flat_quote_shipping_rate`;
TRUNCATE `sales_flat_shipment`;
TRUNCATE `sales_flat_shipment_comment`;
TRUNCATE `sales_flat_shipment_grid`;
TRUNCATE `sales_flat_shipment_item`;
TRUNCATE `sales_flat_shipment_track`;
TRUNCATE `sales_invoiced_aggregated`; # ??
TRUNCATE `sales_invoiced_aggregated_order`; # ??
TRUNCATE `log_quote`;
ALTER TABLE `sales_flat_creditmemo_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_status_history` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_shipping_rate` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_track` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated_order` AUTO_INCREMENT=1;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
#########################################
# PRODUITS TELECHARGEABLES
#########################################
TRUNCATE `downloadable_link_purchased`;
TRUNCATE `downloadable_link_purchased_item`;
ALTER TABLE `downloadable_link_purchased` AUTO_INCREMENT=1;
ALTER TABLE `downloadable_link_purchased_item` AUTO_INCREMENT=1;
#########################################
# REINITIALISATION DES COMPTEURS ID
#########################################
TRUNCATE `eav_entity_store`;
ALTER TABLE `eav_entity_store` AUTO_INCREMENT=1;
##############################
# TABLES CLIENTS
##############################
TRUNCATE `customer_address_entity`;
TRUNCATE `customer_address_entity_datetime`;
TRUNCATE `customer_address_entity_decimal`;
TRUNCATE `customer_address_entity_int`;
TRUNCATE `customer_address_entity_text`;
TRUNCATE `customer_address_entity_varchar`;
TRUNCATE `customer_entity`;
TRUNCATE `customer_entity_datetime`;
TRUNCATE `customer_entity_decimal`;
TRUNCATE `customer_entity_int`;
TRUNCATE `customer_entity_text`;
TRUNCATE `customer_entity_varchar`;
TRUNCATE `tag`;
TRUNCATE `tag_relation`;
TRUNCATE `tag_summary`;
TRUNCATE `tag_properties`;
TRUNCATE `wishlist`;
TRUNCATE `log_customer`;
ALTER TABLE `customer_address_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `tag` AUTO_INCREMENT=1;
ALTER TABLE `tag_relation` AUTO_INCREMENT=1;
ALTER TABLE `tag_summary` AUTO_INCREMENT=1;
ALTER TABLE `tag_properties` AUTO_INCREMENT=1;
ALTER TABLE `wishlist` AUTO_INCREMENT=1;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
##############################
# RECHERCHES
##############################
TRUNCATE catalogsearch_query;
TRUNCATE catalogsearch_fulltext;
TRUNCATE catalogsearch_result;
ALTER TABLE catalogsearch_query AUTO_INCREMENT=1;
ALTER TABLE catalogsearch_fulltext AUTO_INCREMENT=1;
ALTER TABLE catalogsearch_result AUTO_INCREMENT=1;
##############################
# MEILLEURES VENTES
##############################
TRUNCATE TABLE sales_bestsellers_aggregated_daily;
TRUNCATE TABLE sales_bestsellers_aggregated_monthly;
TRUNCATE TABLE sales_bestsellers_aggregated_yearly;
ALTER TABLE sales_bestsellers_aggregated_daily AUTO_INCREMENT=1;
ALTER TABLE sales_bestsellers_aggregated_monthly AUTO_INCREMENT=1;
ALTER TABLE sales_bestsellers_aggregated_yearly AUTO_INCREMENT=1;
##############################
# LOGS
##############################
TRUNCATE `log_url`;
TRUNCATE `log_url_info`;
TRUNCATE `log_visitor`;
TRUNCATE `log_visitor_info`;
TRUNCATE `report_event`;
TRUNCATE `report_viewed_product_index`;
TRUNCATE `sendfriend_log`;
ALTER TABLE `log_url` AUTO_INCREMENT=1;
ALTER TABLE `log_url_info` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
ALTER TABLE `report_viewed_product_index` AUTO_INCREMENT=1;
ALTER TABLE `sendfriend_log` AUTO_INCREMENT=1;
SET FOREIGN_KEY_CHECKS=1;
Cette requête a été testée sous la dernière version de Magento (1.9.1) mais il est toujours préférable de faire un backup avant de la lancer.
Un petit bug bien difficile à détecter s'est niché dans la version 1.9.1 de Magento, impossible de traduire l'alerte des méthodes de livraison "Please specify payment method".
En fouillant et en étudiant de plus près le fichier app/code/core/Mage/Checkout/etc/jstranslator.xml on peut se rendre compte qu'il y a une petite erreur de code, l'élément "validate-shipping-methods-required" est doublé. Il faut donc corriger ce fichier en remplaçant :
<jstranslator>
<!-- opcheckout.js -->
<validate-guest translate="message" module="checkout">
<message>Please choose to register or to checkout as a guest</message>
</validate-guest>
<validate-shipping-methods-not-available translate="message" module="checkout">
<message>Your order cannot be completed at this time as there is no shipping methods available for it. Please make necessary changes in your shipping address.</message>
</validate-shipping-methods-not-available>
<validate-shipping-methods-required translate="message" module="checkout">
<message>Please specify shipping method.</message>
</validate-shipping-methods-required>
<validate-payment-methods-not-available translate="message" module="checkout">
<message>Your order cannot be completed at this time as there is no payment methods available for it.</message>
</validate-payment-methods-not-available>
<validate-shipping-methods-required translate="message" module="checkout">
<message>Please specify payment method.</message>
</validate-shipping-methods-required>
<!-- end opcheckout.js -->
</jstranslator>
par :
<jstranslator>
<!-- opcheckout.js -->
<validate-guest translate="message" module="checkout">
<message>Please choose to register or to checkout as a guest</message>
</validate-guest>
<validate-shipping-methods-not-available translate="message" module="checkout">
<message>Your order cannot be completed at this time as there is no shipping methods available for it. Please make necessary changes in your shipping address.</message>
</validate-shipping-methods-not-available>
<validate-shipping-methods-required translate="message" module="checkout">
<message>Please specify shipping method.</message>
</validate-shipping-methods-required>
<validate-payment-methods-not-available translate="message" module="checkout">
<message>Your order cannot be completed at this time as there is no payment methods available for it.</message>
</validate-payment-methods-not-available>
<validate-payment-methods-required translate="message" module="checkout">
<message>Please specify payment method.</message>
</validate-payment-methods-required>
<!-- end opcheckout.js -->
</jstranslator>
Modifier les fichiers du core de Magento est la dernière solution à envisager, mais vu qu'il s'agit d'un bug du core, c'est la solution qui a fonctionné pour moi. À garder de côté donc pour vérifier si c'est bien corrigé dans les futures mises à jour, ou s'il faut ré-appliquer cette correction.