Tải bản đầy đủ (.pdf) (42 trang)

Lập trình joomla 15 theo mô hình mvc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.05 MB, 42 trang )

JoomlaBasic.Com Page 1

I. GIỚI THIỆU CHUNG

1. Mô hình MVC

MVC hay Model-View-Controller (tiếng Anh) là một mẫu kiến trúc phần mềm trong kỹ thuật kỹ
sư phần mềm. Khi sử đúng cách, mẫu MVC giúp cho người phát triển phần mềm cô lập các
nguyên tắc nghiệp vụ và giao diện người dùng một cách rõ ràng hơn. Phần mềm phát triển theo
mẫu MVC tạo nhiều thuận lợi cho việc bảo trì vì các nguyên tắc nghề nghiệp và giao diện ít liên
quan với nhau.

Trong mẫu Model-View-Controller, mô hình (model) tượng trưng cho dữ liệu của chương trình
phần mềm. Tầm nhìn hay khung nhìn (view) bao gồm các thành phần của giao diện người dùng.
Bộ kiểm tra hay bộ điều chỉnh (controller) quản lý sự trao đổi giữa dữ liệu và các nguyên tắc
nghề nghiệp trong các thao tác liên quan đến mô hình.

2. Công cụ trong quá trình thực hành

- Trình soạn thảo Notepad++ bạn có thể download về tại địa chỉ
- Máy chủ ứng dụng Wamp download tại địa chỉ
- Công cụ lập trình PHP & MySQL trong hướng dẫn này chúng ta sẽ sử dụng NetBeans các
phiên bản có hỗ trợ PHP bạn có thể tải về tại địa chỉ
- Tham khảo thêm các hàm và các meo tại trang chủ của tác giả

























JoomlaBasic.Com Page 2




II. CẤU TRÚC CỦA MỘT COMPONENT

Cấu trúc tổng quát của một Component trong Joomla ! CMS sẽ được xây dựng như hình bên
dưới






























Hình 1










JoomlaBasic.Com Page 3











Hình 2

- Hình 1: Là cấu trúc của component quản trị trong Joomla ở thưc mục
yoursite.com/administrator/components

- Hình 2: Là cấu trúc của một component bên ngoài yoursite.com/components

- Điểm khác nhau chính giữa 2 cấu trúc này là điểm vào của component trong quản trị là
admin.hoidap.php trong khi bên ngoài là hoidap.php bạn nên lưu ý kỹ phần này.




























JoomlaBasic.Com Page 4





1. XÂY DỰNG COMPONENT TRONG QUẢN TRỊ


1.1 THÊM MENU COMPONENT VÀO TRÌNH ĐƠN














Để thực hiện điều này bạn vào yourdomain/phpmyadmin thêm các dòng này vào bảng
jos_components như hình bên dưới.

Ý nghĩa của từng trường:

- id : là định danh của từng dòng, mục này bạn bỏ trống.
- name: tên của component
- link: là đường dẫn đến component của chúng ta, quy tắc chung option=<tên thư mục
component>&view=<Các view tương ứng trong thư mục view>
- menuid mục này bạn để trống.
- parent cha hiện tại, dựa vào id.
- admin_menu_link: tương tự như mục link
- admin_menu_alt: tên thay thế theo link
- option: điền tên component của chúng ta.

- ordering để sắp xếp thứ tự trước sau cho sub menu .
- admin_menu_img hình ảnh đại diện menu.
- iscore trường này mặc định, bỏ trống.
- params các tham số, nếu không dùng thì bạn bỏ trống.
- enabled có hiệu dụng không 1 có 0 không.






JoomlaBasic.Com Page 5





Tạo menu chính cho component










JoomlaBasic.Com Page 6





Tạo các submenu chúng ta tạo tương tự nhung chú ý trường parent và ordering.














JoomlaBasic.Com Page 7






Do trình mục này chúng ta xếp ordering là 2 nên nó sẽ sắp sau, các hàng trong component có
ordering là 1.








1.2 XÂY DỰNG CSDL CHO COMPONENT

JoomlaBasic.Com Page 8

Sau khi tạo xong trình đơn, chúng ta bắt tay vào xây dựng CSDL cho component. Ở đây chúng
tôi đã tạo ra 2 bảng CSDL mẫu là bảng jos_hoidap_cauhoi và bảng jos_hoidap_dapan cấu trúc
2 bảng này như sau:





Bảng jos_hoidap_cauhoi



Bảng jos_hoidap_dapan

Ở đây tôi dùng chương trình Navicat for MySQL để tạo CSDL như 2 hình trên, bạn có thể tham
tải về tại


1.3 XÂY DỰNG ĐIỂM VÀO CHO COMPONENT admin.hoidap.php

