public function build()
{
// Get a reference to the model
$model = $this->model;
// Create the "no records" language string
$noRowsKey = strtoupper($this->builder->getContainer()->componentName) . '_COMMON_NORECORDS';
$this->addString($noRowsKey, 'There are no records to display');
// Create the attributes of the form's base element
$this->xml->addAttribute('type', 'browse');
$this->xml->addAttribute('show_header', "1");
$this->xml->addAttribute('show_filters', "1");
$this->xml->addAttribute('show_pagination', "1");
$this->xml->addAttribute('norows_placeholder', $noRowsKey);
// Create the headerset and fieldset sections of the form file
$headerSet = $this->xml->addChild('headerset');
$fieldSet = $this->xml->addChild('fieldset');
$fieldSet->addAttribute('name', 'items');
// Get the database fields
$allFields = $model->getTableFields();
// Ordering must go first
if ($model->hasField('ordering')) {
$this->applyOrderingField($model, $headerSet, $fieldSet, $allFields);
}
// Primary key field goes next
$this->applyPrimaryKeyField($model, $headerSet, $fieldSet, $allFields);
// Get a list of "do not display" fields
$doNotShow = $this->getDoNotShow();
foreach ($allFields as $fieldName => $fieldDefinition) {
// Skip the fields which shouldn't be displayed
if (in_array($fieldName, $doNotShow)) {
continue;
}
// Get the lowercase field name and prepare to handle specially named fields
$lowercaseFieldName = strtolower($fieldName);
// access => AccessLevel
if ($model->getFieldAlias('access') == $fieldName) {
$this->applyAccessLevelField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// title => Title
if ($model->getFieldAlias('title') == $fieldName) {
$this->applyTitleField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// slug => Hide if there is a title field as well
if ($model->getFieldAlias('slug') == $fieldName) {
$titleField = $model->getFieldAlias('title');
if (array_key_exists($titleField, $allFields)) {
continue;
}
}
// tag => Tag
if ($model->getFieldAlias('tag') == $fieldName) {
$this->applyTagField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// enabled => Actions
if ($model->getFieldAlias('enabled') == $fieldName) {
$this->applyActionsField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// cache_handler => CacheHandler
if ($lowercaseFieldName == 'cache_handler') {
$this->applyCacheHandlerField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// component_id => Components
if ($lowercaseFieldName == 'component_id') {
$this->applyComponentsField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// body, introtext, fulltext => Editor
if (in_array($lowercaseFieldName, array('body', 'introtext', 'fulltext', 'description'))) {
$this->applyEditorField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// email, *_email => Email
if ($lowercaseFieldName == 'email' || substr($lowercaseFieldName, -6) == 'email') {
$this->applyEmailField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// image, media, *_image => Media
if (in_array($lowercaseFieldName, array('image', 'media')) || substr($lowercaseFieldName, -6) == '_image') {
$this->applyMediaField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// language, lang, lang_id => Language
if (in_array($lowercaseFieldName, array('language', 'lang', 'lang_id'))) {
$this->applyLanguageField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// password, passwd, pass => Password
if (in_array($lowercaseFieldName, array('password', 'passwd', 'pass'))) {
$this->applyPasswordField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// plugin_id => Plugins
if ($lowercaseFieldName == 'plugin_id') {
$this->applyPluginsField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// asset_id => Rules (not applicable here)
if ($lowercaseFieldName == 'asset_id') {
continue;
}
// session_handler => SessionHandler
if ($lowercaseFieldName == 'session_handler') {
$this->applySessionHandlerField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// tel, telephone, phone => Tel
if (in_array($lowercaseFieldName, array('tel', 'telephone', 'phone'))) {
$this->applyTelField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// timezone, tz, time_zone => Timezone
if (in_array($lowercaseFieldName, array('timezone', 'tz', 'time_zone'))) {
$this->applyTimezoneField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// url, link, href => Url
if (in_array($lowercaseFieldName, array('url', 'link', 'href'))) {
$this->applyUrlField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// user, user_id, userid, uid => User
if (in_array($lowercaseFieldName, array('user', 'user_id', 'userid', 'uid'))) {
$this->applyUserField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// group, group_id, groupid, gid => UserGroup
if (in_array($lowercaseFieldName, array('group', 'group_id', 'groupid', 'gid'))) {
$this->applyUserGroupField($model, $headerSet, $fieldSet, $fieldName);
continue;
}
// Special handling for myComponent_whatever_id fields
$myComponentPrefix = $this->builder->getContainer()->bareComponentName . '_';
if (strpos($fieldName, $myComponentPrefix) === 0 && substr($fieldName, -3) == '_id') {
$parts = explode('_', $fieldName);
array_pop($parts);
array_shift($parts);
// myComponent_something_id => Relation or Model
if (count($parts) == 1) {
$foreignName = array_shift($parts);
} else {
$foreignName1 = array_shift($parts);
$foreignName1 = $this->model->getContainer()->inflector->pluralize($foreignName1);
$foreignName2 = array_shift($parts);
$foreignName2 = $this->model->getContainer()->inflector->pluralize($foreignName2);
$modelName = $model->getName();
$modelName = $this->model->getContainer()->inflector->pluralize($modelName);
$foreignName = $foreignName1 == $modelName ? $foreignName2 : $foreignName1;
}
try {
$model->getRelations()->getRelation($foreignName);
$this->applyRelationField($model, $headerSet, $fieldSet, $fieldName);
continue;
} catch (DataModel\Relation\Exception\RelationNotFound $e) {
$foreignName = $this->model->getContainer()->inflector->pluralize($foreignName);
try {
$this->applyModelField($model, $headerSet, $fieldSet, $fieldName, $foreignName);
continue;
} catch (\Exception $e) {
}
}
}
// Other fields, use getFieldType
$typeDef = $this->getFieldType($fieldDefinition->Type);
switch ($typeDef['type']) {
case 'Text':
$this->applyTextField($model, $headerSet, $fieldSet, $fieldName);
break;
case 'Editor':
$this->applyEditorField($model, $headerSet, $fieldSet, $fieldName);
break;
case 'Calendar':
$this->applyCalendarField($model, $headerSet, $fieldSet, $fieldName);
break;
case 'Checkbox':
$this->applyCheckboxField($model, $headerSet, $fieldSet, $fieldName);
break;
case 'Integer':
$this->applyIntegerField($model, $headerSet, $fieldSet, $fieldName);
break;
case 'Numeric':
$this->applyNumericField($model, $headerSet, $fieldSet, $fieldName);
break;
case 'GenericList':
$this->applyGenericListField($model, $headerSet, $fieldSet, $fieldName, $typeDef['params']);
break;
}
}
$this->pushResults();
}