array( 'label' => 'Edit', 'icon' => null, 'class' => 'popuplink editlink', ), 'delete' => array( 'label' => 'Delete', 'icon' => null, 'class' => 'deletelink', ) ); public $popupClass = "DataObjectManager_Popup"; public $templatePopup = "DataObjectManager_popup"; function __construct($controller, $name, $sourceClass, $fieldList = null, $detailFormFields = null, $sourceFilter = "", $sourceSort = "", $sourceJoin = "") { if(!class_exists("ComplexTableField_ItemRequest")) die(""._t('DataObjectManager.ERROR','Error').": "._t('DataObjectManager.SILVERSTRIPEVERSION','DataObjectManager requires Silverstripe version 2.3 or higher.')); parent::__construct($controller, $name, $sourceClass, $fieldList, $detailFormFields, $sourceFilter, $sourceSort, $sourceJoin); Requirements::block(THIRDPARTY_DIR . "/greybox/AmiJS.js"); Requirements::block(THIRDPARTY_DIR . "prototype.js"); Requirements::block(THIRDPARTY_DIR . "/greybox/greybox.js"); Requirements::block(SAPPHIRE_DIR . "/javascript/ComplexTableField.js"); Requirements::block(SAPPHIRE_DIR . "/javascript/TableListField.js"); Requirements::block(THIRDPARTY_DIR . "/greybox/greybox.css"); Requirements::block(SAPPHIRE_DIR . "/css/ComplexTableField.css"); Requirements::css('dataobject_manager/css/dataobject_manager.css'); Requirements::css('dataobject_manager/css/facebox.css'); Requirements::javascript('dataobject_manager/javascript/facebox.js'); Requirements::javascript('dataobject_manager/javascript/jquery-ui.1.5.3.js'); Requirements::javascript('dataobject_manager/javascript/dataobject_manager.js'); Requirements::javascript('dataobject_manager/javascript/tooltip.js'); $this->filter_empty_string = '-- '._t('DataObjectManager.NOFILTER','No filter').' --'; if(isset($_REQUEST['ctf'][$this->Name()])) { $this->per_page = $_REQUEST['ctf'][$this->Name()]['per_page']; $this->showAll = $_REQUEST['ctf'][$this->Name()]['showall']; $this->search = $_REQUEST['ctf'][$this->Name()]['search']; $this->filter = $_REQUEST['ctf'][$this->Name()]['filter']; $this->sort = $_REQUEST['ctf'][$this->Name()]['sort']; $this->sort_dir = $_REQUEST['ctf'][$this->Name()]['sort_dir']; } $this->setPageSize($this->per_page); $this->loadSort(); $this->loadSourceFilter(); } protected function loadSort() { if($this->ShowAll()) $this->setPageSize(999); if($this->Sortable() && (!isset($_REQUEST['ctf'][$this->Name()]['sort']) || $_REQUEST['ctf'][$this->Name()]['sort'] == "SortOrder")) { $this->sort = "SortOrder"; $this->sourceSort = "SortOrder ASC"; } elseif(isset($_REQUEST['ctf'][$this->Name()]['sort'])) $this->sourceSort = $_REQUEST['ctf'][$this->Name()]['sort'] . " " . $this->sort_dir; } protected function loadSourceFilter() { $filter_string = ""; if(!empty($this->filter)) { $break = strpos($this->filter, "_"); $field = substr($this->filter, 0, $break); $value = substr($this->filter, $break+1, strlen($this->filter) - strlen($field)); $filter_string = $field . "='$value'"; } $search_string = ""; if(!empty($this->search)) { $search = array(); $SNG = singleton($this->sourceClass); foreach(parent::Headings() as $field) { if($SNG->hasField($field->Name)) $search[] = "UPPER($field->Name) LIKE '%".strtoupper($this->search)."%'"; } $search_string = "(".implode(" OR ", $search).")"; } $and = (!empty($this->filter) && !empty($this->search)) ? " AND " : ""; $source_filter = $filter_string.$and.$search_string; if(!$this->sourceFilter) $this->sourceFilter = $source_filter; else if($this->sourceFilter && !empty($source_filter)) $this->sourceFilter .= " AND " . $source_filter; } public function handleItem($request) { return new DataObjectManager_ItemRequest($this, $request->param('ID')); } protected function getQueryString($params = array()) { $per_page = isset($params['per_page'])? $params['per_page'] : $this->per_page; $show_all = isset($params['show_all'])? $params['show_all'] : $this->showAll; $sort = isset($params['sort'])? $params['sort'] : $this->sort; $sort_dir = isset($params['sort_dir'])? $params['sort_dir'] : $this->sort_dir; $filter = isset($params['filter'])? $params['filter'] : $this->filter; $search = isset($params['search'])? $params['search'] : $this->search; return "ctf[{$this->Name()}][per_page]={$per_page}&ctf[{$this->Name()}][showall]={$show_all}&ctf[{$this->Name()}][sort]={$sort}&ctf[{$this->Name()}][sort_dir]={$sort_dir}&ctf[{$this->Name()}][search]={$search}&ctf[{$this->Name()}][filter]={$filter}"; } public function Headings() { $headings = array(); foreach($this->fieldList as $fieldName => $fieldTitle) { if(isset($_REQUEST['ctf'][$this->Name()]['sort_dir'])) $dir = $_REQUEST['ctf'][$this->Name()]['sort_dir'] == "ASC" ? "DESC" : "ASC"; else $dir = "ASC"; $headings[] = new ArrayData(array( "Name" => $fieldName, "Title" => ($this->sourceClass) ? singleton($this->sourceClass)->fieldLabel($fieldTitle) : $fieldTitle, "IsSortable" => singleton($this->sourceClass)->hasField($fieldName), "SortLink" => $this->RelativeLink(array( 'sort_dir' => $dir, 'sort' => $fieldName )), "SortDirection" => $dir, "IsSorted" => (isset($_REQUEST['ctf'][$this->Name()]['sort'])) && ($_REQUEST['ctf'][$this->Name()]['sort'] == $fieldName), "ColumnWidthCSS" => !empty($this->column_widths) ? sprintf("style='width:%f%%;'",($this->column_widths[$fieldName] - 0.1)) : "" )); } return new DataObjectSet($headings); } function saveComplexTableField($data, $form, $params) { $className = $this->sourceClass(); $childData = new $className(); $form->saveInto($childData); $childData->write(); $form->sessionMessage(sprintf(_t('DataObjectManager.ADDEDNEW','Added new %s successfully'),$this->SingleTitle()), 'good'); if($form->getFileField()) { $form->clearMessage(); Director::redirect($this->BaseLink().'/item/'.$childData->ID.'/edit'); } else Director::redirectBack(); } function getCustomFieldsFor($childData) { if(is_a($this->detailFormFields,"Fieldset")) $fields = $this->detailFormFields; else { if(!is_string($this->detailFormFields)) $this->detailFormFields = "getCMSFields"; $functioncall = $this->detailFormFields; if(!$childData->hasMethod($functioncall)) $functioncall = "getCMSFields"; $fields = $childData->$functioncall(); } foreach($fields as $field) { if($field->class == "CalendarDateField") $fields->replaceField($field->Name(), new DatePickerField($field->Name(), $field->Title(), $field->attrValue())); } return $fields; } function AddForm($childID = null) { $form = parent::AddForm($childID); $actions = new FieldSet(); $text = ($field = $form->getFileField()) ? sprintf(_t('DataObjectManager.SAVEANDADD','Save and add %s'), $field->Title()) : _t('DataObjectManager.SAVE','Save'); $actions->push( $saveAction = new FormAction("saveComplexTableField", $text) ); $saveAction->addExtraClass('save'); $form->setActions($actions); return $form; } public function Link($action = null) { return parent::Link($action)."?".$this->getQueryString(); } public function BaseLink($action = null) { return parent::Link($action); } public function CurrentLink($action = null) { return $this->Link($action); } public function RelativeLink($params = array(), $action = null) { return parent::Link($action)."?".$this->getQueryString($params); } public function FirstLink($action = null) { return parent::FirstLink($action) ? parent::FirstLink($action)."&".$this->getQueryString() : false; } public function PrevLink($action = null) { return parent::PrevLink($action) ? parent::PrevLink($action)."&".$this->getQueryString() : false; } public function NextLink($action = null) { return parent::NextLink($action) ? parent::NextLink($action)."&".$this->getQueryString() : false; } public function LastLink($action = null) { return parent::LastLink($action) ? parent::LastLink($action)."&".$this->getQueryString() : false; } public function ShowAllLink($action = null) { return $this->RelativeLink(array('show_all' => '1'),$action); } public function PaginatedLink($action = null) { return $this->RelativeLink(array('show_all' => '0'),$action); } public function AddLink($action = null) { return $this->BaseLink($action) . '/add'; } public function ShowAll() { return $this->showAll == "1"; } public function Paginated() { return $this->showAll == "0"; } public function Sortable() { return SortableDataObject::is_sortable_class($this->sourceClass()); } public function setFilter($field, $label, $map) { if(is_array($map)) { $this->filter_map = $map; $this->filtered_field = $field; $this->filter_label = $label; } } public function HasFilter() { return !empty($this->filter_map); } public function FilterDropdown() { $map = $this->filter_empty_string ? array($this->RelativeLink(array('filter' => '')) => $this->filter_empty_string) : array(); foreach($this->filter_map as $k => $v) { $map[$this->RelativeLink(array('filter' => $this->filtered_field.'_'.$k))] = $v; } $value = !empty($this->filter) ? $this->RelativeLink(array('filter' => $this->filter)) : null; $dropdown = new DropdownField('Filter',$this->filter_label . " ("._t('DataObjectManager.REFRESH','refresh').")", $map, $value); return $dropdown->FieldHolder(); } public function PerPageDropdown() { $map = array(); for($i=10;$i<=50;$i+=10) $map[$this->RelativeLink(array('per_page' => $i))] = $i; $value = !empty($this->per_page) ? $this->RelativeLink(array('per_page' => $this->per_page)) : null; return new FieldGroup( new LabelField('show', _t('DataObjectManager.PERPAGESHOW','Show').' '), new DropdownField('PerPage','',$map, $value), new LabelField('results', ' '._t('DataObjectManager.PERPAGERESULTS','results per page')) ); } public function SearchValue() { return !empty($this->search) ? $this->search : false; } public function AddTitle() { return $this->addTitle ? $this->addTitle : $this->Title(); } public function SingleTitle() { return $this->singleTitle ? $this->singleTitle : $this->AddTitle(); } public function setAddTitle($title) { $this->addTitle = $title; } public function setSingleTitle($title) { $this->singleTitle = $title; } public function getColumnWidths() { return $this->column_widths; } public function setColumnWidths($widths) { if(is_array($widths)) { $total = 0; foreach($widths as $name => $value) $total += $value; if($total != 100) die('DataObjectManager::setColumnWidths():' . sprintf(_t('DataObjectManager.TOTALNOT100','Column widths must total 100 and not %s'), $total)); else $this->column_widths = $widths; } } public function setFilterEmptyString($str) { $this->filter_empty_string = $str; } } class DataObjectManager_Item extends ComplexTableField_Item { function __construct(DataObject $item, DataObjectManager $parent, $start) { parent::__construct($item, $parent, $start); } function Link($action = null) { return $this->parent->BaseLink(Controller::join_links('item', $this->item->ID, $action)); } function Fields() { $fields = parent::Fields(); $widths = $this->parent->getColumnWidths(); if(!empty($widths)) { foreach($fields as $field) { $field->ColumnWidthCSS = sprintf("style='width:%f%%;'",($widths[$field->Name] - 0.1)); } } return $fields; } } class DataObjectManager_Controller extends Controller { function dosort() { if(!empty($_POST) && is_array($_POST) && isset($this->urlParams['ID'])) { $className = $this->urlParams['ID']; foreach($_POST as $group => $map) { if(substr($group, 0, 7) == "record-") { foreach($map as $sort => $id) { $obj = DataObject::get_by_id($className, $id); $obj->SortOrder = $sort; $obj->write(); } } } } } } class DataObjectManager_Popup extends Form { protected $sourceClass; protected $dataObject; function __construct($controller, $name, $fields, $validator, $readonly, $dataObject) { $this->dataObject = $dataObject; Requirements::clear(); Requirements::block('/jsparty/behaviour.js'); Requirements::block('sapphire/javascript/Validator.js'); Requirements::block('jsparty/prototype.js'); Requirements::block('jsparty/behavior.js'); Requirements::block('jsparty/jquery/jquery.js'); Requirements::clear('jsparty/behavior.js'); Requirements::block('sapphire/javascript/i18n.js'); Requirements::block('assets/base.js'); Requirements::block('sapphire/javascript/lang/en_US.js'); Requirements::css(SAPPHIRE_DIR . '/css/Form.css'); Requirements::css(CMS_DIR . '/css/typography.css'); Requirements::css(CMS_DIR . '/css/cms_right.css'); Requirements::css('dataobject_manager/css/dataobject_manager.css'); if($this->dataObject->hasMethod('getRequirementsForPopup')) { $this->dataObject->getRequirementsForPopup(); } Requirements::javascript('dataobject_manager/javascript/jquery.1.3.js'); // File iframe fields force horizontal scrollbars in the popup. Not cool. // Override the close popup method. Requirements::customScript(" jQuery(function() { jQuery('iframe').css({'width':'433px'}); }); "); $actions = new FieldSet(); if(!$readonly) { $actions->push( $saveAction = new FormAction("saveComplexTableField", _t('DataObjectManager.SAVE','Save')) ); $saveAction->addExtraClass('save'); } parent::__construct($controller, $name, $fields, $actions, $validator); $this->unsetValidator(); } function FieldHolder() { return $this->renderWith('ComplexTableField_Form'); } public function getFileField() { foreach($this->Fields() as $field) { if($field instanceof FileIFrameField || $field instanceof ImageField) return $field; } return false; } } class DataObjectManager_ItemRequest extends ComplexTableField_ItemRequest { function __construct($ctf, $itemID) { parent::__construct($ctf, $itemID); } function Link($action = null) { return $this->ctf->BaseLink(Controller::join_links('item', $this->itemID, $action)); } function saveComplexTableField($data, $form, $request) { $form->saveInto($this->dataObj()); $this->dataObj()->write(); $form->sessionMessage(sprintf(_t('DataObjectManager.SAVED','Saved %s successfully'),$this->ctf->SingleTitle()), 'good'); Director::redirectBack(); } } */ ?>