Thứ Sáu, 26 tháng 2, 2010

Đa ngôn ngữ trong CakePHP

Đa ngôn ngữ với dữ liệu tĩnh trên trang
- Tạo file định nghĩa đa ngôn ngữ
Bình thường, khi làm đa ngôn ngữ với php. Bạn cần tạo ra một file để định nghĩa tất cả các cụm từ cần dịch. Việc tìm ra từng cụm từ, gán cho nó một hằng và định nghĩa hằng đó sẽ mất rất nhiều thời gian và nhàm chán. CakePHP hỗ trợ bạn tạo file định nghĩa đó một cách dễ dàng nếu bạn viết theo đúng qui cách.
Ví dụ site của bạn cần 2 ngôn ngữ là Tiếng Việt(vie) và tiếng Anh (eng). Ta thực hiện các bước sau:
Đầu tiên, thiết lập các thư mục chứa file định nghĩa. Tạo lập các thư mục mới trong thư mục app/locale:
cmd
cd your_app/app/locale
mkdir vie
mkdir vie/LC_MESSAGES
mkdir eng
mkdir eng/LC_MESSAGES
Sau khi file định nghĩa được gen ra sẽ được đưa vào các thư mục LC_MESSAGES.
Qui cách để cakePHP tìm được từ, cụm từ cần định nghĩa là với thêm cặp ngoặc __('') hoặc __('',true). Tham số thứ 2 cho biết từ đó cần trả về giá trị hay hiển thị qua hàm echo. Ví dụ:

<h1><?php __('Xin chào');?></h1>
<?php __('Đây là một ví dụ về đa ngôn ngữ'); ?><br/>
<?php $text=__('Đây là một ví dụ về đa ngôn ngữ',true); echo $text?><br/>


Vào chương trình console của cakePHP và bắt đầu thực hiện việc gen file định nghĩa của bạn:
cd path_your_app/cake/console
cakephp i18n
- Chọn e để gen file, chọn i để tạo bảng i18n trong database hiện thời... chọn e.
- Cake hỏi bạn đường dẫn tuyệt đối tới thư mục app của ứng dụng của bạn: path_to_app/app (VD:c:\xampp\htdocs\your_site\app - windows)
- Cake hỏi bạn đường dẫn tuyệt đối tới thư ban muốn gen file, thường là thư mục locale.
path_to_app/app/locale
- Nếu bạn muốn gen các định nghĩa ra một file chọn y hoặc ngược lại.
- Sửa tên file: Chọn y. nếu không file sẽ có tên mặc định là default.pot. trong ví dụ này, tôi để tên mặc định.
- Sau khi thực hiện xong, một file có trong thư mục bạn muốn gen file sẽ có một file deafult.pot. Thay đổi đuôi .pot->.po. Copy file default.po vào thư mục LC_MESSAGES đã tạo:
- Bây giờ, bạn mở file default.po và dịch. Trong ví dụ của tôi thì file các deafult.po sẽ như sau :

// locale/vie/LC_MESSAGES/default.po
msgid "Xin chào"
msgstr "Xin chào"

msgid "Đây là một ví dụ về đa ngôn ngữ"
msgstr "Đây là một ví dụ về đa ngôn ngữ"

// locale/eng/LC_MESSAGES/default.po
msgid "Xin chào"
msgstr "Hello"

msgid "Đây là một ví dụ về đa ngôn ngữ"
msgstr "This is an multi language example "


- Thay đổi ngôn ngữ: CakePHP xác định ngôn ngữ hiện thời của trang bằng một Session(Config.language). Cho nên việc của bạn khi thay đổi ngôn ngữ là thay đổi giá trị của Session đó. Bạn làm như thế này:
Đầu tiên, tạo file p28n.php trong thư mục component. copy đoạn code:
<?php
class P28nComponent extends Object {
var $components = array('Session', 'Cookie');
function startup() {
if (!$this->Session->check('Config.language')) {
$this->change(($this->Cookie->read('lang') ? $this->Cookie->read('lang') : DEFAULT_LANGUAGE));
}
}
function change($lang = null) {
if (!empty($lang)) {
$this->Session->write('Config.language', $lang);
$this->Cookie->write('lang', $lang, null, '+350 day');
}
}
}
?>

DEFAULT_LANGUAGE là một hằng được định nghĩa trong thư mục app/config/bootstrap.php: define('DEFAULT_LANGUAGE','vie');

- Tạo controller P28n: controller này được gọi đến khi người dùng click link chuyển ngôn ngữ.
<?php
class P28nController extends AppController {
var $name = 'P28n';
var $uses = null;
var $components = array('P28n');
function change($lang = null) {
$this->P28n->change($lang);
$this->redirect($this->referer(null, true));
}
function shuntRequest() {
$this->P28n->change($this->params['lang']);
$args = func_get_args();
$this->redirect("/" . implode("/", $args));
}
}
?>

- trong file app/app_controller.php chúng ta cần gọi tới component P28n
<?php
//app_controller.php
class AppController extends Controller {
var $components = array('P28n');
}
?>

- Cấu hình trong file app/config/routes.php giúp link của chúng ta dễ hiểu hơn với người dùng và đẹp hơn.
//route to switch locale
Router::connect('/lang/*', array('controller' => 'p28n', 'action' => 'change'));

//forgiving routes that allow users to change the lang of any page
Router::connect('/eng/*', array(
'controller' => "p28n",
'action' => "shuntRequest",
'lang' => 'eng'
));

