28 maj kommer Laravel 4 – på riktigt

Det är spännande tider för Laravel, MVC-projektet som på senare tid har seglat upp som ett av det mer intressanta php-rameverksprojekten. Var beror det på? Dels har använder man sig av en väl känd arkitektur som många tycker om och snabbt förstår, dels så har det alltid varit väl dokumenterat men framföra allt så har det gjort php.utveckling till något njutbart igen.

Syntaxen är superfin, orm-klasserna gör det rails-enkelt att hämta och returnera data, Composer gör det underbart enkelt att uppdatera och utöka/integrera. Laravel är helt enkelt väldigt lätt att tycka om.

Så vad kommer då för godis i den slutgiltiga version 4?

Hantering av köer, som gör att du kan flytta bort lite tyngre jobb från dina vanliga sidrequests, till exempel skicka mail eller olika typer av meddelanden.

Queue::push('SendEmail', array('message' => $message));

Cachen har fått sektioner, vilket gör att du kan gruppera entiteter i större ”klumpar” och sedan ta bor alla dessa vid samma tillfälle.

Cache::section('people')->put('John', $john);

Ta ner appen för service, enkel men bra om man vill uppdatera.

App::shutdown

Optimering av klasser som laddar via.

artisan optimize

En hel del nya helpers för form och string.

echo Form::select('size', array('L' => 'Large', 'S' => 'Small'));

Eloquent har även den fått endel uppdateringa som till exempel, Touching Parent Timestamps, där man på ett enkelt sätt kan uppdatera relaterade tabellers timestamp.

protected $touches = array('post');

”Mjuk radering” där man inte tar bort ett record vid delete utan att man iställer lägger till en deleted_at i tabellen. Sedan man kan köra en restore på sitt record och återskapa posten.

protected $softDelete = true;

$user->restore();

Detta är bara ett litet smakprov på vad som kommer och vill man själc läsa changloggen så finns den här.

Kodat och resonerat i Mars

Mars är snart slut och kodmässigt har de senaste 30 dagarna bjudit på lite insikter. Generellt har det varit en bra månad, förutom att det varit -2 grader och snöstorm mest hela tiden.

1# Designa för tablet first
Jag ser i loggarna på mina projekt att allt fler använder mobile enheter för att surfa med. Själv gör jag det hela tiden. Datorn använder jag att bygga med, Tablet för att använda tjänster och mobilen för att snabbkolla nyheter. Jag är knappast inte och det säger mig att man gör rätt i att alltid leverera en riktigt bra upplevelse på Ipad och Tablets.

bild

2# Beta är beta
Jag använder just nu flera olika projekt som är i beta. Bloggen går på WordPress 3.6-alpha-23797 och Lyriken på Laravel4 beta 3, ett annat hemligt projekt går på Phalcon 0.9. Det är kul och bra att vara uppdaterad men den senaste tiden har jag råkat ut för krascher, och då är det inte lika kul.

3# WordPress kod diskuteras
Jag använder wp och gillar det väldigt mycket. Backend är superenkelt och det går snabbt att bygga pluginer och funktionallitet. Man kan dock inte blunda för kodbasen och arkitekturen som numera har några år på nacken. Medan Drupal och Joomla har gjort omfattande strukturella ändringar (mer MVC-orienterade) har wp inte varit fullt så offensiva. Om detta skriver Henri Bergius i bloggposten Why WordPress needs to get Decoupled, intressant.

4# Uppdaterat
- Sticky texter, under rubriken utvalda
- Cache på meddelande
- Samtliga Macros omskriva i en egen klass
- Meddelande har fått bättre feedback
- Lagt till papperskorg, istället för att radera
- Omdesignad textsida, så författarens bild visas tydligt
- Mail hanmar inte längre i spam
- Inloggning med Facebook + skapa nytt konto med Facebook
- Kört jsLInit + php_sniffer på allt, och rättat massa små syntaxfel

Pronto – jquery plugin för att ladda sidor snabbare

Alla vill ladda webbsidor snabbare, inte mist i mobilen där laddtiden ofta försämras av en lägre bandbredd. Ett sätt att göra detta på är att inte ladda hela sidan utan bara det som faktiskt ändras.

