Thứ Ba, 28 tháng 10, 2008

Phân trang tìm kiếm trong cakephp 1.1

Việc phân trang trong cakephp 1.1 đã được tôi đề cập ở bài trước vì vậy tôi sẽ không hướng dẫn chi tiết các bạn cách làm phân trang trong cakephp 1.1 nữa. Các bạn có thể xem lại tại http://i-php.net/2008/10/pagination-phan-trang-trong-cakephp-11x/. Ở bài viết này tôi chỉ đi hướng dẫn cách phân trang khi tìm kiếm mà thôi. (Tất nhiên là dựa vào cách phân trang ở bài viết trước rồi).

Với các PaginationHelper và PaginationComponent ở bài trước chỉ có thể giúp chúng ta phân trang một cách bình thường mà thôi. Nhưng khi chúng ta thêm vào điều kiện tìm kiếm thì chức năng phân trang sẽ chạy sai. Nguyên nhân là do khi chúng ta thực hiện phân trang thì các biến của trang sẽ được truyền qua URL theo phương thức GET. Vì vậy mà các điều kiện lọc ở form sẽ không được truyền vào , và khi khởi tạo lại trang thì nó sẽ chỉ hiểu các điều kiện truyền từ phương thức GET, do vậy phân trang không còn chính xác nữa.

Đề giải quyết vấn đề trên có rất nhiều phương pháp, trong đó có 2 phương pháp mà tôi được biết đó là truyền các điều kiện còn lại lên trên URL theo phương thức GET hoặc là truyền điều kiện lọc theo phương thức POST đồng thời truyền các tham số phân trang lên URL theo phương thức GET. Cách đầu tiên có một nhược điểm rất lớn là do các tham số sẽ được truyền hết lên trên URL do đó URL trông sẽ rất xấu và dài, đồng thời nhược điểm lớn nhất khi truyền tham số trên URL là URL chỉ cho phép dài nhất là 256 ký tự mà thôi, do vậy khi tìm kiếm với khối lượng lớn dữ liệu điều kiện thì phương pháp này sẽ không khả thi. Do vậy tôi chọn phương pháp thứ 2 là truyền dữ liệu lọc theo phương thức POST đồng thời truyền các tham sô phân trang trên URL theo phương thức GET.
Cách thức thực hiện:

Trong phần phân trang ở trước, công việc phân trang sẽ thực hiện thông qua phương thức GET tức là các link sẽ chứa các tham số phân trang.và việc phân trang sẽ dựa hoàn toàn vào các tham số đó.

Giờ đây, khi ấn vào các link đó thay vì kích hoạt các link đó chúng ta sẽ gọi ra một hàm javascript thông qua sự kiện onclick. Chúng ta sẽ submit dữ liệu theo phương thức POST thay vì phương thức GET đồng thời truyền lên  URL các tham số phân trang. Như vậy sau khi submit chúng ta sẽ có cả dữ liệu lấy từ phương thức POST và phương thức GET.
Các bước thực hiện:

- Đầu tiên, chúng ta sẽ thêm sự kiện 'onclick' vào tất cả các link phân trang. Chúng ta mở file '/app/views/helpers/pagination.php', chúng ta tìm đến 'function _generateLink ()', di chuyển đến cuối hàm và thay đổi đoạn source code sau:
return $this->Html->link(
$title,
$url,
NULL,
NULL,
$escapeTitle)

thành
$options['onclick'] = "return paginator_number('form', '{$this->Html->url($url)}')";

