Jquery Typeahead tidak memaparkan hasil carian

typehead-300x215Hari ini, terpaksa menghadap isu dari plugin ini https://twitter.github.io/typeahead.js/ . Ketika hantaran ini ditulis (atau lebih tepat ditaip), plugin ini masih diversi 0.11.1.

Masalah plugin ini adalah, apabila hasil dari json lebih kecil dari had yang ditetapkan. Sebagai contoh, sekiranya kita hadkan hanya papar 5 baris hasil carian, sekiranya hasil carian tersebut bersamaan dengan 5 atau kurang dari 5, typeahead akan trigger untuk paparkan “Result Not Found.

Ada dua jalan penyelesaian yang boleh digunakan.
1. Penggunaan limit:Infinity

var bestPictures = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: '../data/films/post_1960.json',
remote: {
url: '../data/films/queries/%QUERY.json',
wildcard: '%QUERY'
}
});
$('#remote .typeahead').typeahead(null, {
name: 'best-pictures',
display: 'value',
limit:Infinity,
source: bestPictures
});

Isu penggunaan limit:Infinity adalah anda perlu menguruskan had pada bahagian pelayan sekiranya ada menggunakan cara remote.

Jadi saya mencadangkan cara yang kedua, kita ubah terus fail typeahead.bundle.js

Lihat baris 1707 hingga 1727

typehead-1-300x170

Baris 1715

