Articles by "PHP"
Showing posts with label PHP. Show all posts
no image

Menyisipkan HTML mentah atau statis ke dalam variabel itu mudah. Pakai saja file_get_contents():

$html = file_get_contents('page.html');

echo $html; // tampilkan hasil

Tapi menyisipkan HTML dinamis yang di dalamnya berisi perintah-perintah PHP ke dalam variabel itu tidaklah mudah. Pertama-tama kita harus menyisipkan berkas tersebut ke dalam halaman, tapi jangan sampai berkas tersebut tampil. Kita hanya akan mengambil hasil render perintah PHP di dalam berkas HTML tersebut untuk kemudian bisa kita simpan ke dalam variabel seperti contoh di atas:

ob_start(); // [1]
include 'page.php'; // [2]
$html = ob_get_contents(); // [3]
ob_end_clean(); // [4]
  1. Memulai output buffering.
  2. Masukkan berkas HTML dinamis ke halaman untuk melakukan render.
  3. Simpan hasil render ke dalam variabel $html.
  4. Matikan output buffering.

Setelah hasil render tersimpan ke dalam variabel, Anda bisa menggunakan variabel tersebut seperti biasa sebagaimana variabel bertipe string digunakan:

echo $html;
no image

1. Array ke Objek

Fungsi

function array_to_object($array) {
if(is_array($array)) {
return (object) array_map(__FUNCTION__, $array);
} else {
return $array;
}
}

Contoh Kasus

Sebelum dikonversi…

$test = array(
'A' => 'Test A',
'B' => 'Test B',
'C' => array(
'CA' => 'Test CA',
'CB' => array(
'CBA' => 'Test CBA'
)
),
'D' => 'Test D'
);

// Pemanggilan...
echo $test['A']; // Hasil => `Test A`
echo $test['C']['CB']; // Hasil => `Test CB`
echo $test['C']['CB']['CBA']; // Hasil => `Test CBA`

Sesudah dikonversi…

...

$object_test = array_to_object($test);

// Pemanggilan...
echo $object_test->A; // Hasil => `Test A`
echo $object_test->C->CB; // Hasil => `Test CB`
echo $object_test->C->CB->CBA; // Hasil => `Test CBA`

2. Objek ke Array

Fungsi

function object_to_array($object) {
if(is_object($object)) {
$object = get_object_vars($object);
}
if(is_array($object)) {
return array_map(__FUNCTION__, $object);
} else {
return $object;
}
}

Contoh Kasus

Sebelum dikonversi…

$test = new stdClass;
$test->A = 'Test A';
$test->B = 'Test B';
$test->C = new stdClass;
$test->C->CA = 'Test CA';
$test->C->CB = new stdClass;
$test->C->CB->CBA = 'Test CBA';
$test->D = 'Test D';

// Pemanggilan
echo $test->A; // Hasil => `Test A`

Sesudah dikonversi…

...

$array_test = object_to_array($test);

// Pemanggilan
echo $array_test['A']; // Hasil => `Test A`
no image

PHP

function array_to_list($array, $list_type = 'ul') {
$output = '<' . $list_type . '>';
foreach($array as $key => $values) {
if(is_array($values)) {
$output .= '<li><a href="#">' . $key . '</a>' . array_to_list($values, $list_type) . '</li>';
} else {
$output .= '<li><a href="#' . $values . '">' . $key . '</a></li>';
}
}
return $output . '</' . $list_type . '>';
}

Penggunaan

Ubah array $test menjadi elemen HTML daftar:

// Testing...
$test = array(
'A' => 'list-A',
'B' => 'list-B',
'C' => 'list-C',
'D' => array(
'AA' => 'list-AA',
'AB' => 'list-AB',
'AC' => 'list-AC',
'AD' => array(
'ADA' => 'list-ADA',
'ADB' => 'list-ADB',
'ADC' => 'list-ADC'
),
'AE' => 'list-AE'
),
'E' => 'list-E'
);

echo array_to_list($test, 'ol');

Akan menghasilkan ini:

