<?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>Marius Barbulescu &#124; Freshcolors &#187; Articole</title>
	<atom:link href="http://www.freshcolors.ro/blog/category/articole/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.freshcolors.ro/blog</link>
	<description>Vor încerca să ne-ntreacă, dar n-o să poată…</description>
	<lastBuildDate>Tue, 18 Jan 2011 12:00:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Standarde de codare</title>
		<link>http://www.freshcolors.ro/blog/2009/09/05/standarde-de-codare/</link>
		<comments>http://www.freshcolors.ro/blog/2009/09/05/standarde-de-codare/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 09:29:55 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[coding standards]]></category>

		<guid isPermaLink="false">http://www.freshcolors.ro/blog/?p=262</guid>
		<description><![CDATA[În toate limbajele de programare există aşa numitele „Standarde de codare” (sau Coding Standards). În general există 2 standarde de codare, diferenţa constând în felul în care sunt poziţionate acoladele:
Primul stil (C++ Coding Standards):
function foo()
{
    echo 'bar';
}
După cum se observă, peste tot pe unde este necesară deschiderea unei acolade, aceasta se poziţionează [...]]]></description>
			<content:encoded><![CDATA[<p>În toate limbajele de programare există aşa numitele „Standarde de codare” (sau Coding Standards). În general există 2 standarde de codare, diferenţa constând în felul în care sunt poziţionate acoladele:</p>
<p>Primul stil (C++ Coding Standards):</p>
<pre class="brush:php">function foo()
{
    echo 'bar';
}</pre>
<p>După cum se observă, peste tot pe unde este necesară deschiderea unei acolade, aceasta se poziţionează pe rândul următor, închiderea ei făcându-se cu un rând mai jos decât ultima linie de cod a blocului respectiv, pe aceeaşi linie verticală cu perechea ei de începere. Foarte pe larg <a href="http://www.possibility.com/Cpp/CppCodingStandard.html">aici</a>.</p>
<p>Un exemplu complet de cod scris în acest stil ar putea arăta aşa:</p>
<pre class="brush:php">public function setParams( $params )
{
    if ( empty( $params ) )
    {
        $this-&gt;__request['params'] = null;
    }
    else
    {
        $keys = $values = array();
        $count = count( $params );

        for( $i = 0; $i &lt; $count; $i++ )
        {
            $param = $this-&gt;getAlpha( $params[$i] );
            $i % 2 == 0 ? $keys[] = $param : $values[] = $param;
        }

        $this-&gt;__request['params'] = array_combine( $keys, $values );
    }
}</pre>
<p>Avantaje:</p>
<ul>
<li>Lizibilitate sporită</li>
<li>Urmărire rapidă a codului, acoladele fiind poziţionate pe aceeaşi linie verticală</li>
</ul>
<p>Dezavantaje:</p>
<ul>
<li>Număr de linii mai mare ocupat de cod</li>
</ul>
<p>Cel de-al doilea stil (PEAR style):</p>
<pre class="brush:php">function bar() {
    echo 'foo';
}</pre>
<p>În acest caz, deschiderea acoladelor se face pe acelaşi rând cu instrucţiunea, iar închiderea ei se face la fel ca în primul caz. Descriere completă <a href="http://pear.php.net/manual/en/standards.php">aici</a>.</p>
<p>Un exemplu complet de cod s cris în acest stil ar putea arăta aşa:</p>
<pre class="brush:php">public function relative($offset) {
    // which absolute row number are we seeking
    $pos = $this-&gt;cursorPos + ($offset - 1);
    $ok = $this-&gt;seek($pos);

    if ($ok === false) {
        if ($pos &lt; 0) {
            $this-&gt;beforeFirst();
        } else {
            $this-&gt;afterLast();
        }
    } else {
        $ok = $this-&gt;next();
    }

    return $ok;
}
</pre>
<p>Avantaje:</p>
<ul>
<li>Număr de linii mai mic ocupat de cod</li>
</ul>
<p>Dezavantaje:</p>
<ul>
<li>Lizibilitatea este scăzută</li>
<li>Codul este greoi de urmărit, un factor fiind chiar poziţionarea acoladelor pe diagonală</li>
</ul>
<p>Pentru mine, cel mai bun stil de programare (şi cel pe care de altfel îl folosesc) este primul dintre cele două. Un prim factor în alegerea acestui stil a fost scrierea de cod curat şi uşor de urmărit, care să nu obosească ochii. Pe urmă, eu începând programarea cu C++, am utilizat intens acest stil şi m-am obişnuit cu el fără probleme.</p>
<p>Însă aceste standarde nu sunt bătute în cuie. Fiecare îşi poate defini propriul standard, pornind de la cele două şi adaptând după cum se simte mai bine. De exemplu, după cum se observă şi în a doua bucată de cod postată mai sus, eu am decis a utiliza şi o spaţiere permanentă, tocmai pentru a spori gradul de lizibilitate (pe larg despre stilul ăsta <a href="http://ez.no/ezpublish/documentation/development/standards/php">aici</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2009/09/05/standarde-de-codare/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Preluare curs valutar BNR update</title>
		<link>http://www.freshcolors.ro/blog/2009/08/20/preluare-curs-valutar-bnr-update/</link>
		<comments>http://www.freshcolors.ro/blog/2009/08/20/preluare-curs-valutar-bnr-update/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 12:25:43 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bnr]]></category>
		<category><![CDATA[curs valutar]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://www.freshcolors.ro/blog/?p=241</guid>
		<description><![CDATA[Acum ceva vreme am postat o modalitate rapidă de a preluat cursul valutar complet de la bnr. Azi un prieten căuta o modalitate la fel de rapidă de a prelua cursul valutar, însă doar pentru USD şi EURO, fără să preia toate valutele şi să verifice dacă sunt cele dorite. Cum se poate rezolva lucrul [...]]]></description>
			<content:encoded><![CDATA[<p>Acum ceva vreme am postat<a href="http://www.freshcolors.ro/blog/2008/09/preluarea-cursului-bnr-in-mai-putin-de-10-linii-de-cod"> o modalitate rapidă</a> de a preluat cursul valutar complet de la bnr. Azi un prieten căuta o modalitate la fel de rapidă de a prelua cursul valutar, însă doar pentru USD şi EURO, fără să preia toate valutele şi să verifice dacă sunt cele dorite. Cum se poate rezolva lucrul ăsta? Răspunsul este XPath.</p>
<pre class="brush:php">
 /*
 * initiez clasa DOMDocument, reprezentand fisierul xml incarcat
 */
 $dom = new DOMDocument();
 $dom-&gt;preserveWhiteSpace = false;

 /*
 * incarc fisierul xml, specificand adresa completa
 */
 $dom-&gt;load( "http://www.bnro.ro/nbrfxrates.xml");
/*
* initializare XPath
*/
$xpath = new DOMXpath($dom);
$xpath->registerNamespace('xsd', 'http://www.bnr.ro/xsd');
 /*
 *  preiau intr-un obiect iterabil (DOMNodeList) lista elementelor ce indeplinesc doleantele mele
 */
 $valute = $xpath-&gt;query( "xsd:Body/xsd:Cube/xsd:Rate[@currency='USD' or @currency='EUR']" );
 /*
 * verific daca sunt elemente de acest tip
 */

 if ( $valute )
 {
 $new_valute = array();

 /*
 * in caz afirmativ, iterez prin ele si le preiau intr-un array ce-mi convine
 */
 foreach ( $valute as $valuta )
 {
 $new_valute[$valuta-&gt;getAttribute('currency')] = $valuta-&gt;nodeValue;
 }
 }
</pre>
<p>Prin XPath putem selecta rapid doar elementele care corespund anumitor criterii, căutând după o cale (path) indicată de noi.  În cazul în care fişierul xml conţine namespace-uri (ca în cazul acesta) ele trebuie anunţate la început, pentru că altfel nu vom primi nici un rezultat. Good luck <img src='http://www.freshcolors.ro/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><em>last update: 01.2011.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2009/08/20/preluare-curs-valutar-bnr-update/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Introducere în UML partea 2</title>
		<link>http://www.freshcolors.ro/blog/2009/02/15/introducere-in-uml-partea-2/</link>
		<comments>http://www.freshcolors.ro/blog/2009/02/15/introducere-in-uml-partea-2/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 20:52:48 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://www.freshcolors.ro/blog/?p=227</guid>
		<description><![CDATA[Dacă în prima parte a acestui articol am vorbit despre diagrame şi modul de reprezentare al claselor, a venit acum rândul să vorbim despre modul în care se descriu relaţiile dintre clase.
În cadrul UML există 4 tipuri mari de relaţii: relaţii de generalizare, relaţii de asociere, relaţii de realizare şi relaţii de dependenţă.
1) Relaţii de [...]]]></description>
			<content:encoded><![CDATA[<p>Dacă în prima parte a acestui articol am vorbit despre diagrame şi modul de reprezentare al claselor, a venit acum rândul să vorbim despre modul în care se descriu relaţiile dintre clase.</p>
<p>În cadrul UML există 4 tipuri mari de relaţii: relaţii de generalizare, relaţii de asociere, relaţii de realizare şi relaţii de dependenţă.</p>
<p>1) Relaţii de generalizare</p>
<p>Acest tip de relaţii se referă la o structură ierarhică ce aplică principiul moştenirii. Cu alte cuvinte, moştenirea este o relaţie de generalizare care se reprezintă la modul următor: se trasează o linie cu săgeata îndreptată de la subclasă la clasa părinte, săgeata fiind închisă şi goală în interior.</p>
<div id="attachment_229" class="wp-caption aligncenter" style="width: 361px"><img class="size-full wp-image-229" title="mostenire1" src="http://www.freshcolors.ro/blog/wp-content/mostenire1.gif" alt="relatie de moştenire" width="351" height="161" /><p class="wp-caption-text">relatie de moştenire</p></div>
<p>2) Relaţii de asociere</p>
<p>Sunt relaţiile în care o clasă se află în relaţie cu o altă clasă pe o durată mare de timp. Aceste relaţii se nasc în momentul în care o proprietate a unei clase ţine o referinţă către o instanţă a altei clase. Din această cauză, acest tip de relaţie este cel mai răspândit.</p>
<div id="attachment_230" class="wp-caption aligncenter" style="width: 360px"><img class="size-full wp-image-230" title="asociere" src="http://www.freshcolors.ro/blog/wp-content/asociere.gif" alt="relaţie de asociere" width="350" height="400" /><p class="wp-caption-text">relaţie de asociere</p></div>
<p>Pentru descrierea relaţiei de asociere se folosete o linie simplă (figura 2-A). Pentru descrierea direcţiei de asociere se foloseşte o săgeată simplă, deschisă la bază. Dacă de exemplu, clasa Profesor conţine o instanţă a clasei Student, direcţia se trasează ca în figura 2-B. În cazul în care şi clasa Student ar fi avut o instanţă a clasei Profesor, ar fi rezultat o relaţie de asociere bidirecţională, linia de asociere având săgeţi la ambele capete.</p>
<p>În aceeaşi măsură se pot ţi specifica numărul de instanţe a unei clase având referinţe în cealaltă clasă, după cum se vede în figura 2-B. Numărul acestora se poate scrie ca un număr fix, se poate da ca un interval închis (ex. 1..10) sau ca asterisk (*), care înseamnă 0 sau mai multe.</p>
<p>În cadrul relaţiilor de asociere mai fac parte  şi 2 tipuri speciale, agregare şi compoziţie.</p>
<div id="attachment_232" class="wp-caption aligncenter" style="width: 348px"><img class="size-full wp-image-232" title="agregare_compozitie1" src="http://www.freshcolors.ro/blog/wp-content/agregare_compozitie1.gif" alt="relaţie de agregare/compoziţie" width="338" height="400" /><p class="wp-caption-text">relaţie de agregare/compoziţie</p></div>
<p>Asocierile de aregare descriu o situaţie în care o clasă păstrează o referinţă permanentă a altei clase. Însă unul din elemente poate exista şi în afara relaţiei respective &#8211; poate fi conţinut şi de alt obiect în acelaşi timp (figura 3-A). Relaţiile de agregare se reprezintă printr-o linie care începe cu un romb gol.</p>
<p>Asocierile de compoziţie sunt mai puternice decât cele de agregare. O parte nu poate exista în afara întregului. În cadrul unei astfel de relaţii obiectul conţinut poate avea referinţă doar în acea clasă. Relaţiile de acest tip sunt reprezentate de o linie care începe însă cu un romb umplut (figura 3-B).</p>
<p>3) Relaţii de realizare</p>
<p>Sunt relaţiile prin care unul dintre elemente „garantează” realizarea unor acţiuni prin intermediul celuilalt element. În cadrul UML, interfeţele sunt asociate acestui tip de relaţii. Reprezentarea se face prin trasarea unei săgeţi, asemănătoare celei din cadrul moştenirii, doar că linia este discontinuă (figura 4).</p>
<div id="attachment_233" class="wp-caption aligncenter" style="width: 360px"><img class="size-full wp-image-233" title="interfata" src="http://www.freshcolors.ro/blog/wp-content/interfata.gif" alt="relatie de realizare - interfaţă" width="350" height="179" /><p class="wp-caption-text">relatie de realizare - interfaţă</p></div>
<p>4) Relaţii de dependenţă</p>
<p>Relaţiile de dependenţă indică o relaţie semantică între două sau mai multe elemente, înă nu descriu o legătură permanentă între clase. O modificare într-unul din obiecte duce la ri semantice la celălalt obiect. Se reprezintă printr-o linie discontinuă având la capăt o săgeată deschisă (figura 5).</p>
<div id="attachment_234" class="wp-caption aligncenter" style="width: 356px"><a href="http://relatiededependenta"><img class="size-full wp-image-234" title="dependenta" src="http://www.freshcolors.ro/blog/wp-content/dependenta.gif" alt="dependenta" width="346" height="179" /></a><p class="wp-caption-text">relatie de dependenta</p></div>
<p>Cu acestea am încheiat discuţia referitoare la modul de reprezentare în UML al relaţiilor dintre clase. În ultima parte a acestui articol o să exemplific toate aceste noţiuni pe un exemplu concret, ca să vedem la ce ne ajută practic UML-ul.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2009/02/15/introducere-in-uml-partea-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducere în UML partea 1</title>
		<link>http://www.freshcolors.ro/blog/2009/02/03/introducere-in-uml-1/</link>
		<comments>http://www.freshcolors.ro/blog/2009/02/03/introducere-in-uml-1/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 22:10:28 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://www.freshcolors.ro/blog/?p=177</guid>
		<description><![CDATA[UML, prescurtarea de la Unified Modeling Language, reprezintă un limbaj standard folosit pentru descrierea sistemelor orientate obiect.
Se foloseşte de elemente grafice pentru a reda cât mai bine relaţiile între obiecte, lucru foarte util în cazul exemplelor, unde nu se poate descrie prea bine acest lucru doar prin câteva linii de cod. Unul din aceste elemente [...]]]></description>
			<content:encoded><![CDATA[<p>UML, prescurtarea de la Unified Modeling Language, reprezintă un limbaj standard folosit pentru descrierea sistemelor orientate obiect.</p>
<p>Se foloseşte de elemente grafice pentru a reda cât mai bine relaţiile între obiecte, lucru foarte util în cazul exemplelor, unde nu se poate descrie prea bine acest lucru doar prin câteva linii de cod. Unul din aceste elemente este diagrama, cea mai folositoare în asemenea cazuri.</p>
<div id="attachment_185" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-185" title="uml1" src="http://www.freshcolors.ro/blog/wp-content/uml1.gif" alt="uml1" width="400" height="173" /><p class="wp-caption-text">figura 1</p></div>
<p>Reprezentarea unei clase prin intermediul unei diagrame se face printr-un simplu dreptunghi divizat în 3 compartimente. În cel de sus este trecut numele clasei, la mijloc se specifică lista atributelor, iar în ultima căsuţă operaţiile (figura 1 &#8211; A) .</p>
<p>După cum spuneam, numele clasei se reprezintă în prima subdiviziune în mai multe forme. Pentru o clasă normală se scrie pur şi simplu numele său, pentru o clasă abstractă se poate scrie fie italic numele, fie se poate adăuga sub nume o etichetă la modul {abstract} pentru a marca faptul că respectiva clasă este abstractă (figura 1 &#8211; B ), iar pentru o interfaţă se adaugă o etichetă la modul « interface » (figura 1 &#8211; C).</p>
<p>Lista atributelor se referă la proprietăţile unei clase şi după cum spuneam, acestea sunt scrise în centru (figura 2).</p>
<div id="attachment_187" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-187" title="uml2" src="http://www.freshcolors.ro/blog/wp-content/uml2.gif" alt="figura 2" width="400" height="156" /><p class="wp-caption-text">figura 2</p></div>
<p>După cum se vede şi în figura 2, pentru fiecare atribut se specifică:</p>
<ol type="a">
<li>nivelul de acces : acesta poate fi + (public), &#8211; (private) sau # (protected)</li>
<li>numele</li>
<li>tipul de date</li>
<li>valoarea default  dacă este cazul, dacă nu, se omite</li>
</ol>
<p>Asemănător cu lista atributelor se specifică şi operaţiile clasei.Operaţiile unei clase reprezintă metodele sale. Lista acestora se specifică precum în figura 3.</p>
<div id="attachment_189" class="wp-caption aligncenter" style="width: 518px"><img class="size-full wp-image-189" title="uml3" src="http://www.freshcolors.ro/blog/wp-content/uml3.gif" alt="figura 3" width="508" height="157" /><p class="wp-caption-text">figura 3</p></div>
<p>Pentru fiecare metodă în parte se specifică următoarele:</p>
<ol type="a">
<li>nivelul de acces : acesta poate fi + (public), &#8211; (private) sau # (protected)</li>
<li>numele</li>
<li>lista parametrilor, pentru fiecare specificându-se numele şi tipul (evident pot lipsi)</li>
<li>tipul de date returnat (care de asemenea poate lipsi)</li>
</ol>
<p>De precizat este faptul că atât în cazul atributelor, cât şi al proprietăţilor nu este necesară trecerea întregii liste, ci doar a acelora care sunt importante în contextul dat.</p>
<p>Acestea fiind spuse, am încheiat prima parte a acestei serii de articole pe tema UML. În următoarele voi vorbi despre modul de figurare a relaţiilor dintre obiecte şi la final voi exemplifica totul pe un exemplu practic <img src='http://www.freshcolors.ro/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2009/02/03/introducere-in-uml-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel to PHP</title>
		<link>http://www.freshcolors.ro/blog/2008/11/28/excel-to-php/</link>
		<comments>http://www.freshcolors.ro/blog/2008/11/28/excel-to-php/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 10:05:53 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://misterjinx.wordpress.com/?p=143</guid>
		<description><![CDATA[Se mai întâmplă uneori să avem nevoia de a prelucra nişte date pe care le avem ţinute în fişiere excel. Dacă sunt câteva înregistrări e totul bine şi frumos, însă atunci când sunt la un loc câteva sute de înregistrări trebuie găsită o variantă mai uşoară pentru preluarea şi prelucrarea lor.
Să presupunem că avem următoarele [...]]]></description>
			<content:encoded><![CDATA[<p>Se mai întâmplă uneori să avem nevoia de a prelucra nişte date pe care le avem ţinute în fişiere excel. Dacă sunt câteva înregistrări e totul bine şi frumos, însă atunci când sunt la un loc câteva sute de înregistrări trebuie găsită o variantă mai uşoară pentru preluarea şi prelucrarea lor.</p>
<p>Să presupunem că avem următoarele înregistrări în fişierul nostru excel:</p>
<pre><a href="http://misterjinx.files.wordpress.com/2008/11/excel.gif"><img class="aligncenter size-full wp-image-146" title="excel" src="http://misterjinx.files.wordpress.com/2008/11/excel.gif" alt="excel" width="480" height="72" /></a></pre>
<p>Datele reprezintă nişte cărţi, coloanele însemnând: Titlu, Autor, Pagini, Editură şi Preţ.</p>
<p>Metoda pe care vă voi prezenta în cele ce urmează foloseşte extensia de care v-am mai vorbit acum ceva vreme, <a title="DOM" href="http://misterjinx.wordpress.com/2008/11/02/dom-vs-simplexml-partea-2/" target="_blank">DOM</a>. După cum spuneam şi atunci, DOM prelucrează fişiere XML. Aşadar primul pas pe care trebuie să-l facem este de a salva fişierul excel ca „XML Spreadsheet”.</p>
<p>Fişierul în cauză conţine foarte multe taguri, însă partea care ne interesează pe noi este următoarea:</p>
<pre class="brush:xml">
<worksheet ss:Name="Sheet1">
<table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="4" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
<column ss:Index="2" ss:AutoFitWidth="0" ss:Width="73.5"/>
<column ss:AutoFitWidth="0" ss:Width="102.75"/>
<row ss:Index="2">
<cell ss:Index="2"><data ss:Type="String">Enigma Otiliei</data></cell>
<cell><data ss:Type="String">George Calinescu</data></cell>
<cell><data ss:Type="Number">401</data></cell>
<cell><data ss:Type="String">Eminescu</data></cell>
<cell><data ss:Type="Number">20.440000000000001</data></cell>
</row>
<row>
<cell ss:Index="2"><data ss:Type="String">La Tiganci</data></cell>
<cell><data ss:Type="String">Mircea Eliade</data></cell>
<cell><data ss:Type="Number">188</data></cell>
<cell><data ss:Type="String">Tana</data></cell>
<cell><data ss:Type="Number">9</data></cell>
</row>
<row>
<cell ss:Index="2"><data ss:Type="String">Jocul Ielelor</data></cell>
<cell><data ss:Type="String">Camil Petrescu</data></cell>
<cell><data ss:Type="Number">384</data></cell>
<cell><data ss:Type="String">Gramar</data></cell>
<cell><data ss:Type="Number">15</data></cell>
</row>
</table>

<worksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<pageSetup>
<header x:Margin="0.3"/>
<footer x:Margin="0.3"/>
<pageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</pageSetup>
<selected/>
<panes>
<pane>
<number>3</number>
<activeRow>11</activeRow>
<activeCol>8</activeCol>
</pane>
</panes>
<protectObjects>False</protectObjects>
<protectScenarios>False</protectScenarios>
</worksheetOptions>
</worksheet>
<worksheet ss:Name="Sheet2">
<table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
</table>

<worksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<pageSetup>
<header x:Margin="0.3"/>
<footer x:Margin="0.3"/>
<pageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</pageSetup>
<protectObjects>False</protectObjects>
<protectScenarios>False</protectScenarios>
</worksheetOptions>
</worksheet>
<worksheet ss:Name="Sheet3">
<table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
</table>

<worksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<pageSetup>
<header x:Margin="0.3"/>
<footer x:Margin="0.3"/>
<pageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</pageSetup>
<protectObjects>False</protectObjects>
<protectScenarios>False</protectScenarios>
</worksheetOptions>
</worksheet>
</pre>
<p>Datele noastre sunt aflate în interiorul tagurilor „Worksheet”. În funcţie de câte sheet-uri avem în documentul excel, atâtea taguri worksheet va conţine şi fişierul nostru xml. În cadrul fiecărui Worksheet avem tagul „Table” cu ale lui „Row” (linie) şi „Cell” (coloană). În funcţie de câte linii aveam completate în document, tot atâtea taguri „Row” vom avea şi în interiorul tagului „Table”.  Valorile fiecărei coloane sunt stocate în interiorul tagului „Data”.</p>
<p>Ok, să ne întoarcem acum la fişierul php. Pentru început declarăm array-ul în care stocăm înregistrările şi declarăm o funcţie pentru adăugarea lor mai uşoară în acest tablou.</p>
<pre class="brush:php">
$data = array();

function adauga_carte( $titlu, $autor, $pagini, $editura, $pret )
{
global $data;

$data[] = array( 'titlu' => $titlu,
'autor' => $autor,
'pagini' => $pagini,
'editura' => $editura,
'pret' => $pret
);
}
</pre>
<p>Următorul pas este citirea documentului nostru şi a tagurilor (liniile tabelului) „Row”.</p>
<pre class="brush:php">
$dom = new DOMDocument();
$xml = $dom->load( 'Book1.xml' );

$rows = $xml->getElementsByTagName( 'Row' );
</pre>
<p>După ce am citit toate liniile tabelului, pentru fiecare în parte căutăm coloanele (tagurile „Cell”). În acest moment trebuie să ne dăm seama în care coloană ne aflăm. Tagul „Cell” are un atribut „ss:Index„ care ne indică poziţia în cazul în care sunt coloane goale pe linia curentă.</p>
<pre class="brush:php">
//prima linie este ignorată

$first_row = true;

foreach ( $rows as $row )
{
if ( ! $first_row )
{
$titlu    = "";
$autor    = "";
$pagini   = "";
$editura  = "";
$pret     = "";
$index = 1;

$cells = $row->getElementsByTagName( 'Cell' );

foreach ( $cells as $cell )
{
$ind = $cell->getAttribute( 'Index' );

if ( $ind != null ) $index = $ind;

if ( $index == 1 ) $titlu      = $cell->nodeValue;
if ( $index == 2 ) $autor      = $cell->nodeValue;
if ( $index == 3 ) $pagini   = $cell->nodeValue;
if ( $index == 4 ) $editura  = $cell->nodeValue;
if ( $index == 5 ) $pret     = $cell->nodeValue;

$index += 1;
}

adauga_carte( $titlu, $autor, $pagini, $editura, $pret );
}

$first_row = false;
}
</pre>
<p>În acest moment array-ul nostru conţine toate înregistrările din fişierul sursă. Dacă dorim să-l vizualizăm pe ecran pentru verificare, putem pur şi simplu să-l afişăm sub formă de tabel stil excel:</p>
<pre class="brush:php">
echo '
<table border="1">
<tr>
<td><b>titlu:</b></td>
<td><b>autor:</b></td>
<td><b>pagini:</b></td>
<td><b>editura:</b></td>
<td><b>pret:</b></td>
</tr>

';

foreach ( $data as $row )
{
echo '
<tr>
<td>' . $row['titlu'] . '</td>
<td>' . $row['autor'] . '</td>
<td>' . $row['pagini'] . '</td>
<td>' . $row['editura'] . '</td>
<td>' . $row['pret'] . '</td>
</tr>

';
}

echo '</table>

';
</pre>
<p>Dacă totul este în regulă, îl inserăm în baza de date:</p>
<pre class="brush:php">
mysql_connect( "localhost", "user", "pass" );
mysql_select_db( "db_name" );

$i = 0;

foreach ( $data as $row )
{
$inserted = mysql_query( "INSERT INTO `carti` ( titlu, autor, pagini, editura, pret )
VALUES ( '".$row['titlu']."', '".$row['autor']."', '".$row['pagini']."', '".$row['editura']."', '".$row['pret']."' )"
);

if ( $inserted ) $i++;
}

echo 'Au fost introduse ' . $i . ' carti.';
</pre>
<p>Cam asta este procedura pe care eu o folosesc atunci când trebuie să lucrez cu fişierele excel. Este un procedeu de bază realizat pentru un caz particular. Evident se poate îmbunătăţi considerabil, însă nu acesta era scopul exemplului.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2008/11/28/excel-to-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOM vs. SimpleXML partea 2</title>
		<link>http://www.freshcolors.ro/blog/2008/11/02/dom-vs-simplexml-partea-2/</link>
		<comments>http://www.freshcolors.ro/blog/2008/11/02/dom-vs-simplexml-partea-2/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 20:13:14 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[simplexml]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://misterjinx.wordpress.com/?p=131</guid>
		<description><![CDATA[Ca urmare a ultimului articol, voi continua acum descrierea modalităţilor de lucru cu xml din php. De această dată este vorba de DOM.
Parserele de tip DOM construiesc în memorie întregul arbore de resurse. Acesta poate fi ulterior parcurs, şters, modificat, adăugat. Un avantaj al DOM constă în flexibilitatea mai mare oferită faţă de SimpleXML, cu [...]]]></description>
			<content:encoded><![CDATA[<p>Ca urmare a ultimului articol, voi continua acum descrierea modalităţilor de lucru cu xml din php. De această dată este vorba de DOM.</p>
<p>Parserele de tip DOM construiesc în memorie întregul arbore de resurse. Acesta poate fi ulterior parcurs, şters, modificat, adăugat. Un avantaj al DOM constă în flexibilitatea mai mare oferită faţă de SimpleXML, cu preţul unei complexităţi sporite.</p>
<p>Extensia DOM (specifică php5) este exclusiv orientată pe obiecte. Principala clasă este DOMNode, din care derivă DOMDocument, DOMElement, DOMAttr, DOMComment, DOMText. Celelalte două clase disponibile sunt DOMNodeList şi DOMXPath.</p>
<p>Încărcarea codului xml se poate face din fişier sau string, prin instanţierea unui obiect de tip DOMDocument urmat de apelarea metodelor de încărcare: load şi loadHTMLFile (din fişier), respectiv loadHTML şi loadXML (din string).</p>
<pre class="brush:php">
$xml = new DOMDocument();

$xml->load("fisier.xml");

$xml->load("http://adresa_web/fisier.xml");

$string = file_get_contents("fisier.xml");

$xml->loadXML($string);
</pre>
<p>Parcurgerea unui arbore de tip DOM şi accesul la resurse se face printr-o multitudine de metode şi câmpuri puse la dispoziţie de toate clasele DOM. Lista lor este foarte mare şi de aceea voi menţiona doar câteva, cele mai importante.</p>
<p>Să luăm drept exemplu acelaşi fişier ca şi în prima parte a articolului:</p>
<pre class="brush:xml">
<?xml version="1.0"?>
<unitati>
<server tip="pc" memorie="1gb" hdd="100gb">
<nume>unitatea 0</nume>
</server>
<calculator tip="pc" memorie="2gb" hdd="160gb">
<nume>unitatea 1</nume>
<valoare>1500 lei</valoare>
</calculator>
<calculator tip="pc" memorie="1gb" hdd="100gb">
<nume>unitatea 2</nume>
<valoare>1200 lei</valoare>
</calculator>
<calculator tip="mac" memorie="2gb" hdd="120gb">
<nume>unitatea 3</nume>
<valoare>3500 lei</valoare>
</calculator>
</unitati>
</pre>
<p>Parcurgerea acestui fişier se poate face în felul următor:</p>
<pre class="brush:php">
$xml = new DOMDocument();
$xml->load("fisier_de_mai_sus.xml");

echo $xml->nodeName; // afiseaza #document
echo $xml->firstChild->nodeName; // afiseaza unitati
echo $xml->firstChild->firstChild->nodeName; // afiseaza server

foreach ( $xml->firstChild->childNodes as $s) echo $s->nodeName . " "; // afiseaza server calculator calculator calculator

foreach ( $xml->DocumentElement as $nod )
{
echo $nod->nodeName;

if ( $nod->hasAttributes() )
{
foreach ( $nod->attributes as $a )
{
echo $a->name . ": " . $a->value . "<br/>"; //afiseaza nume_atribut: valoare_atribut
}
}

echo "<br/>";
}
</pre>
<p>Bun, acum să luăm pe rând să vedem ce am folosit mai sus pentru parsarea fişierului.</p>
<ul>
<li>Câmpul nodeName din clasa DOMNode afişează numele nodului. Pentru elemente returnează numele tagului, iar pentru noduri text <em>#text</em>.</li>
<li>Câmpul firstChild ( sau lastChild ) desemnează primul/ultimul nod copil al nodului curent</li>
<li>childNodes returnează lista de noduri copil</li>
<li>documentElement returnează elementul rădăcină al fişierului xml</li>
<li>metoda hasAttributes returnează true/false dacă elementul are atribute sau nu</li>
<li>Câmpul attributes returnează lista de atribute ale unui nod, sub forma unui obiect iterabil. pentru afisarea lor se folosesc câmpurile clasei DOMAttr, name şi value.</li>
</ul>
<p>De asemenea se pot adăuga noduri la obiectul curent prin metodele clasei DOMNode, appendChild sau insertBefore, iar asocierea de atribute se poate face prin metoda setAttribute, a clasei DOMElement.</p>
<p>Dacă dorim, putem crea de la zero un document xml folosind metoda createElement a clasei DOMDocument, pentru crearea de elemente, createAttribute, pentru adăugare de atribute şi createTextNode, pentru adăugarea de PCDATA.</p>
<p>Spuneam la început că se pot folosi şi interogări XPath pentru parcurgerea codului XML. Clasa care ajută la acest lucru este DOMXPath. Prinicipala metodă a acestei clase este <em>query</em>, care primeşte ca argument expresia XPath şi returnează nodurile găsite sub forma unui obiect de tip DOMNodeList ce se poate itera.</p>
<p>Extensia DOM este foarte puternică pentru lucrul cu fişiere XML şi din acest motiv, foarte complexă. Dacă doriţi să cunoaşteţi mai multe desprea ea puteţi să începeţi cu <a title="DOM" href="http://www.php.net/manual/en/book.dom.php" target="_blank">documentaţia</a> de pe site-ul oficial.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2008/11/02/dom-vs-simplexml-partea-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DOM vs. SimpleXML partea 1</title>
		<link>http://www.freshcolors.ro/blog/2008/10/25/dom-vs-simplexml-partea-1/</link>
		<comments>http://www.freshcolors.ro/blog/2008/10/25/dom-vs-simplexml-partea-1/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 18:59:52 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[simplexml]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://misterjinx.wordpress.com/?p=124</guid>
		<description><![CDATA[Pentru lucrul cu XML există 2 extensii disponibile în PHP, SimpleXML şi DOM. În următoarele 2 articole voi vorbi pe rând despre fiecare dintre ele, iar la final voi scrie nişte avantaje şi dezavantaje pentru fiecare.
SimpleXML
După cum spune şi numele, extensia SimpleXML este intuitivă şi uşor de învăţat. Ea a fost dezvoltată ca o soluţie [...]]]></description>
			<content:encoded><![CDATA[<p>Pentru lucrul cu XML există 2 extensii disponibile în PHP, SimpleXML şi DOM. În următoarele 2 articole voi vorbi pe rând despre fiecare dintre ele, iar la final voi scrie nişte avantaje şi dezavantaje pentru fiecare.</p>
<h3><strong>SimpleXML</strong></h3>
<p>După cum spune şi numele, extensia SimpleXML este intuitivă şi uşor de învăţat. Ea a fost dezvoltată ca o soluţie intermediară între DOM şi SAX: are un consum de resurse mic, precum SAX, însă nu este aşa de flexibilă, precum DOM.</p>
<p>SimpleXML prezintă funcţii ce permit încărcarea de cod XML din fişiere, string-uri sau noduri DOM.</p>
<pre class="brush:php">
//încarcare din fişier
$xml = simple_xml_load_file("fisier_sursa.xml");

//încarcare din string
$string = file_get_contents("fisier_sursa.xml");

$xml = simplexml_load_string($string);
</pre>
<p>De asemenea acest lucru se poate realiza şi prin utilizarea clasei SimpleXMLElement (principala clasă a SimpleXML):</p>
<pre class="brush:php">
$xml = new SimpleXMLElement("fisier_sursa.xml", null, true);
</pre>
<p>După încărcarea codului XML, conţinutul poate fi parcurs foarte uşor folosind membrii clasei SimpleXMLElement.</p>
<p>Să presupunem că fişierul sursă invocat mai sus are următorul conţinut:</p>
<pre class="brush:xml">
<?xml version="1.0"?>
<unitati>
<server tip="pc" memorie="1gb" hdd="100gb">
<nume>unitatea 0</nume>
</server>
<calculator tip="pc" memorie="2gb" hdd="160gb">
<nume>unitatea 1</nume>
<valoare>1500 lei</valoare>
</calculator>
<calculator tip="pc" memorie="1gb" hdd="100gb">
<nume>unitatea 2</nume>
<valoare>1200 lei</valoare>
</calculator><calculator tip="mac" memorie="2gb" hdd="120gb">
<nume>unitatea 3</nume>
<valoare>3500 lei</valoare>
</calculator>
</unitati>
</pre>
<p>Un obiect de tip SimpleXMLElement corespunde fiecarui element din XML, în cazul de mai sus fiind chiar elementul rădăcină. Pentru aflarea numelui se foloseşte metoda getName().</p>
<pre class="brush:php">
echo $xml->getName(); // va afişa unitati
</pre>
<p>În cazul acestei extensii sub-elementele sunt tratate precum câmpuri ale obiectului definit, fiecare element copil având un câmp cu numele său.</p>
<pre class="brush:php">
$server = $xml->server; // $c devine un obiect SimpleXMLElement

echo $server->nume; // va afisa unitatea 0
</pre>
<p>În cazul în care există mai multe sub-elemente cu acelaşi nume, ele vor fi construite ca un array şi se vor putea apela asemeni acestora.</p>
<pre class="brush:php">
$calculatoare = $xml->calculator; //preiau toate sub-elementele calculator

foreach ( $calculatoare as $calculator ) echo $calculator->nume; //va afişa pe rând fiecare numele
</pre>
<p>Conţinutul PCDATA se poate obţine prin conversia la string a unui obiect SimpleXMLElement.</p>
<pre class="brush:php">
echo $server->nume; // va afisa unitatea 0
</pre>
<p>Atributele fiecărui element se pot accesa sub forma unui tablou asociativ, având forma elementului căruia aparţin.</p>
<pre class="brush:php">
echo $server['tip']; //va afişa pc
</pre>
<p>De asemenea pentru atributele unui element se mai poate folosi şi metoda attributes(), care extrage atributele sub forma unui tablou asociativ de obiecte de tip SimpleXMLElement.<br />
Pe scurt, cam aşa se prezintă extensia SimpleXML. După cum spuneam la început, este foarte intuitivă şi uşor de învăţat. Pentru a nu lungi însa prea mult acest post voi vorbi despre cealaltă extensie pentru lucrul cu fişiere xml în următorul articol.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2008/10/25/dom-vs-simplexml-partea-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Preluarea cursului BNR în mai puţin de 10 linii de cod</title>
		<link>http://www.freshcolors.ro/blog/2008/09/25/preluarea-cursului-bnr-in-mai-putin-de-10-linii-de-cod/</link>
		<comments>http://www.freshcolors.ro/blog/2008/09/25/preluarea-cursului-bnr-in-mai-putin-de-10-linii-de-cod/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 20:37:37 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bnr]]></category>
		<category><![CDATA[curs valutar]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[preluare]]></category>

		<guid isPermaLink="false">http://misterjinx.wordpress.com/?p=113</guid>
		<description><![CDATA[Azi am fost nevoit să preiau cursul valutar de pe site-ul bnr pentru a-l stoca în baza de date.  Ştiu că erau pe nu ştiu ce site-uri puse la dispoziţie coduri care fac treaba asta, însă după mine într-o manieră foarte alandala. După mine cel mai simplu de parsat un fişier xml (cum este [...]]]></description>
			<content:encoded><![CDATA[<p>Azi am fost nevoit să preiau cursul valutar de pe site-ul bnr pentru a-l stoca în baza de date.  Ştiu că erau pe nu ştiu ce site-uri puse la dispoziţie coduri care fac treaba asta, însă după mine într-o manieră foarte alandala. După mine cel mai simplu de parsat un fişier xml (cum este cel pus la dispoziţie de bnr) este folosind extensiile puse la dispoziţie de php, SimpleXML şi DOM. Eu am ales să folosesc DOM, deoarece rezolvă foarte repede ceea ce am avut nevoie.</p>
<p>Structura fişierului xml care trebuie parsat este urătoarea:</p>
<pre class="brush:xml">
<dataSet xsi:schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd">
<header>
<sender>National Bank of Romania</sender>
<sendingDate>2008-09-25</sendingDate>
<messageType>DR</messageType>
</header>
<body>
<subject>Reference rates</subject>
<origCurrency>RON</origCurrency>
<cube date="2008-09-25">
<rate currency="AUD">2.0985</rate>
<rate currency="BGN">1.8802</rate>
<rate currency="CAD">2.4202</rate>
<rate currency="CHF">2.3059</rate>
<rate currency="CZK">0.1505</rate>
<rate currency="DKK">0.4930</rate>
<rate currency="EGP">0.4583</rate>
<rate currency="EUR">3.6773</rate>
<rate currency="GBP">4.6475</rate>
<rate currency="HUF" multiplier="100">1.5275</rate>
<rate currency="JPY" multiplier="100">2.3608</rate>
<rate currency="MDL">0.2414</rate>
<rate currency="NOK">0.4452</rate>
<rate currency="PLN">1.1040</rate>
<rate currency="RUB">0.1000</rate>
<rate currency="SEK">0.3800</rate>
<rate currency="SKK">0.1214</rate>
<rate currency="TRY">2.0194</rate>
<rate currency="USD">2.5001</rate>
<rate currency="XAU">71.4560</rate>
<rate currency="XDR">3.9396</rate>
</cube>
</body>
</dataSet>
</pre>
<p>(evident documentul nu este valid, dar nu ne interesează asta <img src='http://www.freshcolors.ro/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  )</p>
<p>După cum se observă, ce trebuie noi să facem este preluarea tuturor tagurilor cu numele „Rate”.  Apoi preluăm  numele valutei folosind metoda getAttribute, care returnează valoarea atributului cu numele specificat.</p>
<p>Iată codul care pune în aplicare cele spuse mai sus:</p>
<pre class="brush:xml">
/*
* initiez clasa DOMDocument, reprezentand fisierul xml incarcat
*/
$dom = new DOMDocument();
/*
* incarc fisierul xml, specificand adresa completa
*/
$dom->load( "http://www.bnro.ro/nbrfxrates.xml" );

/*
* preiau intr-un obiect iterabil lista elementelor(tagurile) cu numele specificat
*/
$valute = $dom->getElementsByTagName('Rate');

/*
* verific daca sunt elemente de acest tip
*/
if ( $valute->length != 0 )
{
/*

* in caz afirmativ, iterez prin ele si le afiez

* ( evident le pot stoca intr-un array sau chiar in baza de date,

* dupa caz)
*/
foreach ( $valute as $valuta )
{
echo $valuta->getAttribute(currency). " - " .$valuta->nodeValue . "<br/>";
}
}
</pre>
<p>Dacă nu punem la socoteală, liniile comentate, putem prelua codul bnr în doar 8 linii de cod ! În acelaşi mod se pot prelua şi diferite feed-uri de pe diverse site-uri. Baftă <img src='http://www.freshcolors.ro/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2008/09/25/preluarea-cursului-bnr-in-mai-putin-de-10-linii-de-cod/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