Biblioteken Pjax och Turbolinks har funnits ett tag och används just för detta. Båda gör sitt jobb men jag tänkte puffa för en liten och väldigt bra jQuery-plugin som heter Pronto.

Jag använder pronto på Lyriken.se och upplevelsen är absolut förbättrad. Det går snabbare och jag slipper dra in fonter, javascript och css så fort en sida ska visas.

Man behöver givetvis jquery och därefter pronto. Sedan har jag lagt följande kod på sidor där jag vill använda pronto.

$(document).ready(function(){
$.pronto({
selector: "a:not(.no-pronto)"
});
$(window).on("pronto.render", init_pronto_events);
});

Nu är alla länkar utom de som har en .no-pronto i href:en aktiva. Via metoden pronto-render kan jag se till att lägga till de events jag vill ha på sidor som pronto hämta. OCh vill man till exempel ta bort events gör man det via pronto.load.

function init_pronto_events() {
init_my_stuff();
}

Laravel och mitt macro för cache

Jag tycker väldigt bra om Laravel, och en av de verkliga styrkorna är ramverkets möjlighet att göra så kallade custom macros, ofta kallat helpers eller view helpers. Macros är små metoder som man kan skriva och sedan återanvända på många olika ställen. Det finns en del inbyggda och man kan enkelt skapa egna.

Vill man skriva ut en img-tag kan man till exempel använda detta:

echo HTML::image('img/smile.jpg', $alt_text);

Man vad har detta med cache att göra? Jo, på en av de sajter jag jobbar med behöver jag rendera alla sidor i realtid. Det är en sajt där användarna loggar in och varje enskild sida är helt unik till varje besökare. Skulle en användare uppdatera sitt namn måste flera hundra sidor ändras (om hela sidor cachas). Här behöver jag en helt annan lösning.

Jag har byggt ett macro som tar emot några få parametrar och den ser ut så här.

/*
* Return a fragment of a user
* Usage HTML::user_fragment($id,'user_name')
*
*/
HTML::macro('user_fragment', function($id,$fragment){
$user = User::getUser($id);
if(isset($user->$fragment))
return e($user->$fragment);
});

Jag skickar in en användares id samt vilket fält från databasen som jag vill ha tillbaka. Objektet $user är cachat och på alla sidor som ska visa en användares namn används samma objekt. Ändrar man något i databasen, till exempel användarens namn så återspeglas ändringen omedelbart på alla sidor.

Macron i Laravel kan användas både i vyer och i modeller så var man än behöver få ut data ur objektet $user kan man använda macrot, superbra!

Metoden User::getUser ser ut så här.

public static function getUser($id){
return (self::getRequestCache($id) ? self::getRequestCache($id) : self::getUserFromDb($id));
}

getRequestCache kollar om samma $user redan har returnerats ut tidigare på sidan (i samma request), och då redan finns tillgänglig i en variabel. Saknas objektet använder jag getUserFromDb(); som hämtar ut objektet och skapar cahcen med Laravel Cache::remember.

På så sätt ser jag till att cacha alla viktiga objekt och jag kan samtidigt rendera alla sidor helt dynamiskt.

Jag kastar in lite fler användbara Larave-macros som ni gärna får använda.

Denna skapar länkar i en text.

/**
 * Try to create links in text
 * usage HTML::make_links($text);
 */
HTML::macro('make_links', function($text){
	$text = preg_replace(
		array(
   			'/(^|\s|>)(www.[^<> \n\r]+)/iex',
   			'/(^|\s|>)([_A-Za-z0-9-]+(\\.[A-Za-z]{2,3})?\\.[A-Za-z]{2,4}\\/[^<> \n\r]+)/iex',
   			'/(?(?=<a[^>]*>.+<\/a>)(?:<a[^>]*>.+<\/a>)|([^="\']?)((?:https?):\/\/([^<> \n\r]+)))/iex'
 		), array(
			"stripslashes((strlen('\\2')>0?'\\1<a href="\&quot;http://\\2\&quot;" target="\&quot;_blank\&quot;">\\2</a> \\3':'\\0'))",
   			"stripslashes((strlen('\\2')>0?'\\1<a href="\&quot;http://\\2\&quot;" target="\&quot;_blank\&quot;">\\2</a> \\4':'\\0'))",
   			"stripslashes((strlen('\\2')>0?'\\1<a href="\&quot;\\2\&quot;" target="\&quot;_blank\&quot;">\\3</a> ':'\\0'))",
		), $text
	);
	return $text;
});

