Review CMF

CodeIgniter, Zend Framework, Cake PHP, Yii, symfony, Prado, Seagull, Kohana, MODX, eZ Components

Moderator: Moderatori

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Review CMF

Mesajde cezar.lucan » Lun Aug 27, 2012 9:05 pm

Am nevoie de review-uri la frameworkul meu. Am publicat de curand varianta 2.0 cu multe imbunatatiri si sincer caut pareri ale programatorilor de la noi.

Documentatia este aproape completa si ar trebui sa fie indeajuns pentru o initiere.

http://www.aws-dms.com/

Ca un overview va recomand:

http://aws-dms.com/temp.php?use=templates/appdesign.xml
(dati click pe acolo sa va arate cum se leaga lucrurile)

Scuze pentru engleza de bastina.... credeti ca ar trebui sa fac si documentatie in Romana?

PS: Puteti sa imi si scrieti pe adresa de pe site daca doriti, pareri sau intrebari!

Multumesc!
Ultima oară modificat Mie Aug 29, 2012 12:45 am de către cezar.lucan, modificat 1 dată în total.



Avatar utilizator
MihaiC
Senior Member
Mesaje: 1644
Membru din: Dum Mai 14, 2006 8:07 pm

Mesajde MihaiC » Mar Aug 28, 2012 3:19 pm

A. Pentru inceput nu merge sa download-ez pe firefox (a mers cu chrome)
B. Structura aratata pe site-ul tau nu arata in nici un caz cu ceea ce am scos eu.
C. Framework:
1. Design interesant
2. Nu e MVC
3. Nu se pot rescrie usor url-urile (nu are dispatcher/router)
4. Din cate am vazut eu pentru site in mai multe limbi folosesti sesiuni (google nu o sa mai inteleaga nimic).
5. Etc.
Dev @ oblio.eu

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Mar Aug 28, 2012 4:32 pm

Salut Mihai si multumesc pentru raspuns!!!! Incepusem sa imi pierd speranta :D

Deoarece sunt pe drum si nu am timp voi raspunde direct la subiect:

A. Pentru inceput nu merge sa download-ez pe firefox (a mers cu chrome)
- Regret, nu e prima oara cand mi se intampla sa fac ceva modificari dar sa uit sa testez pe alte browsere; repar diseara

B. Structura aratata pe site-ul tau nu arata in nici un caz cu ceea ce am scos eu.
In ce sens? Te referi la strucura din overview? Acea structura este intocmai cum functioneaza frameworkul meu si am facut-o intocmai dupa motorul framworkului.

Daca te regeri la imaginea de pe prima pagina, aceea este ce mi-am propus si in proportie de 90% este realizata

C. Framework:
1. Design interesant
Multumesc

2. Nu e MVC
Nu in sensul in care sunt definite structurile MVC dar in functie de performatele fiecarui programator este destul de bine orientat MVC. Nu am vrut sa urmez acest "standard" deoarece prin flexibilitatea frameworkului consider ca l-as complica si nici nu vreau sa intru intr-o astfel de discutie pt ca este lunga ... prea!! :D

3. Nu se pot rescrie usor url-urile (nu are dispatcher/router)
De fapt acest framework a pornit chiar de la aceasta problema: intr-una din aplicatiile mele aveam nevoie sa schimb diferite atribute ale elementelor din pagina.

Deoarece este bazat pe xml, ai access instantaneu la orice element din pagina, indifirent unde anume esti in logica programului.

Ca solutie se pot folosi filtrele globale (user filters sau parsers) care sunt secvente de cod executate in toate aplicatiile ce ruleaza in framework.
O simpla adaugare a codului de mai jos in parsers.xml, rezolva problema:

<item>
<xpath>
//a
</xpath>

<callback>
selectia dupa calea aplicatiei (merge si cu $GLOBALS["appName"] daca este setat in /app/name)
switch(basename($el->getAttribute("href")))
{
case "app1.xml":
//codul aici
break;

....
}
</callback>
</item>

Acesta este un model de dispatcher pe care il poti folosi la orice, nu doar pt url-uri

4. Din cate am vazut eu pentru site in mai multe limbi folosesti sesiuni (google nu o sa mai inteleaga nimic)

Corect, la baza acestui framework se afla sesiunile.... Dar schimbarea limbii se face doar intr-o variabila din sesiune, si nu prin regenerarea id-ului sesiunii.

5. Etc.
?? Mai astept!!!


Cu respect!

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4832
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Mesajde vectorialpx » Mar Aug 28, 2012 5:19 pm

