<?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>qvister &#187; php</title>
	<atom:link href="http://qvister.se/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://qvister.se</link>
	<description></description>
	<lastBuildDate>Mon, 06 Sep 2010 12:03:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Server-side Google Analytics</title>
		<link>http://qvister.se/2010/02/02/server-side-google-analytics/</link>
		<comments>http://qvister.se/2010/02/02/server-side-google-analytics/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 11:49:14 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[mobil]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=624</guid>
		<description><![CDATA[In late 2009 Google announced a new Analytics SDK used for tracking events inside iPhone and Android applications. The same release also featured a new method for more accurate tracking running Analytics server-side instead of using JavaScript. This especially comes handy when developing mobile websites. Many older phones suffer from the lack of JavaScript support. [...]]]></description>
			<content:encoded><![CDATA[
<p>In late 2009 Google announced a new Analytics SDK used for tracking events inside iPhone and Android applications. The same release also featured a new method for more accurate tracking running Analytics server-side instead of using JavaScript. This especially comes handy when developing mobile websites.<span id="more-624"></span></p>
<p>Many older phones suffer from the lack of JavaScript support. Which in some cases makes it more complicated to track the user. But running the tracking service server-side will solve this problem easily.</p>
<p>As mentioned earlier Google does offer a server-side solution for Analytics. Sadly enough the documentation is almost non-existing and the only thing provided is some crappy PHP <a href="http://www.google.com/url?sa=D&amp;q=http://www.google.com/analytics/googleanalyticsformobile.zip&amp;usg=AFQjCNEzXGXLA9w0rSdNPKJT-BA0QfJ3MQ">example code</a> to get you started.</p>
<p>Therefor I wrote a simple class in PHP used for interacting with the server-side solution for Analytics. The logic and flow is provided by the existing example code. Below you&#8217;ll find a brief description of the &#8220;<em>flow</em>&#8220;.</p>
<p>A user comes to your site and the url function will generate an uri with all mandatory parameters included. This uri is will be included in the src attribute inside an img element. The browser will then request the uri believing that it&#8217;s an image. The uri will actually be pointing to a executable script. In this script the track function is called. A unique visitor id will be generated and stored inside a cookie. An HTTP-request will be sent to Analytics including all kind of parameters in order to track the user. When the request is done a 1&#215;1 GIF image will be severed in order to satisfy the browser.</p>
<p>The method described above is a quite common way of solving lack of JavaScript related problems.</p>
<p>In order to start using this tracking method you&#8217;ll need to create a new Analytics profile for your website.</p>
<ul>
<li>Create a new profile.</li>
<li>Select &#8220;tracking for a new domain&#8221; or new subdomain if applicable.</li>
<li>Click on the &#8220;Advanced&#8221; tab and choose the mobile option.</li>
<li>Copy your new Analytics ID from the textarea (MO-XXXXXX-XX).</li>
</ul>
<p>The code is available on <a href="http://github.com/mptre/php-ga">GitHub</a> so feel free to fork away! There&#8217;s also a demo included in the repository. Should be just enough to get you started.</p>
<p>To all CodeIgniter fanboys out there. The class works perfectly as a library in CodeIgniter. You just need to make sure to include the uri generated from the url function inside your view. And then point it towards a function in your controller which executes the track function. See the demo inside the repository for further reference.</p>
<p>Happy accurate tracking!</p>
<p><em>Photo credit: <a href="http://www.flickr.com/photos/manfrys/" target="_blank">Antonio Manfredonio</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/02/02/server-side-google-analytics/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Discobelle</title>
		<link>http://qvister.se/2010/01/04/discobelle/</link>
		<comments>http://qvister.se/2010/01/04/discobelle/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 19:32:30 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Discobelle]]></category>
		<category><![CDATA[Uppdrag]]></category>
		<category><![CDATA[emo vote]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=552</guid>
		<description><![CDATA[Idag släpptes äntligen den nya versionen av bloggen Discobelle. Där jag fick nöjet att ansvara för produktionen. Discobelle är en musikblogg som drivs av ett gäng svenskar sedan år 2006. Så här beskriver de själva bloggen. Discobelle.net is a Swedish blog about music. Because we love it, not because we want to cheat anyone out [...]]]></description>
			<content:encoded><![CDATA[
<p>Idag släpptes äntligen den nya versionen av bloggen <a href="http://www.discobelle.net/">Discobelle</a>. Där jag fick nöjet att ansvara för produktionen.<span id="more-552"></span></p>
<p>Discobelle är en musikblogg som drivs av ett gäng svenskar sedan år 2006. Så här beskriver de själva bloggen.</p>
<blockquote><p>Discobelle.net is a Swedish blog about music. Because we love it, not because we want to cheat anyone out of any money. We don’t post albums, just single tracks, remixes and videos.</p></blockquote>
<p>Design togs fram av svensken <a href="http://www.pmkfa.com/">PMKFA</a> (bosatt i Tokyo) och jag ansvarade som tidigare nämnt för produktionen och allmänt WordPress underhåll.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/01/04/discobelle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mipi.se, frågan är fri</title>
		<link>http://qvister.se/2009/11/01/mipi-se-fragan-ar-fri/</link>
		<comments>http://qvister.se/2009/11/01/mipi-se-fragan-ar-fri/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 16:15:11 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[24hbc]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=473</guid>
		<description><![CDATA[24 Hour Business Camp är ett underbart initiativ från Ted Valentin och SSES sida. Det hela går ut på att skapa en webbtjänst på 24 timmar i Yasuragis rofyllda miljö. Förra året deltog jag på distans och skapade tillsammans med Morris Packer, Herman Olsson och Rickard Thorman moco.se på garanterat mindre än 24 timmar. Denna [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://www.24hbc.com/">24 Hour Business Camp</a> är ett underbart initiativ från <a href="http://www.tedvalentin.com/">Ted Valentin</a> och <a href="http://www.sses.se/">SSES</a> sida. Det hela går ut på att skapa en webbtjänst på 24 timmar i <a href="http://www.yasuragi.se/">Yasuragis</a> rofyllda miljö. Förra året deltog jag på distans och skapade tillsammans med Morris Packer, Herman Olsson och Rickard Thorman <a href="http://moco.se/">moco.se</a> på garanterat mindre än 24 timmar. Denna gång befann jag mig tillskillnad från förra gången på plats.<span id="more-473"></span></p>
<p>Idéen till projektet <a href="http://mipi.se/">mipi.se</a> spånades redan fram på konferensen <a href="http://qvister.se/2009/06/30/reboot11/">Reboot</a> av mig och Morris Packer. Grundidéen var helt enkelt att kunna skapa en frågeställning för att sedan skicka ut den till en så stor publik som möjligt. Med andra ord frågan är fri.</p>
<p>Under mina 24 timmar skapade jag ett webbaserat gränssnitt för att skapa frågor och se resultatet som uppdateras i realtid. Användningsområdena är redan så här initialt många. Tänk t. ex. om du anordnar en konferens och vill ha din deltagares svar på en viss fråga. Skapa frågan och visa resultatet en storskärm medhjälp av en projektor. Deltagarna kommer på så sätt kunna följa utvecklingen i realtid.</p>
<p>Det hela byggdes i ramverket <a href="http://codeigniter.com/">Codeigniter</a> som jag verkligen har fattat tycke för den senaste tiden. Plus en hel del JavaScript med <a href="http://qvister.se/tag/jquery/">jQuery</a> som grund.</p>
<p>Framtiden för detta projekt ser ljus ut. <a href="http://www.appcorn.se/">Appcorn</a> har sedan en tid tillbaka tagit fram en &#8220;<em>proof of concept</em>&#8221; iPhone applikation som använder sig av Push-protokollet för att skicka ut frågor.</p>
<p>Gillar mipi.se får du gärna <a href="http://www.24hbc.com/2009/10/rosta-pa-dina-favoriter-fran-24hbc.html">rösta på oss</a>. Eller läs mer om <a href="http://www.24hbc.com/2009/10/mipise.html">bakgrunden</a> till detta projekt.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/11/01/mipi-se-fragan-ar-fri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hyper Island Recruitment Tour</title>
		<link>http://qvister.se/2009/10/16/hyper-island-recruitment-tour/</link>
		<comments>http://qvister.se/2009/10/16/hyper-island-recruitment-tour/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 11:21:28 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Hyper Island]]></category>
		<category><![CDATA[Uppdrag]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[goodold]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=427</guid>
		<description><![CDATA[För tredje året i rad är det dags för Hyper Island att inleda deras rekryteringsprocess som turnerar runt om i världen. Totalt besöks åtta städer i jakten på framtidens talanger. Good Old fick i uppdrag att ta fram en sajt för världsturnén samtidigt som jag fick i uppdrag att ansvara för produktionen. På sajten kan hitta [...]]]></description>
			<content:encoded><![CDATA[
<p>För tredje året i rad är det dags för Hyper Island att inleda deras rekryteringsprocess som turnerar runt om i världen. Totalt besöks åtta städer i jakten på framtidens talanger.<span id="more-427"></span></p>
<p><a href="http://goodold.se/">Good Old</a> fick i uppdrag att ta fram en sajt för världsturnén samtidigt som jag fick i uppdrag att ansvara för produktionen.</p>
<p>På sajten kan hitta mer information om vilka städer som besöks samt ett flertal presentationer av elever som studerar vid Hyper Island. Varje elev representerar en stad och agerar kontaktperson för staden. På så sätt kan man få personligare kontakt med skolan om man går tankarna att söka till nästa års utbildningar. Det hela presenteras medhjälp av en <a href="http://code.google.com/intl/sv-SE/apis/maps/index.html">Google Maps</a> karta för att öka interaktionen.</p>
<p>Kartan kompletteras med ett bloggflöde samt ett ansökningsformulär. Formuläret &#8220;<em>pratar</em>&#8221; med Hyper Islands ansökningsdatabas medhjälp av ett API som togs fram av de trevliga typerna på <a href="http://www.samurajdata.se/">Samuraj Data</a> som även utvecklat ansökningsdatabasen.</p>
<p>Det var kul att få chansen att jobba med Google Maps, var länge sedan sen sist. Ännu en gång slogs jag av att det går att göra så oerhört mycket med relativt lite kod. All befintlig funktionalitet kan byggas på och många av de grafiska elementen för att navigera runt kan man ta kontroll över. Till min glädje visade det sig även Google Maps egna JavaScript API fungerar bra ihop med <a href="http://qvister.se/tag/jquery/">jQuery</a>. Om du själv är sugen på att börja jobba med Google Maps så har jag vid det här laget samlat på mig en del <a href="http://delicious.com/mptre/google+maps">bokmärken</a> som kan komma väl till använding.</p>
<p>Sajten hittar du på <a href="http://tour.hyperisland.se/">tour.hyperisland.se</a> och jag önskar Hyper Island lycka till med rekryteringen!</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/10/16/hyper-island-recruitment-tour/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SoundCloud API wrapper med stöd för OAuth</title>
		<link>http://qvister.se/2009/09/18/soundcloud-api-wrapper-med-stod-for-oauth/</link>
		<comments>http://qvister.se/2009/09/18/soundcloud-api-wrapper-med-stod-for-oauth/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 18:49:39 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[soundcloud]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=408</guid>
		<description><![CDATA[Tidigare i år skrev jag ihop en API wrapper för SoundCloud i PHP. Idag kan jag med glädje meddela att denna wrapper har utökats med stöd för det nya OAuth protokollet. Öppen autentisering är hetare än någonsin. Bland de främsta i ledet står det nya protokollet OAuth, som ur ett perspektiv gör det möjligt för dig [...]]]></description>
			<content:encoded><![CDATA[<p><a style="text-decoration: none;" href="http://qvister.se/wp-content/uploads/2009/09/soundcloud_logo.gif"></a></p>
<p>Tidigare i år skrev jag ihop en API wrapper för <a href="http://soundcloud.com">SoundCloud</a> i PHP. Idag kan jag med glädje meddela att denna wrapper har utökats med stöd för det nya <a href="http://oauth.net">OAuth</a> protokollet.<span id="more-408"></span></p>
<p>Öppen autentisering är hetare än någonsin. Bland de främsta i ledet står det nya protokollet OAuth, som ur ett perspektiv gör det möjligt för dig som användare att logga in och komma åt t ex. ditt SoundCloud-konto från vilken sajt som helst (förutsagt att stöd för OAuth finns). Fördelarna är många, inte minst p.g.a. att vi slipper komma ihåg en uppsjö av användarnamn och lösenord. Ett praktiskt exempel är Twitter som tack vare sitt API med stöd för OAuth har lyckats skapa ett helt ny flora med tredjepartsutvecklade tjänster.</p>
<p>För er som inte känner till SoundCloud sen tidigare så kan jag berätta att det är fantastik tjänst utvecklad av musiker för musiker. Flickr kretsar kring bilder, Youtube kring video och SoundCloud kring musik. Tjänsten är utvecklad av två svenska smartskallar vid namn Alexander Ljung och Eric Wahlforss.</p>
<p>Att SoundCloud är en succé råder det inget tvivel om. Med drygt 300 000 användare och 2,5 miljoner euro i riskkapital ser framtiden oerhört ljus ut. Om du vill läsa mer om deras framgångsresa rekommenderar jag <a href="http://www.arcticstartup.com/2009/04/17/soundcloud-made-the-big-dream-a-reality/">ArcticStartups</a> bloggpost från i våras.</p>
<p>Timingen för releasen av denna wrapper kunde inte ha varit bättre. Ikväll inleds nämlingen <a href="http://berlin.musichackday.org">Music Hack Day</a> i Berlin där en massa musiker och utvecklare samlas under samma tak för att skapa musikrelaterade tjänster och program. Jag hoppas att min wrapper kan komma till användning!</p>
<p>API wrappern finns tillgänglig på <a href="http://github.com/mptre/php-soundcloud">GitHub</a> samt ett <a href="http://wiki.github.com/mptre/php-soundcloud/getting-started">exempel</a> på hur du kommer igång. Jag satte även ihop en liten demo applikation som finns att pröva på <a href="http://soundcloud.qvister.se">soundcloud.qvister.se</a>. SoundCloud själva har även skrivit om wrappern deras <a href="http://blog.soundcloud.com/2009/09/18/php-wrapper/">egna blogg</a>.</p>
<p><strong>Uppdatering: </strong>i ett nyligen publicerat inlägg hos självaste <a href="http://uk.techcrunch.com/2009/09/21/the-music-industry-should-learn-from-musichackday/">TechCrunch</a> länkas det till wrappern min!</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/09/18/soundcloud-api-wrapper-med-stod-for-oauth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Västra City</title>
		<link>http://qvister.se/2009/08/31/vastra-city/</link>
		<comments>http://qvister.se/2009/08/31/vastra-city/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 09:42:31 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Jernhusen]]></category>
		<category><![CDATA[Uppdrag]]></category>
		<category><![CDATA[bkcsthlm]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[stockholm]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=366</guid>
		<description><![CDATA[Västra City är en ny spännande stadsdel som sträcker sig från Tegelbacken till Karlbergs station. Jernhusen och Stockholm stad har tillsammans tagit fram en utvecklingsplan för området som innehåller två etapper, 2012 och 2020 samt en vision för 2030. I korthet innefattar projektet en överdäckning av spårområdet som i sin tur gör det möjligt att [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://vastracity.se/">Västra City</a> är en ny spännande stadsdel som sträcker sig från Tegelbacken till Karlbergs station. <a href="http://www.jernhusen.se/">Jernhusen</a> och <a href="http://www.stockholm.se/">Stockholm stad</a> har tillsammans tagit fram en utvecklingsplan för området som innehåller två etapper, 2012 och 2020 samt en vision för 2030.<span id="more-366"></span></p>
<p>I korthet innefattar projektet en överdäckning av spårområdet som i sin tur gör det möjligt att binda samman Stockholm city med Vasastaden. Stockholm skulle tack vare detta projekt få en förnyad central stadsdel som vidgar stadskärnan och gör den mer attraktiv genom att skapa fler arbetsplatser, butiker och bostäder.</p>
<p>Reklambyrån <a href="http://www.bkcsthlm.se/">BKC STHLM</a> fick i uppdrag att skapa en informativ och interaktiv sajt för detta projekt. Jag ansvarade till viss del för det grafiska och hela produktionen av webben. Sajten är byggd i PHP och innehåller en hel del JavaScript (med <a href="http://jquery.com/">jQuery</a> som grund) för att göra hela upplevelsen lite trevligare för besökaren. Jag bestämde mig även för att dela med mig av funktionen som räknar upp årtalet när man navigerar mellan projektets olika etapper. Denna funktion eller plugin som det kallas går under namnet <a href="http://github.com/mptre/jquery-jcountup">jCountUp</a> och finns tillgänglig på GitHub. Pluginen är helt och hållet fri, kom gärna med feedback om det är något du saknar!</p>
<p>Som en liten bonus gick arkitektbyrån <a href="http://www.rosenbergs.se">Rosenbergs Arkitekter</a> med på att ladda upp alla konceptskisser på <a href="http://www.flickr.com/photos/vastracity/">flickr</a>.</p>
<p><em>Thumbnailen tillhörande detta inlägg är lånad ifrån <a href="http://www.flickr.com/photos/vastracity/3637806573/">Rosenbergs Arkitekter</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/08/31/vastra-city/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bygg kampanjsajter med WordPress</title>
		<link>http://qvister.se/2009/08/06/bygg-kampanjsajter-med-wordpress/</link>
		<comments>http://qvister.se/2009/08/06/bygg-kampanjsajter-med-wordpress/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 10:05:41 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[kampanj]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=266</guid>
		<description><![CDATA[Som webbutvecklare har man med stor sannolikhet byggt en del kampanjsajter genom åren. Många kampanjsajter kretsar kring någon form av tävling eller användargenererat innehåll på ett eller annat sätt. Till min glädje har jag på den senaste tiden upptäck att WordPress fungerar som en perfekt grund till dessa sajter. I detta inlägg tänkte jag visa [...]]]></description>
			<content:encoded><![CDATA[<p>Som webbutvecklare har man med stor sannolikhet byggt en del kampanjsajter genom åren. Många kampanjsajter kretsar kring någon form av tävling eller användargenererat innehåll på ett eller annat sätt. Till min glädje har jag på den senaste tiden upptäck att WordPress fungerar som en perfekt grund till dessa sajter. I detta inlägg tänkte jag visa hur man kan gå tillväga, därav kommer det bli mycket teknisk &#8220;<em>mumbo-jumbo</em>&#8221; för den oinvigde.<span id="more-266"></span></p>
<p>Till både <a href="http://qvister.se/2009/05/11/inga-lojliga-bilresor/">inga löjliga bilresor</a> och <a href="http://qvister.se/2009/07/17/sveriges-basta-place-brand-2009/">place brand</a> har jag använt denna metod som beskrivs nedan. Visst kan man istället använda sig av t ex, <a href="http://wordpress.org/extend/plugins/tdo-mini-forms">TDO Mini Forms</a> men jag gillar att ha full kontroll över processen.</p>
<p>Jag är övertygad över att fler än jag har valt WordPress som verktyg till kampanjsajter, t ex. <a href="http://www.tubemusic.se/">Nokia Tube music</a> och <a href="http://www.telefonjacknejtack.se/">Telefonjack? Nej tack</a>. Hjälp mig gärna med att fylla på listan!</p>
<p>Principen är ganska enkel. Vad vi vill åstadkomma är att gemene besökare ska kunna posta ett inlägg (eller tävlingsbidrag) utan att behöva logga in. Detta inlägg ska sedan sparas ned som ett helt vanligt inlägg plus information om användaren. Inlägget sparas som ett utkast per automatik så att administratörerna kan granska det innan publicering. På detta vill vi gärna ha ett skydd emot elak spam och någon form av validering av datan. Så här kan flödet beskrivas.</p>

<p><strong>1. Användaren skickar in sitt bidrag.</strong><br />
Utifrån formuläret vi har skapat skickar användaren in sitt bidrag för granskning.</p>
<p><strong>2. Bidraget körs via Akismet.</strong><br />
All data vi får in ifrån användaren körs via <a href="http://akismet.com/">Akismet</a> för att avgöra om det är spam eller ej. Om det visar sig vara spam avfärdar vi helt enkelt användaren. Om inte går vi vidare till nästa steg.</p>
<p><strong>3. Spara ned bidrag som ett utkast.</strong><br />
Allt verkar stå rätt till och vi sparar slutligen ner bidraget i vår databas på servern.</p>
<p><strong>4. Meddela användaren att bidraget har tagits emot.</strong><br />
Meddela användaren att bidraget har tagits emot på ett eller annat sätt. Detta kan man göra på flera sätt, ett simpel meddelande som presenteras för användaren eller per e-post.</p>
<p>Nu när vi har en bra överbild över vad vi vill åstadkomma är det dags att skrida till verket.</p>
<p>Vad vi först behöver är ett formulär som användaren kan använda för att posta sitt bidrag. Vi behöver en titel och motivering plus lite information om användaren, som t ex. namn, e-post och telefonnummer. Formuläret nedan innehåller allt vi behöver. Tyvärr så strippar WordPress bort <a href="http://sv.wikipedia.org/wiki/Indentering">indenteringen</a>.</p>
<pre>&lt;form action="" method="post"&gt;
 &lt;fieldset&gt;
 &lt;p&gt;
 &lt;legend&gt;Ditt bidrag&lt;/legend&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_title"&gt;Titel&lt;/label&gt;
 &lt;input type="text" name="campaign[post_title]" id="campaign-post_title" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_content"&gt;Motivering&lt;/label&gt;
 &lt;textarea name="campaign[post_content]" id="campaign-post_content" rows="8" cols="40"&gt;&lt;/textarea&gt;
 &lt;/p&gt;
 &lt;/fieldset&gt;
 &lt;fieldset&gt;
 &lt;p&gt;
 &lt;legend&gt;Om dig&lt;/legend&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_author_name"&gt;Namn&lt;/label&gt;
 &lt;input type="text" name="campaign[post_author_name]" id="campaign-post_author_name" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_author_email"&gt;Email&lt;/label&gt;
 &lt;input type="text" name="campaign[post_author_email]" id="campaign-post_author_email" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_author_phone"&gt;Telefon&lt;/label&gt;
 &lt;input type="text" name="campaign[post_author_phone]" id="campaign-post_author_phone" /&gt;
 &lt;/p&gt;
 &lt;/fieldset&gt;
 &lt;p&gt;
 &lt;input type="submit" name="campaign[submit]" value="Posta" id="campaign-submit" /&gt;
 &lt;/p&gt;
&lt;/form&gt;</pre>
<p>Postdatan som skickas när användaren klickar på &#8220;<em>Posta</em>&#8221; måste behandlas av en funktion eller dylikt. I detta fall använder vi oss av en funktion. Personligen föredrar jag att placera denna funktion i functions.php tillhörande temat. Vad funktionen gör är att kolla av om någon har fyllt i formuläret och skickat in uppgifterna. Denna kontroll utförs vid varje pageload med hjälp av WordPress egna funktion <a href="http://codex.wordpress.org/Function_Reference/add_action">add_action</a> som gör det möjligt att binda en funktion till en viss händelse (en s.k. hook). I detta fall binder vi funktionen till &#8220;<em>init</em>&#8221; som står för initialisering (pageload). Det första funktionen gör är att stämma av om postdatan vi söker verkligen har skickats eller inte. Om inte avbryter vi operationen omgående.</p>
<pre>&lt;?php
function mytheme_add_post() {
    global $micro_akismet;

    if (!isset($_POST['campaign']['submit'])) {
        return;
    }
}
add_action('init', 'mytheme_add_post');
?&gt;</pre>
<p>Om man vill kontrollera vissa uppgifter som t ex. att den ifyllda e-postadressen verkligen är en riktig e-postadress ska det ske nu. Förutsagt att man inte gör det innan formuläret skickas med hjälp av JavaScript.</p>
<p>Nästa steg är att kontrollera att uppgifterna vi har fått inte är spam. Detta görs enklast med hjälp av Akismet. Som du säkert redan vet finns det från start ett inbyggt stöd för Akismet när det gäller kommentarerna i WordPress. Dock har jag kommit fram till det är enklare att använda sig <a href="http://vanhegan.net/">Gaby Vanhegans</a> <a href="http://vanhegan.net/software/akismet/">MicroAkismet</a> klass. Jag har själv modifierat klassen lite för att göra det enklare att använda sig av den i WordPress. Denna plugin finns tillgänglig för nedladdning på <a href="http://github.com/mptre/wp-microakismet">GitHub</a>. Observera att denna plugin kräver att du har Akismet pluginen aktiverad och konfigurerad. Efter att både Akismet och MicroAkismet pluggarna är aktiverade och klara kan vi äntligen göra en bedömning om uppgifterna vi fått är spam eller ej.</p>
<pre>$post_data = $_POST['campaign'];
$vars = array(
    'comment_content' =&gt; $post_data['post_content'],
    'comment_author' =&gt; $post_data['post_author_name'],
    'comment_author_email' =&gt; $post_data['post_author_email']
);

if ($micro_akismet-&gt;is_spam($vars)) {
    // We caught a spammer.
} else {
    // Everything's alright.
}</pre>
<p>Om allt är frid och fröjd (ingen spam) kan vi spara ned uppgifterna som ett inlägg med hjälp av funktionen <a href="http://codex.wordpress.org/Function_Reference/wp_insert_post">wp_insert_post</a>. Denna funktion tar en array innehållandes en massa argument som första och enda parameter. Vi vill spara inlägget men inte publicera det på direkten för att ge administratörerna en chans att bedöma om inlägget ska publiceras eller inte. Värt att notera är att  vi inte behöver escape:a den inkommande datan eftersom wp_insert_post gör det i syfte att skydda mot <a href="http://en.wikipedia.org/wiki/Sql_injections">SQL-injektioner</a> och annat otyg.</p>
<pre>$new_post = array(
    'post_title' =&gt; $post_data['post_title'],
    'post_content' =&gt; $post_data['post_content'],
    'post_status' =&gt; 'pending',
    'post_author' =&gt; 2,
    'post_category' =&gt; array(10)
);

if ($post_id = (int)wp_insert_post($new_post)) {
    // Post inserted successfully.
} else {
    // Something went wrong.
}</pre>
<p>Det kan vara bra att sätta upp ett användarkonto som får agera skribent åt alla bidrag. Byt ut post_author värde mot användarens id-nummer. Detsamma gäller även kategorier. Man vill med stor sannolikhet tilldela inlägget kategorin Tävling eller liknande. Notera att post_category argumentet alltid måste vara en array, även fast det bara handlar om en kategori. Byt ut post_category&#8217;s värde mot id-numret på din eller dina kategorier. För en fullständig dokumentation över alla tillgängliga argument rekommenderar jag dig att läsa igenom dokumentation för funktionen hos <a href="http://codex.wordpress.org/Function_Reference/wp_insert_post">WordPress</a>.</p>
<p>Nu när inlägget är har sparats vill vi också spara ner uppgifterna om skribenten. Detta gör vi enklast med hjälp av WordPress egna <a href="http://codex.wordpress.org/Custom_Fields">custom fields</a>. På så sätt försäkrar vi oss om att uppgifterna endast tillhör vårt nyligen sparade inlägg.</p>
<pre>&lt;?php
$post_author = array(
    'post_author_name' =&gt; $post_data['post_author_name'],
    'post_author_email' =&gt; $post_data['post_author_email'],
    'post_author_phone' =&gt; $post_data['post_author_phone']
);

foreach ($post_author as $key =&gt; $val) {
    add_post_meta($post_id, $key, $val);
}
?&gt;</pre>
<p>Om du sedan i ditt tema vill visa upp t ex. skribentens namn kan du använda dig av funktionen <a href="http://codex.wordpress.org/Custom_Fields">get_post_meta</a>. Notera denna funktion måste användas innanför <a href="http://codex.wordpress.org/The_Loop">post-loopen</a>.</p>
<pre>&lt;?php echo get_post_meta($post-&gt;ID, 'post_author_name', TRUE); ?&gt;</pre>
<p>Då var det (nästan) klart! Personligen föredrar jag att &#8220;<em>ajax:ifera</em>&#8221; mina formulär för att skapa en trevligare upplevelse. Detta görs enklast med hjälp av <a href="http://jquery.com/">jQuery</a> och <a href="http://malsup.com/jquery/form/">jForm</a>. Om du bestämmer dig för att använda Ajax är det bra att skicka tillbaka en respons lätt kan tolkas med JavaScript. JSON är rätt det rätta valet för detta jobb. Så här kan en respons se ut i vår funktion.</p>
<pre>&lt;?php
$response = array(
    'status' =&gt; 1,
    'message' =&gt; 'Your post has been submitted!'
);

die(print(json_encode($response)));
?&gt;</pre>
<p>Jag har satt ihop ett demo med all kod ovan, baserat på WordPress default tema. Glöm inte heller att installera <a href="http://github.com/mptre/wp-microakismet">MicroAkismet</a> pluginen innan.</p>
<p><a href="http://qvister.se/wp-content/uploads/qvister_campaign_theme.zip">Ladda ner demot här</a></p>
<p>Det här är min första renodlade guide. Därav uppskattas all form av feedback och konstruktiv kritik. Gör gärna din röst hörd bland kommentarerna om du har synpunkter eller frågor.</p>
<p><em>Thumbnailen tillhörande detta inlägg är lånad ifrån <a href="http://www.flickr.com/photos/jeremygetscash/2648946793/">jmaclynn</a>.<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/08/06/bygg-kampanjsajter-med-wordpress/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Namnsdagsbot på twitter</title>
		<link>http://qvister.se/2009/01/17/namnsdagsbot-pa-twitter/</link>
		<comments>http://qvister.se/2009/01/17/namnsdagsbot-pa-twitter/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 14:50:34 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=115</guid>
		<description><![CDATA[På min egen namnsdag (17:e januari) slog tanken mig vilken dålig koll åtminstone jag har på allas namnsdagar. Samma dag började jag söka runt efter ett RSS-flöde eller liknande som tillhandahöll alla svenska namnsdagar. Till min glädje fann jag dagensnamnsdag.nu. Ett RSS-flöde är dock inte det ultimata sättet att hålla koll på alla namnsdagar. Varför [...]]]></description>
			<content:encoded><![CDATA[
<p>På min egen namnsdag (17:e januari) slog tanken mig vilken dålig koll åtminstone jag har på allas namnsdagar. Samma dag började jag söka runt efter ett RSS-flöde eller liknande som tillhandahöll alla svenska namnsdagar. Till min glädje fann jag <a href="http://www.dagensnamnsdag.nu">dagensnamnsdag.nu</a>.<span id="more-115"></span></p>
<p>Ett RSS-flöde är dock inte det ultimata sättet att hålla koll på alla namnsdagar. Varför inte låta informationen komma till en istället? Med detta i åtanke skrev jag ihop en enkel twitterbot som varje dag berättar om vem eller vilka som har namnsdag. Om du följer <a href="http://twitter.com/namnsdag">namnsdag</a> på twitter gratulerar den även dig på din egen namnsdag.</p>
<p>För den tekniskt intresserade är det ett skript skrivet i PHP som parse:ar RSS-flödet från <a href="http://www.dagensnamnsdag.nu">dagensnamnsdag.nu</a> och twittrar sedan via twitter egna API. Skriptet körs i en crontab som utförs 01:00 varje dag.</p>
<p>Så vill du bli kvitt alla pinsamma situationer där du har glömt bort eller helt och hållet missat dina nära och käras namnsdagar? Följ då <a href="http://twitter.com/namnsdag">namnsdag</a> på twitter!</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/01/17/namnsdagsbot-pa-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Korta.nu, gör dina långa länkar korta</title>
		<link>http://qvister.se/2008/11/01/korta-nu-gor-dina-langa-lankar-korta/</link>
		<comments>http://qvister.se/2008/11/01/korta-nu-gor-dina-langa-lankar-korta/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 09:59:13 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[applikation]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=176</guid>
		<description><![CDATA[Korta.nu är en URL-förkortare som fungerar precis på samma sätt som originalet TinyURL. Tjänsten är förövrigt min första renodlade och publika webbapplikation. Idéen grundade sig i frågan &#8220;Hur svårt kan det vara att bygga en URL-förkortare?&#8221; och inte minst p.g.a. avsaknaden av en bra svensk URL-förkortare. En helg senare hade jag en färdig applikation och [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://korta.nu/">Korta.nu</a> är en URL-förkortare som fungerar precis på samma sätt som originalet <a href="http://tinyurl.com/">TinyURL</a>. Tjänsten är förövrigt min första renodlade och publika webbapplikation.<span id="more-176"></span></p>
<p>Idéen grundade sig i frågan &#8220;Hur svårt kan det vara att bygga en URL-förkortare?&#8221; och inte minst p.g.a. avsaknaden av en bra svensk URL-förkortare. En helg senare hade jag en färdig applikation och domänen korta.nu visade sig vara ledig. Idag används tjänsten ganska flitigt, inte minst på <a href="http://search.twitter.com/search?q=korta.nu+filter%3Alinks">Twitter</a>.</p>
<p>Tjänsten kompletteras med en bookmarklet som gör det oerhört enkelt att förkorta länkar med en knapptryckning och en Mac OS X <a href="http://korta.nu/korta.nu-wdgt.zip">Dashboard widget</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2008/11/01/korta-nu-gor-dina-langa-lankar-korta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
