Drupal e programmazione ad oggetti?

5 contenuti / 0 new
Ultimo contenuto
Drupal e programmazione ad oggetti?

Salve.
Vengo da una programmazione PHP molto orientata agli oggetti e mi trovo in difficoltà a capire come lavora Drupal dato che noto sempre più spesso che ha una visione molto funzionale basata su parole chiave riservate.

Vi faccio un esempio.

PROGRAMMAZIONE OO

Ho un oggetto di tipo bicicletta che ha 2 proprietà: ruote, marce.
diciamo che lo scriverei così:

class bicicletta
{
private $_ruote = null;
private $_marce = null;
function __construct($ruote,$marce){
$this->_ruote = $ruote;
$this->_marce = $marce;
}
       /**** METODI SET E GET DEI DUE PARAMETRI ****/
public function buildForm(){
/* CREO UN OGGETTO FORM TRAMITE UN FRAMEWORK (es. Zend o Pear) */
return $form;
}
}

Nell'idea quindi ho un oggetto bicicletta che ha un metodo per stampare una form mappata sulle sue proprietà. Nell'esempio stamperei probabilmente una form con due campi TEXT di tipo numerico ed un tasto submit.

Chi fa la new bicicletta, richiama il metodo buildForm() e stamperà il codice tramite una probabile $form->buildCode(); o $form->render(); ecc...
Qualcosa insomma che traduce un oggetto in HTML secondo l'oggetto stesso.

Ho quindi tentato di fare la stessa cosa in Drupal cercando quindi di usare i suoi hook quando obbligato ma tentando di oggettizzare dove possibile. Fino ai DAO ancora si può fare ma con la form per esempio ho scoperto un blocco che spero possiamo illuminare.

Diciamo che nel mio file giroitalia.module creo un blocco che dovrebbe stamparmi la form. Avrò quindi una roba tipo:

function png_creator_block_view($delta = '') {
  switch($delta){
    case 'hello_world':
      $block['subject'] = t('My Hello World');
      if(user_access('access content')){
        //Use our custom function to retrieve data.
        $result = funzione_crea_form();
    $block['content'] = $result;
      }
  }
  return $block;
   }

Nella mia idea originale, nella funzione funzione_crea_form() faccio la new di bicicletta, uso il metodo e ritorno un qualche render per il codice della form che andrà a riempire quel $block['content'].

Purtroppo non è così.

class bicicletta
{
[...]
public function newForm(){
return drupal_get_form('new_png');
}
private function new_png ($form,&$form_state){
  /*robe della form */
  return $form;
}
}

Nella mia idea c'era una cosa del genere. Quello che però ottengo dall'altra parte chiamando newForm(), è un array strano e tanti errori sul sito di indici non settati.

# Notice: Undefined index: indice form in drupal_retrieve_form() (linea 738 di /opt/lampp/htdocs/drupal-7.8/includes/form.inc).
# Warning: call_user_func_array() eccetera

Quindi l'unico modo che ho visto per farlo funzionare, è togliere completamente l'oggetto, mettere nel file (che era dell'oggetto) la sola funzione isolata qua sotto:

function new_png ($form,&$form_state){
  $form['description'] = array(
    '#type' => 'item',
    '#title' => t('A form with nothing but a textfield'),
  );
  // This is the first form element. It's a textfield with a label, "Name"
  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
  );
  return $form;
}

e poi dall'altra parte fare semplicemente (dopo aver fatto l'include del file)

$result = drupal_get_form('new_png');
$block['content'] = $result;

E' solo questo il modo in cui Drupal fa le cose? Non è possibile fare diversamente portando un po' di sana programmazione OO al suo interno?

Grazie.

Risposta veloce
NO, se non vuoi complicarti la vita.

Risposta più complessa (parziale, ora non ho molto tempo)
Creare una classe dell'oggetto su cui andare a mappare le informazioni e poi costruire il form in maniera "magica" è quanto sta cercando di fare il modulo entity (e correlati) per D7. Con CTools (altro modulo) puoi ottenere una astrazione degli oggetti anche con D6 (gestione dei plugin, ereditarietà, ...), ma concettualmente sotto il sitema funziona "alla vecchia maniera".

Ora se la domanda è: voglio per forza lavorare ad oggetti, nulla ti vieta di creare degli oggetti con dei metodi e wrapparli nei metodi (ook) che ritieni opportuni, anche se secondo me è una complicazione "inutile". Ad esempio, ipotiziamo di avere l'oggetto bicicletta:

<?php
class Bicicletta {
  public function
__construct($id = NULL) {}
  public function
getForm() {
   
$form = array();
   
// Costruisciti il form
   
return $form;
  }
}
function
bicicletta_get_form($id) {
 
$b = new Biciletta($id);
  return
$b->getForm();
}
$form = drupal_get_form('bicicletta_get_form', $id);
?>

ripeto, non trovo strettamente conveniente lavorare in questo modo, ma in alcuni contesti ha senso. In ogni caso (se sei su D7) ti consiglio vivamente di guardarti il modulo entity ;)

Ciao
Marco
--
My blog
Working at @agavee

Grazie della risposta.
In effetti lavoro su D7.

Ora vedo cosa offre questo modulo. Spero di cavarci qualcosa.

Grazie.

mavimo wrote:

Risposta più complessa (parziale, ora non ho molto tempo)
Creare una classe dell'oggetto su cui andare a mappare le informazioni e poi costruire il form in maniera "magica" è quanto sta cercando di fare il modulo entity (e correlati) per D7.

Non preoccuparti. Con calma e soprattutto quando avrai tempo, la potrai approfondire! ;)

Sto "tuned"! :D

Io sto studiando Java all'università e java è fortemente orientata agli oggetti. Da li sto cercando di imparare da solo il php e drupal come cms. Stavo cercando anchio qualcosa, ho trovato questo modulo per la versione 6
http://drupal.org/project/moopapi
Non so cosa sia, lo sto provando. Penso possa essere interessante. Dice che trasforma l'object oriented in programmazione per drupal.

Il mio sito web