fieldlayout.php
4.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
<?php
/**
* @package Joomla.Administrator
* @subpackage com_fields
*
* @copyright Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
jimport('joomla.filesystem.folder');
/**
* Form Field to display a list of the layouts for a field from
* the extension or template overrides.
*
* @since 3.9.0
*/
class JFormFieldFieldlayout extends JFormField
{
/**
* The form field type.
*
* @var string
* @since 3.9.0
*/
protected $type = 'FieldLayout';
/**
* Method to get the field input for a field layout field.
*
* @return string The field input.
*
* @since 3.9.0
*/
protected function getInput()
{
$extension = explode('.', $this->form->getValue('context'))[0];
if ($extension)
{
// Get the database object and a new query object.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
// Build the query.
$query->select('element, name')
->from('#__extensions')
->where('client_id = 0')
->where('type = ' . $db->quote('template'))
->where('enabled = 1');
// Set the query and load the templates.
$db->setQuery($query);
$templates = $db->loadObjectList('element');
// Build the search paths for component layouts.
$component_path = JPath::clean(JPATH_SITE . '/components/' . $extension . '/layouts/field');
// Prepare array of component layouts
$component_layouts = array();
// Prepare the grouped list
$groups = array();
// Add "Use Default"
$groups[]['items'][] = JHtml::_('select.option', '', JText::_('JOPTION_USE_DEFAULT'));
// Add the layout options from the component path.
if (is_dir($component_path) && ($component_layouts = JFolder::files($component_path, '^[^_]*\.php$', false, true)))
{
// Create the group for the component
$groups['_'] = array();
$groups['_']['id'] = $this->id . '__';
$groups['_']['text'] = JText::sprintf('JOPTION_FROM_COMPONENT');
$groups['_']['items'] = array();
foreach ($component_layouts as $i => $file)
{
// Add an option to the component group
$value = basename($file, '.php');
$component_layouts[$i] = $value;
if ($value === 'render')
{
continue;
}
$groups['_']['items'][] = JHtml::_('select.option', $value, $value);
}
}
// Loop on all templates
if ($templates)
{
foreach ($templates as $template)
{
$files = array();
$template_paths = array(
JPath::clean(JPATH_SITE . '/templates/' . $template->element . '/html/layouts/' . $extension . '/field'),
JPath::clean(JPATH_SITE . '/templates/' . $template->element . '/html/layouts/com_fields/field'),
JPath::clean(JPATH_SITE . '/templates/' . $template->element . '/html/layouts/field'),
);
// Add the layout options from the template paths.
foreach ($template_paths as $template_path)
{
if (is_dir($template_path))
{
$files = array_merge($files, JFolder::files($template_path, '^[^_]*\.php$', false, true));
}
}
foreach ($files as $i => $file)
{
$value = basename($file, '.php');
// Remove the default "render.php" or layout files that exist in the component folder
if ($value === 'render' || in_array($value, $component_layouts))
{
unset($files[$i]);
}
}
if (count($files))
{
// Create the group for the template
$groups[$template->name] = array();
$groups[$template->name]['id'] = $this->id . '_' . $template->element;
$groups[$template->name]['text'] = JText::sprintf('JOPTION_FROM_TEMPLATE', $template->name);
$groups[$template->name]['items'] = array();
foreach ($files as $file)
{
// Add an option to the template group
$value = basename($file, '.php');
$groups[$template->name]['items'][] = JHtml::_('select.option', $value, $value);
}
}
}
}
// Compute attributes for the grouped list
$attr = $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';
$attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';
// Prepare HTML code
$html = array();
// Compute the current selected values
$selected = array($this->value);
// Add a grouped list
$html[] = JHtml::_(
'select.groupedlist', $groups, $this->name,
array('id' => $this->id, 'group.id' => 'id', 'list.attr' => $attr, 'list.select' => $selected)
);
return implode($html);
}
return '';
}
}