×

คำเตือน

JFolder::create: Path not in open_basedir paths.

สำหรับนักพัฒนามือใหม่ที่ยังไม่ชำนาญทั้ง PHP และจูมล่า จูมล่าโมดูลน่าจะเป็นส่วนขยายที่ง่ายที่สุดที่จะเริ่มต้น ไม่ต้องเขียนโค้ดมากมาย ใช้เวลาไม่นานก็ได้ชิ้นงานแล้วครับ วันนี้เราจะมาดูกันว่าถ้าจะพัฒนาจูมล่าโมดูลจะมีขั้นตอนอะไรบ้าง และเพื่อไม่ให้บทความยาวและเยิ่นเย้อเกินไป ผมจะแบ่งเป็นตอนๆ อาจจะซัก 2-3 ตอนนะครับ ก็สามารถติดตามและให้คำแนะนำกันได้ครับ

 

จูมล่าโมดูล (module) เป็นส่วนประกอบย่อยๆ หรือวินโดว์เล็กๆ บนหน้าเว็บไซต์ที่วางอยู่ในตำแหน่งของ module position ตัวอย่างโมดูลเช่นเมนูต่างๆ หรือฟอร์มล๊อกอิน (Login Form) โดยส่วนประกอบของโมดูลประกอบด้วยไฟล์โมดูล (.php) ไฟล์ xml (.xml) โดยไฟล์ xml เป็นไฟล์ที่ใช้ในการติดตั้งโมดูล โดย

  • ไฟล์โมดูลจะต้องตั้งชื่อ mod_<name>.php
  • ไฟล์ติดตั้ง xml ต้องตั้งชื่อ mod_<name>.xml
  • ไฟล์ index.html สำหรับป้องกันการ browse โฟลเดอร์
  • โฟลเดอร์ tmpl สำหรับเก็บ layout ในส่วนการแสดงผลเำืพิ่อรองรับการทำ Template Override 
  • โฟลเดอร์ language สำหรับเก็บข้อมูลการแปลภาษา ซึ่งมีสองไฟล์คือ .sys.ini สำหรับการใช้งานโดยจูมล่า และ .ini สำหรับการใช้งานในโมดูลของเราเอง
  • ไฟล์ helper.php ตัวนี้ไม่บังคับแต่ส่วนใหญ่จะใช้งานในลักษณะนี้

โดยแทนที่ <name> ด้วยชื่อของโมดูลของเรา ซึ่งจะต้องไม่ซ้ำกับ module อื่นๆ ไม่เช่นนั้นจะติดตั้งไม่ได้

ไฟล์หลักของโมดูล

ก่อนที่จะมาดูกันที่ไฟล์หลัก เรามาดูวัตถุประสงค์ของตัวโมดูลตัวนี้กันก่อนครับ สำหรับตัวโมดูลตัวนี้เราให้ชื่อว่า mod_regonline_latest ทำหน้าที่ในการแสดงผลกำหนดการฝึกอบรมหลักสูตร โดยใช้ข้อมูลจากตัวคอมโพเนนท์ชื่อ com_regonline หรือ RegOnline ซึ่งเราสามารถสร้างหลักสูตร แล้วนำหลักสูตรมาจัดกำหนดการฝึกอบรม เพื่อให้สมาชิกสามารถสมัครเข้าทำการฝึกอบรมได้ โดยเราเขียนโมดูลขึ้นมาเพื่อนำข้อมูลกำหนดการมาแสดงในหน้าอื่นๆ เช่นหน้าแรก

ทีนี้เรามาเริ่มต้นกันที่ไฟล์หลักของโมดูลก่อนซึ่งนอกจากหมายเหตุต่างๆในส่วนหัวของไฟล์ที่เราจะเจอแล้วบรรทัดแรกที่เราจะต้องเจอและเป็นข้อบังคับเกี่ยวกับความปลอดภัยของการเขียนโมดูลและ คคอมโพเนนท์สำหรับจูมล่าซึ่งเป็นการป้องกันการเข้าถึงไฟล์โดยตรง (ต้องถูกเรียกโดย index.php เท่านั้นครับ) นั่นคือเราจะไม่สามารถเรียกไปที่ URL ของไฟล์ได้ครับ ดูไฟล์กันก่อนครับ