Eu nu pot sa descarc (firefox, chrome, safari, opera)

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Mar Aug 28, 2012 5:29 pm

Imi cer scuze, trebuie sa verific!

Va rog aveti rabdare pana diseara!

PS: pe chrome merge sigur
Captcha este case sensitive

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4832
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Mesajde vectorialpx » Mar Aug 28, 2012 5:56 pm

Mda, se pare ca eu trebuie sa ofer scuze. Nu am vazut ca download-ul il ai mai jos (foarte aiurea pus, de altfel).

Butonul de download se pune undeva mai sus, mare si rosu, sa vada si "eu" care da click pe "Latest" release asteptand un download. Cand colo, e doar o ancora :)
De exemplu http://framework.zend.com/download/latest
(nu stiu de ce ai pune captcha la un download, mai ales daca e public)

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Mie Aug 29, 2012 12:06 am

@MihaiC

Am gresit in cod... rezolvat cu download-ul in Firefox!!!

@vectorialpx
Ai dreptate cu download-ul sa fie inainte, am modificat!!! Multumesc de idee!!
Cat despre Captcha, am fost obligat sa il pun deoarece cred ca unii se plictiseau si bagau download-uri la greu. Nu m-ar fi deranjat dar am un contor si il dadeau peste cap :D

Astept comentarii si intrebari!! Daca aveti nevoie de ajutor scrieti aici, poate documentatia nu e prea clara peste tot.

PS: filmele si pozele din documentatie sunt de la varianta 1.x. Diferenta este ca in 1.x tot codul (js, php) era in continutul de tip text al elementelor. In 2.x am schimbat cum era normal si tot ceea ce inseamna php este in processing instruction, toate celelalte (javascript, css si interogarile xpath) au ramas in text!

In plus toate exemplele le puteti descarca la adresa: http://www.aws-dms.com/uup/XMSAllEx.rar

Am facut si o serie de tutoriale, daca va uitati pe site le vedeti.

Multumesc!!

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Vin Aug 31, 2012 11:38 am

@vectorialpx
Impresii, critici, pareri, sugestii? :D



@ TOATA LUMEA DE PE AICI:
Am nevoie de de testeri pentru acest framework!

Ofer suport complet si o bere fiecarui tester cand ajung la el in zona (calatoresc destul de mult)

PS: pana luni sunt in Bucuresti, marti Craiova, miercuri si joi Brasov :D

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Sâm Sep 08, 2012 1:49 pm

Am tot stat si m-am gandit zilele trecute cum sa explic in asa fel incat sa intelegeti acest framework mai usor si am ajuns la concluzia ca cel mai usor ar fi sa discutam pe o aplicatie.
Mai jos vedeti cum arata aplicatia in Designer, dupa care este este codul xml al aplicatiei.
Voi explica pe scurt ce face aceasta aplicatie, dupa codul xml. Cred ca daca aveti rabdare sa cititi acest post reusiti sa intelegeti cum functioneaza acest framework care este mult diferit de orice sunteti obisnuiti.

Imagine

Cod: Selectaţi tot

<app outputxsl="xsl/aws2html.xsl">
   <bookmarks/>
   <client>
      <content>
         <table id="DOMtblIterator">
            <tr>
               <th class="first">
                  id
               </th>
               <th>
                  title
               </th>
               <th>
                  location
               </th>
               <th>
                  reference
               </th>
            </tr>
            <tr unit="">
               <td reference="id"/>
               <td reference="name"/>
               <td reference="location" skip=""/>
               <td reference="location" modtype="prepend" skip="">
                  <button reference="id">
                     Button
                  </button>
               </td>
            </tr>
         </table>
         <import source="http://www.phpromania.net/forum/viewtopic.php?t=25914&amp;sid=1c9cecdbb27156ece97cf5f58917f109" xpath="//table[@width='98%'][2]" importashtml=""/>
      </content>
   </client>
   <templates>
      <importtest>
         <strong>
            <font>
               SESIUNEA:
               <replace>
                  <?aws $el->setAttribute("color","red");