return $this->Html->link(
$title,
$url,
$option,
NULL,
$escapeTitle

Ở trên, chúng ta đã gọi ra hàm javascript la 'paginator_number' với 2 tham số truyền và là tên form, mà cụ thể trong trường này tên form là 'form', tham số thứ 2 là url cần link đến và các tham số phân trang (giá trị này sẽ tự sinh ra, chúng ta không cần thay đổi). Điều đáng chú ý ở đây là để chạy được thì các bạn sẽ phải để tên form là 'form', nếu là tên form khác thì chương trình sẽ không chạy.

- Tiếp đến chúng ta sẽ thêm hàm sau:
function paginator_number(element, url )
{
$(element).attr("action",url);
$(element).submit();
return false;
}

Hàm javascript này sẽ được thêm vào layout. Các bạn chú ý các viết hàm javascipt trên là viết thông qua jquery. Nếu các bạn chưa có thì nhơ tải jquery về nhé. Chúc các bạn thành công.

Sử dụng bootstrap.php cấu hình các thư mục chứa source code trong cakephp

Như chúng ta đã biết, cakephp viết theo mô hình MVC, do vậy khi ta viết các đoạn lệnh của chương trình chủ yếu chúng ta chỉ viết ở các thư mục trong app như model, controller, views, component(trong controller) và helper (trong views). Các file source chủ yếu sẽ được viết trên các thư mục này.

Sau đây tôi xin hướng dẫn các bạn chuyển các file source của chúng ta ra một thư mục khác ngoài app. Việc chuyển code ra khỏi thư mục app trong cakephp sẽ có một số tiện ích sau đây:

- Quản lý các file code sẽ dễ dàng và sáng sủa hơn, dễ bảo trì hơn. Các file của chúng ta khi chuyển ra thư mục riêng thì việc tìm kiếm sẽ trở lên dễ dàng hơn so với việc ta tìm kiếm một file trong một mớ file hỗn độn bên trong app.

- Với các bạn hay sử dụng svn thì việc này sẽ tạo ra một sự tiện dụng vô cùng lớn. Thay vì chúng ta phải gửi rất nhiều code, bao gồm cả những file không cần thiết thì nay ta chỉ việc gửi một thư mục duy nhất mà ở đó chứa tất cả những gì chúng ta cần làm nên.

- Việc thay đổi các bản cakephp mới hơn sẽ trở lên dễ dàng hơn, vì giơ đây chương trình của chúng ta nằm ngoài các thư mục của cakephp. Thay vì trước khi khi update bản cakephp mới chúng ta phải nhọc công copy riêng từng thư mục ra thì nay ta chỉ việc copy đề lên thư mục cũ là được. Các file của chúng ta không hề bị ảnh hưởng gì cả.

Còn rất nhiều tiện ích nữa mà tôi chưa nhắc đến. Nhưng tôi nghĩ như vậy có lẽ là đủ để các bạn nên thử rồi đấy. Sau đây tôi sẽ thực hiện chuyển dữ liệu ở các thư mục sau ra bên ngoài: controllers, views và models (tất nhiên là sẽ bao gồm cả các thư mục con nằm bên trong các thư mục này như là helpers, components ...). Và thư mục mà chúng ta sẽ chuyển đến là thư mục bitjsc nằm cùng cấp với thư mục app.
Sau đây là các công việc cần làm:

- Đầu tiên: Chúng ta sẽ tạo các thư mục cần thiết bao gồm:

+ Thư mục bitjsc nằm cùng cấp với thư mục app và cake.

+ Các thư mục con nằm trong bitjsc bao gồm : controllers, views, models và config.

+ Các thư mục con nằm trong các thư mục controller, views, models và config như là: helpers, component ....

- Tiếp theo, chúng ta sẽ cấu hình lại file bootstrap.php theo đường dẫn /app/config/bootstrap.php. Chúng ta thêm vào cuối file dòng sau:
require_once(dirname(__FILE__) . DS . '..' . DS . '..' . DS . 'bitjsc' . DS . 'config' . DS . 'bootstrap.php');

Dòng trên sẽ thực hiện gọi file bootstrap.php trong theo đường dẫn 'bitjsc/config/', đây là các thư mục mà chúng ta vừa tạo ở phía trên. Trong thư mục 'bitjsc/config/' chúng ta sẽ tạo ra một file có tên là bootstrap.php, trong file này ta sẽ thực hiện bẫy để khi gọi các model, controller hay views thì chương trình sẽ tự động gọi các file tương ứng trong thư mục bitjsc thay vì gọi chúng trong app.

- Tạo file bootstrap.php theo đường dẫn '/bitjsc/config/bootstrap.php'.  Nội dung của file bootstap.php sẽ như sau:
<?php
/**
* Bitjsc bootstrap file
*
* This file should be included in app/bootsrap.php. It connect WF
* with your application.
*
* @package bitjsc
*/

// Bitjsc MVC paths
define('BITJSC_DIR', ROOT . DS . 'bitjsc');
define('SETTINGS_CACHE_FILE', TMP . 'settings' . DS . 'cache');

$modelPaths = array(BITJSC_DIR . DS . 'models' . DS);
$viewPaths = array(BITJSC_DIR . DS . 'views' . DS);
$controllerPaths = array(BITJSC_DIR . DS . 'controllers' . DS);
$behaviorPaths = array(BITJSC_DIR . DS . 'models' . DS . 'behaviors' . DS);
$helperPaths = array(BITJSC_DIR . DS . 'views' . DS . 'helpers' . DS);
$componentPaths = array(BITJSC_DIR . DS . 'controllers' . DS . 'components' . DS);
?>

Vậy là chúng ta đã xong việc cấu hình lại đường dẫn. Giờ khi thêm mới bất kỳ file controller, views hay model gì các bạn chỉ cần thêm vào các thư mục tương ứng trong bitjsc là xong. Chúc các bạn thành công.

convert mdyDate to YMDDate

Convert '23/12/1988' to '1988/12/23'
    function toYMDDate($mdyDate)
{
$mdyDate = explode("/",$mdyDate);
krsort($mdyDate);
return implode("/",$mdyDate);
}

Hướng dẫn sử dụng làm web với cakephp

1 Giới thiệu về cakePHP
2 Download framework
3 Cài đặt và cấu hình cakephp
3.1 Cài đặt
3.2 Cấu hình
4 Ví dụ sử dụng CakePHP để quản lý khách hàng trong web application "Quản lý phòng trọ"
4.1 Tạo bảng cơ sở dữ liệu
4.2 Viết Code
4.3 Mô hình hoạt động
4.4 Model
4.5 Controller
4.6 View
4.7 Hoàn chỉnh các chức năng của modul quản lý customer

Giới thiệu về cakePHP

CakePHP là một framework cho php, mục đích của nó là cung cấp một framework cho người sử dụng php phát triển những ứng dụng web nhanh, mạnh mà không mất tính linh hoạt của nó. Và điều quan trọng là CakePHP is free.Trang chủ cakephp: http://cakephp.org Để sử dụng nó, yêu cầu người làm phải biết những kiến thức cơ bản về PHP và HTML, ... Có thể đọc nội dung chi tiết về nội dung cũng như ví dụ của nó tại http://manual.cakephp.org Huypvt

Download framework

Click vào liên kết sau để tải về cakephp framework: http://cakephp.org/downloads (chọn stable release).

Cài đặt và cấu hình cakephp

Cài đặt

Để sử dụng nó, cần phải đáp ứng những yêu cầu sau: - Một HTTP Server (vd như Apache, IIS) - CakePHP chỉ support trong PHP ver 4 trở lên. - Database: cake hổ trợ các hệ cơ sở dữ liệu sau: MySql, PostgreSQL. Bài hướng dẫn này được viết dựa trên "AppServ Version 2.5.7 for Windows" gồm - Apache Web Server Version 2.2.3 - PHP Script Language Version 5.1.6 - MySQL Database Version 5.0.24a - phpMyAdmin Database Manager Version 2.9.0.2 Sau khi download cakephp về, bạn giải nén tập tin đó ra (.zip) và sao chép vào thư mục chứa Apache Server (vd: C:\AppServ\www\MyCake). VD:
/MyCake
/app
/cake
/vendors
.htaccess
index.php

Cấu hình

Để cake có thể làm việc được với database, cần cấu hình lại trang database.php, mặc định trang này không có, để cấu hình ta làm như sau: - Mở file database.php.default ở /app/config và Save As lại thành file database.php. - Điều chỉnh lại các thông số:
var $default = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'project_name',
'prefix' => );