- Do component của chúng ta sẽ thực hiện nhiều tác vụ như SAVE, APPLY, PUBLISH…vì thế
chúng cần 1 người dẫn đường chỉ chúng biết phải làm gì, ở đâu và làm như thế nào. Thì tập tin

admin.hoidap.php sẽ đảm nhiệm vai trò này.

- Nhiệm vụ chính của tập tin này là cho bạn biết bạn đang ở Controller nào, và nó sẽ lắng nghe
các yêu cầu (task) và thực thi yêu cầu đó ứng với các Controller đó.
JoomlaBasic.Com Page 9






Ý nghĩa của từng dòng lệnh:

- Dòng 3, dùng để cấm người dùng truy cập trực tiếp vào chính của chúng ta, ví dụ khi họ truy
cập vào yourdomain/administrator/components/admin.hoidap.php thì sẽ nhận được câu
thông báo “Restricted access”.
- Dòng 8, dùng để nhận tên của Controller.
- Dòng 16, dùng để thêm controller của chúng ta.
- Dòng 20, khởi tạo lớp hàm để sử dụng chúng.
- Dòng 23, nhận vào các task (tác vụ ) và thực thi chúng.
- Dòng 26, chuyển hướng theo tác vụ.


1.4 XÂY DỰNG CÁC LỚP JTABLE CHO COMPONENT

- Lớp hàm JTable này là một lớp hàm để khai báo cấu trúc các trường trong CSDL chúng ta.
Cách đặt tên cho các tập tin nằm trong lớp hàm này như sau:


JoomlaBasic.Com Page 10


Class JTable<Tên tập tin> extends JTable
{
// Khai báo bên trong đây
}

- Các tập tin này nằm trong folder tables của component chúng ta tại đường dẫn
yourdomain/administrator/components/com_hoidap/tables , chúng sẽ khai báo cho joomla
biết cách dữ liệu được tổ chức ra sao để thực hiện các nâng cập nhật, thêm, sửa , xóa trên dữ liệu
sau này. Chúng ta tạo 2 file cauhoi.php và dapan.php nằm trong thư mục tables này.

Nội dung file cauhoi.php





Nội dung file dapan.php

JoomlaBasic.Com Page 11




Class parent::__construct(<Tên bản trong CSDL>,<Khóa chính>,<Tham số truyền vào là
một đối tượng lớp JDatabase>);

Class JFactory là lớp hàm tạo ra các phương thức để chúng ta xử lý và thao tác.

JFactory::getDate()->toMySQL() : để nhận về ngày theo dạng CSDL chúng ta theo dang 0000-

00-00 00:00:00

JFactory::getUser()->get(‘id’): để nhận về id hiện tại của người đang thao tác trên CSDL.


1.5 XÂY DỰNG MODEL ĐỂ THAO TÁC TRÊN CSDL

Để xây dựng Model thao tác trên CSDL bạn cần truy cập vào component hiện tại tạo mới 2 file
cauhoi.php và dapan.php chúng nằm trong thư mục models trong component của chúng ta.

Nội dung của file cauhoi.php

JoomlaBasic.Com Page 12



- Dòng 4, dùng để import các model từ thư viện của joomla.
- Dòng 5, class HoidapModelCauhoi, quy tắc đặt tên <Tên component bỏ phần tiên tố com_
>Model<Tên của Model>
- Xét các hàm chức năng getTotal() để nhận về tổng số mẫu tin có trong CSDL của bảng câu
hỏi, mục đích chính để chúng ta phân trang trong phần view.html.php trong thư mục views.
- Hàm showCauhoi($limitstart, $limit) dùng để hiện thị mẫu tin ra giống như hình sau:



JoomlaBasic.Com Page 13


Trong đó bạn cần chú ý đến hàm $this->_getList($query, $limitstart, $limit) hàm này trả về
các mẫu tin được giới hạn từ $limitstart đến $limit. Nếu bạn bỏ qua 2 tham số sau cùng thì sẽ trả

về tất cả các mẫu tin.

Hàm editCauhoi() dùng để load mẫu tin theo id của chúng. Cách sử dụng hàm getVar và setVar





JRequest::getVar() trả về giá trị nhận được từ biến.
JRequest::setVar() gán giá trị cho biến. JRequest::setVar(„hiddenmainmenu‟,1) để ẩn trình đơn
ngang của menu trong quản trị.

- Các bước sử dụng lớp hàm của JTable:

Bước 1: Tạo đường dẫn tới thư mục tables



Bước 2: Khởi tạo lớp hàm JTable



Bước 3: Sử dụng hàm trong lớp JTable một số hàm của lớp JTable



JRequest::setVar(<Tên biến>,<Giá trị>)

JTable::getInstance(<Tên tập tin trong thư mục tables>); // Khởi tạo lớp hàm JTable


JTable::addIncludePath(<Đường dẫn tới thư mục tables>);