Och den här använder jag för att leverera speciella styles till ie8 och ie9.

/**
 * This handle styling, check for user agent and send the correct one
 * to the Assets lib
 */
HTML::macro('page_css', function($file){

	if(!isset($file))
		return;

	if( stristr('MSIE 8.0', $_SERVER['HTTP_USER_AGENT']) OR stristr('MSIE 9.0', $_SERVER['HTTP_USER_AGENT'])){
		Assets::css($file . '-ie');
	} else {
		Assets::css($file);
	}

	return Assets::renderCss();

});

Jag hoppas ha inspirerat några till att bygga egna macros och framför allt till att använda Laravel.

Enkel pakethantering med Composer

Pakethantering har historiskt inte varit fantastiskt i php-världen. Det beror bland annat på att utvecklare har gjort sina klasser och funktioner på olika sätt och då har det varit svårt att få dem fungera tillsammans. Drupal har haft en helt egen kodstandard som inte fungerat med Zend Framework osv. Jo, man kan skriva en wrapper och lösa problemet men…

Vore det inte bättre om php-klasser fungerade tillsammans på ett väldigt enkelt sätt? Självklart vore det så.

Lösningen finns och den heter Composer (och PSR-0). Det är en pakethantering för php och hanterar beroenden mellan klasser. Man kan säga att Composer klistrar ihop dina egna klasser med andras, underbart och väldigt användbart.

Composer har två grundbultar, dels repot Packagist som listar paket (drygt 4000 just nu) du kan inkludera i ditt projekt. Och dessutom finns en terminal-applikation.

För att installera Composer använder du terminalen. Gå till rooten (förmodligen webb-rooten) i ditt projekt och curla hem en .phar.

curl -s getcomposer.org/installer | php -d detect_unicode=Off

Därefter skapar du en composer.json och lägger denna på samma ställe som composer.phar nu ligger i, dvs i rooter i ditt projekt. I json-filen specar du vilka paket du vil ha.

{
  "require": {
    "imagine/Imagine": "dev-develop",
    "swiftmailer/swiftmailer": "4.2.x-dev",
    "monolog/monolog": "1.0.0"
  }
}

För att hämta hem paketen kör du.

php composer.phar install

Och för att i framtiden uppdatera paketen och se till att du har senaste versionen kör du

php composer.phar update

Nu kan du autoladda paketen i ditt projekt med hjälp av.

<?php require_once __DIR__ . '/vendor/autoload.php'; ?>

Skulle något något av dina paket ha ytterligare beroende hanterar Composer detta och ser till att även dessa paket laddas hem och blir tillgängliga.

Läs mer här.

http://nelm.io/blog/2011/12/composer-part-1-what-why/

http://blog.fortrabbit.com/handle-your-dependencies-with-php-composer/

Lyriken beta närmar sig

Lyriken.se närmar sig sakta en öppen beta. Förhoppningsvis ska jag vara klar med med visning av texter och hantering av användare inom några veckor.Jag bygger allt väldigt enkelt och enbart med grundläggande funktioner. Dels vill jag inte att detta ska bli ett monster, och dels tror jag att enkelt är bättre och att allt man vill är att posta texter och lösa dem (inte helt sant kanske…)

Just nu har jag massa ångest över designen och hur den ska skalas ner till iPad och mobilen. Det hoppas jag dock kunna lösa ganska kvickt för på en Post-it är följande nedkladdat…

- Multiactions på texter
- Datum på texter är engelska
- Utbox, meddelanden
- Datum på engelska, meddelanden
- Läsa ett meddelande
- Svara på ett meddelande
- Multiactions på meddelanden
- Nästa föregående, som ustoday.com
- Skriva en kommentar på en text, lite fetare fält än tidigare
Streckad yta ”logga in för att skriva en kommentar”, ytan byts sedan till form för texten.
(som instagram)
Fältet ska ligga under kommentarerna, äldst överst
Visa de 10 senaste + knapp, Visa alla kommentarer
- Macro nice_date visa fel språk
- Organisera dina texter, gruppera gör en ”Samling/Collections” (inte böcker)
- Nya kommentarer på mina texter är viktigt (ev i menyn)
- Blockera, rensa bort blockerade från listor
- Settings
- Skapa ny användare