Với user, password, database lần lượt là: tên user, password và database ở trong MySql. Quy ước về đặt tên bảng trong database
Tên bảng trong cake nên ở dạng tiếng Anh số nhiều (vd: users, customers, students, ... )
Bảng phải có primary key tên là 'id'
Nếu có sử dụng quan hệ trong các bảng vd: user_id (user không có s và dấu _ cộng id)

Ví dụ sử dụng CakePHP để quản lý khách hàng trong web application "Quản lý phòng trọ"

Tôi sẽ nói đến tính năng, cũng như mô hình hoạt động của CakePHP, cách viết một web application bằng cakephp tôi sẽ nói dần với các bạn qua ví dụ: Sau khi cài đặt và cấu hình CakePHP, kiểm tra CakePHP đã setup chưa, bạn test thử bằng cách mở webbrowserlên go http://localhost/MyCake/ bạn sẽ thấy giao diện như sau

Cần chú ý đến 2 dòng Your database configuration file is present. Cake is able to connect to the database. Xác định xem bạn đã kết nối được Cake với database của bạn hay chưa.

Tạo bảng cơ sở dữ liệu

Ta tạo bảng customers với những field như sau:
id: INT, AUTO_INCREMENT, PRIMARY KEY
name: NVARCHAR
age: INT
address: NVARCHAR

Viết Code

Mở trình soạn thảo và tạo các file và nội dung như sau lưu theo đường dẫn chỉ định File customer.php -> C:\AppServ\www\MyCake\app\models\
<?php
class Customer extends AppModel
{
var $name = 'Customer';
}
?>

File customers_controller.php -> C:\AppServ\www\MyCake\app\controllers
<?php
class CustomersController extends AppController
{
var $name = 'Customers';
function index()
{
$this->set('customers', $this->Customer->findAll());
}
}
?>

File index.thtml -> C:\AppServ\www\MyCake\app\views\customers\ Chú ý tạo thư mục customers trong /app/views

<h1>Customer Manager</h1>
<table>
<tr>
<th>Id</th><th>Name</th><th>Age</th><th>Address</th>
</tr>
<?php foreach ($customers as $cust): ?>
<tr>
<td><?php echo $cust['Customer']['id']; ?></td>
<td>
<?php echo $html->link($cust['Customer']['name'], '/customers/view/'.$cust['Customer']['id']);?>
<?php echo $html->link(
'Delete',
"/customers/delete/{$cust['Customer']['id']}",
null,
'Are you sure?'
)?>
<?php echo $html->link('Edit', '/customers/edit/'.$cust['Customer']['id']);?>
</td>
</td>
<td><?php echo $cust['Customer']['age']; ?></td>
<td><?php echo $cust['Customer']['address']; ?></td>
</tr>
<?php endforeach; ?>
</table>
<p><?php echo $html->link("Add Customer", "/customers/add"); ?>

Xong 3 trang đó, chúng ta test chạy thử , mở webbrowser http://localhost/MyCake/customers Bạn sẽ thấy giao diện trang chính như hình sau: Như vậy là bạn đã tạo được ứng dụng đơn giản đầu tiên về việc sử dụng cakephp để viết ứng dụng web. Tiếp theo tôi sẽ giải thích cho các bạn mô hình hoạt động của CakePHP, cách viết các trang,cũng như cách sử dụng biến, hàm ...

Mô hình hoạt động

Như tôi đã giới thiệu CakePHP là một framework, mô hình hoạt động của nó tương tự mô hình 3 lớp MVC trong lập trình hướng đối tượng. Với tầng trên cùng là view, tiếp theo là tầng controller và cuối cùng là tầng model. Tầng model sẽ giao tiếp với cơ sở dữ liệu của chúng ta.

Model

Trong ví dụ trên các bạn thấy trong file customer.php với cách viết code như trên, được Cake hiểu là ta muốn tạo một model tên là Customer để sử dụng trong CustomersController của chúng ta. Biến $name được chỉ định để tránh trường hợp model của chúng ta trùng với tên của các hàm của php. Và lớp Customer sẽ được kế thừa các thuộc tính và phưông thức từ lớp AppModel. Để có thể hiểu chi tiết về model và cách sử dụng các thuộc tính và hàm của model bạn có thể tham khảo tại http://manual.cakephp.org/chapter/models

Controller

Controller được sử dụng để quản lý việc giao tiếp với cơ sở dữ liệu, thiết lập các yêu cầu theo ý muốn của chúng ta để thể hiện lên view vidu như các hàm xử lý thêm, xóa, sữa và hiển thị, ..., là nơi mà tất cả các hoạt động của model ta sẽ quản lý nó được. Trong ví dụ trên (customers_controller.php)đoạn code trên được Cake hiểu rằng ta sẽ tạo một CustomersController dùng để quản lý việc sử dụng, các hoạt động của CustomerModel. Tương tự lớp CustomersController sẽ kế thừa từ lớp AppController. Hàm index() sẽ được xử lý khi ta gọi trang index.thtml. Trong đó có phương thức set() được sử dụng để gán giá trị là một mảng được trả về từ phương thức findAll() tại của model Customer. Trong ví dụ trên thì biến $customers sẽ mang giá trị là mảng các customer được lấy từ bảng customers từ database. Để xem chi tiết về controller các bạn có thể tham khảo tại: http://manual.cakephp.org/chapter/controllers

