Vecka 04, Lördag 28 Januari 2012 Prenumerera

När WordPress gör det enkelt

23 oktober, 2011

Ibland svär jag över WordPress när jag inte hittar lösningar på svåra problem, men ibland gör det också livet väldigt enkelt när man hittar rätt. Det här tipset förutsätter att du känner till litegrann om WordPress. När jag kodar plugins till WordPress använder jag shortcodes (dvs en lite textrad ägaren till hemsidan kan klistra in i ett inlägg). Shortcodes fungerar dock inte i sidebar widgets, du vet de där som du drar och släpper i sidokolumnen. Som tur är går det lätt att åtgärda det problemet, genom ett kommando i ditt layout-temas fil functions.php:

<?php
// Get shortcodes running in widgets
add_filter('widget_text', 'do_shortcode');
?>

Du kan förstås även köra samma funktion från ditt plugin för att få det att fungera. Smidigt. Nu gäller det bara att producera lite shortcodes ;)

Gillar du WordPresstips? Jag kommer fortsätta med det här i bloggen närmaste tiden.

Jobb via nätverk

4 april, 2011

Jag ser en möjlighet att bygga nätverk för dem som lär sig PHP bra. Har senaste tiden fått mycket intressanta jobbförfrågningar via den här hemsidan eller andra som hört om PHP-kursen. Så vill du att vi ska skriva om dig här på hemsidan eller förmedla en kontakt, vare sig du söker arbete eller arbetskraft så kan är du välkommen att höra av dig :-)

Rabatt till 1 april 2011

28 mars, 2011

Alla våra kurser på Kurswebben har rabatt 20% fram till 1 april 2011. Det är ett steg i vår nylansering (ny platform, ny design, ny server, ny rabatt ;) ). Platserna är begränsade. Gör du en beställning före 1 april kostar alltså PHP-kursen 3 840 exklusive moms istället för 4 800 exklusive moms.

Siduppdelning på klienten

20 januari, 2011

Att dela upp data på sidor (siduppdelning, eng. paging), göra den sökbar, sortera kolumner är en uppgift som är vanlig för den som jobbar i PHP. Hämtar man ut data från en enkel databastabell är det inga problem. Men ibland är det kanske mer komlicerad data och onödigt mycket jobb, när det enkelt kan lösas på klientsidan istället, det vill säga med javascript.

jQuery och ett plugin som heter tablesorter och tablesorter.pager gör det väldigt smidigt att dela upp tabelldata och ordna enkel sortering av kolumnerna.

Tablesorter med paging

Du behöver ladda hem och inkludera filerna i HTML-kodens head.

1
2
3
<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script> 
<script type="text/javascript" src="js/jquery.tablesorter.min.js"></script> 
<script type="text/javascript" src="js/jquery.tablesorter.pager.js"></script>

Skapa en tabell i din sida med lita data i (jag hittar på lite i mitt exempel)…
Läs mer »

ImageMagick utan exec()

19 januari, 2011

ImageMagick används för att hantera bilder med t.ex. PHP och ofta med funktionen exec(). Många webbhotell blockerar exec() av säkerhetsskäl men med lite tur finns ändå ImageMagick installerat.

Under arbete åt en kund som använder Webbkonsulterna upptäckte jag att de har ImageMagick som kan användas genom PHPs klass istället för med exec(). Ett exempel på vad man kan göra, en tumnageln av en PDF-fil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * Jag skapar inställningarna i variabler för att lättare kunna 
 * ändra och ev fixa till en funktion
 */
$input_file = '/path/to/inputfile.pdf[0]'; // Sökväg till filen, [0] anger pdffilens sidnummer
$output_file = '/path/to/outputfile.jpg'; // Sökväg till tumnageln, här har jag valt en .jpg
$thumbnail_width = 400; // Ställ in maxbredd
$thumbnail_height = 0; // Maxhöjd, 0 betyder att den ska gå efter bredd
$jpeg_quality = 80; // jpeg kvalitet
 
$im = new imagick($input_file);  // Skapa objektet med filen
$im->setImageColorspace(255); // Färginställning
$im->setCompression(Imagick::COMPRESSION_JPEG); // Använd jpg-kompression
$im->setCompressionQuality($jpeg_quality); // Kvalitet på jpeg
$im->setImageFormat('jpeg'); // Format på filen
$im->thumbnailImage($thumbnail_width, $thumbnail_height); // Skapa tumnagel med bredd/höjd
$im->writeImage($output_file); // Spara filen
$im->clear();
$im->destroy();

