Voici les quelques commandes à exécuter pour installer SugarCRM sous un Ubuntu.
La procédure utilise les versions Ubuntu 11.10 et SugarCRM 6.2 .
# Télécharger SugarCRM Community Edition 6.2
cd /tmp
wget http://www.sugarforge.org/frs/download.php/8507/SugarCE-6.2.3.zip
cd /var/www
unzip /tmp/SugarCE-6.2.3.zip
mv SugarCE-Full-6.2.3 mon_projet
# Mettre les bons droits
sudo chown -R www-data: mon_projet
sudo chmod -R 775 mon_projet
Ensuite il faut aller, via son navigateur, sur l'url http://localhost/mon_projet/install.php
Et suivre les instructions.
En espérant que ça puisse vous aider,
Thomas.
Vous devez être identifié pour poster un commentaire.
Lors de mes premiers tests avec SugarCRM, j'ai essayé de déployer un Package créé avec Module Builder sans lui associer de module.
Sans surprises ça ne fonctionne pas. Seulement les traces ne sont pas très explicites !
Voici les erreurs que l'on va rencontrer :
Donc si vous rencontrez ces erreurs, il s'agit sûrement d'un module cassé ou mal associé au votre Package.
En espérant que ça puisse vous aider,
Thomas.
Vous devez être identifié pour poster un commentaire.
Sous Linux, vous pouvez créer vos propres commandes shell.
Ceci est un petit tutoriel pour savoir comment faire.
Le but de ce tutoriel sera de recréer la commande pour connaître à quel groupe appartient un utilisateur.
Habituellement, pour trouver dans quels groupes est un utilisateur Linux, il faut exécuter la commande suivante :
groups username
Pour définir notre nouvelle commande shell il faut ajouter le code ci-dessous au fichier ~/.bash_aliases :
# WHICHGROUP
# Définir une méthode whichgroup
function whichgroup {
# Afficher l'usage s'il n'y a pas assez d'arguments
if [ $# -eq 0 ]
then
echo "usage: whichgroup username";
# Implémentation de la fonction s'il y a le bon nombre d'arguments
else
cat /etc/group | grep -E "(:|;|,)$1" | cut -f1 -d':';
fi;
}
# Déclarer la fonction whichgroup en tant qu'alias de commande
alias whichgroup=whichgroup $1
La commande shell whichgroup username sera alors disponible au prochain démarrage.
Si vous ne voulez pas attendre, vous pouvez la charger en exécutant la commande suivante :
source ~/.bash_aliases
En espérant que ça puisse vous aider,
Thomas.
Vous devez être identifié pour poster un commentaire.
Voici quelques liens qui peuvent être utiles pour bien démarrer avec Sugar CRM :
Installer SugarCRM :
Créer son premier module SugarCRM :
Les Forums en français SugarCRM :
Ressources officielles :
Schéma UML :
Ce billet est un billet vivant. Il sera donc complété au fur et à mesure de mes découvertes.
N'hésitez pas à m'envoyer vos liens préférés !
En espérant que ça puisse vous être utile,
Thomas.
Vous devez être identifié pour poster un commentaire.
Sous eZ Publish, on peut afficher des traces de debug directement en front-office.
Dans cet article je vous présente un petit Bookmarklet que j'ai fait pour améliorer leur rendu.
Le Bookmarklet "eZ Filter Debug" se résume en 3 fonctionnalités qui peuvent vous intéresser :
1. Chargement de la feuille de style debug.css
Pour mettre en forme les traces de debug, il faut charger la feuille de style debug.css.
Mais on n'a pas forcément envie de la charger tout le temps, surtout en production.
C'était l'idée de départ : ce Bookmarklet charge à la volée la feuille de style de Debug.
2. Afficher les traces de debug à la demande
La deuxième idée est de pouvoir cacher les traces de debug par défaut.
Pour cela, il suffit de rajouter dans votre feuille CSS la ligne suivante :
#debug {display: none;}
Lorsque vous activerez le Bookmarklet, les traces de Debug s'afficheront, et vous serez redirigé vers elles.
Ceci n'est pas forcément utile, car eZ Publish vous permet déjà de n'afficher les traces de Debug que pour une certaine liste d'IP.
Mais ça peut être pratique dans certains cas : IP dynamique, client interne, site mobile, etc.
3. Permettre de filtrer les traces de debug
Les traces de Debug affichent également les traces de Notice, Timing, Warning et Error.
Pas toujours facile de s'y retrouver en un coup d’oeil.
Du coup le Bookmarklet "eZ Filter Debug" vous propose également une option de filtrage :

Note 1 : ce Bookmarklet a été testé sous eZ Publish 4.3 - 4.5.
Note 2 : Le code du Bookmarklet est diponible sur GitHub.
N'hésitez pas en me faire des remarques, soit par commentaire, soit par le formulaire de contact de mon site.
En espérant que ça puisse vous être utile,
Thomas.
Vous devez être identifié pour poster un commentaire.
Une petite astuce pour les traductions sous eZ Publish, on peut utiliser des paramètres.
Par exemple, on est pas obligé de couper la traduction de "Plus que 3 exemplaires." si la valeur 3 est dynamique.
Vous pouvez utiliser dans votre template le code ci-dessous :
{"Only %quantity left in stock."|i18n('shop', , hash('%quantity', $product.stock))}
Et utiliser dans votre fichier de traduction, le code ci-dessous :
<!DOCTYPE TS>
<TS>
<context>
<name>shop</name>
<message>
<source>Only %quantity left in stock.</source>
<translation>Plus que %quantity exemplaires.</translation>
</message>
</context>
</TS>
En espérant que ça puisse vous aider,
Thomas.
Vous devez être identifié pour poster un commentaire.
Dans une template "classique", on a accès à la variable $view_parameters.
Celle-ci contient les valeurs des paramètres personnalisés passés dans l'url.
Par exemple pour l'url suivante :
http://www.example.com/my/url/alias/(couleur)/vert/(prix)/34
On pourra accéder aux paramètres "couleur" et "prix" à l'aide de la variable $view_parameters :
La couleur est : {$view_parameters.couleur}
Le prix est : {$view_parameters.prix}
Par contre, vous n'avez pas accès à $view_parameters dans une vue d'un module.
Mais on peut quand même les récupérer à l'aide du code suivant :
$uri = eZURI::instance( eZSys::requestURI() );
$viewParameters = $uri->UserParameters();
On peut ensuite facilement les passer à une template :
// Récupérer les view_parameters
$uri = eZURI::instance( eZSys::requestURI() );
$viewParameters = $uri->UserParameters();
// Instancier la template
$tpl = templateInit();
$tpl->setVariable( 'view_parameters', $viewParameters );
// Renvoyer le résultat de la vue
$Result = array();
$Result['content'] = $tpl->fetch( "design:<ma/template.tpl>" );
En espérant que ça puisse vous aider,
Thomas.
Vous devez être identifié pour poster un commentaire.
On peut manipuler très facilement les chaînes de caractères en shell.
Il est par exemple très simple de faire un substring !
1. Couper une chaîne sur une distance donnée
Nous avons une chaîne "aaa-bbb-ccc" et nous voulons récupérer la sous-chaîne "a-bbb-c".
Cette sous-chaîne commence à l'index 2. C'est le 3e caractères et le premier index est 0.
La longueur de la sous-chaîne sera de 7 caractères.
$ string="aaa-bbb-ccc"
$ echo ${string}
aaa-bbb-ccc
$ echo ${string:2:7}
a-bbb-c
2. Couper la chaîne avant un caractère donné
Nous avons une chaîne "aaa-bbb-ccc" et nous voulons récupérer les sous-chaînes de :
$ string="aaa-bbb-ccc"
$ echo ${string%%-*}
aaa
$ echo ${string%-*}
aaa-bbb
3. Couper la chaîne après un caractère donné
Nous avons une chaîne "aaa-bbb-ccc" et nous voulons récupérer les sous-chaînes de :
$ string="aaa-bbb-ccc"
$ echo ${string#*-}
bbb-ccc
$ echo ${string##*-}
ccc
En espérant que ça puisse vous aider,
Thomas.
Vous devez être identifié pour poster un commentaire.
Pour les versions d'eZ Publish inférieur à 4.4.1, il fallait éviter de supprimer un utilisateur eZ Publish.
Même supprimé, tous les contenus qu'il a publié lui font encore référence.
Ceci pose quelques problèmes dans le Back Office d'eZ Publish. Par exemple, l'interface n'arrive plus à lister les sous-éléments.
C'est pour cela qu'il valait mieux désactiver un utilisateur que le supprimer.
Si c'est trop tard et qu'il est supprimé, comme ça m'est arrivé, on peut réparer sa BDD.
On peut le faire à la main, il suffit de réassocier tous les contenus crées par des utilisateurs supprimés.
Voici les requêtes SQL à exécuter :
UPDATE ezcontentobject SET owner_id=14 WHERE owner_id NOT IN
(SELECT contentobject_id FROM ezuser);
UPDATE ezcontentobject_version SET creator_id=14 WHERE creator_id NOT IN
(SELECT contentobject_id FROM ezuser);
Ici, 14 représente l'id de votre utilisateur admin.
En espérant que ça puisse vous aider,
Thomas.
Edit: Merci à Damien POBEL pour m'avoir montré que le bug était désormais corrigé.
Vous devez être identifié pour poster un commentaire.
eZ Publish dispose d'un moteur i18n ou d'internationalisation.
1. Presentation
On peut l'utiliser dans les templates à l'aide de l'opérateur i18n() :
{$string|i18n($context)}
{'The results'|i18n('search')}
Dans le ficher translations/fre-FR/translation.ts, on peut lui indiquer les valeurs en français :
<!DOCTYPE TS>
<TS>
<context>
<name>search</name>
<message>
<source>The results</source>
<translation>Les résultats</translation>
</message>
</context>
</TS>
2. Utiliser des sources en français
Dans le sens anglais > français, il n'y a pas de soucis.
Sauf qu'on est pas tous bilingue, donc ça peut être plus pertinent de prendre le français comme référence.
Le problème est que le moteur i18n ne va pas utiliser le fichier de traduction translations/eng-GB/translation.ts.
Il doit sûrement supposer que la langue de référence est forcément l'anglais.
La petite astuce est d'utiliser la langue eng-GB@euro.
Donc de mettre ses traducitons dans le fichier translations/eng-GB@euro/translation.ts.
3. Encodage
Un dernier problème, le moteur ne gère pas naturellement les caractères accentués en tant que source.
Alors que bizarrement, il n'y avait pas de problème d'encodage pour les traductions dans le sens anglais > français.
Pour que ce code-là fonctionne dans votre template :
{'Les résultats'|i18n('search')}
Il vous faudra encoder les accents dans votre fichier de traduction translations/eng-GB@euro/translation.ts :
<!DOCTYPE TS>
<TS>
<context>
<name>search</name>
<message>
<source>Les résultats</source>
<translation>The results</translation>
</message>
</context>
</TS>
Dans ce fichier, é représente le caractère é.
E9 est la valeur numériques hexadécimal du caractère.
Pour connaître les valeurs hexadécimale, il faut utiliser un convertisseur de caractères.
Conclusion
Si tous les membres de votre équipe sont à l'aise avec l'anglais, il vaut mieux garder l'anglais en tant que langue de référence.
Vous garderez des fichiers de traductions plus lisible et maintenable.
En espérant que ça puisse vous aider,
Thomas.
Vous devez être identifié pour poster un commentaire.
Hier, on a codé un petit script pour entourer toutes les images d'une page.
Aujourd'hui on va s'amuser à le transformer en Bookmarklet, ou applisignet en québecois.
1. Qu'est-ce qu'un Bookmarklet
Un Bookmarklet est un Bookmark, ou favoris, qui contient un script JavaScript à exécuter.
Un Bookmarklet est simple à reconnaître, son URL commence toujours par javascript:.
Au chargement de l'URL, la navigateur exécute le JavaScript sans changer de page.
Par exemple, essayez de copier-coller la ligne suivante dans la barre d'adresse de votre navigateur :
javascript:alert('\103\145\143\151\40\145\163\164\40\165\156\40\102\157\157\153\155\141\162\153\154\145\164');
Vous devez être identifié pour poster un commentaire.
Voici un petit tutoriel JS.
Le but est de voir comment exécuter du JavaScript à l'intérieur des iframes.
On va essayer de coder un script qui entoure toutes les images de la page.
1. Première version du script :
// On récupère toutes les images du document
var imgs = document.getElementsByTagName('img');
if (imgs != null) {
// Pour chaque image
for (var i=0; i<imgs.length; i++) {
// On applique une bordure rouge
imgs[i].style.border = "5px red solid";
}
}
Vous devez être identifié pour poster un commentaire.
Copyright © 2000-2012 - www.developpez.com