Kompilera Lesscss med WordPress – och tillbaka på Jayway

Jag har blivit smått förälskad i {less}. Det är helt enkelt sjukt bra och användbart. Att det inte redan finns variabler i css är en gåta men som tur är är det enkelt att använda {less} i WordPress, och man kan göra ungefär såhär.

Först en helt vanlig registrering av style.

wp_register_style('less', get_bloginfo( 'template_directory', 'display' ) . '/style.less', false, '1.0');
wp_enqueue_style('less');

Och därefter behöver man se till att

rel="stylesheet"

skrivs om till

rel="stylesheet/less"

Vilket man kan lösa med ett filter

function filter_less($tag){
 if(strpos($tag,'.less') && strpos($tag,'stylesheet')){
 $tag = str_replace('stylesheet','stylesheet/less',$tag);
 }
 return $tag;
 }
 add_filter( 'style_loader_tag', 'filter_less' );

Det hela parsar du sedan med less.js som inkluderas som vanligt.

wp_enqueue_script('less', get_bloginfo( 'template_directory', 'display' ) . '/js/less-1.3.0.min.js', false, '1.3.0', false);

Själva parsningen går snabbat och resultatet cachas bra av browsern. Dock känns det kanske lite knasigt att parsa i klienten så nu har jag istället tittat lite på hur man kan sköta detta lokalt och skicka ut en klar .css istället.

Det kan man lösa på lite olika sätt och ett väldigt enkelt är att installera WP-less som i sin tur wrappar lessphp. Det har fungera bra för mig med undantag av @import. Lessphp skapar en cachead fil och skapar en ny om orginalet ändras. Sweet, men det fungerar inte om man använder @import, för då ser inte kompilatorn att källfilen blivit ändrad. Minst sagt opraktiskt.

Jo, förresten – jag är tillbaka på Jayway, det känns som att de roligaste och duktigaste konsulterna finns där . Jag är väldigt glad att kunna vara tillbaka igen!

Responsivt ramverk med Lesscss och mobile first

Efter en del påstötningar från kollegor har jag testat Lesscss. Det är en teknik som utvidgar klassisk CSS med fina saker som variabler, funktioner (mixins) och en del annat bra. Det är väldigt praktiskt om man till exempel har kod i sitt CSS som återkommer på flera olika ställen. Då kan man istället deklarera detta på ett ställe och sedan återanvända på ett enkelt sätt.

För att testa har jag byggt en enkel grid för responsiv desig. Jag använde 12 spalter och gutter runt alla spalter (klassisk 960.gs-tänk). Med traditionell CSS hade jag hårdkodat fyra varianter mobil, tablet, desktop och huge. Men Lesscss löser detta på ett smidigt sätt.

Jag har en mixin (funktion) för griden som jag sedan matar med tre variabler, spaltbredd, gutter och totalbredd. Inne i min grid-mixin räknar jag sedan fram exakta bredder på de olika blocken eller på min wrapper. Redan i detta läge har jag alltså jag sparat cirka 75% av koden eftersom jag gör en grid istället för fyra, trolleri.

Min Mixin ser ut ungefär såhär.