View

View là nơi thể hiện dữ liệu đã được xử lý của chúng ta. Một view được xem như một trang template. Chúng ta có thể lấy dữ liệu từ model tương ứng. Dữ liệu được truyền qua một mãng $data. Trong ví dụ trên thì index.thtml là một view. Phần tiếp theo tôi sẽ nói đến chi tiết view thông qua ví dụ trên. Tiếp theo ta tìm hiểu đến các thuộc tính và phương thức trong index.thtml <?php foreach ($customers as $cust): ?> Biến $customers chính là biến mà ta đã thiết lập bằng phương thức set() ở CustomersController của ví dụ. Nó mang giá trị là một mãng như tôi đã nói. $html là một đối tượng của lớp helpers sẽ được đề cập trong phần tới. Phương thức link() được sử dụng để xuất ra một liên kết giống href trong HTML với tham số đầu tiên là tựa để của liên kết, tham số thứ 2 là url.

Hoàn chỉnh các chức năng của modul quản lý customer

Ta sẽ thêm các chức năng thêm, sữa, xóa, hiển thị trong view của chúng ta. Ta thêm các hàm trong customers_controller như sau:
<?php
class CustomersController extends AppController
{
var $name = 'Customers';
function index()
{
$this->set('customers', $this->Customer->findAll());
}
function view($id)
{
$this->Customer->id = $id;
$this->set('customers', $this->Customer->read());
}
function add()
{
if (!empty($this->data))
{
if ($this->Customer->save($this->data))
{
$this->flash('Your customer has been saved.','/customers');
}
}
}
function delete($id)
{
$this->Customer->del($id);
$this->flash('The customer with id: '.$id.' has been deleted.', '/customers');
}
function edit($id = null)
{
if (empty($this->data))
{
$this->Customer->id = $id;
$this->data = $this->Customer->read();
}
else
{
if ($this->Customer->save($this->data['Customer']))
{
$this->flash('Your customer has been updated.','/customers');
}
}
}
}
?>

Như vậy ta đã thêm 4 function trong CustomersController của chúng ta. Function sẽ được gọi ở view. Ví dụ trên ta click vào link Add Customer thì function sẽ được thực hiện và thể hiện lên view add của chúng ta. Bạn tạo file add.thtml với nội dung như sau:

<h1>Add Customer</h1>
<form method="post" action="<?php echo $html->url('/customers/add')?>">
<p>
Name:
<?php echo $html->input('Customer/name', array('size' => '40'))?>
<?php echo $html->tagErrorMsg('Customer/name', 'Name is required.') ?>
</p>
<p>
Age:
<?php echo $html->input('Customer/age', array('size' => '40'))?>
<?php echo $html->tagErrorMsg('Customer/age', 'Age is required.') ?>
</p>
<p>
Address:
<?php echo $html->input('Customer/address', array('size' => '40'))?>
<?php echo $html->tagErrorMsg('Customer/address', 'Address is required.') ?>
</p>
<p>
<?php echo $html->submit('Save') ?>
</p>
</form>

Trong view add trên dòng <?php echo $html->input('Customer/name', array('size' => '40'))?> sẽ xuất ra một thẻ input text. Với dòng lệnh trên thì Cake sẽ hiểu rằng ta sẽ sử dụng trường name trong model Customer.Tham số thứ 2 là thuộc tính của thẻ input trong HTML. Tương tự với thẻ submit. Hàm tagErrorMsg() sẽ thông báo lỗi ở view trong trường hợp dữ liệu nhập của ta bị lỗi. Việc xử lý lỗi sẽ được nói trong phần sau. Tương tự ta tạo các file edit.thtml, view.thtml như sau:
edit.thtml

<h3>Edit Your Customer</h3>
<form method="post" action="<?php echo $html->url('/customers/edit')?>">
<?php echo $html->hidden('Customer/id'); ?>
<p>
Name:
<?php echo $html->input('Customer/name', array('size' => '40'))?>
<?php echo $html->tagErrorMsg('Customer/name', 'Name is required.') ?>
</p>
<p>
Age:
<?php echo $html->input('Customer/age', array('size' => '40'))?>
<?php echo $html->tagErrorMsg('Customer/age', 'Age is required.') ?>
</p>
<p>
Address:
<?php echo $html->input('Customer/address', array('size' => '40'))?>
<?php echo $html->tagErrorMsg('Customer/address', 'Address is required.') ?>
</p>
<p>
<?php echo $html->submit('Save') ?>
</p>
</form>

view.thtml

<h3>Your Customer</h3>
<h1>Name :<?php echo $customers['Customer']['name']?></h1>
<h1>Age :<?php echo $customers['Customer']['age']?></h1>
<h1>Address:<?php echo $customers['Customer']['address']?></h1>

Cách cài svn trên host BlueHost

1.Request bluehost cho access bằng ssh
2.Tiến hành connect lên server bằng ssh client (PuTTY,Bitvise)
3.Các bước cài đặt :

