<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Julien Falque</title>
	<atom:link href="http://julien-falque.fr/fr/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://julien-falque.fr/fr/blog</link>
	<description>Développeur web indépendant sur Aix-en-Provence</description>
	<lastBuildDate>Sun, 01 Aug 2010 16:02:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Internet Explorer : javascript et &lt;base&gt;</title>
		<link>http://julien-falque.fr/fr/blog/2010/08/ie-base-javascript/</link>
		<comments>http://julien-falque.fr/fr/blog/2010/08/ie-base-javascript/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 15:55:06 +0000</pubDate>
		<dc:creator>Julien Falque</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[base]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://julien-falque.fr/fr/blog/?p=113</guid>
		<description><![CDATA[La balise HTML &#60;base&#62; permet de définir l&#8217;URL de base d&#8217;une page, tout URL relatif présent dans la page sera résolu selon cette base et non plus selon l&#8217;adresse de la page elle-même. Ce principe est valable pour les liens vers d&#8217;autres pages mais également les feuilles de style, les fichiers Javascript ou encore les [...]]]></description>
			<content:encoded><![CDATA[<p>La balise HTML &lt;base&gt; permet de définir l&#8217;<abbr title="Uniform Resource Locator" lang="en">URL</abbr> de base d&#8217;une page, tout <abbr title="Uniform Resource Locator" lang="en">URL</abbr> relatif présent dans la page sera résolu selon cette base et non plus selon l&#8217;adresse de la page elle-même. Ce principe est valable pour les liens vers d&#8217;autres pages mais également les feuilles de style, les fichiers Javascript ou encore les images.</p>
<p>Les navigateurs modernes utilisent également cette base en Javascript. En définissant par exemple la base comme étant http://mon-site.com/fr/, le code suivant : <code class="js">window.location.ref = "contact/";</code> chargera la page http://mon-site.com/fr/contact/, quelque soit l&#8217;adresse à laquelle vous êtes. Malheureusement, le mauvais élève qu&#8217;est Internet Explorer (y compris la version 8) ignore totalement la base et vous serez renvoyé sur une page du genre http://monsite.com/fr/articles/2010/08/contact/ et vous obtiendrez une belle erreur 404.</p>
<p>Pour remédier au problème, voici une petite fonction jQuery toute simple qui force la prise en compte de la balise <base> si elle est présente : <code class="js">function location(url) {<br />
	var base = $("base");<br />
	window.location.href = (base ? base.attr("href") : "")+url;<br />
}</code></p>
<p>À noter que le problème est le même avec window.location.replace().</base></p>
]]></content:encoded>
			<wfw:commentRss>http://julien-falque.fr/fr/blog/2010/08/ie-base-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adoucir le scroll des liens internes avec jQuery</title>
		<link>http://julien-falque.fr/fr/blog/2010/04/adoucir-le-scroll-des-liens-internes-avec-jquery/</link>
		<comments>http://julien-falque.fr/fr/blog/2010/04/adoucir-le-scroll-des-liens-internes-avec-jquery/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 22:07:33 +0000</pubDate>
		<dc:creator>Julien Falque</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ancres]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[scroll]]></category>

		<guid isPermaLink="false">http://127.0.0.1/julien-falque/fr/blog/?p=51</guid>
		<description><![CDATA[De plus en plus de sites ajoutent un effet aux liens internes de leurs pages pour rendre le scroll plus attrayant, voici un petit bout de code pour reproduire cet effet grâce à jQuery : $(function() { var scrollElement = $("html"); var scrollValue = scrollElement.scrollTop(); if (scrollElement.scrollTop(scrollValue + 1).scrollTop() == scrollValue) { scrollElement = $("body"); [...]]]></description>
			<content:encoded><![CDATA[<p>De plus en plus de sites ajoutent un effet aux liens internes de leurs pages pour rendre le scroll plus attrayant, voici un petit bout de code pour reproduire cet effet grâce à jQuery : <code class="js">$(function() {<br />
	var scrollElement = $("html");<br />
	var scrollValue = scrollElement.scrollTop();<br />
	if (scrollElement.scrollTop(scrollValue + 1).scrollTop() == scrollValue) {<br />
		scrollElement = $("body");<br />
	}<br />
	else {<br />
		scrollElement.scrollTop(scrollValue);<br />
	}<br />
	$("a[href*=#]").click(function() {<br />
		if (location.hostname+location.pathname+location.search == this.hostname+this.pathname.replace(/^([^\/].*)/, "/$1")+this.search) {<br />
			var hash = "#"+$(this).attr("href").split("#")[1];<br />
			var target = $(hash == "#" ? body : hash);<br />
			if (target.length) {<br />
				var id = target.attr("id");<br />
				target.attr("id", "");<br />
				location.hash = hash;<br />
				target.attr("id", id);<br />
				var to = target.offset().top;<br />
				scrollElement.animate({ scrollTop: to }, {<br />
					duration: Math.abs($(window).scrollTop() - to) * 0.75,<br />
					complete: function() { target.focus(); }<br />
				});<br />
				return false;<br />
			}<br />
		}<br />
	});<br />
});</code></p>
<h4>Fonctionnement</h4>
<ol>
<li>Lignes 2 à 9 : pour faire le scroll, il faudra animer la propriété scrollTop du noeud racine de la page. On pourrait se contenter d&#8217;utiliser le sélecteur &laquo;&nbsp;html,body&nbsp;&raquo; pour couvrir tous les navigateurs mais ça provoque un méchant bug sous Opera. On prend donc &laquo;&nbsp;html&nbsp;&raquo; par défaut ou &laquo;&nbsp;body&nbsp;&raquo; si ça ne fonctionne pas.</li>
<li>Ligne 10 : le sélecteur &laquo;&nbsp;a[href*=#]&nbsp;&raquo; s&#8217;applique à tous les liens de la page dont l&#8217;attribut contient le caractère &laquo;&nbsp;#&nbsp;&raquo;.</li>
<li>Ligne 11 : vérification que la cible est bien sur la page actuelle, dans le cas contraire il n&#8217;y a pas de scroll donc inutile d&#8217;aller plus loin.</li>
<li>Lignes 15 à 18 : la fonction supprime le comportement par défaut du clic. On perd donc le scroll immédiat – comme souhaité – mais aussi la gestion de l&#8217;historique. Cette partie du code sert à rétablir cette dernière.</li>
<li>Lignes 19 à 23 : création du scroll animé, il suffit de changer la valeur du paramètre duration pour changer la durée du scroll. Dans l&#8217;exemple ci-dessus la durée est calculée en fonction de la distance à parcourir.</li>
</ol>
<h4>Problèmes connus</h4>
<p>A cause de la partie gérant l&#8217;historique, le navigateur ne connait plus la cible du lien le temps du clic. Si vous utilisez la pseudo-classe CSS3 :target, le style ne sera pas appliqué du tout dans le cas où l&#8217;utilisateur a cliqué sur le lien ; cela ne pose en revanche aucun problème dans le cas où l&#8217;ancre a été ajoutée manuellement à l&#8217;adresse par l&#8217;utilisateur.<br />
Un autre bug moins gênant mais assez étrange : ce code ne marche pas sous Safari, Chrome ou Opera si la cible est &laquo;&nbsp;#top&nbsp;&raquo;. Là encore parce que le navigateur ne connait plus la cible au moment du clic : pour une raison que j&#8217;ignore, ces navigateurs considèrent que &laquo;&nbsp;#top&nbsp;&raquo; correspond au haut de page si aucun élément n&#8217;a cet identifiant ailleur dans la page. Du coup, au lieu de faire un joli scroll vers la cible, le navigateur se retrouve immédiatement en haut de page. Si vous avez la moindre explication sur ce comportement, n&#8217;hésitez pas à le faire savoir dans les commentaires où sur <a href="http://forum.alsacreations.com/topic-5-47208-1-ChromeSafari--top.html">le thread que j&#8217;ai ouvert sur Alsacréations</a> à ce sujet :)</p>
<h4>Mise à jour le 24/05/2010 à 23:53</h4>
<p>Lorsque la cible est en bas de page, il est fréquent que le scroll s&#8217;arrête avant par manque de place (cible plus petite que la fenêtre du navigateur). Cette modification permet de tenir compte de ce cas particulier, la fin du scroll reste fluide au lieu de s&#8217;arrêter brusquement sans pouvoir aller plus loin. Il suffit de mettre à jour la ligne 19 : <code class="js">$(function() {<br />
	var scrollElement = $("html");<br />
	var scrollValue = scrollElement.scrollTop();<br />
	if (scrollElement.scrollTop(scrollValue + 1).scrollTop() == scrollValue) {<br />
		scrollElement = $("body");<br />
	}<br />
	else {<br />
		scrollElement.scrollTop(scrollValue);<br />
	}<br />
	$("a[href*=#]").click(function() {<br />
		if (location.hostname+location.pathname+location.search == this.hostname+this.pathname.replace(/^([^\/].*)/, "/$1")+this.search) {<br />
			var hash = "#"+$(this).attr("href").split("#")[1];<br />
			var target = $(hash == "#" ? body : hash);<br />
			if (target.length) {<br />
				var id = target.attr("id");<br />
				target.attr("id", "");<br />
				location.hash = hash;<br />
				target.attr("id", id);<br />
				var to = Math.min(target.offset().top, $(document).height() - $(window).height());<br />
				scrollElement.animate({ scrollTop: to }, {<br />
					duration: Math.abs($(window).scrollTop() - to) * 0.75,<br />
					complete: function() { target.focus(); }<br />
				});<br />
				return false;<br />
			}<br />
		}<br />
	});<br />
});</code></p>
]]></content:encoded>
			<wfw:commentRss>http://julien-falque.fr/fr/blog/2010/04/adoucir-le-scroll-des-liens-internes-avec-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intégrer WordPress à un site existant</title>
		<link>http://julien-falque.fr/fr/blog/2010/03/integrer-wordpress-a-un-site-existant/</link>
		<comments>http://julien-falque.fr/fr/blog/2010/03/integrer-wordpress-a-un-site-existant/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 18:38:30 +0000</pubDate>
		<dc:creator>Julien Falque</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[intégrer]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://127.0.0.1/julien-falque/fr/blog/?p=1</guid>
		<description><![CDATA[WordPress a l&#8217;avantage de fonctionner entièrement en PHP y compris pour les thèmes, ce qui le rend assez flexible. C&#8217;est pourquoi il est relativement facile d&#8217;intégrer WordPress à un site existant, pour y apporter un moteur de blog efficace tout en gardant le design du site. Il suffit de créer un nouveau thème et de [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress a l&#8217;avantage de fonctionner entièrement en <acronym title="PHP Hypertext Preprocessor" lang="en">PHP</acronym> y compris pour les thèmes, ce qui le rend assez flexible. C&#8217;est pourquoi il est relativement facile d&#8217;intégrer WordPress à un site existant, pour y apporter un moteur de blog efficace tout en gardant le design du site. Il suffit de créer un nouveau thème et de le bidouiller un peu.</p>
<h4>Le thème WordPress</h4>
<p>Si vous avez bien construit votre site, vous avez probablement des fichiers <span lang="en">header</span> et <span lang="en">footer</span> que vous incluez dans chacune de vos pages ou un système équivalent. WordPress fonctionne également de cette manière avec les fichiers header.php et footer.php du thème. Tout ce que vous avez à faire est de mettre dans ces <span lang="en">templates</span> les instructions pour récupérer vos propres fichiers.</p>
<p>header.php : <code class="php">require_once('chemin/vers/mon/fichier/header.php');</code> et footer.php : <code class="php">require_once('chemin/vers/mon/fichier/footer.php');</code></p>
<p>Dans votre propre <span lang="en">header</span>, vous faites sûrement appel à d&#8217;autres fichiers (configuration, textes, &#8230;). Si ces fichiers contiennent des variables que vous réutilisez un peu partout sur votre site — notamment les textes — celles-ci ne seront pas accessibles dans les fichiers de votre thème et la raison est simple : les variables globales ne sont par défaut pas accessibles à l&#8217;intérieur d&#8217;une fonction, le code exécuté par get_header() n&#8217;a donc pas accès à vos textes et autres variables utiles.</p>
<p>Lorsque vous ne pouvez pas utiliser get_header() dans votre thème, vous devez inclure manuellement les fichiers : <code class="php">// TEMPLATEPATH = chemin du thème<br />
require_once(TEMPLATEPATH.'/header.php');</code></p>
<p>Le principe est le même pour tous les éléments de votre thème à une exception près : les commentaires. Ce <span lang="en">template</span> s&#8217;insère via la fonction comments_template(). Ici cette fonction est obligatoire car en plus de récupérer votre <span lang="en">template</span>, elle va initaliser la plupart des variables dont vous aurez besoin pour afficher les commentaires. Il va donc falloir bidouiller pour accéder à la fois aux variables des commentaires et à vos propres variables, en ajoutant au début de comments.php le code suivant : <code class="php">if (empty($do_comments_template))<br />
{<br />
	return false;<br />
}</code></p>
<p>Ainsi l&#8217;appel à comments_template() permettra d&#8217;initialiser les variables des commentaires sans afficher le <span lang="en">template</span>. Il ne reste plus qu&#8217;à placer le code suivant juste après l&#8217;appel : <code class="php">$do_comments_template = true;<br />
require(TEMPLATEPATH.'/comments.php');</code></p>
<p>Rien ne vous empêche d&#8217;utiliser un autre nom de variable que <var>$do_comments_template</var>, l&#8217;important étant qu&#8217;elle soit initialisée entre la première et la seconde inclusion du <span lang="en">template</span>.</p>
<p>Vous devrez également adapter le <span lang="en">template</span> pour le formulaire de réponse. WordPress mémorise les informations des utilisateurs qui postent des commentaires pour remplir automatiquement le formulaire. Dans les thèmes classiques, ces informations sont stockées dans les variables <var>$comment_author</var>, <var>$comment_author_email</var>, <var>$comment_author_url</var> mais avec la méthode ci-dessous, elles sont perdues. Voici comment les retrouver : <code class="php">$commenter = wp_get_current_commenter();<br />
$comment_author = $commenter['comment_author'];<br />
$comment_author_email = $commenter['comment_author_email'];<br />
$comment_author_url = $commenter['comment_author_url'];</code></p>
<p>Après ça il ne vous reste plus qu&#8217;à adapter le reste du thème à vos feuilles de style. Bien entendu le fichier style.css n&#8217;a plus aucune utilité à partir du moment où vous avez déjà votre propre feuille de style, si ce n&#8217;est éventuellement préciser les informations de votre thème.</p>
<h4>Fonctions WordPress dans vos pages</h4>
<p>Maintenant votre blog est stylé comme votre site mais il manque des éléments dans vos pages. Il faut au moins ajouter des informations dans le <span lang="en">header</span> — le ou les flux <abbr title="Really Simple Syndication" lang="en">RSS</abbr> par exemple — et pour cela vous aurez besoin des fonctions de WordPress : <code class="php">if (!$blog) // Cette page n'est pas une page WordPress (adapter à votre code)<br />
{<br />
	$_post = $_POST;<br />
	$_get = $_GET;<br />
}<br />
require_once('chemin/vers/votre/installation/wordpress/wp-load.php');<br />
if (isset($_get) &amp;&amp; isset($_post))<br />
{<br />
	$_POST = $_post;<br />
	$_GET = $_get;<br />
}</code></p>
<p>Avec ça vous aurez accès aux fonctions telles que bloginfo() ou wp_head(). Ce code, en plus de charger WordPress, va empêcher que celui-ci ne modifie vos données GET ou POST avec son mécanisme <span lang="en">Magic Quotes</span> maison.</p>
<p>Les <span lang="en">Magic Quotes</span> sont une fonctionnalité dont l&#8217;utilisation est déconseillée (<span lang="en">deprecated</span> depuis <acronym title="PHP Hypertext Preprocessor" lang="en">PHP</acronym> 5.3 et supprimée dans <acronym title="PHP Hypertext Preprocessor" lang="en">PHP</acronym> 6). Toutefois, WordPress implémente son propre système en modifiant les données, notamment <var>$_GET</var> et <var>$_POST</var>. Cela fonctionne très bien pour le blog mais avec le code ci-dessus, ce système est appliqué à tout votre site, ce qui peut poser problème si vous avez des formulaires. C&#8217;est pourquoi lorsqu&#8217;on n&#8217;est pas sur une page WordPress on stocke les variables <var>$_GET</var> et <var>$_POST</var> originales pour les rétablir juste après avoir chargé WordPress.</p>
<h4><span lang="en"><abbr title="Uniform Resource Locator">URL</abbr> Rewriting</span></h4>
<p>Vous avez probablement installé WordPress dans un répertoire bien à lui. Si vous souhaitez que l&#8217;<abbr title="Uniform Resource Locator" lang="en">URL</abbr> soit différente vous pouvez le faire via l&#8217;URL Rewriting. Il faut d&#8217;abord indiquer la nouvelle adresse dans les réglages généraux de WordPress. Le champ &laquo;&nbsp;Adresse web du blog&nbsp;&raquo; passe donc de <samp>http://monsite.com/wordpress</samp> à <samp>http://monsite.com/blog</samp>. Il ne reste plus qu&#8217;à mettre un .htaccess à la racine de votre site avec la ligne suivante :<br />
<code>RewriteRule ^blog(/?)(.*)$ wordpress/$2 [L,QSA]</code></p>
]]></content:encoded>
			<wfw:commentRss>http://julien-falque.fr/fr/blog/2010/03/integrer-wordpress-a-un-site-existant/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