Router::connect('/vie/*', array(
'controller' => "p28n",
'action' => "shuntRequest",
'lang' => 'vie'
));

Cuối cùng, tạo link để thay đổi ngôn ngữ:
<!-- Ví dụ các từ cần định nghĩa -->
<h1><?php __('Xin chào');?></h1>
<?php __('Đây là một ví dụ về đa ngôn ngữ'); ?><br/>
<?php $text=__('Đây là một ví dụ về đa ngôn ngữ',true); echo $text?><br/>
<!-- Thay đổi ngôn ngữ và ở trang hiện tại //-->
<?php echo $html->link($html->image('vie.gif'), '/lang/vie', null, null, false); ?>
<?php echo $html->link($html->image('eng.gif'), '/lang/eng', null, null, false); ?>
<!--  Thay đổi ngôn ngữ và chuyển tới một trang mới nào đó//-->
<?php echo $html->link($html->image('vie.gif'), '/vie/news', null, null, false); ?>
<?php echo $html->link($html->image('eng.gif'), '/eng/news', null, null, false); ?>

Xong, bạn đã hoàn thành việc đa ngôn ngữ với dữ liệu tĩnh trên trang của bạn. Với đa ngôn ngữ dữ liệu động, bạn có thể tham khảo chi tiết tại trang:
http://book.cakephp.org/view/92/Translate

Thứ Năm, 25 tháng 2, 2010

Cách rewrite url trong cake php

Trong cakephp mặc định sãn url sẽ là: .../controller/action

vd: http://vnland.vn/frontpages/preview/Ban-chung-cu-cao-cap

Rõ ràng url trên ta không thấy được nhiều thông tin,nhưng với url

http://vnland.vn/bat-dong-san/can-ban/chi-tiet/Ban-chung-cu-cao-cap

Cùng một nội dung hiển thị như nhau nhưng rõ ràng url thứ 2 mang nhiều thông tin và nhìn đẹp hơn url đầu.Hơn thế nữa việc rewrite lại url còn giúp cho các bộ máy tìm kiếm dễ dàng tìm ra trang web của bạn.

Ok,có thể thấy việc rewrite lại url mang lại khá nhiều điều,và chỉ cần một số thao tác bạn có thể rewrite lại url như mong muốn,hãy làm theo các bước sau:

bước1:mở file routes.php trong thư mục app/config/routes.php.

bước 2:chèn đoạn mã sau vào:

Router::connect('/bat-dong-san/:gi-cung-duoc-1/:gi-cung-duoc-2/:id', array('controller' => 'frontpages','action'=>'preview'),
array( 'pass' => array(
'id'
)
)
);

Nhìn vào dòng code trên các bạn có thể thấy .../frontpages/preview được thay thế bằng .../bat-dong-san/:gi-cung-duoc-1/:gi-cung-duoc-2/

Còn cái ":id" và array( 'pass' => array('id') ) giúp bạn truyền tham số từ url xuống controller(nó là cái $id hay sử dụng trong các function edit($id){})

còn ở 2 cái ":gi-cung-duoc-1" và ...":gi-cung-duoc-n" bạn có thể thay bằng bất cứ nội dung gì để url của bạn nhìn cho đẹp và đủ thông tin,lưu ý là số lượng ":gi-cung-duoc" bao nhiêu là tùy bạn nhưng cần đảm bảo số lượng phải đủ trên url mà bạn gọi ở vd trên mình dùng là 2:/:gi-cung-duoc-1/:gi-cung-duoc-2/ trên url là /can-ban/chi-tiet/.

Ok,vậy là các bạn đã có một url như mong muốn.^-^.

Thứ Sáu, 5 tháng 2, 2010

Giới thiệu các cú pháp thay thế của PHP

Giới thiệu các cú pháp thay thế (Alternate-Syntax) sử dụng trong php


Các cú pháp này nhằm đơn giản hoá, rút gọn các cú pháp chuẩn của php . Cũng có thể chúng được tạo ra để nhìn cho giống mộ vài ngôn ngữ động khác như python , perl , ruby . Mà cũng có thể làm cho php có vẻ gì đó mới mẻ không biết chừng :D .


Các Alternate-Syntax thường sử dụng dấu `:` (ternary)


1. if - else





<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>


-------------------------------------------




<?php
if ($a == 5):
echo "a equals 5";
echo "...";
elseif ($a == 6):
echo "a equals 6";
echo "!!!";
else:
echo "a is neither 5 nor 6";
endif;
?>





----------------


<?php


print $foo = ($hour < 12) ? "Good morning!" : "Good afternoon!";


?>


2.Switch - case


<?php


switch($var):
case 1:
//statements


break;


case 2:
//statements
break;
case 3:
//statements
break;
endswitch;

?>



3.for ( bao gồm cả foreach)


<?php


for(exp):
//statements;
endfor;


?>



Nhìn chung nếu php mix với mã HTML thì dùng Alternate-Syntax "khá sướng" . Vì nó dễ phân biết ra các block tạo ra bởi các cấu trúc khác nhau như if else , for , while hơn rất nhiều so với bracket .


<ul>


<?php foreach($todo as $item): ?>

<li><?=$item?></li>

<?php endforeach; ?>

</ul>


Kết luận :


PHP-Alternate-Syntax thích hợp cho làm view , template file


PHP-Alternate-Syntax không nên dùng trong các file thuần php ( vì ko phát huy hiệu quả , và không thân thiện với IDE)


Một số các framework hay các CMS ( ví dụ cái WordPress này chẳng hạn ) bắt đầu dùng Alternate-Syntax nhiều .