%31 %709 %2013 %00:%十 %AM

Joomla自定义字段类型

作者
给本项目评分
(0 得票数)

问题由来:

在群里面一个朋友提出了一个问题,能否后台显示最近登录用户信息的模块不显示超级管理员的信息。

当时稍微想了一下,觉得实现这个功能不是很困难。最初的思想是直接判断ID是否是超级管理员,然后决定是否显示。后来,思考了一下认为这个主要和用户组有关,其实提问者根本要屏蔽的是超级管理员组的信息。那好,思路有了。在后台的logged模块中增加一个选项,用来决定哪一个组的信息不显示。这个字段最好是一个下拉选择框,供选择的内容是所有的用户组。由于用户组是可以通过后台改变的,因此,我们不能够进行硬编码。为了解决这一问题,就产生了这篇文章,joomla中该如何自定义一个字段?

 JForm是2.5中新引入的一个特性,他可以让你很容易的创建格式化的HTML 表单(原文为:forms)。表格(Forms) 是由form和fields组成,是以JFormFields的形式来实现的。在JFormFiled中提供了不同的字段类型,像日期类型,文本类型。JForm支持大量的标准字段,同时也提供了一种机制让我们去扩充和定制自定的字段。


自定义字段对类的要求

自定义字段在类中定义,并且这个类必须是JFormField类的子类,可以不是直接子类。为了让自定义字段类正常工作,至少需要定义两个方法:

public function getLabel()

         这个方法将被调用去创建和属于你自定义的字段标签,并且以HTML字符串的形式返回。由于在JFormField类中已经实现了这个方法,所有,一般情况下我们不需要实现。系统会自动基础父类的方法来创建标签。一般情况下,为了保证一致性和执行的速度,我们建议不实现getLabel()方法。但是你如果真的想修改标签的HTML,你也可以实现这个方法。

public function getInput()

          这个方法用来创建自身的字段,并且以HTML字符串的形式返回。我们通常在这个方法中处理逻辑。在我们的这个例子中,我将会从数据库中读取所有的用户组,让后将他作为<option>.进行返回。

在我们的代码中,有时候需要处理XML中定义的字段的属性。通过保护的成员变量JFormFIeld我们可以访问其中的一些属性。例如,使用$this->name来访问name属性。类似的,label,description,default.multiple和class都可以通过$this来访问。其他的参数需要$this->element['size']的形式返回。


这个类的该从谁派生?

JForm中使用的字段都是JFormField类的子类。然而,并不一定是直接子类,可以是一个存在的字段或者是自定义的字段的类的子类。如果你要定制的字段和已有的字段十分相似,那么就从这个相似的类派生。这样的话,你可以少写很多代码。

将设现在要从JFormFieldList派生,需要使用下面的代码:

jimport('joomla.form.helper');
JFormHelper::loadFiledClass('list');

如果你要自定义的字段不同于任何一个已经存在的字段,那么直接从JFormFields类派生。


文件的位置

标准类型的字段存放在 joomla/libraries/joomla/form/fields/下面。你不应该存放自己定义的字段在这个文件夹下面,也不需要在自己的代码中用这个路径。

定制的字段通常属于你的组件,通常位于:administrator/components/组件名/models/fields.下面。你也可指定其他的的路径:

JForm::addFieldPath(JPATH_COMPONENT.'/models/fields');

命名原则和框架

在这一节中,组件的名称需要是驼峰式的,类型的名称也需要是驼峰式的。字段的类的实现文件应该在:administrator/components/组件名称/models/fields/<name of your field>.php.

defined('_JEXEC') or die('Restricted access');

jimport('joomla.form.formfield');

//The class name must always be the same as the filename(in camel case)
class JFormField extends JFormField
{
  // The field class must konw its own type through the variable $type
  protected $type='';
  
  public function getLabel()
 {
    // code that return HTML that will be shown as the label
  }
  
 public function getInput()
 {
  //code that returns HTML that will be shown as the form field
}

}

 


一个实例

 

Suppose you're working on your component named com_phonebook and you want to define a field that contains cities. Create the fileadministrator/components/com_phonebook/models/fields/city.php and write something similar to the following:

<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');
 
jimport('joomla.form.formfield');
 
class JFormFieldCity extends JFormField {
 
        protected $type = 'City';
 
        // getLabel() left out
 
        public function getInput() {
                return '<select id="'.$this->id.'" name="'.$this->name.'">'.
                       '<option value="1" >New York</option>'.
                       '<option value="2" >Chicago</option>'.
                       '<option value="3" >San Francisco</option>'.
                       '</select>';
        }
}

 

阅读 14741 次数 最后修改于 %22 %691 %2014 %23:%二 %PM