~$mkdir _src
~$cd _src
_src$wget http://subversion.tigris.org/downloads/subversion-1.4.6.tar.gz
_src$wget http://subversion.tigris.org/downloads/subversion-deps-1.4.6.tar.gz
_src$tar -xzvf subversion-1.4.6.tar.gz
_src$tar -xzvf subversion-deps-1.4.6.tar.gz
_src$cd subversion-1.4.6
_src/subversion-1.4.6$cd apr
_src/subversion-1.4.6/apr$./configure --enable-shared --prefix=$HOME
_src/subversion-1.4.6/apr$make && make install
_src/subversion-1.4.6/apr$cd ../apr-util
_src/subversion-1.4.6/apr-util$./configure --enable-shared --prefix=$HOME \
--with-expat=builtin --with-apr=$HOME \
--without-berlekey-db
_src/subversion-1.4.6/apr-util$make && make install
_src/subversion-1.4.6/apr-util$cd ../neon
_src/subversion-1.4.6/neon$EXTRA_CFLAGS="-L/usr/lib64 -fPIC"
_src/subversion-1.4.6/neon$CFLAGS="-L/usr/lib64 -fPIC"
_src/subversion-1.4.6/neon$./configure --prefix=/home/zzzzz/system --enable-shared
_src/subversion-1.4.6/neon$make && make install
_src/subversion-1.4.6/neon$cd ..
_src/subversion-1.4.6$./configure --prefix=/home/zzzzz/system --with-expat=builtin
_src/subversion-1.4.6$/$make && make install

Chú ý :
Dấu ~ biểu diễn thư mục gốc của user
Dấu $ phân cách lệnh thực hiện và thư mục (chỉ gõ các lệnh sau dấu $)

4.Cấu hình :
Cấu hình cho PATH vào $/system/svn/bin

~$nano -w .bash_profile (file .bash_profile nằm trong thư mục gốc ví dụ /home/bitjsc/.bash_profile)
sửa file này
Tìm đoạn PATH=$PATH:$HOME/bin
thêm vào thành PATH=$PATH:$HOME/bin:$HOME/system/bin
Save lại (Ctrl+X)


5. Test
logout ra
login lại
gõ svn help
???? Có thành công không nhỉ ?

Select TOP PERCENT Records MSSQL,MySQL

Returning TOP Records



Microsoft SQL Server

SELECT TOP 10 column FROM table

MySQL

SELECT column FROM table LIMIT 10

Returning TOP PERCENT Records



Microsoft SQL Server

SELECT TOP 50 PERCENT * FROM table

MySQL

SELECT @percentage := ROUND(COUNT(*) * 50/100) FROM table;
PREPARE STMT FROM 'SELECT * FROM table LIMIT ?';
EXECUTE STMT USING @percentage;


Cách lọc link trong trang html


preg_match_all('/(href=)(.*?)(")/i',$response,$patterns);
var_dump($patterns[2]);

Demo kéo thả trong Flex

http://i-php.net/flex/Survey.swf

Thứ Bảy, 25 tháng 10, 2008

Xác định ngày đầu tuần và ngày đầu tháng

doremi 
- Xác định ngày đầu tuần (thứ 2)

<?php
$date_time = getdate();
$day = $date_time['wday']-1;
$date = new DateTime($date_time['mday'].'-'.$date_time['mon'].'-'.$date_time['year']);
$date->modify("-{$day} day");
return $date->format("Y-m-d");
?>

Hoặc :
<?php
$day = date('d-m-Y', strtotime("last Monday"));
echo $day;
?>

Để tìm ngày thứ 2 của tuần tiếp theo thì thay 'last' bằng 'next'.

Để xác định ngày hiện tại và ngày đầu tuần cách nhau bao nhiêu ngày ta dùng hàm sau :

<?php
echo floor((strtotime ("now")- strtotime("last Monday"))/86400);
?>
Nếu muốn xác định khoảng cách giữa các ngày khác nhau
thì thay "now" bằng "last Monday" hoặc "next Monday"....

- Xác định ngày đầu tháng

<?php
$day = date('Y-m-d', strtotime(date('Y-m-01', strtotime("now"))));
return $day;
?>

Hoặc :
<?php
$date = date("01/m/Y");
echo $date;
?>

Thứ Bảy, 18 tháng 10, 2008

giới hạn tốc độ download bằng php

http://code.google.com/p/phptraining/source/browse/trunk/download_limited.php


/**
* Download with limited speed class file.
*
* i-php group :
* Copyright (c) <2008>,
* Licensed under New BSD License
* @filesource download_limited.php
* @copyright Copyright 2008, i-php group
* @author habogay@gmail.com
* @link http://i-php.net/about/
* @since php 5.0
* @version $Revision: 1 $
* @modifiedby $LastChangedBy: habogay $
* @lastmodified $Date: 2008-08-18 09:45:49 -0500 (Sat, 18 Oct 2008) $
* @license http://www.freebsd.org/copyright/freebsd-license.html New BSD Style License
*/

class DownloadLimited
{
/**
* Send the local file to client with limit download rate as user view file name
*
* @param string $localFile file to send
* @param string $userViewFileName filename client will see
* @param float $downloadRate download limit speed in kb/s (ex: 50 kb/s)
* @return no return
*/
function sendFile($localFile,$userViewFileName,$downloadRate)
{
/** check file exists
* @see file_exists
*/
if(!file_exists($localFile))
{
throw new Exception('File not found execption file :'.$localFile.' not found');
}
/** check file is file
* @see is_file
*/
if(!is_file($localFile))
{
throw new Exception($localFile.' not is a file');
}
if(!is_readable($localFile))
{
throw new Exception('file '.$localFile.' not readable ');
}
// send headers
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($localFile));
header('Content-Disposition: filename='.$userViewFileName);

// flush header content
flush();
// open file stream
$file = fopen($localFile, "r");
while(!feof($file))
{

// send the current file part to the browser
print fread($file, round($downloadRate * 1024));

// !important flush the content to the browser
flush();

// !important sleep one second
sleep(1);
}

// close file stream
fclose($file);


}
/**
* Send the string data to client with limit download rate as user view file name
*
* @param string string data to send include ascii,utf-8 character
* @param string $userViewFileName filename client will see
* @param float $downloadRate download limit speed in kb/s (ex: 50 kb/s)
* @return no return
*/
function sendString($data,$userViewFileName,$downloadRate)
{
// send headers
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.strlen($data));
header('Content-Disposition: filename='.$userViewFileName);
// flush header content
flush();