no image
// http://stackoverflow.com/a/2699110/1163000
function sort_array_by_value($key, &$array) {

$sorter = array();
$ret = array();

reset($array);

foreach($array as $ii => $value) {
$sorter[$ii] = $value[$key];
}

asort($sorter);

foreach($sorter as $ii => $value) {
$ret[$ii] = $array[$ii];
}

$array = $ret;

}

Contoh Kasus

Sampel array:

$my_array = array(
array(
'id' => 1,
'title' => 'Orange',
'time' => '2014-03-05 03:00:42'
),
array(
'id' => 2,
'title' => 'Banana',
'time' => '2013-01-06 13:05:15'
),
array(
'id' => 3,
'title' => 'Grape',
'time' => '2011-05-15 01:30:45'
)
);

Menyortir data berdasarkan nilai dari title

sort_array_by_value('title', $my_array);

print_r($my_array);

Akan menghasilkan urutan seperti ini:

Array
(
[1] => Array
(
[id] => 2
[title] => Banana
[time] => 2013-01-06 13:05:15
)

[2] => Array
(
[id] => 3
[title] => Grape
[time] => 2011-05-15 01:30:45
)

[0] => Array
(
[id] => 1
[title] => Orange
[time] => 2014-03-05 03:00:42
)

)

PHP

<?php

/**
* Original => http://phoboslab.org/log/2007/08/generic-syntax-highlighting-with-regular-expressions
* Usage => `echo SyntaxHighlight::process('source code here');`
*/

class SyntaxHighlight {
public static function process($s) {
$s = htmlspecialchars($s);

// Workaround for escaped backslashes
$s = str_replace('\\\\','\\\\<e>', $s);

$regexp = array(

// Comments/Strings
'/(
\/\*.*?\*\/|
\/\/.*?\n|
\#.[^a-fA-F0-9]+?\n|
\&lt;\!\-\-[\s\S]+\-\-\&gt;|
(?<!\\\)&quot;.*?(?<!\\\)&quot;|
(?<!\\\)\'(.*?)(?<!\\\)\'
)/isex'
=> 'self::replaceId($tokens,\'$1\')',

// Punctuations
'/([\-\!\%\^\*\(\)\+\|\~\=\`\{\}\[\]\:\"\'<>\?\,\.\/]+)/'
=> '<span class="P">$1</span>',

// Numbers (also look for Hex)
'/(?<!\w)(
(0x|\#)[\da-f]+|
\d+|
\d+(px|em|cm|mm|rem|s|\%)
)(?!\w)/ix'
=> '<span class="N">$1</span>',

// Make the bold assumption that an
// all uppercase word has a special meaning
'/(?<!\w|>|\#)(
[A-Z_0-9]{2,}
)(?!\w)/x'
=> '<span class="D">$1</span>',

// Keywords
'/(?<!\w|\$|\%|\@|>)(
and|or|xor|for|do|while|foreach|as|return|die|exit|if|then|else|
elseif|new|delete|try|throw|catch|finally|class|function|string|
array|object|resource|var|bool|boolean|int|integer|float|double|
real|string|array|global|const|static|public|private|protected|
published|extends|switch|true|false|null|void|this|self|struct|
char|signed|unsigned|short|long
)(?!\w|=")/ix'
=> '<span class="K">$1</span>',

// PHP/Perl-Style Vars: $var, %var, @var
'/(?<!\w)(
(\$|\%|\@)(\-&gt;|\w)+
)(?!\w)/ix'
=> '<span class="V">$1</span>'

);

$tokens = array(); // This array will be filled from the regexp-callback

$s = preg_replace(array_keys($regexp), array_values($regexp), $s);

// Paste the comments and strings back in again
$s = str_replace(array_keys($tokens), array_values($tokens), $s);

// Delete the "Escaped Backslash Workaround Token" (TM)
// and replace tabs with four spaces.
$s = str_replace(array('<e>', "\t"), array('', ' '), $s);

return '<pre><code>' . $s . '</code></pre>';
}

