/**
* Renders a Form for a Browse view and returns the corresponding HTML
*
* @param Form &$form The form to render
* @param DataModel $model The model providing our data
*
* @return string The HTML rendering of the form
*/
public function renderFormBrowse(Form &$form, DataModel $model)
{
$html = '';
\JHtml::_('behavior.multiselect');
\JHtml::_('bootstrap.tooltip');
\JHtml::_('dropdown.init');
$view = $form->getView();
$order = $view->escape($view->getLists()->order);
$html .= <<<HTML
<script type="text/javascript">
\tJoomla.orderTable = function() {
\t\tvar table = document.getElementById("sortTable");
\t\tvar direction = document.getElementById("directionTable");
\t\tvar order = table.options[table.selectedIndex].value;
\t\tvar dirn = 'asc';
\t\tif (order != '{$order}')
\t\t{
\t\t\tdirn = 'asc';
\t\t}
\t\telse {
\t\t\tdirn = direction.options[direction.selectedIndex].value;
\t\t}
\t\tJoomla.tableOrdering(order, dirn);
\t};
</script>
HTML;
// Getting all header row elements
$headerFields = $form->getHeaderset();
// Get form parameters
$show_header = $form->getAttribute('show_header', 1);
$show_filters = $form->getAttribute('show_filters', 1);
$show_pagination = $form->getAttribute('show_pagination', 1);
$norows_placeholder = $form->getAttribute('norows_placeholder', '');
// Joomla! 3.x sidebar support
$form_class = '';
if ($show_filters) {
\JHtmlSidebar::setAction("index.php?option=" . $this->container->componentName . "&view=" . $this->container->inflector->pluralize($form->getView()->getName()));
}
// Reorder the fields with ordering first
$tmpFields = array();
$i = 1;
foreach ($headerFields as $tmpField) {
if ($tmpField instanceof HeaderOrdering) {
$tmpFields[0] = $tmpField;
} else {
$tmpFields[$i] = $tmpField;
}
$i++;
}
$headerFields = $tmpFields;
ksort($headerFields, SORT_NUMERIC);
// Pre-render the header and filter rows
$header_html = '';
$filter_html = '';
$sortFields = array();
if ($show_header || $show_filters) {
foreach ($headerFields as $headerField) {
$header = $headerField->header;
$filter = $headerField->filter;
$buttons = $headerField->buttons;
$options = $headerField->options;
$sortable = $headerField->sortable;
$tdwidth = $headerField->tdwidth;
// If it's a sortable field, add to the list of sortable fields
if ($sortable) {
$sortFields[$headerField->name] = \JText::_($headerField->label);
}
// Get the table data width, if set
if (!empty($tdwidth)) {
$tdwidth = 'width="' . $tdwidth . '"';
} else {
$tdwidth = '';
}
if (!empty($header)) {
$header_html .= "\t\t\t\t\t<th {$tdwidth}>" . "\n";
$header_html .= "\t\t\t\t\t\t" . $header;
$header_html .= "\t\t\t\t\t</th>" . "\n";
}
if (!empty($filter)) {
$filter_html .= '<div class="filter-search btn-group pull-left">' . "\n";
$filter_html .= "\t" . '<label for="title" class="element-invisible">';
$filter_html .= \JText::_($headerField->label);
$filter_html .= "</label>\n";
$filter_html .= "\t{$filter}\n";
$filter_html .= "</div>\n";
if (!empty($buttons)) {
$filter_html .= '<div class="btn-group pull-left hidden-phone">' . "\n";
$filter_html .= "\t{$buttons}\n";
$filter_html .= '</div>' . "\n";
}
} elseif (!empty($options)) {
$label = $headerField->label;
$filterName = $headerField->filterFieldName;
$filterSource = $headerField->filterSource;
\JHtmlSidebar::addFilter('- ' . \JText::_($label) . ' -', $filterName, \JHtml::_('select.options', $options, 'value', 'text', $model->getState($filterSource, ''), true));
}
}
}
// Start the form
$filter_order = $form->getView()->getLists()->order;
$filter_order_Dir = $form->getView()->getLists()->order_Dir;
$actionUrl = $this->container->platform->isBackend() ? 'index.php' : \JUri::root() . 'index.php';
if ($this->container->platform->isFrontend() && $this->container->input->getCmd('Itemid', 0) != 0) {
$itemid = $this->container->input->getCmd('Itemid', 0);
$uri = new \JUri($actionUrl);
if ($itemid) {
$uri->setVar('Itemid', $itemid);
}
$actionUrl = \JRoute::_($uri->toString());
}
$html .= '<form action="' . $actionUrl . '" method="post" name="adminForm" id="adminForm" ' . $form_class . '>' . "\n";
// Get and output the sidebar, if present
$sidebar = \JHtmlSidebar::render();
if ($show_filters && !empty($sidebar)) {
$html .= '<div id="j-sidebar-container" class="span2">' . "\n";
$html .= "\t{$sidebar}\n";
$html .= "</div>\n";
$html .= '<div id="j-main-container" class="span10">' . "\n";
} else {
$html .= '<div id="j-main-container">' . "\n";
}
// Render header search fields, if the header is enabled
$pagination = $form->getView()->getPagination();
if ($show_header) {
$html .= "\t" . '<div id="filter-bar" class="btn-toolbar">' . "\n";
$html .= "{$filter_html}\n";
if ($show_pagination) {
// Render the pagination rows per page selection box, if the pagination is enabled
$html .= "\t" . '<div class="btn-group pull-right hidden-phone">' . "\n";
$html .= "\t\t" . '<label for="limit" class="element-invisible">' . \JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC') . '</label>' . "\n";
$html .= "\t\t" . $pagination->getLimitBox() . "\n";
$html .= "\t" . '</div>' . "\n";
}
if (!empty($sortFields)) {
// Display the field sort order
$asc_sel = $form->getView()->getLists()->order_Dir == 'asc' ? 'selected="selected"' : '';
$desc_sel = $form->getView()->getLists()->order_Dir == 'desc' ? 'selected="selected"' : '';
$html .= "\t" . '<div class="btn-group pull-right hidden-phone">' . "\n";
$html .= "\t\t" . '<label for="directionTable" class="element-invisible">' . \JText::_('JFIELD_ORDERING_DESC') . '</label>' . "\n";
$html .= "\t\t" . '<select name="directionTable" id="directionTable" class="input-medium" onchange="Joomla.orderTable()">' . "\n";
$html .= "\t\t\t" . '<option value="">' . \JText::_('JFIELD_ORDERING_DESC') . '</option>' . "\n";
$html .= "\t\t\t" . '<option value="asc" ' . $asc_sel . '>' . \JText::_('JGLOBAL_ORDER_ASCENDING') . '</option>' . "\n";
$html .= "\t\t\t" . '<option value="desc" ' . $desc_sel . '>' . \JText::_('JGLOBAL_ORDER_DESCENDING') . '</option>' . "\n";
$html .= "\t\t" . '</select>' . "\n";
$html .= "\t" . '</div>' . "\n\n";
// Display the sort fields
$html .= "\t" . '<div class="btn-group pull-right">' . "\n";
$html .= "\t\t" . '<label for="sortTable" class="element-invisible">' . \JText::_('JGLOBAL_SORT_BY') . '</label>' . "\n";
$html .= "\t\t" . '<select name="sortTable" id="sortTable" class="input-medium" onchange="Joomla.orderTable()">' . "\n";
$html .= "\t\t\t" . '<option value="">' . \JText::_('JGLOBAL_SORT_BY') . '</option>' . "\n";
$html .= "\t\t\t" . \JHtml::_('select.options', $sortFields, 'value', 'text', $form->getView()->getLists()->order) . "\n";
$html .= "\t\t" . '</select>' . "\n";
$html .= "\t" . '</div>' . "\n";
}
$html .= "\t</div>\n\n";
$html .= "\t" . '<div class="clearfix"> </div>' . "\n\n";
}
// Start the table output
$html .= "\t\t" . '<table class="table table-striped" id="itemsList">' . "\n";
// Open the table header region if required
if ($show_header) {
$html .= "\t\t\t<thead>" . "\n";
}
// Render the header row, if enabled
if ($show_header) {
$html .= "\t\t\t\t<tr>" . "\n";
$html .= $header_html;
$html .= "\t\t\t\t</tr>" . "\n";
}
// Close the table header region if required
if ($show_header) {
$html .= "\t\t\t</thead>" . "\n";
}
// Loop through rows and fields, or show placeholder for no rows
$html .= "\t\t\t<tbody>" . "\n";
$fields = $form->getFieldset('items');
$num_columns = count($fields);
$items = $model->get();
if ($count = count($items)) {
$m = 1;
foreach ($items as $i => $item) {
$rowHtml = '';
$form->bind($item);
$m = 1 - $m;
$rowClass = 'row' . $m;
$fields = $form->getFieldset('items');
// Reorder the fields to have ordering first
$tmpFields = array();
$j = 1;
foreach ($fields as $tmpField) {
if ($tmpField instanceof FieldOrdering) {
$tmpFields[0] = $tmpField;
} else {
$tmpFields[$j] = $tmpField;
}
$j++;
}
$fields = $tmpFields;
ksort($fields, SORT_NUMERIC);
/** @var FieldInterface $field */
foreach ($fields as $field) {
$field->rowid = $i;
$field->item = $item;
$labelClass = $field->labelclass;
$class = $labelClass ? 'class ="' . $labelClass . '"' : '';
if (!method_exists($field, 'getRepeatable')) {
throw new \Exception('getRepeatable not found in class ' . get_class($field));
}
// Let the fields change the row (tr element) class
if (method_exists($field, 'getRepeatableRowClass')) {
$rowClass = $field->getRepeatableRowClass($rowClass);
}
$rowHtml .= "\t\t\t\t\t<td {$class}>" . $field->getRepeatable() . '</td>' . "\n";
}
$html .= "\t\t\t\t<tr class=\"{$rowClass}\">\n" . $rowHtml . "\t\t\t\t</tr>\n";
}
} elseif ($norows_placeholder) {
$html .= "\t\t\t\t<tr><td colspan=\"{$num_columns}\">";
$html .= \JText::_($norows_placeholder);
$html .= "</td></tr>\n";
}
$html .= "\t\t\t</tbody>" . "\n";
// End the table output
$html .= "\t\t" . '</table>' . "\n";
// Render the pagination bar, if enabled, on J! 3.0+
$html .= $pagination->getListFooter();
// Close the wrapper element div on Joomla! 3.0+
$html .= "</div>\n";
$html .= "\t" . '<input type="hidden" name="option" value="' . $this->container->componentName . '" />' . "\n";
$html .= "\t" . '<input type="hidden" name="view" value="' . $this->container->inflector->pluralize($form->getView()->getName()) . '" />' . "\n";
$html .= "\t" . '<input type="hidden" name="task" value="' . $form->getView()->getTask() . '" />' . "\n";
$html .= "\t" . '<input type="hidden" name="layout" value="' . $form->getView()->getLayout() . '" />' . "\n";
// The id field is required in Joomla! 3 front-end to prevent the pagination limit box from screwing it up.
if ($this->container->platform->isFrontend()) {
$html .= "\t" . '<input type="hidden" name="id" value="" />' . "\n";
}
$html .= "\t" . '<input type="hidden" name="boxchecked" value="" />' . "\n";
$html .= "\t" . '<input type="hidden" name="hidemainmenu" value="" />' . "\n";
$html .= "\t" . '<input type="hidden" name="filter_order" value="' . $filter_order . '" />' . "\n";
$html .= "\t" . '<input type="hidden" name="filter_order_Dir" value="' . $filter_order_Dir . '" />' . "\n";
$html .= "\t" . '<input type="hidden" name="' . \JFactory::getSession()->getFormToken() . '" value="1" />' . "\n";
// End the form
$html .= '</form>' . "\n";
return $html;
}