.grid(@block,@gutter,@container) {

	/* Blocks */
	.block-1 { width: @block }
	.block-2 { width: @block * 2 + @gutter * 2 }
	.block-3 { width: @block * 3 + @gutter * 4 }
	.block-4 { width: @block * 4 + @gutter * 6 }
	.block-5 { width: @block * 5 + @gutter * 8 }
	.block-6 { width: @block * 6  + @gutter * 10 }
	.block-7 { width: @block * 7 + @gutter * 12 }
	.block-8 { width: @block * 8 + @gutter * 14 }
	.block-9 { width: @block * 9 + @gutter * 16 }
	.block-10 { width: @block * 10 + @gutter * 18 }
	.block-11 { width: @block * 11 + @gutter * 20 }
	.block-12 { width: @block * 12 + @gutter * 22 }

	/* Prefix */
	.prefix-1 { padding-left: @block + @gutter * 2; }
	.prefix-2 { padding-left: @block * 2 + @gutter * 4; }
	.prefix-3 { padding-left: @block * 3 + @gutter * 6; }
	.prefix-4 { padding-left: @block * 4 + @gutter * 8; }
	.prefix-5 { padding-left: @block * 5 + @gutter * 10; }
	.prefix-6 { padding-left: @block * 6 + @gutter * 12; }
	.prefix-7 { padding-left: @block * 7 + @gutter * 14; }
	.prefix-8 { padding-left: @block * 8 + @gutter * 16; }
	.prefix-9 { padding-left: @block * 9 + @gutter * 18; }
	.prefix-10 { padding-left: @block * 10 + @gutter * 20; }
	.prefix-11 { padding-left: @block * 11 + @gutter * 22; }

	/* Suffix */
	.suffix-1 { padding-right: @block + @gutter * 2; }
	.suffix-2 { padding-right: @block * 2 + @gutter * 4; }
	.suffix-3 { padding-right: @block * 3 + @gutter * 6; }
	.suffix-4 { padding-right: @block * 4 + @gutter * 8; }
	.suffix-5 { padding-right: @block * 4 + @gutter * 10; }
	.suffix-6 { padding-right: @block * 4 + @gutter * 12; }
	.suffix-7 { padding-right: @block * 7 + @gutter * 14; }
	.suffix-8 { padding-right: @block * 8 + @gutter * 16; }
	.suffix-9 { padding-right: @block * 9 + @gutter * 18; }
	.suffix-10 { padding-right: @block * 10 + @gutter * 20; }
	.suffix-11 { padding-right: @block * 11 + @gutter * 22; }

	/* Wrapper */
	.wrapper { width: @container; margin-left: auto; margin-right: auto; }
	.wrapper .row { display: inline-block; margin: 0 -@gutter; width: auto; }

	/* Block Commons */
	.block-1, .block-2, .block-3, .block-4, .block-5, .block-6, .block-7, .block-8, .block-9, .block-10, .block-11, .block-12 { display: inline; float: left; margin-left: @gutter; margin-right: @gutter; }

}

För att skapa en grid för desktop med korrekta mått kör jag sedan följande.

.grid(60px,10px,960px);

Eller för en tablet-grid

.grid(43px,10px,756px);

Givetvis vill jag att min grid är responsiv och för att lösa det har jag tagit inspiration från Gilles Vandenoostendes fina koncept, Sensible Mediaqueries. Tanken är att med hjälp av Lesscss använda mediaqueries som inbjuder till att man arbetar med ett Mobile First-tänk. Samt att man får ett rimligt bra stöd för IE, som ju har en del problem med mediaqueries.

Det vanliga upplägget är att man bygger sin version för desktop först, och att man därefter ”nedgraderar” den till tablet och mobile. Det brukar leda till att man tvingas ”nolla” massa attribut i sina CSS-er för att ta bort saker.

Gilles upplägg är omvänt. Man startar man med att bygga för mobile och därefter ärver man till de större formaten, dvs desktop använder Mobile -> Tablet -> Desktop. Man lägger alltså till kod för större device snarare än strippar bort för mindre.

På så sätt blir det naturligt att först bygga mobilsajten, därefter bygger man tablet och sist desktop. Desktop kommer då använda CSS för mobilen, tablet och desktop. Man arbetar helt enligt Mobile First och arbetar sig mot större skärmar, och man levererar minst CSS-regler till den minsta enheten, visst känns det helt rätt!

@import "global.less";
@import "grid.less";
@import "mobile.less";
@import "tablet.less";
@import "desktop.less";
@import "huge.less";

@media only screen and (min-width: 100px) {
	.mobile;
}

@media only screen and (min-width: 730px) {
	.tablet;
}

@media only screen and (min-width: 970px) {
	.desktop;
}

@media only screen and (min-width: 1280px) {
	.huge;
}

För att hantera IE så använder man en egen css där jag väljer att avsluta arvet vid desktop.

@import "global.less";
@import "grid.less";
@import "mobile.less";
@import "tablet.less";
@import "desktop.less";

.mobile;
.tablet;
.desktop;

För mer detaljerad information om Lesscss så läs Lesscss.org.

För mer information om responsivt och lesscss läs Gilles artikel