Kombinerat med lite filuppladdning, felhantering, jQuery reflect m.m. blir det här en mycket trevlig PDF-funktion.

Jag vet inte ens om detta hade varit möjligt att göra med det bibliotek som vanligen är inbyggt, GD2.

Förstå WordPress-teman

18 januari, 2011

Yoast finns ett bra cheat-sheet över hur WordPress-teman är uppbyggda. Det är på engelska, men kan vara bra att ha tillgängligt när man börjar skapa teman.

Den här kursen kommer gradvis få mer och mer innehåll om WordPress, eventuellt som en bifogad egen kurs, med tanke på hur stort WordPress blivit. Många frågor är nu om WordPress. För vanliga hemsidor är det logiskt, varför uppfinna hjulet på nytt om man inte behöver specialfunktioner? Lär man sig PHP kan man också skapa plugins när man behöver något extra.

VPS – Kontrollera din server och PHP

17 januari, 2011

Trött på att inte ha kontroll över funktionerna på ditt webbhotells server? Saknar du ImageMagick, rätt databasformat eller versionshantering? Då är det kanske dags att prova VPS (Virtual private server).

En VPS fungerar som om du har en egen servermaskin, fast det egentligen bara är en del av en server. Du kan installera eget operativsystem, applikationer och använda dina inställningar. Du kan installera de PHP-tillägg du själv väljer. Nackdelen är förstås att du behöver kunskapen och tiden för att sköta din VPS, eller punga ut extra för att webbhotellet ska sköta det åt dig (brukar kallas ”managed vps”).

Jag testar för tillfället tjänsten Cloud VPS hos GleSYS.se och är väldigt nöjd. Här kan jag skapa, klona och ta bort servrar som jag vill. Öka minne, cpu, bandbredd, hårddisk vid behov genom ett par klick (på deras hemsida finns en demofilm som visar hur du gör). Förutom vanlig support finns ett forum på vpsforum.se E-post kan jag ta hand om själv eller använda GleSYS system, jag har valt det senare eftersom det inte roar mig att konfigurera e-post ;)

Fler aktörer än GleSYS är t.ex. Oderland.se, ipeer.se, citycloud.se … i den här tråden på Webmaster Network hittar du fler.

Offset i MySQL

3 november, 2010

Vill du hämta innehåll med offset i MySQL, dvs start några rader in och hämta resten av raderna? Där finns en liten egenhet hos MySQL, du måste ange hur många rader som ska hämtas (LIMIT) för att kunna ange var hämtningen ska starta.

För att göra en hämtning av alla poster från databastabellen men hoppa över de första anger du den största siffra som går som LIMIT. Så här kan det se ut:

SELECT * FROM mytable LIMIT 18446744073709551610 OFFSET 10;

Koden ovan bör hämta alla rader utom de 10 första. Kanske inte så snyggt, men fungerar.

Problem med PHP och localhost på Windows?

15 oktober, 2010

Jag har haft problem med PHP och localhost på Windows 7. Jag installerade en Apache-server, MySQL och phpMyAdmin på min Windows 7 maskin – men vid PHPs försök att koppla till MySQL med ”localhost” hängde sig phpMyAdmin, och Chive… osv.

Det visade sig att för att få PHP 5.3 att haja vad localhost är behöver jag kommentera fram raden 127.0.0.1 localhost i Windows host-fil (%Systemroot%/system32/drivers/etc/hosts)

Ajax med jQuery och PHP

6 oktober, 2010

Ajax har blivit enkelt med jQuery och PHP. Tja, det mesta har blivit enkelt med jQuery, plötsligt är man Javascriptexpert ;) Ett exempel bara för att visa…

Vi börjar med ett inkludera jQuery, för att slippa ladda hem filen laddar vi från Google. Skapa ett HTML-dokument och klipp in den här raden i HTML-dokumentes head:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

Skapa ett javscript block. Där kallar vi på jQuery med $(document).ready :

<script type="text/javascript">
    // jQuery listening event
    $(document).ready(function(){
    });
</script>

Vi behöver något HTML-element att arbeta med, så jag skapar en div i HTML-dokumentets <body>-tagg:

<div id="getmytime"></div>