// Regexp-Callback to replace every comment or string with a uniqid and save
// the matched text in an array
// This way, strings and comments will be stripped out and wont be processed
// by the other expressions searching for keywords etc.
private static function replaceId(&$a, $match) {
$id = "##r" . uniqid() . "##";

// String or Comment?
if(substr($match, 0, 2) == '//' || substr($match, 0, 2) == '/*' || substr($match, 0, 2) == '##' || substr($match, 0, 7) == '&lt;!--') {
$a[$id] = '<span class="C">' . $match . '</span>';
} else {
$a[$id] = '<span class="S">' . $match . '</span>';
}
return $id;
}
}

?>

CSS

pre {
display:block;
background-color:#3F3F3F;
margin:1em 0;
padding:1em;
font:normal normal 13px/1.4 Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,Monospace;
color:#E3CEAB;
overflow:auto;
white-space:pre;
word-wrap:normal;
}
pre code {
font:inherit;
color:inherit;
}
pre span.N {color:#8CD0D3} /* Numbers */
pre span.S {color:#CC9385} /* Strings */
pre span.C {color:#7F9F7F} /* Comments */
pre span.K {color:#DFC47D} /* Keywords */
pre span.V {color:#CEDF99} /* Vars */
pre span.D {color:#FFFFFF} /* Defines */
pre span.P {color:#9F9D65} /* Punctuations */
no image

Versi PHP

function get_first_image_url($data, $default_url = null) {

// Matched with `![alt text](IMAGE URL)` from Markdown file
if(preg_match_all('/\!\[.*?\]\((.*?)\)/', $data, $matches)) {
return $matches[1][0];
}

// Matched with...
// 1. `<img src="IMAGE URL">`
// 2. `<img foo="bar" src="IMAGE URL">`
// 3. `<img src="IMAGE URL" foo="bar">`
// 4. `<img src="IMAGE URL"/>`
// 5. `<img foo="bar" src="IMAGE URL"/>`
// 6. `<img src="IMAGE URL" foo="bar"/>`
// 7. `<img src="IMAGE URL" />`
// 8. `<img foo="bar" src="IMAGE URL" />`
// 9. `<img src="IMAGE URL" foo="bar" />`
// ... and the uppercased version of them, and the single-quoted version of them
if(preg_match_all('/<img (.*?)?src=(\'|\")(.*?)(\'|\")(.*?)? ?\/?>/i', $data, $matches)) {
return $matches[3][0];
}

return $default_url; // Default image URL if nothing matched
}

Penggunaan

<img src="<?php echo get_first_image_url($page['content'], 'img/no-image.png'); ?>">

$page['content'] cuma contoh. Anda harus mengambilnya dari konten posting Anda sesuai dengan API pada CMS yang Anda pakai.

Versi JavaScript

function getFirstImageURL(data, noImage) {

// Matched with `![alt text](IMAGE URL)` from Markdown file
var matches = /\!\[.*?\]\((.*?)\)/.exec(data);
return matches ? matches[1] : noImage;

// Matched with...
// 1. `<img src="IMAGE URL">`
// 2. `<img foo="bar" src="IMAGE URL">`
// 3. `<img src="IMAGE URL" foo="bar">`
// 4. `<img src="IMAGE URL"/>`
// 5. `<img foo="bar" src="IMAGE URL"/>`
// 6. `<img src="IMAGE URL" foo="bar"/>`
// 7. `<img src="IMAGE URL" />`
// 8. `<img foo="bar" src="IMAGE URL" />`
// 9. `<img src="IMAGE URL" foo="bar" />`
// ... and the uppercased version of them, and the single-quoted version of them
matches = /<img (.*?)?src=(\'|\")(.*?)(\'|\")(.*?)? ?\/?>/i.exec(data);
return matches ? matches[3] : noImage;

}

Penggunaan

var img = '<img src="' + getFirstImageURL(sourceText, 'img/no-image.png') + '">';
document.write(img);

sourceText cuma contoh. Anda harus mengambilnya dari konten posting Anda, misalnya dengan cara ini:

var sourceText = document.querySelector('.post-body').innerHTML;
Flat-File Guestbook in PHP
Tampilan Buku Tamu

Saya membuat aplikasi Buku Tamu tanpa basis data dengan PHP. Semua data disimpan di dalam sebuah file TXT sebagai pengganti basis data. Ide asli diambil dari sini.

Pada versi Saya, Saya tidak menggunakan captcha gambar, melainkan hanya menggunakan tantangan matematika yang lebih sederhana namun relatif aman. Kode ini dituliskan secara baru, mulai dari awal dan bukan merupakan hasil modifikasi. Beberapa fitur baru yang Saya berikan:

  • Memungkinkan pengguna untuk menambahkan URL.
  • Tanggal penerbitan tersedia, dan akan ditampilkan di pojok kanan atas secara normal.
  • Memungkinkan pengguna untuk membagikan pesan secara individual melalui tautan permanen.
  • Memungkinkan administrator untuk membuat “database” baru tanpa harus menghapus data yang lama.
  • Memungkinkan administrator dan pengguna untuk memuat data lama melalui parameter URL berupa nama file.
  • Sistem keamanan yang lebih baik:
    • Pengguna wajib menjawab tantangan matematika sederhana.
    • Pembatasan jumlah karakter pada setiap bidang.
    • Secara otomatis mengubah kode HTML menjadi entitas HTML untuk keamanan, dan hanya akan menerjemahkan kode HTML yang diperbolehkan saja.
    • Pesan kesalahan akan tampil lebih jelas, serta data yang telah pengguna masukkan sebelumnya ke dalam formulir akan tetap tersimpan di sana sebelum pengguna berhasil mengirimkan pesannya.
    • Tautan di dalam pesan akan terhapus secara otomatis.

Ekstrak file unduhan untuk mendapatkan folder guestbook. Masukkan folder tersebut beserta isinya ke dalam folder public_html atau www pada server lokal Anda. Tidak perlu konfigurasi khusus. Sekali pasang langsung jalan! Jika Anda ingin melakukan konfigurasi, maka itu hanya sebatas pada penamaan “database”, pengaturan panjang karakter maksimal dan penyesuaian teks pesan peringatan.

Jika sudah selesai, buka alamat http://localhost/guestbook/index.php pada peramban untuk melihat hasilnya.

Tidak ada fitur emotikon. Terlalu berlebihan untuk diterapkan pada aplikasi yang sederhana dan bukan merupakan kebutuhan primer. Anda bisa dengan mudah membuatnya sendiri melalui perintah preg_replace() seperti ini:

$message = preg_replace(
array(
'/( |>)\:\-?\)/',
'/( |>)\:\-?\D/',
'/( |>)\:\-?\)/',
...
...
),
array(
'$1<img src="emoticons/smile.gif" alt=":)">',
'$1<img src="emoticons/laugh.gif" alt=":D">',
'$1<img src="emoticons/sad.gif" alt=":(">',
...
...
),
$message);

Ketika Data Dirasa telah Penuh

Ketika Anda merasa bahwa file TXT yang Anda buat sudah terlalu besar ukurannya, atau membuat proses muat halaman menjadi lambat, Anda bisa mengatasinya dengan cara mengganti nilai $database dengan nama yang baru untuk menciptakan file TXT baru tanpa harus menghapus yang lama. Untuk memuat data yang lama ke dalam halaman buku tamu agar bisa ditampilkan ke publik (katakanlah Anda telah membuat pengaturan khusus agar pengguna tidak bisa melihat file dengan format TXT), Anda bisa menambahkan parameter data dengan nilai berupa nama “database” seperti ini:

http://localhost/guestbook/index.php?data=database-003

Atau kalau memang data-data di dalam buku tamu Anda itu tidak penting, Anda bisa menghapus file tersebut begitu saja kalau mau. Semua kode sudah Saya lengkapi dengan penjelasan. Silakan dipelajari atau digunakan jika dirasa berguna.