Väike reklaami bänner viimasest blogi sissekandest

Foorumites on sageli hea võimalus enda blogile lugejaid leida, kuid selleks on vaja teha natuke reklaami. Kõige paremini püüab pilku reklaami osas liikuvad elemendid, kuid antud näites kasutame siiski staatilist pilti, mis siis näitab meie viimast postitust blogis.

Milline lahendus on kõige lihtsam? Antud juhul läheb vaja kahte php moodulit simpleXML, millega parsime RSS feedis oleva xml-i ja teiseks läheb vaja moodulit GD mis toimetab pildi joonistamisega.

<?php
define('URL', 'https://veebdev.wordpress.com/feed/');
$rss =  simplexml_load_file(URL); // Load xml from webpage
$items = $rss->channel->item;


foreach ($items as $item) {
    echo $item->title ." ". $item->pubDate ."\n<br />";
}
?>

Antud kood kuvab kõik RSS feedis leiduvate postituste pealkirjad koos kuupäevadega. Ainult viimase postituse näitamiseks kasutame massiivi [0] abi, millega saame esimese elemendi.

<?php
define('URL', 'https://veebdev.wordpress.com/feed/');
$rss =  simplexml_load_file(URL); // Load xml from webpage
$item = $rss->channel->item[0];
echo $item->title ." ". date('d-m-Y', strtotime($item->pubDate)) ."\n<br />";
?>

Kuna hetkel on mul ainult kasutada tasuta host ning ligipääs php.ini konfile on võimatu, siis pidin realiseerima rakenduse teisiti kui olnuks võimalik. Tasuta hosti puhul pole võimalik simplexml_load_file(url) otse aadresilt andmeid allalaadida, seega oli vajalik eraldi XML alla saada ning siis alles loadida. Demo pidin eemaldama, kuna pole leidnud(ei ole viitsinud otsida) tasuta hosti, kus oleks võimaliks kasutada korralikult fopenit teistelt lehtedelt andmete allalaadimiseks.

rssFeed.php

<?php
//error_reporting(-1);
define('URL', 'https://veebdev.wordpress.com/feed/');
define('XML_FILE', './tmp/file.xml');

// Set time zone if the server is in diffrent one
date_default_timezone_set('Europe/Tallinn');

$rss = simplexml_load_file(XML_FILE); // Load xml from webpage
$item = $rss->channel->item[0];
$date = date('d-m-Y', strtotime($item->pubDate)); // Format date
// Create an image
$im = imagecreate(200, 40);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);

// Set the background to be white
imagefilledrectangle($im, 0, 0, 299, 299, $white);

// Path to our font file
$font = './arial.ttf';

// First we create our bounding box for the first text
$bbox = imagettfbbox(10, 0, $font, $item->title);

$string = $item->title;
$wrapWord = 27;
if (strlen($string) >= $wrapWord) {
    $string = substr($string, 0, $wrapWord) . '...';
}
// Write it
imagettftext($im, 11, 0, 5, 18, $black, $font, $string);
// Write it
imagettftext($im, 9, 0, imagesx($im) / 2 + 30, 35, $black, $font, $date);

// Output to browser
header('Content-type: image/png');
imagepng($im);
imagedestroy($im)
?>

getXML.php (osa mida cron-ga executada näiteks päevas korra)

<?php
//error_reporting(-1);
define('URL', 'http://www.veebdev.wordpress.com/feed/');
define('XML_FILE', './tmp/file.xml');

$write = fopen(XML_FILE, 'w');
$read = fopen(URL, 'r');

if (flock($write, LOCK_EX)) {
    while (($buffer = fgets($read, 4096)) !== false) {
        fwrite($write, $buffer, 4096);
    }
    flock($write, LOCK_UN); // unlock the file
} else {
    // flock() returned false, no lock obtained
    print "Could not lock!\n";
}

?>

Leidsin et parem on jagada failid kahte ossa ning cron-ga tõmmata näiteks üks kord päevas xml fail alla ning siis seda parseda. Veel paremini saaks teha kui ainult salvestada viimane postitus tekstifaili.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s