Tillbaka till javascript-blocket. jQuery har en funktion som heter $.get. Den gör samma sak som om vi kallar på ett script och skickar data i adressraden som querystring (eller skickar formulär med method=”get”). $.get anropar ett PHP-script vi snart ska göra, och returnerar data.

Så här ser mitt anrop med $.get ut

		// Call the PHP file to  get value into the div on load
		// I also send the variable format with the call (would be similar to sending the url mytime.php?format=(Y-m-d) H:i:s)
		$.get('mytime.php', { format: '(Y-m-d) H:i:s' }, function(data) {
			$("#getmytime").html(data);
		});

Ser det rörigt ut? Det är javascript function med 3 argument:

  1. Adressen till vårt PHP-script (‘mytime.php’)
  2. Variabler vi vill skicka med, jag skickar med variabeln ”format”. Den här kan du ta bort om du vill. { format: '(Y-m-d) H:i:s' }. ‘(Y-m-d) H:i:s’ skulle kunna varit vad som helst för värde, nu råkar det vara datumformatet jag vill använda.
  3. Det tredje argumentet är en function som avgör vad som ska hända med datan som returneras från skriptet. function(data) {}.

När data skickas tillbaka vill jag ladda det till div-taggen i HTML-dokumentet. Jag använder jQuery functionen .html() för att lägga in data i en div.

$("#getmytime").html(data);

Dags att skapa mytime.php – vi måste ju förstås ha PHP-filen som returnerar någon data. Jag gör den väldigt kort, den skriver ut värdet från PHP-funktionen date(), om ett värde skickats in i $_GET['format'] använder jag det för att sätta formatet på mitt datum. Så här (det här är hela PHP-filen mytime.php):

<?php
if (isset($_GET['format'])) {
	echo date($_GET['format']);
} else {
	echo date('Y-m-d H:i:s');	
}
?>

Nu laddas rätt datum till HTML-filen när du öppnar sidan i webbläsaren. Men vi vill att det ska uppdateras när du klickar utan att sidan uppdateras. Det är ju trots allt det som är den stora grejen med Ajax, att ladda dynamisk data utan att ladda om hel sidan. Vi lägger till en av jQuery event-handlers (”händelse-hanterare”), .click(). Inom den kör jag samma .get som när sidan laddas:

	// If you click the div#getmytime, the time updates
	$("#getmytime").click(function() {
		// Call the php file. Just to show things change I alter the format argument
		$.get('mytime.php', { format: 'j F H:i:s' }, function(data) {
			$("#getmytime").html(data);
		});
	})

Koden ovan lyssnar alltså på klick i vår div-tagg med id getmytime, och hämtar in PHP-skriptet när något klickar. Bara för visa att något ändras har jag angivet ett annat format på datumet. Jag antar, och hoppas, du kan komma på många mer spännande saker med det här än att visa tiden ;)

Här kan du ladda hem scriptet som ZIP-fil. Det består av filerna

  • index.html
  • mytime.php
  • style.css

Mer kan du lära dig genom att gå vår PHP-kurs, anmäl dig här!

strtolower och encoding

6 juli, 2010

Ett problem som kan vara svårt att hitta är hantering av strtolower och encoding. Under en tid har jag jobbat med ett projekt som till viss del ligger på en Windows-plattform vi har begränsad kontroll över. Ibland blir det problem när man ska göra jämörelser av textsträngar och vill använda strtolower. Eftersom ”Mattias” inte är samma sak som ”mattias” vill man se till att båda värden man jämför bara innehåller gemener (eller versaler). Men strtolower() vill inte lira med å,ä,ö etc i UTF-8.

En lösning på problemet kan vara att ändra tecken till något annat – varför inte htmlentities(). Så här kan det se ut att förvandla ett värde till gemener och komma runt encoding problem:

1
2
3
$value = htmlentities($value, ENT_COMPAT, 'UTF-8');
$value = trim(strtolower($value));
$value = html_entity_decode($value, ENT_COMPAT, 'UTF-8');

En annan lösning är mb_strtolower() om den funktionen finns tillgänlig.

WordPress 3 med menyer

29 maj, 2010

Jag har börjat testa WordPress 3.0 RC-1, det vill säga ”release candidate”. En stor nyhet är menyer som hanteras dynamiskt i administrationen, något som kommer göra det till ett mycket trevligare CMS. Jag har inte provat dem i något layout-tema ännu, men vid en första anblick ser det mycket lovande ut! :) Uppgraderingen verkar gått utan problem där jag provat.

