Drupal kattintgatás nélkül

Avagy egy drupal programozó hétköznapjai

Állomány Feltöltés Saját Formon

A minap a webform2pdf drupal 6-os modulom drupal 5-ös átiratát készítettem, amikor belefutottam az állomány feltöltés problémájába, hogy is kell állományt feltölteni drupal 5-tel? Az ötös Drupal kimaradt az életemből, így nem sok tapasztalatom van vele, valahogy úgy alakult, hogy a 4.7.x után nekem a 6-os Drupal jött. Következzen akkor egy kis leírás arról, hogy töltünk fel állományt drupal 5-tel, majd nézzük meg, hogy változott meg ez drupal 6-ra.

Drupal 5

Form függvényünkben most csak egy állományt fogunk feltölteni:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function mymodule_upload_form() {
  // Ezt a sort ne felejtsük el megadni, mert ennek hiányában nem töltődik fel az állomány
  $form['#attributes'] = array(
    'enctype' => "multipart/form-data"
  );

  $form['file_upload'] = array(
    '#type' => 'file',
    '#title' => t('Filename'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Upload file'),
  );

  return $form;
}

Tároljuk le a feltöltött állományt a form submit kampójában (hook):

1
2
3
4
5
6
7
8
function mymodule_upload_form_submit($form_id, $form_values) {
  // Itt ellenőrizzük le, hogy sikeres volt-e a feltöltés  
  $file = file_check_upload('file_upload');
  if ($file){
    // Ha sikeres volt elmentjük az állományt a megadott könyvtárba
    $file = file_save_upload($file, 'cél_könyvtár_útvonala');
  }
}

Eddig sétagalopp, a neheze akkor jön amikor valamilyen feltételnek megfelelő állományt szeretnénk, ha feltöltene a felhasználó. A példában várjunk egy képet, ami nem nagyobb mint 100x100 pixel, ha nagyobb méretezzük át.

A validációban megvizsgáljuk, hogy kép típusú-e az állomány, az átméretezést pedig megcsináljuk a sumbitkor.

A form előállítása változatlan. Az feltöltött állomány vizsgálatát a form validate függvényben végezzük el. A submit függvényben a képet átméretezzük, ha nagyobb mint a megengedett, majd elmentjük a megadott könyvtárba. Validate függvény:

1
2
3
4
5
6
7
8
9
10
11
12
function mymodule_upload_form_validate($form_id, $form_values) {
  // Itt ellenőrizzük le, hogy sikeres volt-e a feltöltés  
  $file = file_check_upload('file_upload');

  // Létezik-e a feltöltött állomány
  if ( isset($file->filepath) ) {
    // Megnézzük, hogy kép-e
    $info = image_get_info($file->filepath);
    if (!$info || !$info['extension']) {
      form_set_error('file_upload', t('The uploaded file was not an image.'));
    }
}

Submit függvény:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function mymodule_upload_form_submit($form_id, $form_values) {
  // Ellenőrizzük le, hogy sikeres volt-e a feltöltés  
  $file = file_check_upload('file_upload');

  // Létezik-e a feltöltött állomány
  if ( isset($file->filepath) ) {
    // Kép méret ellenőrzése
    list($maxwidth, $maxheight) = explode('x', '100x100');
    if ($info['width'] > $maxwidth || $info['height'] > $maxheight) {
      // Átméretezés
      image_scale($file->filepath, $file->filepath, $maxwidth, $maxheight);
      // Informáljuk a felhasználót az eseményről.
      drupal_set_message(t('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', array('%dimensions' => '100x100'));
    }

    // Állomány elmentése a megadott helyre.
    $file = file_save_upload($file, 'cél_könyvtár_útvonala');
  }
}

Aki ismeri a drupal 6 állomány kezelését az tudja, hogy ott már adatbázisban tárolja le az állományok adatait. Adatbázis drupal 5-ben is rendelkezésre áll csak kicsit más a szerkezete, és picit más célokra szolgál. Mi magunk is írhatunk az adatbázisba, ha szeretnénk ott is tárolni az állományaink adatait. Arra azonban figyeljünk, hogy az ötös verzióban magunknak kell gondoskodni az állományok törléséről mind a lemezről mind az adatbázisból (ha használjuk).

Nézzük, hogy kell állományt feltölteni drupal 6 alatt.

Drupal 6

Hozzuk létre a form függvényünket a következőképp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function mymodule_upload_form() {
  // Ezt a sort ne felejtsük el megadni, mert ennek hiányában nem töltődik fel az állomány
  $form['#attributes'] = array(
    'enctype' => "multipart/form-data"
  );

  $form['file_upload'] = array(
    '#type' => 'file',
    '#title' => t('Filename'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Upload file'),
  );

  return $form;
}

Tároljuk le a feltöltött állományt a form submit kampójában (hook):

1
2
3
4
5
6
7
function mymodule_upload_form_submit($form_id, $form_values) {
  //Állomány feltöltése
  if ( $file = file_save_upload('file_upload', array(), 'cél_könyvtár_útvonala' ) ) {
    //Státusz beállítása véglegesre, ha nem tesszük meg akkor egy idő után törli a drupal az állományunk.
    file_set_status($file, FILE_STATUS_PERMANENT);
  }
}

Készítsük el a fenti példa drupal 6-os változatát. A feladat várjunk egy képet, ami nem nagyobb mint 100x100 pixel, ha nagyobb méretezzük át. Ebben az esetben nem kell validate függvényt írnunk, mert egy lépésben megtehetjük a submit részben.

1
2
3
4
5
6
7
8
9
10
11
12
13
function mymodule_upload_form_submit($form_id, $form_values) {
  //Az feltöltött állomány validációs feltételei. 
  $validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array('100x100'),
  );

  //Állomány feltöltése, validációval
  if ( $file = file_save_upload('file_upload', $validators, 'cél_könyvtár_útvonala' ) ) {
    //Státusz beállítása véglegesre, ha nem tesszük meg akkor egy idő után törli a drupal az állományunk.
    file_set_status($file, FILE_STATUS_PERMANENT);
  }
}

A file_save_upload függvényről az http://api.drupal.org oldalon van részletesebb leírás.

Felhasznált források: