Saya menemui kasus dimana dibutuhkan untuk menampilkan background image pada halaman tertentu website yang menggunakan drupal 7.
Supaya background image ini bisa diganti-ganti sesuai tema dan dengan cara manual, maka dibutuhkan form di halaman admin untuk menangani upload file.
File yang sudah di-handle di halaman admin perlu diambil url nya supaya bisa dipakai di halaman yang ingin kita tampilkan.
Saya menemukan beberapa sumber referensi, tapi disini yang paling lengkap prosesnya.
Pertama bikin menu admin dulu yang akan dipakai untuk mengakses halaman konfigurasi, termasuk upload file image tersebut.
<?php
/**
* @file
* mymodule.module
*/
/**
* Implements hook_menu().
*/
function mymodule_menu() {
$items['admin/content/set-default-header-image'] = array(
'title' => 'Set Default Header Image',
'page callback' => 'drupal_get_form',
'page arguments' => array(‘mymodule_set_default_header_image_form'),
'access arguments' => array('access administration pages'),
'file' => ‘mymodule.pages.inc',
);
return $items;
}
pada bagian ‘page arguments’ itulah nama function dimana form-nya ditempatkan.
<?php
/**
* @file
* mymodule.pages.inc
* Part of the mymodule package.
*/
function mymodule_set_default_header_image_form(){
// Add a managed file form element for uploading an image
$form['mymodule_default_header'] = array(
'#type' => 'managed_file',
'#title' => t('Default Header Image'),
'#description' => t('Set the site-wide default header image'),
'#upload_location' => 'public://files',
'#default_value' => variable_get('mymodule_default_header', ''),
);
// Add custom submit handler to set the file status to permanent
$form['#submit'][] = 'mymodule_set_default_header_image_form_submit';
return system_settings_form($form);
}
Selanjutnya adalah function yang berfungsi membuat file tetap sebagai variable permanen yang bisa diakses kapanpun melalui API bawaan drupal.
Snippet ini yang sebelumnya tertinggal dari percobaan-percobaan saya sebelumnya.
/*
* Additional submit handler for making the file permanent
*/
function mymodule_set_default_header_image_form_submit($form, &$form_state){
$form['mymodule_default_header']['#file']->status = FILE_STATUS_PERMANENT;
file_save($form['mymodule_default_header']['#file']);
}
Dari fungsi diatas, kita bisa memanggil file dengan cara sebagi berikut
<?php
// Load image fid
$image_fid = variable_get('mymodule_default_header');
// Load image
$image = file_load($image_fid);
// Get URL
$url = file_create_url($image['uri']);
Snippet diatas bisa kita pasang di semua halaman atau file template drupal kita.
Cara yang sama mestinya bisa digunakan untuk file dengan ekstensi yang lain.