PHP länktips vecka 13

30 mars, 2010

Några PHP länkar för vecka 13. Det är fantastiskt så mycket som redan finns gjort om man söker.

Att skriva plugins är bra marknadsföring

17 mars, 2010

Jag har upptäckt att skriva plugins är bra marknadsföring. Populära applikationer som WordPress har så många användare, och ger man dem något gratis får man trafik tillbaka. Mitt eget WordPress plugin, Random Post Box (på WordPress, och på OpenSourceEditor) gav snabbt en rejäl trafikökning. Efter några dagar när länken inte var bland nya plugins på WordPress.org så gick trafiken ned något men håller ändå en stadig ström och ger kommentarer.

Chive – ett modernt alternativ till phpMyAdmin

12 mars, 2010

Jag har testat ett nytt gränssnitt till MySQL. Det heter Chive, ett modernt alternativ till phpMyAdmin. Det var rejält uppfriskande måste jag säga, ett webbgränssnitt enkelt att installera, relativt (för att vara db gränssnitt) intiutivt. Det har dock bara gått någon dag med Chive efter många år med phpMyAdmin, så jag har inte bestämt mig för att byta ut det gamla helt än. Men Chive är absolut värt att prova.

Vanliga fel att se upp med

11 mars, 2010

Den senaste tiden har jag diskuterat med mina kollegor om det vanligaste PHP-felet att se upp med. Vi är överens om ett av de mest irriterande, ett glömt likamed tecken i en if-sats.

När man jämför två värden i PHP kan man använda dubba lika-med tecken, så här:

1
2
3
if ($mittnamn == 'Mattias') {
	echo 'Hello Mattias';
}

När man tilldelar värden till variabler används ett lika-med tecken:

1
$mittnamn = 'Mattias';

Tänk dig då vad som händer med den här koden:

1
2
3
if ($mittnamn = 'Mattias') {
	echo 'Hello Mattias';
}

Den jämför inte värden, den testar om det går att tilldela $mittnamn värdet ‘Mattias’. If-satsen som var till för kontrollera om variabeln $mittnamn har värdet ‘Mattias’ kommer nu alltid vara sant. Även om $mittnamn innehåller namnet ‘Vera’ kommer ‘Hello Mattias’ skrivas ut.

Eftersom det är fullt möjligt att använda en if-sats på båda visen genereras inget felmeddelande. Och är man lite trött och stirrat sig blind på samma skript länge kan det vara väldigt svårt att hitta.

Nya kursstarter på php-kursen

8 mars, 2010

Trots stora snöhögar runt husknuten så närmar sig våren och den 6 april har vi en ny kursstart för php-kursen. En möjlighet för dig som vill vässa dina kunskaper under våren.

Om Twitter och PHP-prestanda hos Facebook

4 mars, 2010

Några länktips om hur du kan använda Twitter och vad Facebook har för PHP-kompilator.

Posta på Twitter med PHP
På kodkodkod.se (en blogg som jag tror blir intressant att följa) finns tips om hur du kan använda Twitter i dina skript. Ligger bra i tiden med tanke på att Twitter och social media blir viktigare och viktigare i marknadsföring.

PHP compiler performance
PHPclasses.org berättar om hur Facebook arbetar med prestanda i sina applikationer. Deras compiler HipHop finns att använda, det verkar av beskrivningen att döma dock inte vara världens lättaste uppgift ;)

Läs även andra bloggares åsikter om prestanda, twtter, curl, php

Glöm inte funktionerna i SQL

28 januari, 2010

Ibland känner jag att man glömmer funktionerna i SQL (den tekniken vi använder för kommunicerar med databasen). I mycket litteratur och annat jag ser lär man sig SELECT, INSERT, UPDATE och sedan inte mycket mer. Alla operationer görs sedan i PHP-koden. Men till exempel MySQL har många inbyggda funktioner, som kan vara snabbare att använda och som sparar mycket kod.

Jag råkade här om dagen på ett inlägg av David Walsh, ”MySQL’s REPLACE is PHP’s STR_REPLACE()”, där han ersätter text med MySQLs gunktion istället för PHPs. Senast idag kunde jag använt en när jag flytta en WordPress Mu blogg till en annan server och skulle ersätta alla sökvägar (men med backup först!)

1
UPDATE mytable SET content = REPLACE(content,'kurswebben.se','phpkurs.se');