Atunci cand lucrezi pentru clienti reali lucrurile sunt mult mai complicate.
Ai nevoie de module mult mai diversificate decat ai crede - pornind de la structura bazei de date care are nevoie de filtre speciale pana la interfata care te poate bloca din cauza unor situatii care nu au fost luate in considerare.
Da, sunt mai complicate, de exemplu ai un termen limita, si daca acela e 2 saptamani tu singur nu o sa-l faci de la 0 (un proiect mai maricel).
Structura bazei de date se face simplu, iar in legatura cu filtrele nu tre sa-ti bati capul. In drupal interfata nu te blocheaza pentru ca siteul e impartit in regiuni unde poti sa bagi orice bucata de continut vrei, sau poti sa-i modifici clasa ca sa arate diferit.
In plus la queryuri merge treaba mult mai usor si repede pentru ca
1. nu trebuie sa-ti bati capul de sql injection
2. exista o clasa sa faci queryuri intr-un mod curat si standard
3. poti modifica oricand o conditie (camp selecteat, etc) si sa reexecuti queryul
De exemplu (am gasit un query pe net):
Cod: Selectaţi tot
$tid = 23;
$types = array('tip1', 'tip2', 'tip3');
$status = 'published';
$limit = 100;
$sql = "SELECT n.nid, n.title, n.type, c.comment_count FROM `node` n INNER JOIN `term_node` tn ON n.nid = tn.nid INNER JOIN `term_data` td ON tn.tid = td.tid LEFT JOIN `node_comment_statistics` c ON n.nid = c.nid WHERE td.tid = {$tid} AND n.type IN (" . implode(',', $types) . ") AND n.status = {$status} ORDER BY n.created DESC LIMIT {$limit}";
$results = mysql_query($sql); ...
Bun m-am straduit sa-l scriu, dar parca lipseste ceva... a da! sunt vulnerabil la sql injection. asa ca trebuie sa trec ficare printr-un filtru si codul mai capata cateva linii si cateva functii. Bun, am adaugat si filtrele. Stai ca e o eroare, am gresit la un join, acum du-te si holbeaza-te ca sa vezi chiar unde ai gresit! O ce prostie, imi mai trebuie un join, oare unde sa-l bag?
In schimb pe drupal mergi simplu:
Cod: Selectaţi tot
$tid = 23;
$types = array('tip1', 'tip2', 'tip3');
$status = 'published';
$limit = 100;
$query = db_select('node', 'n')
->fields('n', array('nid', 'type'));
$query->innerJoin('term_node', 'tn', 'n.nid = tn.nid');
$query->innerJoin('term_data', 'td', 'tn.tid = td.tid');
$query->leftJoin('node_comment_statistics', 'c', 'n.nid = c.nid');
$query = $query->fields('c', array('comment_count'))
->condition('td.tid', $tid, '=')
->condition('n.type', $types, 'IN')
->condition('n.status', $status, '=')
->orderBy('n.created', 'DESC')
->range(0, $limit);
$results = $query->execute()->fetchAll();
Nu trebuie sa-mi bat capul de sql injection, pot foarte usor sa adaug un join, o conditie, un field, etc. Pot sa primesc rezultatele in X moduri (fetchAllKeyed(), fetchCol(), etc...).
Tie nu ti se pare mai simplu, mai logic, mai normal asa? Ca bonus ruleaza pe orice baza de date cum am mai spus, trebuie doar schimbat driverul din setari.
La fel de usor poti crea un tabel, sau face alter.