För att se allt i drift, titta i källan på Fosseus.se, givetvis lever jag som jag lär.

Du kommer inte ångra dig!

LESS för WordPress

Status

Dynamisk CSS (LESS) är riktigt intressant. För visst har även du velat kunna sätta variabler i ett stylesheet, för att sedan använda rakt igenom och därmed bara få ett ställa att ändra på. Det finns flea olika sätt att implementera Less på i WordPress. Artikeln ”How to implement LESS in WordPress, first approach” beskriver hur man gör det ”för hand”, men man kan även använda en färdig plugin, till exempel denna, Less.js for WordPress.

Lärdommar från Google:s senaste redesign

Status

I veckan (SXSW) har Google berättat historien bakom deras redesign som genomfördes förra året. Följ länkarna nedan för spännande läsning men här är några korta punkter som lyfts i artiklarna. Man hade fullt stödet från högrsta ort. Man gjorde flera prototyper för test och senare implementation. Designteamet var litet, fristående och inte hade fäste i de olika produkterna. Den nya designen gjordes initialt i ett vakum.

The Google that never was: how the search giant killed a 2007 redesign
8 Design Lessons Learned from the Google Redesign

How Google’s Designers Got the Company on the Same Page

A Brief History of the Complete Redesign of Google

Poetfreak.com visas på Mediaqueri.es, fantastiskt!

Status

I veckan dök mitt projekt Poetfreak.com upp på sajten Mediaqueri.es. Väldigt roligt att bli uppmärksammad utifrån ett rent designperspektiv. Mediaqueri.es är en sajt där man fullt ut fokuserar på att visa goda exempel av responsiv design så det känns givetvis fantastiskt kul! Som grädde på moset kommer ett all time high för Poetfreak.com och februari stannade vid 30 939 besök (trots att det är en kort månad).

Design på en timme: Barometern.se och balans

Så, här kommer ännu en re-design på en timme. Denna gång är det Småländska Barometern jag har jobbat på. Jag har försökt få till en balans på sidan en harmoni. Inte helt sällan är nyhets-sajten osannolikt röriga (tex. Aftonbladet.se) vilket gör dem svåra att snabbt scanna sidans innehåll. Varför kan inte en nyhets-sajt få vara vacker och tilltalande?

Sajten är indelar i tre större block. Överst en klassisk nyhetsdel i tre spalter, svart på vitt med feta rubriker. Därefter följer en yta med lite mer långsamt material. Här finns en mer sober form och tanken är att här finns sajtens magasin, texter som kanske ligger en vecka. Vi växlar helt enkelt tempo.

Sist ligger ett block med tjänster som är lokalt knutna, till exempel nyfödda och händelser i en kalender. Det är också här jag tänker mig att försäljning av saker sker, böcker, tjänster, plusmedlemskap, appar osv. Så, grädden är nyheterna, moset är affären.

IE6 lever och frodas – i Kina

Vi är många som tycker illa om ie6 (browsern). Den är inte bara gammal, den gör också livet helt vansinnigt trist för webbutvecklare som vill följa standarder. Oavsett hur rätt man kodar så blir det fel. Detta inser numera även Microsoft som för ett tag sedan försökte ge ie6 en sista dödsstöt via sajten ie6countdown.com och bloggposten Bye bye ie6. Man har lyckats ganska bra och under 1% av internetanvändarna i USA kör nu ie6, siffran för Sverige är under 0.5%.

Men (det finns alltid ett men), jobbar man på ett företag som har användare i Kina ser bilden helt annorlunda ut. Hela 25% av Kinas internetanvändare kör ie6 och det ser inte ut att sjunka lika snabbt i resten av världen. Kina har dessutom flest uppkopplade internetanvändare i världen så föreställningen om att ie6 är död stämmer helt enkelt inte. I alla fall inte om man utvecklar för en global marknad.

Vad beror det på? Säkert flera olika orsaker, bland annat använder många Kineser fortfarande Windows XP och på dessa system finns ie6 förinstallerat. Det sägs dessutom att kring 90% av installationerna är piratkopior och därmed inte helt triviala att uppgradera.