JRequest::getVar(<Tên biến>,<Giá trị mặc định>,<Phương thức>,<Kiểu biến>)
JoomlaBasic.Com Page 14



Nội dung của file dapan.php

 bind( $from, $ignore=array() ) // Trả về True nếu dữ liệu được gắn vào Table
 load( $oid=null ) // Load 1 dòng với $oid, trả về True nếu thành công.
 store( $updateNulls=false ) // Lưu dữ liệu
 move( $dirn, $where='' ) // Thay đổi thứ tự của tập tin
 getNextOrder ( $where='' )
 delete( $oid=null )
 canDelete( $oid=null, $joins=null )
 checkout( $who, $oid = null )
 checkin( $oid=null )
 hit( $oid=null, $log=false )
 isCheckedOut( $with = 0, $against = null)
 save( $source, $order_filter='', $ignore='' )
 publish( $cid=null, $publish=1, $user_id=0 )
 toXML( $mapKeysToText=false )
 addIncludePath( $path=null )
 check()
 reset()
 getInstance( $type, $prefix = 'JTable', $config = array() )







JoomlaBasic.Com Page 15


JoomlaBasic.Com Page 16

Hàm getTotal() trả về tổng số dòng có trong bảng jos_hoidap_dapan


Hàm showDapan($where, $limitstart, $limit) để nhận về các các dòng trong bảng theo điều kiện
truyền trong biến $where



Hàm cauhoiRef( $name, $active = NULL, $javascript = NULL, $size = 1, $sel_cat = 1 ) trả về id,
title của câu hỏi tồn tại trong bảng đáp án theo dạng danh sách.



Cú pháp sử dụng HTML::_();



Hàm getCauhoi($sel) trả về danh sách các câu hỏi


JHTML::_(„select.genericlist‟,<mảng>,<Tên Selectbox>,<Kiểu trang trí (STYLE)
>,<Giá trị>,<Tiêu đề>,<Giá trị mặc định> )

JoomlaBasic.Com Page 17





Hàm editDapan() trả về dữ liệu theo id đầu tiên nhận được từ hàm JRequest::getVar().



Cú pháp của hàm JError::raiseError() hàm này trả về dòng thông báo lỗi.



1.6 THAO TÁC TRÊN VIEWS

Sau khi hoàn tất các hàm cần thiết trên model chúng ta chuyển sang thao tác với views. Đầu tiên
tại thư mục views ta tạo các cấu trúc như sau :



JError::raiseError(<Mã lỗi>,<Dòng thông báo>);
JoomlaBasic.Com Page 18



Trong tập tin view.html.php tại thư mục views/cauhoi/ ta tạo lớp HoidapViewCauhoi như hình bên
dưới :




Tiếp theo chúng ta bổ sung các hàm vào bên trong lớp này

JoomlaBasic.Com Page 19



Tạo menu cho hàm trang edit



Tạo menu cho trang default



Bạn có thể xem ý nghĩa của của từng hàm trong lớp JToolHelper trong bảng bên dưới
JoomlaBasic.Com Page 20



Tạo trang default.php trong thư mục views/cauhoi/tmpl







JoomlaBasic.Com Page 21



<?php
defined('_JEXEC') or die('Restricted access');
jimport( 'joomla.html.html' );
JHTML::_('behavior.tooltip');
?>

<form name="adminForm" action="index.php?option=com_hoidap&view=cauhoi"
method="post">
<table class="adminlist">
<thead>
<th width="20"><input type="checkbox" name="toggle" value=""
onclick="checkAll(<?php echo count( $this->rows ); ?>);" /></th>
<th><?php echo JText::_('Câu hỏi'); ?></th>
<th><?php echo JText::_('Đáp án đúng'); ?></th>
<th><?php echo JText::_('Người tạo'); ?></th>
<th><?php echo JText::_('Ngày tạo'); ?></th>
<th><?php echo JText::_('Trạng thái'); ?></th>
<th><?php echo JText::_('ID'); ?></th>
</thead>
<?php for($i = 0, $n = count($this->rows);$i < $n; $i++){
$link = JRoute::_( 'index.php?option=com_hoidap&view=cauhoi&task=edit&cid[]='.
$this->rows[$i]->id );
?>

<tr class="row<?php echo $i%2; ?>">
<td><?php echo JHTML::_('grid.checkedout', $this->rows[$i], $i ) ?></td>
<td>
<span class="editlinktip hasTip" title="<?php echo JText::_( 'Chỉnh sửa' );?>:<?php
echo htmlspecialchars($this->rows[$i]->title); ?>">

<?php
if ( JTable::isCheckedOut(JFactory::getUser()->get('id'), $this->rows[$i]-
>checked_out ) ) {
echo htmlspecialchars($this->rows[$i]->title);
} else {
?>

<a href="<?php echo $link; ?>">
<?php echo htmlspecialchars($this->rows[$i]->title); ?></a>
<?php
}
?>
</span>
</td>
<td align="center"><?php echo htmlspecialchars(strtoupper($this->rows[$i]-
>dapandung)); ?></td>
<td><?php echo htmlspecialchars($this->rows[$i]->postname); ?></td>
JoomlaBasic.Com Page 22




Tạo trang edit.php trong thư mục views/cauhoi/tmpl

<td><?php echo htmlspecialchars($this->rows[$i]->created); ?></td>
<td align="center"><?php echo JHTML::_('grid.published', $this->rows[$i], $i );
?></td>
<td><?php echo htmlspecialchars($this->rows[$i]->id); ?></td>
</tr>


<?php } ?>
<tfoot>
<tr>
<td colspan="7"><?php echo $this->page->getListFooter(); ?></td>
</tr>
</tfoot>
</table>
<input type="hidden" name="task" value="" />
<input type="hidden" name="option" value="com_hoidap" />
<input type="hidden" name="boxchecked" value="" />
<input type="hidden" name="c" value="cauhoi" />
<?php echo JHTML::_( 'form.token' ); ?>

