Acces utilizatori

Nymphaea Software Solutions a devenit Organisation Member in Drupal Association

Upload de fișiere folosind Form API în Drupal

Modulul webform pentru Drupal 6 este un foarte bun exemplu de implemntare al Form API, folosind la maxim toate operatiunile cu form disponibile in Drupal. Crearea unui webform este foarte asemanatoare cu cea a creerii unu content type folosind CCK însă ceea ce dorim sa va aratm in continuare este un exemplu de implemntare a form api intr-un modul personalizat (custom module) - diferit de webform - formul va suporta uploadul de fisiere cu extensia .pdf si le va salva in folderul dorit.

Forum va avea 3 campuri (Nume Prenume si Factura) iar rezultatele vor fi salvate intr-o tabla mysql pe care am creat-o in prealabil cu urmatoarea structura:

CREATE TABLE `blocks` (
`nyid` int(11) NOT NULL auto_increment,
`nume` varchar(64) NOT NULL default '',
`prenume` varchar(64) NOT NULL default '',
`cale_fisier` varchar(255) NOT NULL default '',
PRIMARY KEY (`bid`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=616 ;

Elementele din form vor fi de tipul : Nume si Prenume (textfield) iar Factura (file)si vor fi definite in felul urmator folosind functia drupaluploadfisierecuformapi_form (unde drupaluploadfisierecuformapi este nume modulului menu personalizat - nu este necesar a se folosi aceasta denumire):


function drupaluploadfisierecuformapi_form($form_state, $type, $node, $link = NULL) {
$form = array();
$form['#attributes']['enctype'] = "multipart/form-data";
$form['nume'] = array(
'#type' => 'textfield',
'#title' => t('Nume'),
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
);

$form['prenume'] = array(
'#type' => 'textfield',
'#title' => t('Prenume'),
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
);
$form['upload'] = array(
'#type' => 'file',
'#title' => t('Upload Fisier'),
);
return $form;
}

Mai multe detalii legate de tipurile de elemente ce pot fi definite inntr-un form puteti obine la http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6

Functia drupaluploadfisierecuformapi_form pe care tocmai am definit-o nu face altceva decat sa returneze un formu-ul. Acesta trebuie in continuare validat , dupa care trebuie submis.

Sa presupunem ca vom avea o validate simpla, si anume, dorim ca in cazul in care campul nume nu este completat sa afisam un mesaj de eroare. Functia care este responsabila pentru acest lucru este drupaluploadfisierecuformapi_validate() - de remarcat sufixul - este foarte important ca functia sa inceapa cu numele functiei care defineste forumul (drupaluploadfisierecuformapi) si sa se termine cu sufixul _validate. Aceast lucru este valabil si pentru functia de submitere pe care o vom trata mai incolo.

/**
* validare elementelor din form.
*/

function drupaluploadfisierecuformapi_validate($form, &$form_state) {
if (!$form_state['values']['nume']) {
form_set_error('erroare', 'Campul nume este obligatoriu');
}
}

Odata ce formul a fost validat cu success, va fi executata functia de submitere si procesare a elementerlor din form. In cazul nostru scenariul dorit este: sa salvam aceste elemente intr-o tabla mysql cu structura precizata la inceputului acestui blog iar fisierul sa il salvam fizic in folderul care este definit de file_directory_path (default sites/default/files) - numele si calea catre fisier va fi salvata in tablea mysql. Numele functiei de submitere conform Drupal, trebuie sa inceapa cu numele functie de definire a formului urmat de sufixul _submit acceasi regula ca si la validate. Rezultatul este functia de mai jos.

/**
* Processarea elementelor din form.
*/
function drupaluploadfisierecuformapi_submit($form, &$form_state) {
$values = $form_state['values'];
$fisier = file_save_upload('upload', array(), variable_get('file_directory_path',NULL), FALSE);
db_query('INSERT INTO {related_links} (nid, nume, prenume, cale_fisier) VALUES (%d, "%s", "%s", "%s")', $values['nume'], $values['prenume'], $fisier->filepath);
drupal_set_message('Mesaj de succes');
}

Odata submis formul , vom afisa un mesaj de succes folosind drupal_set_message();
Functiile de validate si submitere nu trebuie neaparat sa fie denumire folosind sufixele mai sus amintite (functiile cu sufix fiind execuate default) - functiilor pot avea nume proprii unice dorite de utilizator. In acest caz in momentul definitii formului acestea trebuiesc precizate ca si elemente de form. De exemplu daca dorim ca pentru functia de validate sa folosim o functie de genul function validare_custom($form, &$form_state) iar pentru submitere o functie function submiterecustom($form, &$form_state) formul va trebui sa mai contina urmatoarele 2 elemente:

$form['#validate'] = array('validare_custom' =>array());
$form['#submit'] = array('submiterecustom' =>array());

De notat este faptul ca $form['#validate'] si $form['#submit'] sunt matrice si contin o lista cu functii ce vor fi executate la validarea respectiv submiterea formului.

Afisarea formului in template sau intr-o pagina peronalizata se poate face foarte simplu folosind:

$output = drupal_get_form('drupaluploadfisierecuformapi');