if (rendered < that.limit && that.async) {

Tukar kepada

if (rendered <= that.limit && that.async) {

Baris 1721

if (!canceled && rendered < that.limit) {

Tukar kepada

if (!canceled && rendered <= that.limit) {

Baris 1723 dan 1724

rendered += suggestions.length;
that._append(query, suggestions.slice(0, that.limit - rendered));

Tukar kepada

that._append(query, suggestions.slice(0, that.limit));
rendered += suggestions.length;

Untuk baris 1723 & 1724, sumber rujukan disini (https://stackoverflow.com/a/35935557)

Harapnya dapat membantu sekiranya anda menghadapi masalah yang sama dengan saya.

Untuk memahami masalah ini dengan lebih mendalam boleh rajin-rajinlah membaca disini.

Apache 2.4, PHP 7 dan MySQL 5.7 Windows 10

  1. Muat turun Apache versi 2.4 di Apache Lounge atau Apache Haus. Saya lebih menyukai Apache Lounge kerana dia menggunakan pengkompil VC14.
  2. Muat turun juga Visual C++ Redistributable dari sini.
  3. Sudah semesti kita perlu muat turun PHP versi 7 dari window.php.net. Dapatkan versi Threaded Safe.
  4. Yang terakhir kita juga perlukan MySQL versi 5.7. Muat turun dari laman sawang MySQL.

Unzip fail zip Apache24 dan juga php7. Untuk memudahkan hidup anda, struktur folder anda haruslah seperti ini.
C:\
—–Apache24
—–php

Kemudian buka command prompt menggunakan akses administrator dan navigasi sehingga folder C:\Apache24\bin. Taip arahan dibawah ini.

httpd.exe -k install -n "Apache 2.4"

Sekarang anda sudah berjaya menjana servis untuk Apache anda. Buka fail C:\Apache24\conf\httpd.conf menggunakan notepad. Tambah kod dibawah pada pengakhiran fail

LoadModule php7_module "C:/Dev/php/php7apache2_4.dll"
AddHandler application/x-httpd-php .php
# configure the path to php.ini
PHPIniDir "C:/Dev/php"

Sekarang waktu untuk melakukan konfigurasi pada php pula. Masuk ke folder C:\php menggunakan File Explorer. Rename fail php.ini-development kepada php.ini. Restart Apache menggunakan Services.

Untuk MySQL, haih, kan pakai setup fail? Next-next je la. :p

Mengira perbezaan hari

Apabila kita membangunkan sistem, seringkali kita berhadapan dengan mengira perbezaan hari. Terutamanya sistem yang melibatkan KPI ataupun ISO bagi sesuatu proses. Catatan kali ini akan menceritakan bagaimana kita boleh mendapatkan perbezaan hari dari 2 tarikh.

Bagi yang menggunakan PHP versi 5.2 dan kebawah bolehlah mencuba cara ini

<?php
$unix_time1 = mktime(0,0,0,3,1,2013);
$unix_time2 = mktime(0,0,0,5,1,2013);
echo $unix_balance = floor(($unix_time2 - $unix_time1) /(60 * 60 * 24));
?>

Format bagi fungsi mktime() adalah seperti ini mktime(jam,minit,saat,bulan,hari,tahun).  Kemudian kita perlu gunakan rumus ini bagi mendapatkan bilangan hari.

(Tarikh2 – Tarikh1) / (60saat x 60minit x 24jam)

Hasil dari pengiraan diatas, kita perlu melakukan proses pembundaran ke nilai yang lebih rendah. Dengan itu fungsi floor() diperlukan.

 

Cara yang kedua adalah dengan menggunakan Class Datetime yang terdapat didalam PHP 5.3 dan keatas. Menggunakan method diff. Bagi mendapat format yang boleh difahami, method format digunakan.

<?php
$Date1 = new Datetime('2013-03-01');
$Date2 = new Datetime('2013-05-01');
$interval = $Date1->diff($Date2);
echo $interval->format("%R%a days");
?>

Sekiranya kita perlu membuat perbandingan dengan data yang dipanggil dari pangkalan data, adalah lebih baik kita menggunakan sql. Ini bagi mengurangkan PHP perlu memprosesnya berulang-ulang kali. Caranya mudah. Pernyataan Sql dibawah menggunakan fungsi yang terdapat didalam MySQL.

 

Selamat mencuba!

SELECT DATEDIFF( tarikh_tamat, tarikh_mula )
FROM nama_jadual
WHERE syarat_anda
LIMIT 0 , 30

Invalid argument supplied for foreach() CORE\Cake\Utility\ObjectCollection.php, line 330

<a><b>Warning</b> (2)</a>: Invalid argument supplied for foreach() [<b>CORE\Cake\Utility\ObjectCollection.php</b>, line <b>330</b>]
Code Context
ObjectCollection::normalizeObjectArray() - CORE\Cake\Utility\ObjectCollection.php, line 330
BehaviorCollection::init() - CORE\Cake\Model\BehaviorCollection.php, line 66
Model::__construct() - CORE\Cake\Model\Model.php, line 748
ReflectionClass::newInstance() - [internal], line ??
ClassRegistry::init() - CORE\Cake\Utility\ClassRegistry.php, line 164
Model::_constructLinkedModel() - CORE\Cake\Model\Model.php, line 1031
Model::__isset() - CORE\Cake\Model\Model.php, line 857
Model::__get() - CORE\Cake\Model\Model.php, line 887
DboSource::read() - CORE\Cake\Model\Datasource\DboSource.php, line 1063
Model::find() - CORE\Cake\Model\Model.php, line 2674
Batch::count_enrolled() - APP\Plugin\course\Model\batch.php, line 73
CoursesController::index_admin() - APP\Plugin\course\Controller\CoursesController.php, line 55
ReflectionMethod::invokeArgs() - [internal], line ??
Controller::invokeAction() - CORE\Cake\Controller\Controller.php, line 485
Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 186
Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 161
[main] - APP\webroot\index.php, line 97

Selama 3 hari saya tersangkut dengan ralat ini. Sungguhpun ianya sekadar amaran(warning), tapi saya mahu menjadikan sistem saya bebas ralat. Kod yang pada asalnya menggunakan cakephp 1.3 kini dalam proses migrasi ke cakephp 2.3.

Hasil daripada apa yang saya kesan penggunaan fungsi $this->NamaModel->(‘count’) haruslah mempunyai parameter ‘contain’ => array(). Dimana kesemua hubungan model ini bersama model lain, haruslah diputuskan.

<?php
$params = array(
'conditions' => array('namaField' => $value),
'contain' => array()
);
$this->NamaModel->find('count',$params);
?>

Custom Helper in Cakephp 2

Hanya ingin berkongsi pengalaman saya menaiktarafkan code yang dijana dari Cakephp 1.3 ke Cakephp 2.0

Ada beberapa peralatan yang saya gunakan, yang pertama menggunakan Shell Script dari command bake

php cake.php upgrade All

Maklumat lanjut boleh diperolehi dari sini (http://book.cakephp.org/2.0/en/console-and-shells/upgrade-shell.html)

Perkara kedua yang saya lakukan adalah, mengubah nama fail untuk ikut standard Cakephp 2. Untuk itu saya telah buat script dibawah untuk ubah nama-nama controller.

<?php
$root = 'C:/Dev/www/vip2/app';
$path = $root.'/'.$_GET['path'].'/';
echo $path;
$dir_handle = opendir($path);
while ($file = readdir($dir_handle))
{
echo $file.'<br />';
if(($file != ".") && ($file != ".."))
{
$filename = explode('_',$file);
echo '<br />';
print_r($filename);
echo '<br />';
//if(isset($filename[1]))
//{
$newFileName = null;
$i = 0;
foreach($filename as $key => $value)
{
$newFileName .= ucfirst($value);
}
echo $newFileName.'<br />';
$oldPath = $path.$file;
$newPath = $path.$newFileName;
rename($oldPath,$newPath);
//}
}
}
closedir($dir_handle)
?>

Sekiranya, sistem anda melibatkan log masuk, maka perubahan perlu dilakukan pada method login. Boleh rujuk book.cakephp.org berkaitan perkara itu.

Kadangkala, kita sering membuat custom helper, dimana custom helper ini pula, akan memanggil Helper standard yang ada didalam Cakephp.

Oleh itu anda boleh melakukan sebegini,

App::import('Helper','Javascript');
App::import('Helper','Form');
App::uses('View','View');
$this->Js = new JavaScriptHelper(new View(null),$options);
$this->Form = new FormHelper(new View(null),$options);

Ini kerana parameter pertama adalah merujuk kepada View. Ini merupakan perubahan yang dilakukan di Cakephp 2.

Selamat mencuba dan memeningkan kepala! 😀