</form>

JoomlaBasic.Com Page 23


<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.html.html' );
?>

<script language="javascript" type="text/javascript">
function submitbutton(pressbutton) {
var form = document.adminForm;

if (pressbutton == 'cancel') {
submitform( pressbutton );
return;

}

if ( form.title.value == "" ) {
alert("<?php echo JText::_( 'Vui lòng nhập tiêu đề câu hỏi', true ); ?>");
}else if ( form.dapandung.value == "" ) {
alert("<?php echo JText::_( 'Vui lòng nhập tiêu đề câu hỏi', true ); ?>");
}else{
submitform(pressbutton);
}
}
</script>

<form name="adminForm" action="index.php?option=com_hoidap&view=cauhoi"
method="post">
<div class="col width-60">
<fieldset>
<legend><?php echo JText::_('Chi tiết'); ?></legend>
<p></p>
<table class="admintable">
<tr>
<td class="key" style="width:200px"><?php echo JText::_('Tiêu đề'); ?></td>
<td><input type="text" name="title" value="<?php echo $this->row->title; ?>"
size="50" class="inputbox" /></td>
</tr>
<tr>
<td class="key"><?php echo JText::_('Đáp án đúng (A, B, C hoặc D)'); ?></td>
<td><input type="text" name="dapandung" value="<?php echo $this->row-
>dapandung; ?>" size="10" class="inputbox" maxlength="1" /></td>
</tr>
<tr>

<td class="key"><?php echo JText::_('Trạng Thái'); ?></td>
<td><?php echo JHTML::_('select.booleanlist','published','class="inputbox"',$this-
>row->published); ?></td>
</tr>
</table>
<p></p>
</fieldset>
</div>

JoomlaBasic.Com Page 24



Thao tác với views đáp án trong thư mục views/dapan

- Tạo tập tin view.html.php
<input type="hidden" name="task" value=""/>
<input type="hidden" name="c" value="cauhoi" />
<input type="hidden" name="option" value="com_hoidap"/>
<input type="hidden" name="id" value="<?php echo $this->row->id; ?>"/>
<?php echo JHTML::_( 'form.token' ); ?>
</form>
JoomlaBasic.Com Page 25



<?php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.view');
class HoidapViewDapan extends JView

{
function display($tpl = null)
{
jimport('joomla.html.pagination');
$db = & JFactory::getDBO();
global $mainframe;

$model = $this->getModel();
$limit = $mainframe->getUserStateFromRequest( 'global.list.limit', 'limit',
$mainframe->getCfg('list_limit'), 'int' );
$limitstart = $mainframe->getUserStateFromRequest( 'cauhoi.limitstart',
'limitstart', 0, 'int' );
$filter_order = $mainframe->getUserStateFromRequest( 'cauhoi.filter_order',
'filter_order', 'd.id', 'cmd' );
$filter_order_Dir = $mainframe->getUserStateFromRequest( 'cauhoi.filter_order_Dir',
'filter_order_Dir', '', 'word' );
$filter_state = $mainframe->getUserStateFromRequest( 'cauhoi.filter_state',
'filter_state', '', 'word' );
$search = $mainframe->getUserStateFromRequest( 'cauhoi.search',
'search', '', 'string' );
$filter_cauhoi = JRequest::getVar('filter_cauhoi', '',
'DEFAULT','string' );

if (strpos($search, '"') !== false) {
$search = str_replace(array('=', '<'), '', $search);
}

$search = JString::strtolower($search);

$where = array();


if ( $filter_state )
{
if ( $filter_state == 'P' ) {
$where[] = 'd.published = 1';
}
else if ($filter_state == 'U' ) {
$where[] = 'd.published = 0';
}
}

×