Jul
13

Cách viết plugin cho CakePHP

Author admin    Category Chia sẻ, Tutorial     Tags ,

Trong một ứng dụng viết bằng CakePHP bạn có thể lồng vào đó một ứng dụng khác nhỏ hơn nhưng vẫn có đủ các thành phần như controller, view, model, component, helper…. gọi là plugin. Plugin đặc biệt hữu ích khi bạn muốn thêm chức năng vào một ứng dụng mà không muốn can thiệp vào ứng dụng đã có. Bài này tôi sẽ hướng dẫn các bạn tự viết một plugin hiển thị một calendar dùng jquery

Giả sử bạn đã có một ứng dụng viết trên nền CakePHP. Bây giờ bạn tạo một thư mục có tên là cake_calender trong app/plugins

Trong thư mục app/plugins/cake_calendar này bạn tạo tiếp các thư mục:

  • controllers
  • views
  • webroot

Lưu ý: nếu bạn dùng bản cakephp 1.2 thì thư mục webroot bạn đổi tên thành vendors, khi đó plugin mới nhận được link tới js và css

Tiếp theo là các thư mục con:

  • views/layouts
  • views/cake_calendar
  • webroot/js
  • webroot/css

Bạn thấy là cấu trúc thư mục y hệt như ứng dụng CakePHP ban đầu của bạn

Tiếp theo bạn tạo file cake_calendar_app_controller.php trong app/plugins/cake_calendar có nội dung:

<?php
class CakeCalendarAppController extends AppController {
 
}
?>

Tạo tiếp file cake_calendar_controller.php trong app/plugins/cake_calendar/controllers có nội dung:

<?php
class CakeCalendarController extends CakeCalendarAppController {
 
	var $name = 'CakeCalendar';
	var $uses = array();
	var $helpers = array('Html','Javascript');
 
	function index() {
 
	}
}
?>

Hoàn thành xong bước tạo controller, tiếp theo ta tạo view cho action index

Tạo file index.ctp trong app/plugins/cake_calendar/views/cake_calendar có nội dung:

<script type='text/javascript'>
 
	$(document).ready(function() {
 
		var date = new Date();
		var d = date.getDate();
		var m = date.getMonth();
		var y = date.getFullYear();
 
		$('#calendar').fullCalendar({
			theme: true,
			header: {
				left: 'prev,next today',
				center: 'title',
				right: 'month,agendaWeek,agendaDay'
			},
			editable: true,
			events: [
				{
					title: 'All Day Event',
					start: new Date(y, m, 1)
				},
				{
					title: 'Long Event',
					start: new Date(y, m, d-5),
					end: new Date(y, m, d-2)
				},
				{
					id: 999,
					title: 'Repeating Event',
					start: new Date(y, m, d-3, 16, 0),
					allDay: false
				},
				{
					id: 999,
					title: 'Repeating Event',
					start: new Date(y, m, d+4, 16, 0),
					allDay: false
				},
				{
					title: 'Meeting',
					start: new Date(y, m, d, 10, 30),
					allDay: false
				},
				{
					title: 'Lunch',
					start: new Date(y, m, d, 12, 0),
					end: new Date(y, m, d, 14, 0),
					allDay: false
				},
				{
					title: 'Birthday Party',
					start: new Date(y, m, d+1, 19, 0),
					end: new Date(y, m, d+1, 22, 30),
					allDay: false
				},
				{
					title: 'Click for Google',
					start: new Date(y, m, 28),
					end: new Date(y, m, 29),
					url: 'http://google.com/'
				}
			]
		});
 
	});
 
</script>
<style type='text/css'>
 
	body {
		margin-top: 40px;
		text-align: center;
		font-size: 13px;
		font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif;
		}
 
	#calendar {
		width: 900px;
		margin: 0 auto;
		}
 
</style>
 
<div id='calendar'></div>

