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! 😀

Cakephp 2.2.2

Cakephp 2.2.2 telah dikeluarkan pada 1 September 2012 yang lalu. Versi kali lebih kepada penambahbaikan keselamatan. Disarankan sesiapa yang menggunakan cakephp 2.2.1, mengemaskini cakephp anda ke versi ini. Maklumat lanjut boleh didapati di http://bakery.cakephp.org/articles/markstory/2012/09/01/cakephp_2_2_2_release

Membakar dengan CakePHP di Windows 7

Artikel ini agak ringkas. Tujuan artikel ini diadakan, agar saya tidak lupa cara menggunakan command prompt untuk melakukan arahan bake.

1. Buka command prompt dan halakan direktori anda ke folder php anda. Sebagai contoh C:\php.

2. Jana arahan ini php.exe capaian ke folder cakephp\console\cake.php bake Sebagai contoh C:\php>php.exe C:\www\blog\cake\console\cake.php bake

Dan anda sudah boleh mula membakar kek!