×

คำเตือน

JFolder::create: Path not in open_basedir paths.

หากเรามีการพัฒนาตัวคอมโพเนนท์สำหรับ Joomla! 2.5 มาซักพักนึง เราจะเห็นว่าปกติแล้วเราต้องมีการสร้างไฟล์ XML สำหรับการใช้่งานฟอร์มทั้งทางด้านหน้า (Frontend) และ ด้านหลัง (Backend) ซึ่งบางครั้งมันก็มีความซ้ำซ้อนอยู่เหมือนกัน ดังนั้นวันนี้ผมจะมานำเสนอแนวทางในการใช้งานไฟล์ XML ในส่วนของ Backend ในการเขียนโค้ดในส่วนของ Frontend ซึ่งมีข้อดีดังนี้

  1. ลดความซ้ำซ้อน และงานในการ Coding ลง
  2. แก้ไขฟอร์มจากที่เดียวคือ Backend

เนื่องจากปกติเราจะตั้งชื่อไฟล์ Model ดังนี้คือ <ComponentName>Model<Entity> ซึ่งจะเหมือนกันทั้ง Frontend และ Backend ดังนั้นในกรณีนี้เราจะตั้งชื่อตัว Model ในส่วนของ Frontend เป็น <ComponentName>Model<Entity>form แทนเพื่อให้แตกต่างจากเดิม ซึ่งจะทำให้เราสามารถสร้างคลาสของ Frontend นี้โดยการ extends หรือสิบทอดจาก Backend ได้เพื่อที่เราจะได้ใช้ฟอร์มจาก Backedn ได้เลยไงครับ

 นอกจากการที่เราจะต้องสืบทอดคลาสจาก Backend แล้วสิ่งที่เราจะต้องทำยังมีอีกสองข้อครับคือ

  1. การทำให้ Model ทำการค้นหาฟอร์มจากโฟลเดอร์ใน Backend ซึ่งเราจะทำโดยการ override ตัว constructor ของโมเดล
  2. การกำหนดชื่อไฟล์ XML ให้เป็นชื่อไฟล์ของไฟล์ XML ใน Backend ตัวนี้จะต้องทำใน getForm() ของตัวโมเดล

สำหรับรายการแรกงานที่เราจะต้องทำการคือเพื่ม include path สำหรับการค้นหา form และ field เข้าไปเนื่องจากปกติแล้วจุมล่าจะค้นหาจากโฟลเดอร์ models/forms  และ models/fields ของตัว Front เท่านั้นครับ ที่เราต้องทำก็คือให้มันหาจาก Backend ด้วย โดยการใช้งาน JForm::addFormPath(...) และ JForm::addFieldPath(...) ส่วนในการกำหนดชื่อของไฟล์ที่จะโหลดปกติจะเป็น $this->option.'.'.$this->getName() ในส่วนของ $this->getName() ก็คือการหาชื่อของโมเดลแบบไดนามิค ซึ่งจะใช้ไม่ได้ในกรณีนี้ เนื่องจากเราใช้ขื่อฟอร์มเป็นชื่อของโมเดลใน Backend เราจึงต้อง override โดยการระบุชื่อไปตรงๆ ดูโค๊ดตัวอย่างครับ

<?php
defined('_JEXEC') or die;
// Base this model on the backend version.
JLoader::register('CashpaymentModelDoc', JPATH_ADMINISTRATOR . '/components/com_cashpayment/models/doc.php');

/**
 * Doc model.
 *
 * @package     Cash Payment System
 * @subpackage  com_cashpayment
 * @since       2.0
 */
class CashpaymentModelDocform extends CashpaymentModelDoc
{
	/**
	 * 
	 * Override the constructor to use XML files in backend
	 * @param unknown_type $configs
	 */
	public function __construct($configs = array())
	{
		parent::__construct($configs);
		JForm::addFormPath(JPATH_ADMINISTRATOR . '/components/com_cashpayment/models/forms');
		JForm::addFieldPath(JPATH_ADMINISTRATOR . '/components/com_cashpayment/models/fields');
	}
	
	/**
	 * Override to load XML form in the backend model folder
	 * @see CashpaymentModelDoc::getForm()
	 */
	public function getForm($data = array(), $loadData = true)
	{	
		// Get the form.
		$form = $this->loadForm(
			$this->option.'.doc',
			'doc',
			array('control' => 'jform', 'load_data' => $loadData)
		);

		if (empty($form)) {
			return false;
		}

		return $form;
	}	

 

สำหรับโค๊ดด้านบนนะครับ ที่บรรทัดที่ 4 จะเป็นการทำการ register ตัว backend class โดยใช้ Joomla autoloader ครับ ในส่วนที่เน้นส่วนอื่นๆ ก็คือการ override ตามที่บอกด้านบนครับ สำหรับการใช้งานของผมจะทำเป็น Eclipse Snippets ไว้เป็นส่วนใหญ่ครับ ประหยัดเวลาในการทำงานซ้ำๆ โดยให้ Eclipse สร้าง code ให้กลุ่มหรือรูปแบบต่างๆ ให้เอง สำหรับใครที่อบรมหลักสูตร Joomla Extension Development กับผมก็จะมีแจกให้ใช้ฟรีครับ

comments