return session_id();?>
               </replace>
            </font>
         </strong>
      </importtest>
   </templates>
   <filters>
      <dom>
         <filter name="FILTRU IMPORT">
            <import xpath="//app/templates/importtest/*"/>
            //span[@class='catrowtext']
         </filter>
         <filter name="SCHIMBA USERUL MEU">
            <nodelist>
               //b[contains(.,'cezar.lucan')]
            </nodelist>
            <?aws $el->replace("
            <strong>
               XMS 2.0
            </strong>
            ");?>
         </filter>
         <filter name="CAUTA ATTR CLASA">
            <xpath>
               //@class[contains(.,'row')]
            </xpath>
            <?aws $el->nodeValue = "TESTATTR";?>
         </filter>
         <filter name="EXEMPLU DOMITERATOR">
            <domiterator>
               //*[@id="DOMtblIterator"]
               <norecords>
                  <?aws return '
                  <tr>
                     <td colspan="4">
                        No records
                     </td>
                  </tr>
                  ';?>
               </norecords>
            </domiterator>
            <?aws return array(array(id => "10",name => "john", location=>"Brasov",product=> "My Product"),array(id => "15",name => "io", location=>"Bucuresti",product=> "My Product"));?>
         </filter>
      </dom>
   </filters>
</app>


In primul rand, orice aplicatie are urmatoarele parti:
- client/header - este de fapt html/head
- client/content - sau html/body

Cand XMS trimite spre client o aplicatie , va cauta atributul outputxsl al app si daca este gasit va folosi fisierul xsl dat de valoarea acestui atribut. In acest caz (aplicatie html), fisierul este xsl/aws2html.xsl.

Pentru a interactiona cu layout-ul, XMS are predefinite o serie de directive si filtre. In plus exista posibilitatea de a defini filtre, ce vor fi executate doar in aplicatia unde sunt definite sau in orice aplicatie.

Nu am vrut sa complic aplicatia dar totusi vreau sa va arat ce este o directiva un filtru si cum functioneaza.

Directiva: un element predefinit care poate sa fie oriunde in /app/client si XMS va cauta aceste directive apoi va executa in functie de cum a fost definita

Filtrul: un element in /app/filters/dom (filtre de tip DOM) sau /app/filters/ob (filtre de tip text) . XMS executa filtrul prin identificarea nodului tinta al sau si executarea codului (predefinit sau definit de utilizator) cu elementul tinta ca parametru.

Cod: Selectaţi tot

<import source="http://www.phpromania.net/forum/viewtopic.php?t=25914&amp;sid=1c9cecdbb27156ece97cf5f58917f109" xpath="//table[@width='98%'][2]" importashtml=""/>


Cea mai des folosita directiva este import. Aceasta directiva va citi fisierul dat de atributul source, cauta elementele din calea data de atributul xpath si se "inlocuieste" cu rezultatul.
import este in primul rand folosita pentru a importa cod XMS din aplicatii existente sau din aplicatia curenta (daca nu are atributul source). Deasemenea, import poate folosi ca sursa atat fisiere xml (default) sau html (daca are atributul importashtml).

In aplicatia de mai sus, in app/client/content este un exemplu de utilizare a acestei directive. Deci, import va deschide ca sursa html fisierul din atributul source (in acest exemplu este vorba chiar despre acest topic), cauta al 2-lea tabel care are atribut width=98%, si se inlocuieste cu rezultatul.
Bineinteles, se pot face multe operatii pe fiecare nod in parte, pe documentul sursa, chiar se pot shimba atributele directivei "on the fly" folosind "directiva copil" runfirst. Mai multe exemple pe site.

Cod: Selectaţi tot

<replace>
                  <?aws $el->setAttribute("color","red");

return session_id();?>
               </replace>


Directiva replace (o gasiti in //app[1]/templates[1]/importtest[1]/strong[1]/font[1]/replace[1] - va fi importata in aplicatie si executata) primeste ca parametru nodul parinte al directivei si se inlocuieste cu rezultatul functiei.
In acest exemplu folosesc replace pentru a arata id-ul sesiunii dar si pentru a schimba culoarea textului. Cum parintele directivei replace este font, codul $el->setAttribute("color","red"); va schimba culoarea.
Functia din "replace" trebuie sa returnese intotdeauna o valoare!


Cod: Selectaţi tot

<filter name="FILTRU IMPORT">
            <import xpath="//app/templates/importtest/*"/>
            //span[@class='catrowtext']
         </filter>


Acum ca am vazut cum lucreaza o directiva, sa explic cum functioneaza un filtru. In acest exemplu am folosit filtrul predefinit import, deoarece face exact ceea ce face directiva cu avantajul ca putem accesa elemente din client "de la distanta".

Pentru ca am importat prima pagina a acestui topic, acum hai sa cautam un element in sursa topicului pe care sa il schimbam cu unul din aplicatia curenta.

Daca va uitati in codul aplicatiei, veti vedea ca filtrele sunt definite in /app/filters.

Asa cum am spus mai sus, orice filtru are un nod tinta: in acest exemplu este vorba de orice nod "span" care are clasa catrowtext (//span[@class='catrowtext']).
Filtrul import, va cauta span-ul de mai sus si il va inlocui cu nodul dat de atributul xpath al nodului import.
Acest exemplu de filtru ne arata cum filtrul import poate fi folosit pentru a importa cod XML din aplicatia curenta. Daca vreti sa importati cod dintr-o alta aplicatie, atunci in atributul source al import puteti sa setati care este acea aplicatie.

Cod: Selectaţi tot

<filter name="SCHIMBA USERUL MEU">
            <nodelist>
               //b[contains(.,'cezar.lucan')]
            </nodelist>
            <?aws $el->replace("
            <strong>
               XMS 2.0
            </strong>
            ");?>
         </filter>


Continuam cu explicarea filtrului nodelist. Folosesc acest filtru pentru a schimba id-ul meu din pagina cu textul XMS 2.0. Deci cauta in pagina un element b care contine textul cezar.lucan.
nodelist apeleaza functia cu parametrul $el care este de tip awsXML. Metodele aceste clase sunt oarecum similare cu jQuery.

Cod: Selectaţi tot

<filter name="CAUTA ATTR CLASA">
            <xpath>
               //@class[contains(.,'row')]
            </xpath>
            <?aws $el->nodeValue = "TESTATTR";?>
         </filter>

Urmatorul filtru este xpath. Acest filtru primeste ca parametru fiecare element al interogarii, deci executa codul pentru fiecare element din xpath, in parte.
Putem executa functia pe orice tip de nod, in acest caz am ales sa caut toate atributele din pagina, care au numele "class" si contin textul "row".
Dupa cum vedeti mai sus, schimb valoarea fiecarui atribut gasit, cu "TESTATTR".
Daca vrei sa cautati un element atunci in xpath puneti //nume_elem[@numeatribut="valoare"] sau orice alta interogare aveti nevoie. Puteti cauta chiar si comment-urile sau noduri de tip processing instruction sau direct text (//comment() sau //processing-instruction("target") sau //text() .......)


Cod: Selectaţi tot

<filter name="EXEMPLU DOMITERATOR">
            <domiterator>
               //*[@id="DOMtblIterator"]
               <norecords>
                  <?aws return '
                  <tr>
                     <td colspan="4">
                        No records
                     </td>
                  </tr>
                  ';?>
               </norecords>
            </domiterator>
            <?aws return array(array(id => "10",name => "john", location=>"Brasov",product=> "My Product"),array(id => "15",name => "io", location=>"Bucuresti",product=> "My Product"));?>
         </filter>


Ultimul filtru pe care am ales sa il pun in aplicatie, este domiterator. Acesta este in primul rand pentru a fi folosit pt lucrul cu bazele de date (exemplu pe site).

domiterator ia ca obiect de lucru un sir de siruri asociative, caut in nodul tinta un element care are atributul unit, pe care il multiplica pentru fiecare array.
Pentru a utiliza valorile din acest sir asociativ, domiterator cauta in fiecare "unit" elementele care au atributul "reference" identic cu numele fiecarei etichete..... Da, stiu, suna complicat dar este chiar foarte simplu!!!
Pentru a intelege, in nodul client. gasiti tabelul:

Cod: Selectaţi tot

<table id="DOMtblIterator">
            <tr>
               <th class="first">
                  id
               </th>
               <th>
                  title
               </th>
               <th>
                  location
               </th>
               <th>
                  reference
               </th>
            </tr>
            <tr unit="">
               <td reference="id"/>
               <td reference="name"/>
               <td reference="location" skip=""/>
               <td reference="location" modtype="prepend" skip="">
                  <button reference="id">
                     Button
                  </button>
               </td>
            </tr>
         </table>

Mai sus vedeti ca a doua linie are atributul "unit".
In unit puteti vedea cum fiecarui element pe care vreau sa il modific, ii setez atributul reference cu valoarea unei etichete din sir.
Default, domiterator schimba continutul fiecarei referinte cu valoarea corespunzatoare din sir. Se poate modifica comportamentul pentru fiecare label, pentru cele care vrem doar, putem accesa elementele DOM direct pentru a seta atribute, toate aceste prin folosirea filtrelor copil (lista este pe site). Exemplu complet al filtrului, cu mare parte din optiuni mai jos (arata si folosirea PDO pt o baza de date):

Cod: Selectaţi tot

<filter>
   <domiterator>
      //*[@id="DOMtblIterator"]
      <eachreference>
         <?aws $el->setAttribute("WORKS",$label."=".$value);
$el->setAttribute("recordsetTEST",$recordset["name"]);?>
      </eachreference>
      <eachnamedreference>
         <id>
            <!--There are two elements referencing to "id" field; this is how you can access these DOM elements and modify them directly from php; --><!--function parameters: $el,$label,$value,$recordset where $el is the DOMNode, $label is the name of the field, $value is the value of the field, $recordset is entire recordset (like array(name => "john", location=>"My City",product=> "My Product"))--><?aws $el->setAttribute("EACHNAMEDREFERENCE","WORKS FOR ID");

if($el->nodeName =="button") $el->appendChild($el->ownerDocument->createTextNode(" / I am a ".$el->nodeName));
else
$el->appendChild($el->ownerDocument->createTextNode(" / I am not a button, I am a  ".$el->nodeName));?>
         </id>
         <name>
            <!--function parameters: $el,$label,$value,$recordset where $el is the DOMNode, $label is the name of the field, $value is the value of the field, $recordset is entire recordset (like array(name => "john", location=>"My City",product=> "My Product"))--><?aws $el->setAttribute("EACHNAMEDREFERENCE","WORKS FOR NAME");
$el->setAttribute("anotherRecordsetTEST",$recordset["location"]);?>
         </name>
         <location>
            <!--function parameters: $el,$label,$value,$recordset where $el is the DOMNode, $label is the name of the field, $value is the value of the field, $recordset is entire recordset (like array(name => "john", location=>"My City",product=> "My Product"))--><?aws $el->setAttribute("EACHNAMEDREFERENCE","WORKS FOR LOCATION");?>
         </location>
      </eachnamedreference>
      <norecords>
         <?aws return '
         <tr>
            <td colspan="4">
               No records
            </td>
         </tr>
         ';?>
      </norecords>
   </domiterator>
   <!--here we have to retrieve the data from our DB and give it to domiterator to be displayed; see "Content of filter" above --><?aws return $GLOBALS["APPINIT"]["PDO"]->query("select * from domiteratortest limit 0,3")->fetchAll(PDO::FETCH_ASSOC);?>
</filter>


Sunt multe alte exemple pe care le putem discuta. Daca aveti intrebari... nu ezitati, raspund la toate!

Pentru fiecare directiva si filtru gasiti exemple pe site. Daca este ceva neclar, scrieti aici si raspund cu placere!

Astept critici, comentarii, dar cel mai important.... sper ca acest post sa va starneasca curiozitatea si sa fi inteles structura si puterea acestui framework!

l33t
Senior Member
Mesaje: 216
Membru din: Sâm Mai 10, 2008 7:31 pm

Mesajde l33t » Mie Sep 12, 2012 12:56 am

Eu nu am stat sa citesc tot, de fapt nici nu am downloadat, am citit primele 2-3 reply-uri si am dat click pe un link unde am citit in diagonala (de fapt, doar m-am uitat la poze :D ).

Am 2 intrebari:
1. De ce as folosi framework-ul tau fata de unul deja consacrat, cu o comunitate in spate si documentatie? In afara de pura curiozitate si prea mult timp liber.

2. Am vazut o remarca anterioara MihaiC:
4. Din cate am vazut eu pentru site in mai multe limbi folosesti sesiuni (google nu o sa mai inteleaga nimic).

Tu ai dat un raspuns:
Corect, la baza acestui framework se afla sesiunile.... Dar schimbarea limbii se face doar intr-o variabila din sesiune, si nu prin regenerarea id-ului sesiunii.

La un asemenea raspuns, te intreb cata experienta (reala) ai?
E logic ca nu se regenereaza id-ul de sesiune altfel nu s-ar schimba niciodata limba. Din ratiuni legate de SEO, este o abordare total gresita (nu stiu daca schimbarile, recente, de algoritm al google tin cont de asta).

Acum este de fapt intrebarea pt 2: tu zici mai sus ca la baza stau sesiunile, eu te intreb acum daca te-ai gandit putin la cache, daca da da-mi exemple; si ce faci cu sesiunile si full page cache?

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Mie Sep 12, 2012 10:07 am

Salutare!!!!

Ei.... asta este exact tipul de discutie constructiva pe care o caut, multumesc!!!

1. Buna intrebare si destul de greu sa raspund!!

Php-ul cred ca a devenit un limbaj popular mai ales datorita simplitatii, dupa care framework-urile au completat oarecum neajunsurile prin adaugarea de "facilitati" necesare dezvoltatorilor pentru a creste productivitatea, a permite reutilizarea codului,....

In primele mele aplicatii am folosit Zend, deoarece era cel mai popular (si se pare ca este in top inca, alaturi de Yii, CI, s.a.). Nu pot sa spun ca am fost un mare adept al lor deoarece adauga un nivel de complexitate, de multe ori documentatia nu era de ajuns si aveam nevoie sa "sap" pentru a gasi raspunsurile.

Pe scurt, Zend mi-a rezolvat problemele dar mi-a creat altele asa ca am incercat sa imi construiesc pe cat posibil, un framework propriu ... suna cunoscut tuturor :D Dar nici acest framework nu a fost ok deoarece era foarte specializat pe un anume tip de aplicatii si daca faceam o schimbare atunci aveam dureri de cap in alte aplicatii... asa m-am convins ca nici aceasta varianta nu este buna deci am luat o pauza de gandire, sa vad unde gresesc.
Se pare ca, deoarece am folosit ZF am ramas oarecum ancorat in abordarea lui de la acel moment si cam tot ce am facut in framewrokul meu a fost o "replica" a ceea ce exista deja deci.... eram pe un drum gresit.

Cand am inceput sa lucrez la acest framework, am pus pe hartie cateva idei:
- Ce vreau sa fac cu el: HTML, XML si alte cateva tipuri de aplicatii (probabil 1%)

- Ce au toate aceste aplicatii in comun: XML!!! Pana si HTML este un XML mai ... specializat

- Cum vreau sa lucrez in el: "crude PHP", fara complicatii si dureri de cap, zeci de clase, care mai de care cu tone de logica pe care eu sa o stapanesc indeajuns de bine pentru a rezolva o problema

- Cum anume realizez ceea ce este mai sus: identificand cateva operatii de baza pe care sa le faca frameworkul si lasand logica aplicatiei la indemana dezvoltatorului

-Cum anume as putea sa fac sa pot lucra la aplicatiile mele de oriunde (orice calculator) fara sa am nevoie de fel si fel de programe: rezulta o interfata integrata in framework, pe care sa o accesez de la distanta si sa fac modificarile necesare

- Cum fac sa pot refolosi codul deja scris? ... raspunsul a venit mai tarziu!

... cateva altele!

Din ideile de mai sus, cea cu XML fiind comun la 99% din aplicatii, mi-a ramas in cap si facea diferenta. Toate framework-urile pe care le stiam construiau aplicatiile, ca sa zic asa, in mod text (php = preprocesor hypertext) deoarece despre asta vorbea php la acel moment.

Odata cu php 5, extensia DOM era destul de puternica si stabila pentru a putea sa dezvolt ceea ce aveam in cap, adica un framework pe php.

Avantajul este ca in XML ai access la orice nod din aplicatie fara probleme, deci logica aplicatiei poate fi separata de codul brut de generare si interpretare a datelor spre deosebire de abordarile de tip text unde nu puteai interveni in "rezultat".

In tot ce am spus mai sus se vad avantajele pe care cred ca le ofera acest framework, de fapt abordarea pe care o are.


2. Experienta mea reala este limitata si se rezuma la 99% aplicatii web pentru diferite domenii si doar cateva site-uri!

De ani buni traiesc din meseria mea, care este complet alta decat programator. Ceea ce fac este sa imi dedic parte din timpul liber acestui prim hobby al meu.
Acesta este si motivul pentru care apelez la voi, programatorii cu experienta care traiesc din programare si care pot sa ma indrume, sa imi dea niste feedback-uri pertinente.

Inapoi la intrebare: m-am gandit la aceasta problema cand am conceput "motorul" framework-ului si stiu ca acele cookie pe care le foloseste google pentru page tracking trebuie "mangaiate" frumos deoarece poti pierde page rank-ul. Este vorba, daca bine imi amintesc, de vestitele __utm*, asa este?
Din cate am citit pe net la acel moment, toate acestea sunt regenerate daca nu mai sunt gasite, si parca utma era un id unic,....

Cred ca lucrurile ar fi astfel: daca schimbi limba, googlebot va incepe sa indexeze continutul paginii in diferite limbi.... rezulta varza.... asta ar fi problema? Chiar va rog, l33t si MihaiC sa dezvoltati subiectul!!

Deoarece schimbarea limbii se face in aceeasi sesiune rezolvarea cred ca ar fi regenerarea id-ului cand se face schimbarea variabilei de sesiune care spune ce limba se foloseste. Este regenerarea id-ului sesiunii o rezolvare? Daca da, se poate face cu directiva init, in orice aplicatie la momentul detectarii unei alte limbi...

As aprecia foarte mult contributia voastra cu explicatiile aferente, daca e nevoie fac modificarile necesare!

Cat despre cache, da se poate face la tot ceea ce inseamna import (local, remote / xml sau html) nu insa si la o pagina / aplicatie completa. Motivul este ca frameworkul este foarte rapid si implementarea cache-ului pe pagina / aplicatie nu am considerat-o o prioritate, dar o am si am avut-o in vedere.

Toate filtrele sau directivele care au atribut cache, cachestorage, clearcache folosesc... cache. Un ex: http://aws-dms.com/temp.php?use=templat ... import.xml

In acest moment nu am gandit un mecanism dar daca aveti sugestii, imi spuneti care arfi dezavantajele in alte framework-uri si cum as putea sa imbunatatesc, atunci voi lucra seios la un astfel de mecanism.

Din pacate, nu am placerea si timpul necesar pentru a cauta in toate framewrk-urile care s-au impus pana acum, sa sap si sa vad aceste lucruri de aceea apreciez foarte mult contributia voastra si pentru toti care vin cu idei care se materializeaza in imbunatatiri, ii trec la "Contribuitori" pe site, cu mare placere!!!

Deasemenea, acest proiect este deschis, daca cineva crede in aceasta idee si vrea sa contribuie (cod, idei, to ce poate fiecare) cu mare placere sunt deschis la colaborare!!!

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Mie Sep 12, 2012 6:11 pm

Revin cu o completare la raspunsul pt intrebarea 2 (cea despre cache).

Directivele sau/si filtrele care au implementat un sistem de caching sunt import, advancedimport si remotetemplate.

Sistemul este foarte simplu si consta in setarea unor atribute ale acestor directive.

Atributele sunt:
cache=enabled
cachestorage = id unic fisier
clearcache = numar de secunde dupa care sa actualizeze cache=ul; pt FALSE nu mai actualizeaza niciodata dupa prima actualizare; pt 0 actualizeaza de fiecare data (pt debug).

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Mie Sep 12, 2012 11:47 pm

Am petrecut putin timp la o bere si o partida de documentare pe net vis'a vis de problemele cu sesiunile ridicate de MihaiC si l33t.

Am verificat si site-urile pe care le-am facut pana acum cu XMS si conform a ceea ce am gasit pe net si a ceea ce imi arata google webmaster tools (care imi indica numarul exact de pagini, cu un verde mare si ok la toate, fara erori si duplicate) nu este nici o problema!!!

Se pare ca problema apare cand id-ul sesiunii este introdus in URL, deoarece apar pagini duplicat pe URL-uri diferite.

Sesiunile nu afecteaza nicidecum un crawler, deoarece acesta nu tine niciodata cont de cookie-uri si sesiuni totusi (ma repet aici) singura problema este daca id-ul sesiunii apare in URL!!

Se pare ca folosirea id-ului in URL nu mai e la moda, sincer nu am mai vazut de mult. In cazul in care din nu stiu ce motive trebuie sa folositi id-ul sesiunii in url, atunci in acea pagina trebuie pus "<meta ="robots" content="noindex">"!!

Surse:
http://www.seomoz.org/blog/controlling- ... ession-ids

http://www.searchengineguide.com/stoney ... s-dont.php

Deci, sesiunile de lucru nu sunt o problema, nu in modul in care sunt folosite de XMS!

As aprecia daca veniti cu completari la acest subiect!!

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Vin Sep 14, 2012 8:59 pm

Vreau sa insist asupra unei probleme ridicate de MihaiC, in post-ul sau. Mai exact vreau sa clarific acea remarca legata de "nu este MVC".

MVC este o paradigma care s-a impus ca model sau standard de conceptie a tuturor framewrok-urilor moderne si este un "must have" pentru orice framework in mod text (scuze, dar chiar nu stiu cum sa le spun - ma refer la zf, yii, ci, ...).

Necesitatea folosirii standardului MVC intr-un framework in mod text apare deoarece este singura abordare care permite dezvoltatorului sa proiecteze aplicatia de asa maniera incat sa poata fi usor extensibila (??) sau sa o adapteze. Ca sa fac o paralela este oarecum acelasi lucru cu diferenta dintre programarea structurata (Pascal, C, ...) si cea nestructurata (Basic).

In abordarea clasica (frameworks in mod text) este imposibila accesarea unui element din view daca dezvoltatorul nu a prevazut aceasta necesitate.

Aici este marea diferenta, in XMS este posibila accesarea oricarui element din view, de oriunde din aplicatie deoarece folosesc DOM XML care identifica orice element prin xpath.
.
Rezulta o flexibilitate mult superioara altor framework-uri din multe privinte. Spre exemplu filtrul "domiterator" este un membru al ceea ce MVC spune ca face parte din model si permite adaptarea view in functie de context.

Avantajul pe care vreau sa il subliniez este: MVC nu este necesar in XMS deoarece structura framework-ului ofera flexibilitatea necesara pentru a nu pierde timpul cu notiuni, structuri si teorii de acest gen!!!!
Ultima oară modificat Sâm Oct 06, 2012 8:11 am de către cezar.lucan, modificat 1 dată în total.

cezar.lucan
Average Member
Mesaje: 83
Membru din: Joi Mar 11, 2010 2:18 pm

Mesajde cezar.lucan » Mar Oct 02, 2012 10:23 pm

Salutare!!

@MihaiC

Mihai, multumesc mult! M-am tot gandit la partea cu router-ul si ca ar fi o idee buna sa reiau lucrul la modelul de router pe care il aveam in minte. Intr-adevar, era un mare handicap pentru un framework, mai ales cand toate celelalte au router built-in.

Cum am spus initial, acest router poate fi facut foarte simplu de oricine dar motivul care m-a descurajat a fost ca acel model ma obliga sa revizui toate aplicatiile mele si sa trec de la url-uri relative la cele absolute (in mod rewrite). In plus, ideea pe care o aveam atunci implica o revizuire complete a motorului de template-uri, temp.php.

Zilele trecute mi-a venit ideea: in mod rewrite (pe apache) in loc sa trimit request-urile catre temp.php, le trimit catre un alt script (urlhandler.php) unde verific daca request-ul este fake sau este o resursa. In primul caz incarc temp.php, il al doilea fac stream la resursa deci... problema rezolvata cu schimbarea url-urilor.

Am publicat zilele trecute un nou release cu acest router, XMS 2.2.

Am pus si patru modele pentru mod rewrite si fara. Partea frumoasa este ca acum se pot initializa unitar aplicatiile, adica daca am o baza de date, o initializez in router.... un avantaj! Deasemenea, se pot face si initializari pe aplicatie, direct din router.

Exemple:
http://locatie/numeAplicatie/ceva/optiuni?si=date
sau
http://locatie/temp.php?use=numeAplicatie.xml&ceva=date (pentru compatibilitate cu variantele anterioare)

Router-ul poate fi rescris complet si cele patru modele ajuta la intelegerea lui.

Sunt curios cum se comporta in mod rewrite si pe alte servere decat apache. Pe apache e simplu, folosesc functia virtual pentru a face un subrequest. Pe alte servere fac stream cu readfile, pentru a nu incarca raspunsul subrequest-ului in memorie, ci a il trimite direct spre stdout. Daca aveti timp sa va uitati in scriptul urlhandler.php si aveti idei.... sunt de folos!

L-am testat pe parte din aplicatii dar si se comporta foarte bine ... a mai ramas una mai stufoasa.

Mai multe pe site: http://aws-dms.com/temp.php?use=templat ... ference=22

Router-ul nu este definit in script-urile php direct, ci in router.xml si se poate modifica de oriunde folosind Designer. Deoarece nu le am cu regex nu am facut nici un model care sa faca match la request.... daca e cineva interesat si are 10 minute ... ar fi super!


Cod: Selectaţi tot

<router>
<?aws // ROUTER MODEL 4
// a more advanced router for mod rewrite
function getRouteCode($el) {
       foreach ($el->childNodes as $child)
              if ($child -> nodeType == 7)
                     $toRet = $child -> data;

       $f = create_function('$el', $toRet);
       $f($el);
}

//split route in path members
$chain = explode("/", $router -> getPathInfo($route));

//looks for a route element (inside this file) bounded to above value and if found execute the code inside
$router -> q("/router/route[@bind[contains(.,'" . $chain[0] . "')]]") -> each('getRouteCode');

//if it had a function, get the path from target attribute
if (get_class($router -> results -> item(0)) == "DOMElement")
       $r = $router -> results -> item(0) -> getAttribute('target');
else
       // else get the application with name chain[0]
       $r = "templates/" . $chain[0] . ".xml";

if (!file_exists($r))
       $awsappxmltemplateFile = file_get_contents(AWS_ERROR_404);
else
       $awsappxmltemplateFile = file_get_contents($r);

return $awsappxmltemplateFile;?>
<route bind="temp.php"><?aws $el->setAttribute('target','templates/index.xml');?></route>
<route bind="designer"><?aws $el->setAttribute('target','templates/designer.xml');?></route>

</router>


Înapoi la “Framework-uri PHP”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 14 vizitatori