Fungsi PHP untuk Auto Convert URL menjadi Clickable Hyperlink

Fungsi yang sangat berguna untuk membuat url pada sebuah text menjadi link yang bisa di-click.

Cara pakainya tinggal masukkan string yang ada url nya kedalam fungsi make_clickable($string). Nanti semua kata yang mengandung format link seperti www dan http akan diubah menjadi clickable.

Fungsi berikut berasal dari wordpress yang saya cuplik dari sumber di sini

function _make_url_clickable_cb($matches) {
	$ret = '';
	$url = $matches[2];
 
	if ( empty($url) )
		return $matches[0];
	// removed trailing [.,;:] from URL
	if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) {
		$ret = substr($url, -1);
		$url = substr($url, 0, strlen($url)-1);
	}
	return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $ret;
}
 
function _make_web_ftp_clickable_cb($matches) {
	$ret = '';
	$dest = $matches[2];
	$dest = 'http://' . $dest;
 
	if ( empty($dest) )
		return $matches[0];
	// removed trailing [,;:] from URL
	if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) {
		$ret = substr($dest, -1);
		$dest = substr($dest, 0, strlen($dest)-1);
	}
	return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret;
}
 
function _make_email_clickable_cb($matches) {
	$email = $matches[2] . '@' . $matches[3];
	return $matches[1] . "<a href=\"mailto:$email\">$email</a>";
}
 
function make_clickable($ret) {
	$ret = ' ' . $ret;
	// in testing, using arrays here was found to be faster
	$ret = preg_replace_callback('#([\s>])([\w]+?://[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_url_clickable_cb', $ret);
	$ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_web_ftp_clickable_cb', $ret);
	$ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret);
 
	// this one is not in an array because we need it to run last, for cleanup of accidental links within links
	$ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
	$ret = trim($ret);
	return $ret;
}

 

Drupal 7 Masalah From Name Pada SMTP module

Bagi yang punya kasus dengan SMTP module untuk drupal 7 yang tidak memunculkan nama pengirim, hanya alamat email saja, berikut solusinya

Pada file smtp.mail.inc, pada baris ke 122, ganti kode berikut

$properfrom = variable_get('site_mail', '');

dengan

$properfrom = variable_get('smtp_from', '');

Kode diatas untuk mengambil from name dari halaman administrasi modul smtp.

Kemudian pada baris 143, temukan kode berikut

$from_comp = $this->_get_components($from);

dan tambahkan kode berikut dibawahnya

if ( empty($from_comp['name']) ) $from_comp['name'] = $from_name;

Kode diatas untuk mendefinisak from name.

Selesai.

solusi ini saya adopsi dari sini. Sudah saya terapkan dan fungsi email option berupa “from address” dan “from name” pada modul smtp menjadi berfungsi.

Drupal 7: File Status Permanent

Postingan ini berkaitan dengan postingan sebelumnya yaitu Drupal 7: Cara Ambil URL File yang Disimpan Melalui Custom Form Halaman Admin.

Pada postingan tersebut, ada bagian snippet yang fungsinya sebagai form handler dari fungsi form submit, sebagai berikut.

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']);
}

fungsi di atas gunanya untuk membuat file berstatus di system-nya drupal menjadi permanent. Artinya dia tidak akan dihapus saat pembersihan reguler file-file yang dianggap temporary oleh drupal. Tapi ternyata dalam kasus saya tidak berfungsi.

Saya cari-cari di berbagai sumber, akhirnya menemukan solusi yang sudah saya test berhasil dari forum drupal, yaitu mengganti fungsi form handlernya menjadi seperti dibawah:

function mymodule_set_default_header_image_form_submit($form, &$form_state){

  global $user;
  $account = user_load($user->uid);
		
  $fid = $form_state['values']['mymodule_default_header'];
  $file = file_load($fid);
  $file->status = FILE_STATUS_PERMANENT;
  file_save($file);
  file_usage_add($file, 'user', 'user', $account->uid); 

}

Perbedaan utamanya yaitu pada “file ID” dan “file_usage_add”. pada baris ke-7 ada pemanggilan fungsi untuk memanggil file id yang hendak kita ubah statusnya menjadi permanent (bukan temporary). Selanjutnya baru di-set permanent pada baris ke-8.

Sedangkan baris ke-9 yaitu untuk mendefinisikan file tersebut digunakan oleh “siapa”, agar tidak muncul error “failed reference”.

O iya, sebagai monitoring tool bahwa form handler ini benar-benar dipanggil ketika submit form, bisa menggunakan drupal_set_message drupal.

drupal_set_message(t('The form has been submitted.'));

kalau message ini muncul setelah submit form, berarti fungsi diatas harusnya sudah dijalankan dan status file menjadi permanent.

Drupal 7: Cara Membuat Form Fieldset Collapsible di Halaman Admin

Ketika form di halaman admin semakin banyak, maka untuk memudahkan mencari bagian form dan merapikan tampilan, lebih baik masih-masing set form dibuat collapsible atau bisa menyempit dan melebar.

Ada beberapa solusi di internet tapi solusi yang saya dapat dari sini seperti berikut yang sudah berhasil saya coba dan juga bagusnya berdasarkan Form API drupal.

$form['highlight'] = array(
    '#type'  => 'fieldset',
    '#title' => t('Highlight'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#attached' => array(
        'library' => array(
            array('system', 'drupal.collapse'),
        ),
      ),
);

Baris ke-4 sampai ke-10 adalah inti dari collapsible function.

Drupal 7: Cara Ambil URL File yang Disimpan Melalui Custom Form Halaman Admin

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.