<?php
/**
 * @copyright	Copyright (C) 2005 - 2014 Prasit Gebsaap. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

// no direct access
defined('_JEXEC') or die;

// Include the syndicate functions only once
require_once dirname(__FILE__).'/helper.php';

$list = modRegonlineHelper::getList($params);

require JModuleHelper::getLayoutPath('mod_regonline_latest', $params->get('layout', 'default'));

ในส่วนของบบรรทัดที่ 8 เราทำการโหลดไฟล์ Helper ซึ่งจะประกอบด้วยคลาส mod<Name>Helper ที่มีฟังก์ชัน getList() ใช้ในการดึงข้อมูลจากฐานข้อมูลอีกที ซึ่งมีการเรียกใช้งานในบรรทัดที่ 13 ครับ ส่วนบรรทัดที่ 15 เป็นการโหลด layout ซึ่งเรียกใช้งานผ่านคลาส JModuleHelper ของจูมล่าเำพื่อให้รองรับการแก้ไขหน้าตาสำหรับแสดงผลใน Tempate อีกที โดยเราต้องผ่านค่าของโมดูลทีีมี mod_ นำหน้า ในไฟล์ layout นี้เราสามารเข้าถึงตัวแปร $list ได้โดยตรงนะครับ

จะเห็นได้ว่าไฟล์ mod_<name>.php ของเรานี้จะใช้งานในรูปแบบเดียวกัน ในการเขียนจริงเราสามารถคัดลอกไฟล์นี้แล้วแก้ไขที่บรรทัดที่ 13 และ 15 ให้ตรงกับชื่อโมดูลของเราก็สามารถใช้งานได้เลย สำหรับผมในการทำงานก็จะใช้ Eclipse Snippet ที่สร้างไว้สำหรับสร้างโค๊ดโดยตรง

ไฟล์อธิบายการติดตั้งโมดูล (.xml)

สำหรับในส่วนของไฟล์ xml ประกอบไปด้วยสามส่วนหลักๆ คือ ข้อมูลทั่วไป ส่วนของไฟล์ และส่วนของพารามิเตอร์ ดูตัวอย่าง

<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="2.5" client="site" method="upgrade">
	<name>mod_regonline_latest</name>
	<author>Prasit Gebsaap</author>
	<creationDate>Feb 2014</creationDate>
	<copyright>Copyright (C) 2005 - 2014 Prasit Gebsaap.	All rights reserved.</copyright>
	<license>GNU General Public License version 2 or later; see
		LICENSE.txt</license>
	<authorEmail>soap-at-joomlant.com</authorEmail>
	<authorUrl>www.joomlant.com</authorUrl>
	<version>2.5.0</version>
	<description>MOD_REGONLINE_LATEST_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_regonline_latest">mod_regonline_latest.php</filename>
		<filename>helper.php</filename>
		<filename>index.html</filename>
		<filename>mod_regonline_latest.xml</filename>
		<folder>tmpl</folder>                
		<folder>language</folder>
	</files>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field name="count" type="text"
					default="10"
					label="MOD_REGONLINE_LATEST_FIELD_COUNT_LABEL"
					description="MOD_REGONLINE_LATEST_FIELD_COUNT_DESC" />
			</fieldset>

			<fieldset name="advanced">
				<field name="layout" type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC" />

				<field name="moduleclass_sfx" type="text"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC" />

				<field name="cache" type="list"
					default="1"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC"
				>
					<option value="1">JGLOBAL_USE_GLOBAL</option>
					<option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field name="cache_time" type="text"
					default="900"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC" />
				<field
					name="cachemode"
					type="hidden"
					default="static">
					<option value="static"></option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>

อธิบายไฟล์ติดตั้ง คร่าวๆ ดังนี้นะครับ

  • บรรทัดที่ 1 เป็นส่วนหัวของ XML ตามข้อมบังคับต้องมีครับ
  • บรรทัดที่ 2 เป็นส่วนที่ระบุว่าไฟล์ที่ติดตั้งนี้เป็นประเภทโมดูล และติดตั้งใช้งานในส่วนของไซต์ (frontend) และรูปแบบการติดตั้งเป็นแบบ Upgrade ก็คือติดตั้งทับตัวเก่าได้
  • บรรทัดที่ 3 เป็นชื่อของโมดูลที่รองรับการแปลภาษา ใช้สำหรับการแสดงผลด้วย
  • บรรทัดที่ 13-20 เป็นส่วนของไฟล์ต่างๆที่จะต้องทำการคัดลอกสำหรับการติดตั้ง ส่วนสำคัญคือบรรทัดที่ 14 
  • บรรทัดทีี่ 21 เป็นต้นไปเป็นส่วนของการกำหนดค่าพารามีเตอร์ที่จะให้ผู้ใช้แก้ไขได้ แล้วเรามาเขียนโค๊ดเพื่อทำตามรูปแบบอีกที

ในส่วนของไฟล์ index.html นั้นเป็นไฟล์ว่างๆ ซึ่งไฟล์นี้ใส่ไว้เพื่อเหตุผลทางด้านความปลอดภัยในกรณีที่โฟลเดอร์ไม่ได้ป้องกัน directory browsing เอาไว้ถ้าไม่เจอไฟล์มันจะทำการแสดงรายการไฟล์ในโฟลเดอร์นั้นแทนซึ่งอาจจะมีปัญหาในด้นความปลอดภัยได้ การใส่ไฟล์ index.html ไว้จะทำให้เว็บเซอร์ฟเวอร์แสดงเนื้อหาของไฟล์นี้แทน ไฟล์ index.html ซึ่งมีในทุกๆ โฟลเดอร์ของจูมล่า ยกเว้น root directory และ administrator ดังนั้นคุณสามารถคัดลอกมาแปะได้ สำหรับโมดูล ในโฟลเดอร์ tmpl ก็ควรมีไฟล์ index.html เช่นกัน นั่นคือถ้าเรามีโฟลเดอร์ย่อยๆ อีกก็ควรใส่ไฟล์ index.html ไว้เพื่อความปลอดภัย

สำหรับในบทความต่อไป จะมากล่าวถึงตัวคลาส Helper ซึ่งเรามีการใช้งานในการโหลดข้อมูลจากฐานข้อมูล โดยใช้โมเดล (Model) ของคอมโพเนนท์ทำให้เราไม่ต้องเขียนโค๊ดสำหรับการเชื่อมต่อฐานข้อมูลเลยครับ ถ้ามันมีข้อมูลในโมเดลที่ให้เราเรียกใช้ได้อยู่แล้ว ถ้าพร้อมแล้วก็คลิกที่บทความนี้เลยนะครับ เริ่มต้นเขียนจูมล่าโมดูล (2.5/3.2)-ตอนที่ 2

comments