Ytterligare en orsak till ie6-kärleken sägs vara att många av de stora Kinesiska bankerna har anpassat sina system helt efter ie6 och dess activeX-komponenter. Det är alltså inte möjligt att använda flera av de Kinesiska internetbanker med en modern browser. I alla fall inte i dagsläget.

Så vad gör man då? Som siffrorna ser ut just nu måste man helt enkelt anpassa sin sajt till ie6 eller helt enkelt bygga två olika versioner. Trist men ett faktum. Säkert kommer detta förändras (bland annat då win7 tar fart i Kina) men ie6 kommer leva och frodas ytterligare ett tag till, hur usel och utdaterad den än må vara.

Nu börjar jobbet på wp3.4 och VK.se på WordPress

Status

Det sägs att WP 3.4 ska lägga fokus på att design och tema, WPcandy har skivit lite mer om det. Låter strålande även om jag personligen hade föredragit att man la lite kraft på att göra hela plattformer mer enterprise och till exempel byggt in en kraftfull lösning för att enkelt förflytta sig mellan dev/stage/test/prod (som tex Rails har). Annars vill jag verkligen att du läser posten ”Nu byter vi till WordPress på vk.se”, bra och intressant. Jag tror fortfarande att dagspressen har väldigt mycket att hämta i WP-lägret, långt mer är bara som bloggplattform.

Poetfreak.com är mobilanpassat

I helgen jobbade jag en del timmar på att mobilanpassa min poesisajt Poetfreak.com. Det gick förvånande snabbt med hjälp av css media queries. Delvis beror det på att jag tidigare i projektet har tagit höjd för detta och på så sätt grundat lite bättre i koden.

Jag har tidigare skrivit lite om tankarna om mobile first (vilket jag alltså inte själv arbetat efter i detta projekt) och nu insåg jag verkligen nyttan av att arbeta så, Väldigt snabbt skalade jag bort onödiga element från mobilsajten vilket direkt ledde till än bättre desktopsajt. Det som var svårt att se på desktop blev helt givet i mobilen.. Resultatet? ja surfa in på www.poetfreak.com så ser du.

Så använder du Pointers i WordPress 3.3

Ganska snart kommer WordPress i en ny version, 3.3. En spännande sak som verkar gå med är konceptet Pointers. Tanken är att man på ett enkelt sätt ska kunna flagga för nya funktionalitet i wp-admin. Tanken är inte helt ny och båda Facebook och Gmail använder något liknande för att presentera nyheter för sina användare.

Eftersom 3.3 inte är släppt än kan saker komma att ändras men vill du testa redan nu så ladda hem senaste versionen av wp, och kopiera sedan in koden här nedan i functions.php i ditt tema.

Principen är ganska enkel, först lägger du till script och style som behövs (med enqueue), därefter lägger du innehållet i din pointer i en variabel, och sist kör du lite jquery och hakar på en pointer till ett #id någonstans i wp-admin.

Vill man går det att ändra på ”position” och ”arrow” för att designa om sin pointer så den passar placeringen på skärmen optimalt, pilen åt höger eller vänster osv. I mitt fall har jag lagt in funktionen i min Related Images för att påminna användarna att konfigurera pluginen, smidigt.


add_action( 'admin_enqueue_scripts', 'mitt_script' );

function mitt_script() {
 $visa_min_pointer = get_user_setting( 'min_pointer', 0 );
 if ( ! $visa_min_pointer ) {
 wp_enqueue_style( 'wp-pointer' );
 wp_enqueue_script( 'wp-pointer' );
 wp_enqueue_script( 'utils' );
 add_action( 'admin_print_footer_scripts', 'mitt_admin_pointer_script' );
 }
 }

function mitt_admin_pointer_script() {
 $p_content = '<h3>Rubriken i min Pointer</h3>';
 $p_content .= '<p>Brödtext i min pointer</p>';
 ?>
 <script type="text/javascript">
 //<![CDATA[
 jQuery(document).ready( function($) {
 $('#menu-settings').pointer({
 content: '<?php echo $p_content; ?>',
 position: {
 my: 'right top',
 at: 'left top',
 offset: '0 -2'
 },
 arrow: {
 edge: 'left',
 align: 'top',
 offset: 10
 },
 close: function() {
 setUserSetting( 'min_pointer', '1' );
 }
 }).pointer('open');
 });
 //]]>
 </script>
 <?php
 }