$start=0;
$sendSize=0;
while($sendSize {
$sendSize=round($downloadRate*1024);
print substr($data,$start,$sendSize);
$start=$sendSize;
// !important flush the content to the browser
flush();

// !important sleep one second
sleep(1);
}
}

}
?>


Thứ Tư, 15 tháng 10, 2008

Pagination - Phân trang trong cakephp 1.1.x

Đối với cakephp 1.1.x, hiện tại chưa hỗ trợ sẵn việc phân trang giống như trong cakephp 1.2. Đối với cakephp 1.2 bạn chỉ việc dùng sẵn helper là có thể phân trang được. Với bản cakephp 1.1 việc phân trang sẽ do chúng ta tự làm. Sau đây tôi xin hướng dẫn các bạn phân trang trong cakephp bằng components và helper của Andy Dawson.

Cài đặt:


- Bạn lưu file http://i-php.net/2008/10/pagination-component/ thành /app/controllers/components/pagination.php

- Bạn lưu file http://i-php.net/2008/10/pagination-helper/ thành /app/views/helpers/pagination.php

- Bạn lưu file http://i-php.net/2008/10/pagination-element/ thành /app/views/elements/pagination.thtml

Sử dụng trong controller


Trong controller, khi nào muốn sử dụng hàm phân trang thì ta chỉ việc sử dụng components và helper pagination mà chúng ta vừa tạo ra ở trên. Ta sẽ khởi tạo chúng trước khi thực hiện lấy dữ liệu. Ví dụ như chúng ta sẽ sử dụng chúng trong controller Post như sau:
<?php
class PostsController extends AppController
{
var
$name = 'Posts'; // for PHP4 installs
var $components = array ('Pagination'); // Added
var $helpers = array('Pagination'); // Added


function index() {
$criteria=NULL;
list(
$order,$limit,$page) = $this->Pagination->init($criteria); // Added
$data = $this->Post->findAll($criteria, NULL, $order, $limit, $page); // Extra parameters added

$this->set('data',$data);
}
}
?>

Sử dụng trong views


Ta sẽ tạo ra một views post mà sử dụng phân trang ở trên.
<h1>Paginated Posts Index</h1>
<table>
<?php
$pagination
->setPaging($paging); // Initialize the pagination variables
$th = array (
$pagination->sortBy('id'),
$pagination->sortBy('title'),
$pagination->sortBy('created')
);
// Generate the pagination sort links
echo $html->tableHeaders($th); // Create the table headers with sort links if desired


foreach ($data as $output)
{
$tr = array (
$output['Post']['id'],
$html->link($output['Post']['title'], "/Posts/View/{$output['Post']['id']}"),
$output['Post']['created']
);
echo
$html->tableCells($tr,array('class'=>'altRow'),array('class'=>'evenRow'));
}
?>
</table>
<? echo $this->renderElement('pagination'); // Render the pagination element ?>

Trong view trên ta có sử dụng hàm sortBy() trong helper Pagination, hàm này sẽ sắp xếp lại dữ liệu theo các trường trong model khi ta kích vào đấy theo thứ tự tăng dần hoặc giảm dần. Hàm setPaging() sẽ xác định xem hiện ta đang ở trang nào. Việc hiện thị các trang cũng như các tuỳ chọn của trang sẽ được thực hiện qua hàm renderElement(), hàm này sẽ gọi pagination.thml trong element ra để thực hiện hiển thị chức năng phân trang.

Pagination Element

By Andy Dawson (AD7six)



<div id='pagination'>
<?php
if($pagination->setPaging($paging)):
$leftArrow = $html->image("nav/arrowleft.gif", Array('height'=>15));
$rightArrow = $html->image("nav/arrowright.gif", Array('height'=>15));

$prev = $pagination->prevPage($leftArrow,false);
$prev = $prev?$prev:$leftArrow;
$next = $pagination->nextPage($rightArrow,false);
$next = $next?$next:$rightArrow;

$pages = $pagination->pageNumbers(" | ");

echo

$pagination->result()."<br>";
echo
$prev." ".$pages." ".$next."<br>";
echo
$pagination->resultsPerPage(NULL, ' ');
endif;
?>
</div>

Pagination Helper

Pagination Component

Thứ Hai, 13 tháng 10, 2008

Sử dụng TinyMCE, iBrowser với CakePHP

TinyMCE



  • Cài đặt


+ Download TinyMCE http://tinymce.moxiecode.com/download.php

+ Sau khi download giải nén ra thư mục TinyMCE, và  copy nguyên thư mục /tiny_mce vào /webroot/js trong cakephp.

  • Cấu hình


+ Đưa đoạn mã vào layout  (hoặc vào view nếu không muốn sử dụng mặc định cho tất cả các layout) :
<?php
if(isset($javascript)):
echo
$javascript->link('tiny_mce/tiny_mce.js');
endif;
?>

+ Khai báo sử dụng javascript helper trong Controller :
var $helpers = array('Javascript' );

+ Sử dụng tinyMCE trong view :
<script type="text/javascript">
tinyMCE.init({
theme : "advanced",
mode : "textareas",
convert_urls : false
});
</script>

* mode : "textareas" Tất cả các textarea sẽ biến thành tinyMCE editor

iBrowser



  • Cài đặt


+ Download the ibrowser plugin from http://j-cons.com/downloads/

