Chủ Nhật, 28 tháng 8, 2011

JoomFish and VirtueMart

Sử dụng JoomFish và VirtueMart để làm website bán hàng đa ngôn ngữ :

Ở đây mình dùng Joomla 1.5.22 – JoomFish 2.1.7 – VirtueMart 1.1.9

B1 : Cài JoomFish

B2 : Cài VirtueMart

B3 : Cài đặt gói ngôn ngữ bạn muốn sử dụng (ở đây mình cài gói ngôn ngữ là tiếng việt)

B4 : Sau khi đã cài đặt gói ngôn ngữ, bạn vào joomfish và active cho nó :

Components >>> Joom!Fish >>> Content Languages

joomfish-active language

B5 : Vào phpMyAdmin , chọn database bạn đang dùng, gõ lệnh sau :

ALTER TABLE `jos_vm_product_attribute_sku` ADD `attribute_sku_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;

joomfish-active language

B6 : Download VM_Ce.zip, giải nén, copy paste vào thư mục :

your_root_folder/administrator/components/com_joomfish/contentelements

B7 : Download file shop_browse_queries.zip giải nén , copy rồi paste đè lên file cũ :

your_root_folder/administrator/components/com_virtuemart/html

Vậy là xong, bây giờ vào joom!Fish , chọn content element rồi dịch thôi.

Components >>> Joom!Fish >>> Translation

Joomfish-translate

Thứ Bảy, 6 tháng 8, 2011

Sử dụng layout trong CakePHP

Khi sử dụng Framework để lập trình , có rất nhiều vấn đề mà người lập trình viên cần phải quan tâm . Trong đó có phần xử lý dao diện là một phần không thể thiếu . Trong bài viết này , mình sẽ hướng dẫn các bạn làm sao sử dụng layout trong CakePHP Khi ta viết một ứng dụng cho CakePHP . mặc định CakePHP đã hổ trợ cho chúng ta dao diện sẵn . Nhưng đôi khi tùy theo sở thích, nhu cầu , xu hướng … nên bắt buộc người thiết kế cũng như người lập trình cần có những giao diện (layout) cho riêng mình. Bài viết sẽ hướng dẫn cách chúng ta tạo 1 layout cho riêng mình và cách áp dụng 1 Helper CakePHP vào ứng dụng của mình. Khi phân tích 1 trang web , nhìn chung ta thấy gồm các phần chính như sau : null


Để vận dụng được sự hổ trợ mạnh mẽ chắc năng load layout của FrameWork CakePHP , ta phân tích các thành phần cố định và thành phần động : null


Như vậy ta để tránh việc xử lý các thành phần cố định ở controller ta chỉ cần viết 1 class Hepler để hiển thị nó . Còn thành phần động sẽ được xử lý thông qua Controllers. Cái file cần chuẩn bị trong Tutorial Layout CakePHP như sau :


 app/controllers/templates/ : -templates_controller.php (Controller chính để load layout)


 app/views/templates/ :


- index.ctp


- view.ctp


app/views/helpers/ :


- common.php (Tạo các thành phần cố định : menu , header,footer)


 app/views/layouts/ :


- template.ctp (File chứa nội dung layout)


 app/webroot/css/ :


- style.css (file CSS của layout)



Tạo file common.php (app/views/helpers/)


[php]


<?php
class CommonHelper extends HtmlHelper {


// Hàm tạo menu
function create_menu(){
$menu  = "<ul>";
$menu .= "<li>".$this->link("CodeIgniter",array("controller"=>"templates","action"=>"view",1))."</li>";
$menu .= "<li>".$this->link("CakePHP",array("controller"=>"templates","action"=>"view",2))."</li>";
$menu .= "<li>".$this->link("Zend",array("controller"=>"templates","action"=>"view",3))."</li>";
$menu .= "</ul>";
return $menu;
}

[/php]

//Hàm tạo các thành phần cho header và footer
function general(){
$data = array(
"header" => "QHOnline.info",
"footer" => "Copyright 2011 © | QHTeam",
);
return $data;
}
?>


Tạo file templates_controller.php (app/controllers/templates/) :


<?php
class TemplatesController extends AppController {
var $layout = "template"; // load file chứa nội dung layout : views/layouts/template.ctp
var $helpers = array("Html","Common"); // Thành phần Helper Common được gọi để tạo menu,header,footer trong view


function  index(){
$this->set('title_for_layout', 'Templates By QHOTeam');
$this->set("content","QHO Team");
}

function view($id){
switch($id){
case 1 :{
$this->set('title_for_layout', 'CodeIgniter FrameWork');
$this->set("content","CodeIgniter FrameWork");
}
break;
case 2 :{
$this->set('title_for_layout', 'CakePHP FrameWork');
$this->set("content","CakePHP FrameWork");
}
break;
case 3 :{
$this->set('title_for_layout', 'Zend Framework');
$this->set("content","Zend Framework");
}
break;
default :
$this->set("content","Framwork");
break;
}
}

}
?>


Tạo file layout template.ctp (app/views/layouts/template.ctp) : File này chứa nội dung layout bao gồm các thành phần cố định và thành phần động như ban đầu mô tả. Nội dung file này gồm mã HTML và PHP…


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?php echo $title_for_layout;?></title>
<?php echo $this->Html->css("style"); // link oi file style.css (app/webroot/css/style.css)?>
<?php $general = $this->Common->general(); // Lấy các giá trị của thành phần tĩnh : header,footer ?>
</head>
<body>
<div id="top">
<center><h2><?php echo $general['header']; ?></h2></center>
</div>
<div id="main">
<div id="menu">
<?php echo $this->Common->create_menu(); // goi ham tao menu tu common helper?>
</div>
<div id="content">
<h1><?php echo $content; // Thành phần động ?></h1>
</div>
</div>
<div id="footer">
<center><?php echo $general['footer'];?></center>
</div>


</body>
</html>


Tạo file style.css (app/webroot/css/style.css)



Hình mô ta khi file template.ctp sử dụng file helper Common.phpbody {
margin: auto;
width: 1000px;
font-family: Verdana, Geneva, sans-serif;
}
#top {
float: left;
width: 1000px;
height: 100px;
background-color: #F36;
color: #FFF;
}
#main {
float: left;
width: 1000px;
}
#menu {
float: left;
width: 200px;
background-color: #F96;
}
#menu ul {
margin: 0px;
}
#menu a {
color: #FFF;
font-size: 12px;
}
 

#content {
float: left;
width: 800px;
}
#content h1 {
font-size: 18px;
color: #0CF;
padding-left: 50px;
}

#footer {
float: left;
width: 1000px;
height: 50px;
background-color: #96C;
font-size: 12px;
font-weight: bold;
color: #FFF;
}

Hình mô ta khi file template.ctp sử dụng file helper Common.php
null

Như thường lệ , khi tạo 1 fuction cho 1 Controller , thì ta phải tạo file view tương ứng để hiển thị nội dung trong file view đó.Trong ví dụ này ta có Controller Templates với 2 function là index() và view(), cần phải có 2 file view là : index.ctp và view.ctp để hiển thị nội dung tương ứng.

Tuy nhiên chúng ta đang sử dụng layout template.ctp (app/views/layouts/template.ctp) ,nên chỉ cần tạo 2 file index.ctp và view.ctp ,nội dung của 2 file này các bạn bỏ trống. Ví dụ function index() được gọi , nó sẽ load file index.ctp và tự động nạp file layout vào (app/views/layouts/templates.ctp).

Hình mô tả khi file view load file template.ctp

null

Chạy thử ứng dụng :
http://localhost/cakephp/templates
null
null
Khi click vào link của Menu : http://localhost/cakephp/templates/view/1
null

Thứ Tư, 3 tháng 8, 2011

CouchDB cơ bản cho lập trình viên PHP

Là lập trình viên PHP thì chắc hẳn mình đã quá quen thuộc với việc tương tác cơ sở dữ liệu (CSDL), dám cá là phần nhiều trong số các bạn đọc bài này dùng MySQL cho công việc/học tập hàng ngày :)

Thực tế chứng minh MySQL là lựa chọn tốt cho dữ liệu có cấu trúc[1] và nhiều ràng buộc[2]. Mình bắt đầu bằng thiết kế các schema, tạo các bảng, định nghĩa kiểu dữ liệu cho các cột và tiếp theo là viết code cho các thao tác CRUD[3]. Vấn đề là trong dự án sẽ có nhiều trường hợp dữ liệu không đoán trước được kiểu, định dạng, độ lớn, hay các đặc tính cần có. Nếu mình thiết kế schema để đón đầu, CSDL sẽ theo thời gian chứa nhiều field bị null, hoặc phát sinh các ràng buộc phức tạp, câu lệnh SQL cũng vì thế mà rắc rối lên nhiều.

Với dự án như này, hãy thử một hướng đi khác, ko liên quan đến CSDL quan hệ. Vậy cái mình cần là 1 CSDL dạng document-based, schema free, ad-hoc.

Question: Với một Web developer thì tại sao lại phải biết SQL để lập trình web (?).

CouchDB là gì?

Theo Apache CouchDB website, CouchDB là

  • document database server, truy vấn thông qua RESTful JSON API[3].

  • ad-hoc, flat, và schema-free[4].

  • distributed.

  • sử dụng Javascript để query dữ liệu.


Cấu tạo một CouchDB như sau

- database

- document

+ _id

+ _rev

+ {"field" : "value"}

+ {"field" : "value"}

...

Ví dụ

- database: contacts



{

_id: 528c3917ed78a2ce16ddc130f700063f

_rev: 1-901de5ccbf8ff7faf4ad09475939f160

fullname: "Black Jack"

occupation: "IT"

skills: ["web", "desktop", "ajax", "php", "javascript","HTML"]

}



Trong document trên, _id là UUID[5], _rev là phiên bản tài liệu, 3 trường chứa giá trị là fullname, occupation, skills thể hiện dạng JSON.

Việc truy vấn dữ liệu được thực hiện thông qua các phương thức RESTful JSON API. Trên thực tế, nếu mình biết về Javascript, Ajax, JSON thì mình không cần phải biết về SQL để làm website(!)

Cài đặt CouchDB

Trên Ubuntu thì
sudo apt-get install couchDB
sudo /etc/init.d/couchdb start

Vậy là xong thôi. Service couchDB được chạy mặc định ở cổng 5984. Từ trình duyệt, gõ http://127.0.0.1:5984 mình sẽ thấy đại loại như
{"couchdb":"Welcome","version":"1.0.2"}

Tiếp theo, chạy trình quản lý Futon được tích hợp vào CouchDB, nó giống như PhpMyAdmin

http://localhost:5984/_utils/


Bước tiếp theo sẽ là thực sự xài CouchDB

Sử dụng CouchDB API

Tại thời điểm này, mình sử dụng cURL[6] để gửi các phương thức GET, PUT, POST, DELETE thông qua HTTP tới CouchDB

Câu lệnh đầu tiên

curl http://127.0.0.1:5984/

Kết quả:
{"couchdb":"Welcome","version":"1.0.2"}

Tạo CSDL mới
curl -X PUT http://127.0.0.1:5984/contacts

Khi bạn nhận được thông tin {"ok":true}, CSDL contacts đã được tạo

Lấy về tất cả cơ sở dữ liệu

curl -X GET http://127.0.0.1:5984/_all_dbs

Tạo 1 record mới trong contacts
curl -X PUT http://127.0.0.1:5984/contacts/*id* -d '{ *json_data* }'

ví dụ:
curl -X PUT http://127.0.0.1:5984/contacts/contact1 -d '{ "fullname":"Doraemon",
"type":"cat" }'

Lấy thông tin về record vừa tạo
curl -X GET http://127.0.0.1:5984/contacts/contact1

Cái đáng phải quan tâm là, với việc gửi đi các phương thức khác nhau, CouchDB sẽ thực thi các hành động khác nhau. Trong ví dụ trên, GET là lấy về, PUT là tạo mới. Bên cạnh đó, CouchDB không phải là object oriented database[7] nên tránh dùng persistent data layer[8].

---

Đón xem phần 2: hoàn thiện phần 1 và giới thiệu cách kết hợp PHP & CouchDB