/** * Adjust the behavior of the supplied field in the context of the supplied * table renderer so that it draws a "handle" that the user can grab to * drag the row around. Adds some custom JS/CSS to pull that off. * * @param FieldInterface $field * @param TableCell $cellRenderer * @param string $primaryKeyName * @return void */ public function assignToField(FieldInterface $field, TableCell $cellRenderer, $primaryKeyName) { $this->view->headScript()->appendFile($this->view->bowerUrl('/dewdrop/www/js/listing-sortable.js')); $this->view->headLink()->appendStylesheet($this->view->bowerUrl('/dewdrop/www/css/listing-sortable.css')); $cellRenderer->getContentRenderer()->assign($field->getId(), function ($helper, array $rowData) use($primaryKeyName) { /* @var $helper TableCell\Content */ return sprintf('<span data-id="%d" class="handle glyphicon glyphicon-align-justify"></span>', $helper->getView()->escapeHtmlAttr($rowData[$primaryKeyName])); }); }
/** * Create a field object, configured to render a checkbox for use in selecting * items for the supplied BulkActions object. * * @param BulkActions $bulkActions * @param TableCellHelper $renderer * @return Field * @throws Exception */ public function direct(BulkActions $bulkActions, TableCellHelper $renderer) { $field = new Field(); $key = $bulkActions->getPrimaryKey()->getName(); $field->setId($bulkActions->getId())->setVisible(true); $renderer->getHeaderRenderer()->assign($bulkActions->getId(), function () { return ''; }); $renderer->getContentRenderer()->assign($bulkActions->getId(), function ($helper, array $rowData) use($bulkActions, $key) { /* @var $helper \Dewdrop\Fields\Helper\TableCell\Content */ if (!isset($rowData[$key])) { throw new Exception("{$key} not available in row data for bulk action checkbox render."); } $value = $rowData[$key]; return sprintf('<input class="bulk-checkbox" type="checkbox" name="%s[]" value="%s" %s />', $helper->getView()->escapeHtmlAttr($bulkActions->getId()), $helper->getView()->escapeHtmlAttr($value), in_array($value, $bulkActions->getSelected()) ? 'checked="checked"' : ''); }); return $field; }
/** * Render the <tbody> with the TableCell.Content helper to allow * each field's cell content to be modified. * * @param Fields $fields * @param array $data * @param TableCellHelper $renderer * @return string */ public function renderBody(Fields $fields, array $data, TableCellHelper $renderer) { $rowIndex = 0; $out = '<tbody>'; foreach ($data as $row) { $classes = $renderer->getRowClasses($row); if (!is_array($classes) || !count($classes)) { $out .= '<tr>'; } else { $out .= sprintf('<tr class="%s">', implode(' ', array_map([$this->view, 'escapeHtmlAttr'], $classes))); } $columnIndex = 0; foreach ($fields as $field) { $out .= sprintf('<td class="%s">', $renderer->getTdClassNamesRenderer()->render($field, $row, $rowIndex, $columnIndex)); $out .= $renderer->getContentRenderer()->render($field, $row, $rowIndex, $columnIndex); $out .= '</td>'; $columnIndex += 1; } $out .= '</tr>'; $rowIndex += 1; } $out .= '</tbody>'; return $out; }
public function testContentRendererGetsView() { $this->assertInstanceOf('Dewdrop\\View\\View', $this->helper->getContentRenderer()->getView()); }
/** * Render the supplied non-grouped fields in a Bootstrap table. * * @param Fields $fields * @param array $data * @param Renderer $renderer * @return string */ protected function renderFields(Fields $fields, array $data, Renderer $renderer) { $rowIndex = 0; $out = '<div class="table-responsive">'; $out .= '<table class="table">'; foreach ($fields->getVisibleFields() as $field) { $out .= '<tr>'; $content = $renderer->getContentRenderer()->render($field, $data, $rowIndex, 1); $classNames = $renderer->getTdClassNamesRenderer()->render($field, $data, $rowIndex, 1); $header = $renderer->getHeaderRenderer()->render($field); if (false !== stripos($content, '<table ')) { $out .= $this->renderTableContentInPanel($header, $classNames, $content); } else { $out .= $this->renderHeaderAndContent($header, $classNames, $content); } $out .= '</tr>'; $rowIndex += 1; } $out .= '</table>'; $out .= '</div>'; return $out; }