+ Copy into folder /tiny_mce/plugins/

  • Cấu hình


+ Cấu hình file config.inc.php trong folder config  dòng 96 :

$cfg['ilibs'] = array (
array (
'value' => '/bitcms/app/webroot/img/uploads/,
'
text'        => 'Site Pictures',
),

...
);

* 'value' => '/bitcms/app/webroot/img/uploads/ Đường dẫn tới folder chứa ảnh.


+  Copy file tinyMCE.editor_plugin.js từ folder interface trong folder ibrowser tới folder chính ibrowser và đổi tên thành editor_plugin.js

+ Khai báo  plugin ibrowser và include ibrowser button.

<script type="text/javascript">
tinyMCE.init({
plugins : "ibrowser",
theme : "advanced",
theme_advanced_buttons3_add : "ibrowser",
mode : "textareas",
convert_urls : false
});
</script>


* Error: ib is undefined

khai báo biến ib trong file editor_plugin.js :
var ib = null;

* Thay đổi trang index trong ibrowser thành trang  Insert .

Sửa file ibrowser.php thêm code sau dưới dòng 129 (  btnStage(); )
/*
imDiv that contain adv content
call changeClass(0,'imDiv','hideit'); to hide  adv content
*/
changeClass(0,'imDiv','hideit');

/*
inDiv that contain insert form
call changeClass(0,'inDiv','showit'); to showit
*/
changeClass(0,'inDiv','showit');

PHP’s world - những khái niệm đầu tiên (tiếp)

Trong phần I, chúng ta có đi qua tổng quan khái niệm về ngôn ngữ PHP & môi trường thực thi. Phần này sẽ nói thêm về các thuật ngữ dùng trong lập trình nhiều hơn.

serverside-code: mã chương trình được compilie & dịch chạy ở trên phía server. PHP chính là một trong số ngôn ngữ viết chạy ở phía server.

clientside-code: thường viết bằng javascript/vbscript, tập trung xử lý các thao tác ở trên trình duyệt mà không cần gửi request tới server.

Chủ Nhật, 12 tháng 10, 2008

Giới thiệu các webserver ít được biết tới

Ngoài Apache và IIS đã qá nổi tiếng và chiếm thị phần lớn trên internet hiện nay xuất hiện nhiều các webserver , mà thời gian gần đây bắt đầu được chú ý . Chúng ta sẽ điểm mặt qua từng loại .

1. lighttpd

Lighttpd là webserver được nhắc đến nhiều nhất trong giới công nghệ thời gian gần đây . Được khoảng 3 triệu website trên thế giới sử dụng , có tốc độ sử lí dữ liệu tĩnh cực nhanh (nhanh hơn nhiều Apache) . Hỗ trợ tốt cho CGI đặc biết nếu chạy FastCGI + PHP + Xcache thì tốc độ sẽ tăng lên đáng kể cho php . Xcache là công nghệ opcode cache của lighttpd . Ngoài ra lighttpd là webserver sử lý streaming , hoặc giả streamming thuộc hàng khủng (do xử lý static content nhanh).

Youtube cũng sử dụng lighttpd để truyền video content .

Vậy Lighttpd có các ưu điểm

  • Sử lý static content nhanh

  • Sử dụng FastCGI + PHP + Xcache cho tốc độ thực thi rất nhanh

  • Sử lý streaming tốt , là sự lựa chọn thay thế các media server


2.Nginx

3.Cherokee

4.Yaws

5.Google Frontend

6.Mongrel

7.Zope

8.Cherrypy

Mysql chạy chậm hơn trên CPU bốn nhân

Công ty mới mua con server 2 CPU - 4 nhân , thay thế con DB server (mysql)  1 CUP - 2 nhân hiện tại

Việc MySQL chạy chậm đi trên CPU 4 nhân mình đã nghe nói từ lâu . Nhưng đến giờ mới được thử nghiệm .
Xem thêm
Mặt khác trong lúc thử nghiệm , lỗi TLB vẫn dính với Phenom mặc dù đã có thông tin là đã được fix .
Theo thông tin trên trang anandtech thì Mysql 5.1 sẽ được fix , đành chờ vậy . Dù sao cũng chưa cần thay server , để con server mới (2 CPU - 4 nhân) làm proxy server vậy .

Mọi người chú ý không nên mua server quá tốt cho LAMP , LAMP mạnh là nhờ sử dụng phần cứng có giá rẻ .

Có thể nghĩ đến chuyện mua máy từ quán net công cộng về lám data center chạy LAMP . Nếu thừa tiền thì đầu tư vào hạ tằng mạng ,đặc biệt là load balancer (phần cứng tốt hơn phần mềm).

Sử dụng Mysql slow log

Slow log là 1 loại log khá hữu dụng . Nó sẽ lưu hết các truy vấn chạy chậm quá thời gian định trước .

Trong giai đoạn phát triển dự án trên stack công nghệ LAMP, mysql slow log tuy không thay thế vai trò của profiler hay monitor tuy nhiên trong giai đoạn chạy thử nghiệm rất nên cấu hình sử dụng mysql slow log , nhằm tìm kiếm các câu truy vấn làm chậm thế thống , từ đó có giải pháp khắc phục .

Các bước tiếng hành :

1.Mở file my.cnf
2.Thêm đoạn

log-slow-queries = /var/log/mysql-slow.log
long_query_time = xxx

Mysql bắt đầu log nếu truy vấn chạy quá xxx giây .

nhớ restart lại Mysql . Log file sẽ được đặt tại đường dẫn /var/log/mysql-slow.log

PHP's world - những khái niệm đầu tiên