Plugin này chưa có layout mặc định, nó sẽ dùng layout của ứng dụng có sẵn, ta tạo file default.ctp trong app/plugins/cake_calendar/views/layouts có nội dung như sau:

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>Cake Calendar Plugin</title>
		<?php
		echo $html->css(array(
			'/cake_calendar/css/redmond/theme',
			'/cake_calendar/css/fullcalendar'
		));
		echo $javascript->link(array(
			'/cake_calendar/js/jquery/jquery',
			'/cake_calendar/js/jquery/jquery-ui-custom',
			'/cake_calendar/js/fullcalendar.min'
		));
		?>
	</head>
	<body>
		<?php echo $content_for_layout;?>
	</body>
</html>

Cuối cùng, bạn chép các files css và js tôi đính kèm vào app/plugins/cake_calendar/webroot/cssapp/plugins/cake_calendar/webroot/js

Bây giờ mở trình duyệt ra và gõ thử: http://localhost/test/cakephp1.3.2/cake_calendar

Nếu xuất hiện giao diện như sau nghĩa là bạn đã viết thành công plugins cake_calendar

Cake calendar plugin

Hãy nhìn lại tổng quan thư mục cake_calendar (cũng là tên của plugin), bạn thấy rằng cake_calendar như một ứng dụng CakePHP hoàn chỉnh (có đầy đủ cấu trúc thư mục như CakePHP ban đầu). Bây giờ bạn chép thư mục cake_calendar này bỏ sang một ứng dụng CakePHP khác và truy cập tới thì kết quả cũng tương tự như trên. Điều này có nghĩa là plugin hoạt động gần như độc lập và có thể chạy trên nhiều ứng dụng khác nhau viết trên nền CakePHP. Chắc hẳn bạn đã thấy rõ công dụng của plugin sau bài viết này! Chúc các bạn ứng dụng thành công!

Tôi có đính kèm code hoàn chỉnh của plugin cake_calendar, bạn thử download về và giải nén cho vào app/plugins, chạy trên trình duyệt xem có kết quả không nhé, sau đó bạn tự mình làm lại xem sao.

Tải mã nguồn cake_calendar

7 Comments to “Cách viết plugin cho CakePHP”

  • chido 26/08/2010 at 11:29 am

    sao minh lam theo huong dan o tren ma khong thay hien thi j het vay?

  • chido 26/08/2010 at 11:30 am

    hay la do duong dan http://localhost/cake/cake_calendar
    minh de duong dan nhu the co dung khong?
    ban nao chi minh voi!

  • admin 27/08/2010 at 12:36 am

    Có báo lỗi gì cụ thể không bạn? Đường dẫn thì tùy vào nơi đặt code của bạn thôi.

  • phuong12g 17/04/2011 at 3:53 pm

    xin chào admin. anh có thể nói thêm về vấn đề Views và Controller: ví dụ như trong Controller có file: cake_calendar_controller thì trong Views phải có thư mục:cake_calendar ha anh, mình có thể đổi thư mục cake_calendar thành cakecalendar duoc không anh, em cảm ơn anh nhiều.

  • admin 20/04/2011 at 4:35 pm

    Nếu muốn đổi tên thư mục hoặc file của view, trong controller, bạn phải dùng thêm hàm

    $this->render(path_to_view);

    để chỉ đúng file mà controller sẽ lấy để render

  • hoaipt 03/12/2011 at 10:36 am

    cho minh xem cau truc thu muc cua ban
    sao lai la : http://localhost/test/cakephp1.3.2/cake_calendar (sao lai co test)
    minh dung cakephp 2 .0.4 thi phai sua doi nhu nao nhi

    • admin 05/01/2012 at 11:49 pm

      test là thư mục trong www, bạn có thể để ở nơi khác tùy bạn, đâu nhất thiết phải có test

Post comment

Follow us on Twitter! Follow us on Twitter!
Diễn đàn CakePHP cho người Việt Nam

Bài viết mới

Thảo luận mới

TAG

Calendar

July 2010
M T W T F S S
« Jun   Aug »
 1234
567891011
12131415161718
19202122232425
262728293031  

Lưu trữ

Blogroll

Thống kê

6 khách