mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FEATURE added GridFieldPrintButton compoonent
This commit is contained in:
parent
00b904b01c
commit
ba02e500e7
169
forms/gridfield/GridFieldPrintButton.php
Normal file
169
forms/gridfield/GridFieldPrintButton.php
Normal file
@ -0,0 +1,169 @@
|
||||
<?php
|
||||
/**
|
||||
* @package sapphire
|
||||
* @subpackage gridfield
|
||||
*/
|
||||
|
||||
/**
|
||||
* Adds an "Print" button to the bottom or top of a GridField.
|
||||
*
|
||||
* WARNING: This is experimental and its API is subject to change. Feel free to use it as long as you are happy of
|
||||
* refactoring your code in the future.
|
||||
*/
|
||||
class GridFieldPrintButton implements GridField_HTMLProvider, GridField_ActionProvider, GridField_URLHandler {
|
||||
|
||||
/**
|
||||
* @var array Map of a property name on the printed objects, with values being the column title in the CSV file.
|
||||
* Note that titles are only used when {@link $csvHasHeader} is set to TRUE.
|
||||
*/
|
||||
protected $printColumns;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
protected $printHasHeader = true;
|
||||
|
||||
/**
|
||||
* Fragment to write the button to
|
||||
*/
|
||||
protected $targetFragment;
|
||||
|
||||
/**
|
||||
* @param string $targetFragment The HTML fragment to write the button into
|
||||
* @param array $printColumns The columns to include in the print view
|
||||
*/
|
||||
public function __construct($targetFragment = "after", $printColumns = null) {
|
||||
$this->targetFragment = $targetFragment;
|
||||
$this->printColumns = $printColumns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Place the print button in a <p> tag below the field
|
||||
*/
|
||||
public function getHTMLFragments($gridField) {
|
||||
$button = new GridField_FormAction(
|
||||
$gridField,
|
||||
'print',
|
||||
_t('TableListField.Print', 'Print'),
|
||||
'print',
|
||||
null
|
||||
);
|
||||
$button->setAttribute('data-icon', 'grid_print');
|
||||
$button->addExtraClass('gridfield-button-print');
|
||||
//$button->addExtraClass('no-ajax');
|
||||
return array(
|
||||
$this->targetFragment => '<p>' . $button->Field() . '</p>',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* print is an action button
|
||||
*/
|
||||
public function getActions($gridField) {
|
||||
return array('print');
|
||||
}
|
||||
|
||||
function handleAction(GridField $gridField, $actionName, $arguments, $data) {
|
||||
if($actionName == 'print') {
|
||||
return $this->handlePrint($gridField);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* it is also a URL
|
||||
*/
|
||||
function getURLHandlers($gridField) {
|
||||
return array(
|
||||
'print' => 'handlePrint',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the print, for both the action button and the URL
|
||||
*/
|
||||
public function handlePrint($gridField, $request = null) {
|
||||
set_time_limit(60);
|
||||
Requirements::clear();
|
||||
Requirements::css(SAPPHIRE_DIR . '/css/GridField_print.css');
|
||||
if($data = $this->generatePrintData($gridField)){
|
||||
return $data->renderWith("GridField_print");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Export core.
|
||||
*/
|
||||
function generatePrintData($gridField) {
|
||||
$printColumns = ($this->printColumns) ? $this->printColumns : $gridField->getDisplayFields();
|
||||
if($this->printHasHeader){
|
||||
$header = new ArrayList();
|
||||
foreach($printColumns as $field => $label){
|
||||
$header->push(
|
||||
new ArrayData(array(
|
||||
"CellString" => $label,
|
||||
))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$items = $gridField->getList();
|
||||
$itemRows = new ArrayList();
|
||||
foreach($items as $item) {
|
||||
$itemRow = new ArrayList();
|
||||
foreach($printColumns as $field => $label) {
|
||||
$value = $item->relField($field);
|
||||
$itemRow->push(
|
||||
new ArrayData(array(
|
||||
"CellString" => $value,
|
||||
))
|
||||
);
|
||||
}
|
||||
$itemRows->push(new ArrayData(
|
||||
array(
|
||||
"ItemRow" => $itemRow
|
||||
)
|
||||
));
|
||||
}
|
||||
$ret = new ArrayData(
|
||||
array(
|
||||
"Header" => $header,
|
||||
"ItemRows" => $itemRows,
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
$item->destroy();
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
function getPrintColumns() {
|
||||
return $this->printColumns;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array
|
||||
*/
|
||||
function setPrintColumns($cols) {
|
||||
$this->printColumns = $cols;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return boolean
|
||||
*/
|
||||
function getPrintHasHeader() {
|
||||
return $this->printHasHeader;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param boolean
|
||||
*/
|
||||
function setPrintHasHeader($bool) {
|
||||
$this->printHasHeader = $bool;
|
||||
return $this;
|
||||
}
|
||||
}
|
@ -112,6 +112,48 @@
|
||||
}
|
||||
});
|
||||
|
||||
$('.ss-gridfield .action.gridfield-button-print').entwine({
|
||||
UUID: null,
|
||||
onmatch: function() {
|
||||
this._super();
|
||||
this.setUUID(new Date().getTime());
|
||||
},
|
||||
onclick: function(e){
|
||||
var self = this, iframeID = 'gridfield-print-iframe' + this.getUUID();
|
||||
var printIframe = $('#' + iframeID);
|
||||
|
||||
if(!printIframe.length){
|
||||
printIframe = $('<IFRAME id="'+iframeID+'" class="ss-gridfield-print-iframe">');
|
||||
$(document.body).append(printIframe);
|
||||
}
|
||||
|
||||
var self = this, btn = this.closest(':button'), grid = this.getGridField(),
|
||||
form = this.closest('form'), data = form.find(':input').serialize();
|
||||
|
||||
// Add current button
|
||||
data += '&' + encodeURIComponent(btn.attr('name')) + '=' + encodeURIComponent(btn.val());
|
||||
|
||||
// Include any GET parameters from the current URL, as the view state might depend on it.
|
||||
// For example, a list prefiltered through external search criteria might be passed to GridField.
|
||||
if(window.location.search) data = window.location.search.replace(/^\?/, '') + '&' + data;
|
||||
|
||||
var url = $.path.makeUrlAbsolute(grid.data('url') + '?' + data, $('base').attr('href'));
|
||||
printIframe.attr('src', url);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
$('.ss-gridfield-print-iframe').entwine({
|
||||
onmatch: function(){
|
||||
this.hide().bind('load', function()
|
||||
{
|
||||
this.focus();
|
||||
var ifWin = this.contentWindow || this;
|
||||
ifWin.print();
|
||||
});;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Prevents actions from causing an ajax reload of the field.
|
||||
* Useful e.g. for actions which rely on HTTP response headers being interpreted nativel
|
||||
|
3
scss/GridField_print.scss
Normal file
3
scss/GridField_print.scss
Normal file
@ -0,0 +1,3 @@
|
||||
table td{
|
||||
border: 1px solid black;
|
||||
}
|
17
templates/Includes/GridField_print.ss
Normal file
17
templates/Includes/GridField_print.ss
Normal file
@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//MI" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="mi" lang="mi">
|
||||
<head>
|
||||
</head>
|
||||
<body>
|
||||
<table>
|
||||
<thead>
|
||||
<tr><% control Header %><td>$CellString</td><% end_control %></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% control ItemRows %>
|
||||
<tr><% control ItemRow %><td>$CellString</td><% end_control %></tr>
|
||||
<% end_control %>
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user