Sử dụng thành thục PHP hay một ngôn ngữ lập trình nào đó, bước đầu tiên bạn nên ghi nhớ và phân biệt được các thuật ngữ/khái niệm căn bản nhất thường được sử dụng liên quan tới bản thân ngôn ngữ hay nền tảng thực thi của ngôn ngữ đó. PHP cũng có một danh sách các thuật ngữ (đơn giản nhưng dễ bỏ qua như):

PHP: PHP Hypertext Preprocessor hoặc Personal Home Page. Cả hai khái niệm này đều đúng và đều liên tưởng tới một script-programming language thân thiện & mạnh mẽ. đọc thêm

LAMP: là sự kết hợp của Linux, Apache, MySQL, PHP. Đây được cho là nền tảng phổ biến & hiệu quả nhất để thực thi các chương trình viết bằng PHP. Với hệ điêu hành nhân Linux (Ubuntu, redhad, CentOS...), webserver Apache, cơ sở dữ liệu MySQL và PHP (tất nhiên). :D tìm hiểu thêm

PhpMyAdmin: là một chương trình mã nguồn mở dùng để quản lý & thực thi cơ sở dữ liệu MySQL, chạy trên nền web (trình duyệt), gọn nhẹ, nhanh. tìm hiểu thêm

MySQL: cơ sở dữ liệu quan hệ mã nguồn mở. Cực kỳ mạnh mẽ và linh hoạt, được ứng dụng trong hầu hết các dự án viết bằng PHP và hiện diện ở hầu hết các ngành kinh tế như một tủ chứa dữ liệu an toàn. tìm hiểu thêm.

IDE: Intergrated Development Environment, môi trường phát triển. Hầu hết chúng ta đều sử dụng ít nhất một IDE nào đó để viết mã chương trình. Các IDE nổi tiếng gồm có Eclipse, Visual studio, Netbeans, Zend studio,

PDT & Eclipse: PDT là một plugin hỗ trợ viết mã PHP được tích hợp thẳng vào eclipse. Miễn phí và mã mở, đây được cho là lựa chọn phổ biến và hợp lý nhất cho các lập trình viên PHP (trừ nhân viên của Zend :P)

(còn tiếp)

Thứ Năm, 9 tháng 10, 2008

Adobe Flash Player 10, tên mã là Astro, giới thiệu những tính năng ấn tượng và tăng cường hiệu quả hình ảnh mới, cho phép người thiết kế và nhà lập trình xây dựng những ứng dụng nhúng mạnh mẽ nhất cho môi trường web. Những tính năng mới này cũng tăng sức mạnh truyền thông cho Flash Player, nâng sự sáng tạo và tương tác lên đẳng cấp mới.
Phiên bản thử nghiệm này là cơ hội cho những nhà phát triển và người sử dụng thử nghiệm các tính năng mới và phản hồi những thông tin về cho Adobe. Ngay khi bạn cài đặt Flash Player 10 beta, bạn có thể xem đoạn demo tương tác. Bạn cũng có thể kiểm nghiệm phiên bản Flash Player mới này bằng cách ghé thăm tất cả những website yêu thích của mình, để đảm bảo rằng chúng vẫn làm việc tốt như phiên bản hiện tại của mình.

Những tính năng mới quan trọng

Hiệu ứng 3 chiều (3D Effect) - Dễ dàng chuyển đổi và trình diễn bất kỳ đối tượng qua không gian 3 chiều trong khi vẫn duy trì toàn bộ tính tương tác. Những hiệu ứng 3D tự nhiên, nhẹ nhàng và nhanh làm cho các hiệu ứng chuyển động trước đây chỉ dành cho những người chuyên nghiệp giờ trở nên dễ dàng hơn với mọi người. Những hiệu ứng phức tạp đã trở nên đơn giản với những hàm API có sẵn sẽ mở rộng những gì bạn đã từng biết đến.

Tùy chọn cho Bộ lọc (Filter) và Hiệu ứng (Effect) - tạo và chia sẻ những định nghĩa của riêng bạn như các bộ lọc, các chế độ phối màu, các mẫu màu tô qua Adobe Pixel Bender, kỹ thuật thường dùng trong bộ lọc Adobe After Effect CS3. Hiệu ứng chuyển màu trong Flash Player chỉ tốn khoảng 1KB và có thể được lập trình và hiển thị thời gian thực trong lúc thi hành (runtime).

Dàn trang văn bản với Layout Text - Cách trình bày mới cho đối tượng văn bản (TextField), như trình bày từ phải qua trái, theo chiều dọc, đặc biệt là hỗ trợ các đoạn nối trong các từ ghép. Ngoài ra có thể hỗ trợ tạo bảng, chia cột, chèn hình ảnh xem vào giữa văn bản.

Tăng cường hàm vẽ API - Các hàm vẽ thời gian thực trở nên dễ dàng và mạnh mẽ hơn với các thuộc tính, các hàm 3D và cách vẽ những hình học phức tạp không cần phải lập trình nối từng đoạn thẳng.

Tăng cường hiệu ứng hình ảnh - Các ứng dụng và video sẽ chạy êm ái và nhanh hơn bằng cách sử dụng bộ tăng tốc đồ họa trong phần cứng. Khi đó những việc hiển thị hình ảnh sẽ đỡ chiếm nhiều bộ nhớ CPU hơn, giải phóng chúng cho những việc khác.

Để cài đặt phiên bản thử nghiệm Flash Player 10, bạn có thể download tại đây http://labs.adobe.com/technologies/flashplayer10/. Flash Player 10 beta tương thích tốt với Windows Vista, Windows XP, Windows Server 2003, Windows 2000, Max OS X và Linux. Sau khi cài xong bạn có thể kiểm tra các tính năng mới trong đoạn demo này http://labs.adobe.com/technologies/flashplayer10/demos/.