From bbc0215635e9ccfe621167b11304f80613e1b582 Mon Sep 17 00:00:00 2001 From: Peter Thaleikis Date: Wed, 16 Dec 2015 01:08:57 +1300 Subject: [PATCH] Converting to PSR-2 --- _config.php | 11 +- .../code/GridFieldBulkActionDeleteHandler.php | 77 +- .../code/GridFieldBulkActionEditHandler.php | 656 ++++++++-------- .../code/GridFieldBulkActionHandler.php | 230 +++--- .../code/GridFieldBulkActionUnlinkHandler.php | 72 +- bulkManager/code/GridFieldBulkManager.php | 636 ++++++++-------- bulkUpload/code/GridFieldBulkImageUpload.php | 17 +- bulkUpload/code/GridFieldBulkUpload.php | 720 +++++++++--------- .../code/GridFieldBulkUpload_Request.php | 506 ++++++------ tasks/BuildTransifexTranslations.php | 309 ++++---- 10 files changed, 1580 insertions(+), 1654 deletions(-) diff --git a/_config.php b/_config.php index dde7bb7..5ed7c55 100644 --- a/_config.php +++ b/_config.php @@ -1,9 +1,8 @@ action map. + * + * @var array + */ + private static $url_handlers = array( + 'delete' => 'delete', + ); - /** - * RequestHandler url => action map - * @var array - */ - private static $url_handlers = array( - 'delete' => 'delete' - ); - + /** + * Delete the selected records passed from the delete bulk action. + * + * @param SS_HTTPRequest $request + * + * @return SS_HTTPResponse List of deleted records ID + */ + public function delete(SS_HTTPRequest $request) + { + $ids = array(); - /** - * Delete the selected records passed from the delete bulk action - * - * @param SS_HTTPRequest $request - * @return SS_HTTPResponse List of deleted records ID - */ - public function delete(SS_HTTPRequest $request) - { - $ids = array(); - - foreach ( $this->getRecords() as $record ) - { - array_push($ids, $record->ID); - $record->delete(); - } + foreach ($this->getRecords() as $record) { + array_push($ids, $record->ID); + $record->delete(); + } - $response = new SS_HTTPResponse(Convert::raw2json(array( - 'done' => true, - 'records' => $ids - ))); - $response->addHeader('Content-Type', 'text/json'); - return $response; - } -} \ No newline at end of file + $response = new SS_HTTPResponse(Convert::raw2json(array( + 'done' => true, + 'records' => $ids, + ))); + $response->addHeader('Content-Type', 'text/json'); + + return $response; + } +} diff --git a/bulkManager/code/GridFieldBulkActionEditHandler.php b/bulkManager/code/GridFieldBulkActionEditHandler.php index 880e8fe..43798ad 100644 --- a/bulkManager/code/GridFieldBulkActionEditHandler.php +++ b/bulkManager/code/GridFieldBulkActionEditHandler.php @@ -3,394 +3,372 @@ * Bulk action handler for editing records. * * @author colymba - * @package GridFieldBulkEditingTools - * @subpackage BulkManager */ class GridFieldBulkActionEditHandler extends GridFieldBulkActionHandler -{ - /** - * RequestHandler allowed actions - * @var array - */ - private static $allowed_actions = array( - 'index', - 'bulkEditForm', - 'recordEditForm' - ); +{ + /** + * RequestHandler allowed actions. + * + * @var array + */ + private static $allowed_actions = array( + 'index', + 'bulkEditForm', + 'recordEditForm', + ); - - /** - * RequestHandler url => action map - * @var array - */ - private static $url_handlers = array( - 'bulkEdit/bulkEditForm' => 'bulkEditForm', + /** + * RequestHandler url => action map. + * + * @var array + */ + private static $url_handlers = array( + 'bulkEdit/bulkEditForm' => 'bulkEditForm', 'bulkEdit/recordEditForm' => 'recordEditForm', - 'bulkEdit' => 'index' - ); + 'bulkEdit' => 'index', + ); + /** + * Return URL to this RequestHandler. + * + * @param string $action Action to append to URL + * + * @return string URL + */ + public function Link($action = null) + { + return Controller::join_links(parent::Link(), 'bulkEdit', $action); + } - /** - * Return URL to this RequestHandler - * @param string $action Action to append to URL - * @return string URL - */ - public function Link($action = null) - { - return Controller::join_links(parent::Link(), 'bulkEdit', $action); - } + /** + * Return a form for all the selected DataObjects + * with their respective editable fields. + * + * @return Form Selected DataObjects editable fields + */ + public function bulkEditForm() + { + $crumbs = $this->Breadcrumbs(); + if ($crumbs && $crumbs->count() >= 2) { + $one_level_up = $crumbs->offsetGet($crumbs->count() - 2); + } + $actions = new FieldList(); - /** - * Return a form for all the selected DataObjects - * with their respective editable fields. - * - * @return Form Selected DataObjects editable fields - */ - public function bulkEditForm() - { - $crumbs = $this->Breadcrumbs(); - if($crumbs && $crumbs->count()>=2) - { - $one_level_up = $crumbs->offsetGet($crumbs->count()-2); - } - - $actions = new FieldList(); - - $actions->push( - FormAction::create('doSave', _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.SAVE_BTN_LABEL', 'Save all')) - ->setAttribute('id', 'bulkEditingSaveBtn') - ->addExtraClass('ss-ui-action-constructive') - ->setAttribute('data-icon', 'accept') - ->setUseButtonTag(true) - ); - - $actions->push( - FormAction::create('Cancel', _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.CANCEL_BTN_LABEL', 'Cancel')) - ->setAttribute('id', 'bulkEditingUpdateCancelBtn') - ->addExtraClass('ss-ui-action-destructive cms-panel-link') - ->setAttribute('data-icon', 'decline') - ->setAttribute('href', $one_level_up->Link) - ->setUseButtonTag(true) - ->setAttribute('src', '')//changes type to image so isn't hooked by default actions handlers - ); - - $recordList = $this->getRecordIDList(); - $recordsFieldList = new FieldList(); - $config = $this->component->getConfig(); + $actions->push( + FormAction::create('doSave', _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.SAVE_BTN_LABEL', 'Save all')) + ->setAttribute('id', 'bulkEditingSaveBtn') + ->addExtraClass('ss-ui-action-constructive') + ->setAttribute('data-icon', 'accept') + ->setUseButtonTag(true) + ); - $editingCount = count($recordList); - $modelClass = $this->gridField->getModelClass(); - $singleton = singleton($modelClass); - $titleModelClass = (($editingCount > 1) ? $singleton->i18n_plural_name() : $singleton->i18n_singular_name()); + $actions->push( + FormAction::create('Cancel', _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.CANCEL_BTN_LABEL', 'Cancel')) + ->setAttribute('id', 'bulkEditingUpdateCancelBtn') + ->addExtraClass('ss-ui-action-destructive cms-panel-link') + ->setAttribute('data-icon', 'decline') + ->setAttribute('href', $one_level_up->Link) + ->setUseButtonTag(true) + ->setAttribute('src', '')//changes type to image so isn't hooked by default actions handlers + ); + + $recordList = $this->getRecordIDList(); + $recordsFieldList = new FieldList(); + $config = $this->component->getConfig(); + + $editingCount = count($recordList); + $modelClass = $this->gridField->getModelClass(); + $singleton = singleton($modelClass); + $titleModelClass = (($editingCount > 1) ? $singleton->i18n_plural_name() : $singleton->i18n_singular_name()); //some cosmetics $headerText = _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.HEADER_TEXT', - 'Editing {count} {class}', - array( - 'count' => $editingCount, - 'class' => $titleModelClass - ) - ); - $header = LiteralField::create( - 'bulkEditHeader', - '

' . $headerText . '

' - ); - $recordsFieldList->push($header); + 'Editing {count} {class}', + array( + 'count' => $editingCount, + 'class' => $titleModelClass, + ) + ); + $header = LiteralField::create( + 'bulkEditHeader', + '

'.$headerText.'

' + ); + $recordsFieldList->push($header); - $toggle = LiteralField::create('bulkEditToggle', '' . _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.TOGGLE_ALL_LINK', 'Show/Hide all') . ''); - $recordsFieldList->push($toggle); + $toggle = LiteralField::create('bulkEditToggle', ''._t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.TOGGLE_ALL_LINK', 'Show/Hide all').''); + $recordsFieldList->push($toggle); - - //fetch fields for each record and push to fieldList - foreach ( $recordList as $id ) - { - $record = DataObject::get_by_id($modelClass, $id); - $recordEditingFields = $this->getRecordEditingFields($record); + //fetch fields for each record and push to fieldList + foreach ($recordList as $id) { + $record = DataObject::get_by_id($modelClass, $id); + $recordEditingFields = $this->getRecordEditingFields($record); - $toggleField = ToggleCompositeField::create( - 'RecordFields_'.$id, - $record->getTitle(), - $recordEditingFields - ) - ->setHeadingLevel(4) - ->setAttribute('data-id', $id) - ->addExtraClass('bulkEditingFieldHolder'); + $toggleField = ToggleCompositeField::create( + 'RecordFields_'.$id, + $record->getTitle(), + $recordEditingFields + ) + ->setHeadingLevel(4) + ->setAttribute('data-id', $id) + ->addExtraClass('bulkEditingFieldHolder'); - $recordsFieldList->push($toggleField); - } - - $bulkEditForm = Form::create( - $this, - 'recordEditForm', //recordEditForm name is here to trick SS to pass all subform request to recordEditForm() - $recordsFieldList, - $actions - ); - - if($crumbs && $crumbs->count()>=2){ - $bulkEditForm->Backlink = $one_level_up->Link; - } + $recordsFieldList->push($toggleField); + } - //override form action URL back to bulkEditForm - //and add record ids GET var - $bulkEditForm->setAttribute( - 'action', - $this->Link('bulkEditForm?records[]='.implode('&', $recordList)) - ); + $bulkEditForm = Form::create( + $this, + 'recordEditForm', //recordEditForm name is here to trick SS to pass all subform request to recordEditForm() + $recordsFieldList, + $actions + ); - return $bulkEditForm; - } + if ($crumbs && $crumbs->count() >= 2) { + $bulkEditForm->Backlink = $one_level_up->Link; + } + //override form action URL back to bulkEditForm + //and add record ids GET var + $bulkEditForm->setAttribute( + 'action', + $this->Link('bulkEditForm?records[]='.implode('&', $recordList)) + ); - /** - * Return's a form with only one record's fields - * Used for bulkEditForm subForm requests via ajax - * - * @return Form Currently being edited form - */ - public function recordEditForm() - { - //clone current request : used to figure out what record we are asking - $request = clone $this->request; - $recordInfo = $request->shift(); + return $bulkEditForm; + } - //shift request till we find the requested field - while ($recordInfo) - { - if ( $unescapedRecordInfo = $this->unEscapeFieldName($recordInfo) ) - { - $id = $unescapedRecordInfo['id']; - $fieldName = $unescapedRecordInfo['name']; + /** + * Return's a form with only one record's fields + * Used for bulkEditForm subForm requests via ajax. + * + * @return Form Currently being edited form + */ + public function recordEditForm() + { + //clone current request : used to figure out what record we are asking + $request = clone $this->request; + $recordInfo = $request->shift(); - $action = $request->shift(); - break; - } - else{ - $recordInfo = $request->shift(); - } - } + //shift request till we find the requested field + while ($recordInfo) { + if ($unescapedRecordInfo = $this->unEscapeFieldName($recordInfo)) { + $id = $unescapedRecordInfo['id']; + $fieldName = $unescapedRecordInfo['name']; - //generate a form with only that requested record's fields - if ( $id ) - { - $modelClass = $this->gridField->getModelClass(); - $record = DataObject::get_by_id($modelClass, $id); + $action = $request->shift(); + break; + } else { + $recordInfo = $request->shift(); + } + } - $cmsFields = $record->getCMSFields(); - $recordEditingFields = $this->getRecordEditingFields($record); - - return Form::create( - $this->gridField, - 'recordEditForm', - FieldList::create($recordEditingFields), - FieldList::create() - ); - } - } + //generate a form with only that requested record's fields + if ($id) { + $modelClass = $this->gridField->getModelClass(); + $record = DataObject::get_by_id($modelClass, $id); + $cmsFields = $record->getCMSFields(); + $recordEditingFields = $this->getRecordEditingFields($record); - /** - * Returns a record's populated form fields - * with all filtering done ready to be included in the main form - * - * @uses DataObject::getCMSFields() - * - * @param DataObject $record The record to get the fields from - * @return array The record's editable fields - */ - private function getRecordEditingFields(DataObject $record) - { - $tempForm = Form::create( - $this, "TempEditForm", - $record->getCMSFields(), - FieldList::create() - ); + return Form::create( + $this->gridField, + 'recordEditForm', + FieldList::create($recordEditingFields), + FieldList::create() + ); + } + } - $tempForm->loadDataFrom($record); - $fields = $tempForm->Fields(); + /** + * Returns a record's populated form fields + * with all filtering done ready to be included in the main form. + * + * @uses DataObject::getCMSFields() + * + * @param DataObject $record The record to get the fields from + * + * @return array The record's editable fields + */ + private function getRecordEditingFields(DataObject $record) + { + $tempForm = Form::create( + $this, 'TempEditForm', + $record->getCMSFields(), + FieldList::create() + ); - $fields = $this->filterRecordEditingFields($fields, $record->ID); + $tempForm->loadDataFrom($record); + $fields = $tempForm->Fields(); - return $fields; - } + $fields = $this->filterRecordEditingFields($fields, $record->ID); + return $fields; + } - /** - * Filters a records editable fields - * based on component's config - * and escape each field with unique name. - * - * See {@link GridFieldBulkManager} component for filtering config. - * - * @param FieldList $fields Record's CMS Fields - * @param integer $id Record's ID, used fir unique name - * @return array Filtered record's fields - */ - private function filterRecordEditingFields(FieldList $fields, $id) - { - $config = $this->component->getConfig(); - $editableFields = $config['editableFields']; + /** + * Filters a records editable fields + * based on component's config + * and escape each field with unique name. + * + * See {@link GridFieldBulkManager} component for filtering config. + * + * @param FieldList $fields Record's CMS Fields + * @param int $id Record's ID, used fir unique name + * + * @return array Filtered record's fields + */ + private function filterRecordEditingFields(FieldList $fields, $id) + { + $config = $this->component->getConfig(); + $editableFields = $config['editableFields']; // get all dataFields or just the ones allowed in config - if ( $editableFields ) - { - $dataFields = array(); + if ($editableFields) { + $dataFields = array(); - foreach ($editableFields as $fieldName) - { - $dataFields[$fieldName] = $fields->dataFieldByName($fieldName); - } - } - else{ - $dataFields = $fields->dataFields(); - } + foreach ($editableFields as $fieldName) { + $dataFields[$fieldName] = $fields->dataFieldByName($fieldName); + } + } else { + $dataFields = $fields->dataFields(); + } - // escape field names with unique prefix - foreach ( $dataFields as $name => $field ) - { - $field->Name = $this->escapeFieldName($id, $name); - $dataFields[$name] = $field; - } - - return $dataFields; - } + // escape field names with unique prefix + foreach ($dataFields as $name => $field) { + $field->Name = $this->escapeFieldName($id, $name); + $dataFields[$name] = $field; + } + return $dataFields; + } - /** - * Escape a fieldName with a unique prefix - * - * @param integer $recordID Record id from who the field belongs - * @param string $name Field name - * @return string Escaped field name - */ - protected function escapeFieldName($recordID, $name) - { - return 'record_' . $recordID . '_' . $name; - } + /** + * Escape a fieldName with a unique prefix. + * + * @param int $recordID Record id from who the field belongs + * @param string $name Field name + * + * @return string Escaped field name + */ + protected function escapeFieldName($recordID, $name) + { + return 'record_'.$recordID.'_'.$name; + } + /** + * Un-escape a previously escaped field name. + * + * @param string $fieldName Escaped field name + * + * @return array|false Fasle if the fieldName was not escaped. Or Array map with record 'id' and field 'name' + */ + protected function unEscapeFieldName($fieldName) + { + $parts = array(); + $match = preg_match('/record_(\d+)_(\w+)/i', $fieldName, $parts); - /** - * Un-escape a previously escaped field name - * - * @param string $fieldName Escaped field name - * @return array|false Fasle if the fieldName was not escaped. Or Array map with record 'id' and field 'name' - */ - protected function unEscapeFieldName($fieldName) - { - $parts = array(); - $match = preg_match('/record_(\d+)_(\w+)/i', $fieldName, $parts); + if (!$match) { + return false; + } else { + return array( + 'id' => $parts[1], + 'name' => $parts[2], + ); + } + } - if ( !$match ) - { - return false; - } - else{ - return array( - 'id' => $parts[1], - 'name' => $parts[2], - ); - } - } - - - /** - * Creates and return the bulk editing interface - * - * @return string Form's HTML - */ - public function index() - { - $form = $this->bulkEditForm(); - $form->setTemplate('LeftAndMain_EditForm'); - $form->addExtraClass('center cms-content'); - $form->setAttribute('data-pjax-fragment', 'CurrentForm Content'); - - Requirements::javascript(BULKEDITTOOLS_MANAGER_PATH . '/javascript/GridFieldBulkEditingForm.js'); - Requirements::css(BULKEDITTOOLS_MANAGER_PATH . '/css/GridFieldBulkEditingForm.css'); - Requirements::add_i18n_javascript(BULKEDITTOOLS_PATH . '/lang/js'); - - if($this->request->isAjax()) - { - $response = new SS_HTTPResponse( - Convert::raw2json(array( 'Content' => $form->forAjaxTemplate()->getValue() )) - ); - $response->addHeader('X-Pjax', 'Content'); - $response->addHeader('Content-Type', 'text/json'); - $response->addHeader('X-Title', 'SilverStripe - Bulk '.$this->gridField->list->dataClass.' Editing'); - return $response; - } - else { - $controller = $this->getToplevelController(); - return $controller->customise(array( 'Content' => $form )); - } - } + /** + * Creates and return the bulk editing interface. + * + * @return string Form's HTML + */ + public function index() + { + $form = $this->bulkEditForm(); + $form->setTemplate('LeftAndMain_EditForm'); + $form->addExtraClass('center cms-content'); + $form->setAttribute('data-pjax-fragment', 'CurrentForm Content'); + Requirements::javascript(BULKEDITTOOLS_MANAGER_PATH.'/javascript/GridFieldBulkEditingForm.js'); + Requirements::css(BULKEDITTOOLS_MANAGER_PATH.'/css/GridFieldBulkEditingForm.css'); + Requirements::add_i18n_javascript(BULKEDITTOOLS_PATH.'/lang/js'); - /** - * Handles bulkEditForm submission - * and parses and saves each records data - * - * @param array $data Sumitted form data - * @param Form $form Form - */ - public function doSave($data, $form) - { - $className = $this->gridField->list->dataClass; - $singleton = singleton($className); + if ($this->request->isAjax()) { + $response = new SS_HTTPResponse( + Convert::raw2json(array('Content' => $form->forAjaxTemplate()->getValue())) + ); + $response->addHeader('X-Pjax', 'Content'); + $response->addHeader('Content-Type', 'text/json'); + $response->addHeader('X-Title', 'SilverStripe - Bulk '.$this->gridField->list->dataClass.' Editing'); - $formsData = array(); - $ids = array(); - $done = 0; + return $response; + } else { + $controller = $this->getToplevelController(); - //unescape and sort form data per record ID - foreach ($data as $fieldName => $value) - { - if ( $fieldInfo = $this->unEscapeFieldName($fieldName) ) - { - if ( !isset($formsData[$fieldInfo['id']]) ) - { - $formsData[$fieldInfo['id']] = array(); - } + return $controller->customise(array('Content' => $form)); + } + } - $formsData[$fieldInfo['id']][$fieldInfo['name']] = $value; - } - } + /** + * Handles bulkEditForm submission + * and parses and saves each records data. + * + * @param array $data Sumitted form data + * @param Form $form Form + */ + public function doSave($data, $form) + { + $className = $this->gridField->list->dataClass; + $singleton = singleton($className); - //process each record's form data and save - foreach ($formsData as $recordID => $recordData) - { - $record = DataObject::get_by_id($className, $recordID); - $recordForm = Form::create( - $this, "RecordForm", - $record->getCMSFields(), - FieldList::create() - ); + $formsData = array(); + $ids = array(); + $done = 0; - $recordForm->loadDataFrom($recordData); - $recordForm->saveInto($record); - $id = $record->write(); + //unescape and sort form data per record ID + foreach ($data as $fieldName => $value) { + if ($fieldInfo = $this->unEscapeFieldName($fieldName)) { + if (!isset($formsData[$fieldInfo['id']])) { + $formsData[$fieldInfo['id']] = array(); + } - array_push($ids, $record->ID); + $formsData[$fieldInfo['id']][$fieldInfo['name']] = $value; + } + } - if ( $id ) - { - $done++; - } - } + //process each record's form data and save + foreach ($formsData as $recordID => $recordData) { + $record = DataObject::get_by_id($className, $recordID); + $recordForm = Form::create( + $this, 'RecordForm', + $record->getCMSFields(), + FieldList::create() + ); - //compose form message - $messageModelClass = (($done > 1) ? $singleton->i18n_plural_name() : $singleton->i18n_singular_name()); - $message = _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.SAVE_RESULT_TEXT', - '{count} {class} saved successfully.', - array( - 'count' => $done, - 'class' => $messageModelClass - ) - ); - $form->sessionMessage($message, 'good'); + $recordForm->loadDataFrom($recordData); + $recordForm->saveInto($record); + $id = $record->write(); - //return back to form - return Controller::curr()->redirect($this->Link('?records[]='.implode('&records[]=', $ids))); - //return Controller::curr()->redirect($form->Backlink); //returns to gridField - } + array_push($ids, $record->ID); + + if ($id) { + ++$done; + } + } + + //compose form message + $messageModelClass = (($done > 1) ? $singleton->i18n_plural_name() : $singleton->i18n_singular_name()); + $message = _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.SAVE_RESULT_TEXT', + '{count} {class} saved successfully.', + array( + 'count' => $done, + 'class' => $messageModelClass, + ) + ); + $form->sessionMessage($message, 'good'); + + //return back to form + return Controller::curr()->redirect($this->Link('?records[]='.implode('&records[]=', $ids))); + //return Controller::curr()->redirect($form->Backlink); //returns to gridField + } } diff --git a/bulkManager/code/GridFieldBulkActionHandler.php b/bulkManager/code/GridFieldBulkActionHandler.php index 91ca627..8cd5bd3 100644 --- a/bulkManager/code/GridFieldBulkActionHandler.php +++ b/bulkManager/code/GridFieldBulkActionHandler.php @@ -2,135 +2,137 @@ /** * Base class to extend for all custom bulk action handlers * Gives access to the GridField, Component and Controller - * and implements useful functions like {@link getRecordIDList()} and {@link getRecords()} + * and implements useful functions like {@link getRecordIDList()} and {@link getRecords()}. * * @author colymba - * @package GridFieldBulkEditingTools - * @subpackage BulkManager */ class GridFieldBulkActionHandler extends RequestHandler { - /** - * Related GridField instance - * @var GridField - */ - protected $gridField; - + /** + * Related GridField instance. + * + * @var GridField + */ + protected $gridField; - /** - * GridFieldBulkManager instance - * @var GridFieldBulkManager - */ - protected $component; - + /** + * GridFieldBulkManager instance. + * + * @var GridFieldBulkManager + */ + protected $component; - /** - * Current controller instance - * @var Controller - */ - protected $controller; + /** + * Current controller instance. + * + * @var Controller + */ + protected $controller; + /** + * @param GridFIeld $gridField + * @param GridField_URLHandler $component + * @param Controller $controller + */ + public function __construct($gridField, $component, $controller) + { + $this->gridField = $gridField; + $this->component = $component; + $this->controller = $controller; + parent::__construct(); + } - /** - * - * @param GridFIeld $gridField - * @param GridField_URLHandler $component - * @param Controller $controller - */ - public function __construct($gridField, $component, $controller) - { - $this->gridField = $gridField; - $this->component = $component; - $this->controller = $controller; - parent::__construct(); - } + /** + * Returns the URL for this RequestHandler. + * + * @author SilverStripe + * + * @see GridFieldDetailForm_ItemRequest + * + * @param string $action + * + * @return string + */ + public function Link($action = null) + { + return Controller::join_links($this->gridField->Link(), 'bulkAction', $action); + } + /** + * Traverse up nested requests until we reach the first that's not a GridFieldDetailForm or GridFieldDetailForm_ItemRequest. + * The opposite of {@link Controller::curr()}, required because + * Controller::$controller_stack is not directly accessible. + * + * @return Controller + */ + protected function getToplevelController() + { + $c = $this->controller; + while ($c && ($c instanceof GridFieldDetailForm_ItemRequest || $c instanceof GridFieldDetailForm)) { + $c = $c->getController(); + } - /** - * Returns the URL for this RequestHandler - * - * @author SilverStripe - * @see GridFieldDetailForm_ItemRequest - * @param string $action - * @return string - */ - public function Link($action = null) - { - return Controller::join_links($this->gridField->Link(), 'bulkAction', $action); - } + return $c; + } - - /** - * Traverse up nested requests until we reach the first that's not a GridFieldDetailForm or GridFieldDetailForm_ItemRequest. - * The opposite of {@link Controller::curr()}, required because - * Controller::$controller_stack is not directly accessible. - * - * @return Controller - */ - protected function getToplevelController() - { - $c = $this->controller; - while($c && ($c instanceof GridFieldDetailForm_ItemRequest || $c instanceof GridFieldDetailForm)) { - $c = $c->getController(); - } - return $c; - } + /** + * Edited version of the GridFieldEditForm function + * adds the 'Bulk Upload' at the end of the crums. + * + * CMS-specific functionality: Passes through navigation breadcrumbs + * to the template, and includes the currently edited record (if any). + * see {@link LeftAndMain->Breadcrumbs()} for details. + * + * @author SilverStripe original Breadcrumbs() method + * + * @see GridFieldDetailForm_ItemRequest + * + * @param bool $unlinked + * + * @return ArrayData + */ + public function Breadcrumbs($unlinked = false) + { + if (!$this->controller->hasMethod('Breadcrumbs')) { + return; + } + $items = $this->controller->Breadcrumbs($unlinked); + $items->push(new ArrayData(array( + 'Title' => 'Bulk Editing', + 'Link' => false, + ))); - /** - * Edited version of the GridFieldEditForm function - * adds the 'Bulk Upload' at the end of the crums - * - * CMS-specific functionality: Passes through navigation breadcrumbs - * to the template, and includes the currently edited record (if any). - * see {@link LeftAndMain->Breadcrumbs()} for details. - * - * @author SilverStripe original Breadcrumbs() method - * @see GridFieldDetailForm_ItemRequest - * @param boolean $unlinked - * @return ArrayData - */ - public function Breadcrumbs($unlinked = false) - { - if(!$this->controller->hasMethod('Breadcrumbs')) return; + return $items; + } - $items = $this->controller->Breadcrumbs($unlinked); - $items->push(new ArrayData(array( - 'Title' => 'Bulk Editing', - 'Link' => false - ))); - return $items; - } - - - /** - * Returns the list of record IDs selected in the front-end - * - * @return array List of IDs - */ - public function getRecordIDList() - { - $vars = $this->request->requestVars(); - return $vars['records']; - } + /** + * Returns the list of record IDs selected in the front-end. + * + * @return array List of IDs + */ + public function getRecordIDList() + { + $vars = $this->request->requestVars(); + return $vars['records']; + } - /** - * Returns a DataList of the records selected in the front-end - * - * @return DataList List of records - */ - public function getRecords() - { - $ids = $this->getRecordIDList(); + /** + * Returns a DataList of the records selected in the front-end. + * + * @return DataList List of records + */ + public function getRecords() + { + $ids = $this->getRecordIDList(); - if ( $ids ) - { - $class = $this->gridField->list->dataClass; - return DataList::create($class)->byIDs( $ids ); - } - else{ - return false; - } - } -} \ No newline at end of file + if ($ids) { + $class = $this->gridField->list->dataClass; + + return DataList::create($class)->byIDs($ids); + } else { + return false; + } + } +} diff --git a/bulkManager/code/GridFieldBulkActionUnlinkHandler.php b/bulkManager/code/GridFieldBulkActionUnlinkHandler.php index 45cfd02..547cf9a 100644 --- a/bulkManager/code/GridFieldBulkActionUnlinkHandler.php +++ b/bulkManager/code/GridFieldBulkActionUnlinkHandler.php @@ -3,43 +3,43 @@ * Bulk action handler for unlinking records. * * @author colymba - * @package GridFieldBulkEditingTools - * @subpackage BulkManager */ -class GridFieldBulkActionUnLinkHandler extends GridFieldBulkActionHandler +class GridFieldBulkActionUnlinkHandler extends GridFieldBulkActionHandler { - /** - * RequestHandler allowed actions - * @var array - */ - private static $allowed_actions = array('unLink'); + /** + * RequestHandler allowed actions. + * + * @var array + */ + private static $allowed_actions = array('unLink'); + /** + * RequestHandler url => action map. + * + * @var array + */ + private static $url_handlers = array( + 'unLink' => 'unLink', + ); - /** - * RequestHandler url => action map - * @var array - */ - private static $url_handlers = array( - 'unLink' => 'unLink' - ); - - - /** - * Unlink the selected records passed from the unlink bulk action - * - * @param SS_HTTPRequest $request - * @return SS_HTTPResponse List of affected records ID - */ - public function unLink(SS_HTTPRequest $request) - { - $ids = $this->getRecordIDList(); - $this->gridField->list->removeMany($ids); - - $response = new SS_HTTPResponse(Convert::raw2json(array( - 'done' => true, - 'records' => $ids - ))); - $response->addHeader('Content-Type', 'text/json'); - return $response; - } -} \ No newline at end of file + /** + * Unlink the selected records passed from the unlink bulk action. + * + * @param SS_HTTPRequest $request + * + * @return SS_HTTPResponse List of affected records ID + */ + public function unLink(SS_HTTPRequest $request) + { + $ids = $this->getRecordIDList(); + $this->gridField->list->removeMany($ids); + + $response = new SS_HTTPResponse(Convert::raw2json(array( + 'done' => true, + 'records' => $ids, + ))); + $response->addHeader('Content-Type', 'text/json'); + + return $response; + } +} diff --git a/bulkManager/code/GridFieldBulkManager.php b/bulkManager/code/GridFieldBulkManager.php index 9b5935d..0cf81cb 100644 --- a/bulkManager/code/GridFieldBulkManager.php +++ b/bulkManager/code/GridFieldBulkManager.php @@ -1,378 +1,364 @@ fields editable on the Model - * 'actions' => maps of action name and configuration - * - * @var array - */ - protected $config = array( +{ + /** + * component configuration. + * + * 'editableFields' => fields editable on the Model + * 'actions' => maps of action name and configuration + * + * @var array + */ + protected $config = array( 'editableFields' => null, - 'actions' => array() - ); - - - /** - * GridFieldBulkManager component constructor - * - * @param array $editableFields List of editable fields - * @param boolean $defaultActions Use default actions list. False to start fresh. - */ - public function __construct($editableFields = null, $defaultActions = true) - { - if ( $editableFields != null ) $this->setConfig ( 'editableFields', $editableFields ); + 'actions' => array(), + ); - if ( $defaultActions ) - { - $this->config['actions'] = array( - 'bulkEdit' => array( - 'label' => _t('GRIDFIELD_BULK_MANAGER.EDIT_SELECT_LABEL', 'Edit'), - 'handler' => 'GridFieldBulkActionEditHandler', - 'config' => array( - 'isAjax' => false, - 'icon' => 'pencil', - 'isDestructive' => false - ) - ), - 'unLink' => array( - 'label' => _t('GRIDFIELD_BULK_MANAGER.UNLINK_SELECT_LABEL', 'UnLink'), - 'handler' => 'GridFieldBulkActionUnLinkHandler', - 'config' => array( - 'isAjax' => true, - 'icon' => 'chain--minus', - 'isDestructive' => false - ) - ), - 'delete' => array( - 'label' => _t('GRIDFIELD_BULK_MANAGER.DELETE_SELECT_LABEL', 'Delete'), - 'handler' => 'GridFieldBulkActionDeleteHandler', - 'config' => array( - 'isAjax' => true, - 'icon' => 'decline', - 'isDestructive' => true - ) - ) - ); - } - } - + /** + * GridFieldBulkManager component constructor. + * + * @param array $editableFields List of editable fields + * @param bool $defaultActions Use default actions list. False to start fresh. + */ + public function __construct($editableFields = null, $defaultActions = true) + { + if ($editableFields != null) { + $this->setConfig('editableFields', $editableFields); + } + if ($defaultActions) { + $this->config['actions'] = array( + 'bulkEdit' => array( + 'label' => _t('GRIDFIELD_BULK_MANAGER.EDIT_SELECT_LABEL', 'Edit'), + 'handler' => 'GridFieldBulkActionEditHandler', + 'config' => array( + 'isAjax' => false, + 'icon' => 'pencil', + 'isDestructive' => false, + ), + ), + 'unLink' => array( + 'label' => _t('GRIDFIELD_BULK_MANAGER.UNLINK_SELECT_LABEL', 'UnLink'), + 'handler' => 'GridFieldBulkActionUnLinkHandler', + 'config' => array( + 'isAjax' => true, + 'icon' => 'chain--minus', + 'isDestructive' => false, + ), + ), + 'delete' => array( + 'label' => _t('GRIDFIELD_BULK_MANAGER.DELETE_SELECT_LABEL', 'Delete'), + 'handler' => 'GridFieldBulkActionDeleteHandler', + 'config' => array( + 'isAjax' => true, + 'icon' => 'decline', + 'isDestructive' => true, + ), + ), + ); + } + } - /* ********************************************************************** - * Components settings and custom methodes - * */ - - /** - * Sets the component configuration parameter - * - * @param string $reference - * @param mixed $value - */ - function setConfig($reference, $value) - { - if (!array_key_exists($reference, $this->config) ) - { - user_error("Unknown option reference: $reference", E_USER_ERROR); - } + /* ********************************************************************** + * Components settings and custom methodes + * */ - if ( $reference == 'actions' ) - { - user_error("Bulk actions must be edited via addBulkAction() and removeBulkAction()", E_USER_ERROR); - } - - if ( ($reference == 'editableFields') && !is_array($value) ) - { - $value = array($value); - } + /** + * Sets the component configuration parameter. + * + * @param string $reference + * @param mixed $value + */ + public function setConfig($reference, $value) + { + if (!array_key_exists($reference, $this->config)) { + user_error("Unknown option reference: $reference", E_USER_ERROR); + } - $this->config[$reference] = $value; + if ($reference == 'actions') { + user_error('Bulk actions must be edited via addBulkAction() and removeBulkAction()', E_USER_ERROR); + } - return $this; - } + if (($reference == 'editableFields') && !is_array($value)) { + $value = array($value); + } - - /** - * Returns one $config parameter of the full $config - * - * @param string $reference $congif parameter to return - * @return mixed - */ - function getConfig ( $reference = false ) - { - if ( $reference ) return $this->config[$reference]; - else return $this->config; - } + $this->config[$reference] = $value; + return $this; + } - /** - * Lets you add custom bulk actions to the bulk manager interface - * - * @todo add config options for front-end: isAjax, icon - * - * @param string $name Bulk action's name. Used by RequestHandler. - * @param string $label Dropdown menu action's label. Default to ucfirst($name). - * @param string $handler RequestHandler class name for this action. Default to 'GridFieldBulkAction'.ucfirst($name).'Handler' - * @param array $config Front-end configuration array( 'isAjax' => true, 'icon' => 'accept', 'isDestructive' => false ) - * @return GridFieldBulkManager Current GridFieldBulkManager instance - */ - function addBulkAction($name, $label = null, $handler = null, $config = null) - { - if ( array_key_exists($name, $this->config['actions']) ) - { - user_error("Bulk action '$name' already exists.", E_USER_ERROR); - } + /** + * Returns one $config parameter of the full $config. + * + * @param string $reference $congif parameter to return + * + * @return mixed + */ + public function getConfig($reference = false) + { + if ($reference) { + return $this->config[$reference]; + } else { + return $this->config; + } + } - if ( !$label ) - { - $label = ucfirst($name); - } + /** + * Lets you add custom bulk actions to the bulk manager interface. + * + * @todo add config options for front-end: isAjax, icon + * + * @param string $name Bulk action's name. Used by RequestHandler. + * @param string $label Dropdown menu action's label. Default to ucfirst($name). + * @param string $handler RequestHandler class name for this action. Default to 'GridFieldBulkAction'.ucfirst($name).'Handler' + * @param array $config Front-end configuration array( 'isAjax' => true, 'icon' => 'accept', 'isDestructive' => false ) + * + * @return GridFieldBulkManager Current GridFieldBulkManager instance + */ + public function addBulkAction($name, $label = null, $handler = null, $config = null) + { + if (array_key_exists($name, $this->config['actions'])) { + user_error("Bulk action '$name' already exists.", E_USER_ERROR); + } - if ( !$handler ) - { - $handler = 'GridFieldBulkAction'.ucfirst($name).'Handler'; - } + if (!$label) { + $label = ucfirst($name); + } - if ( !ClassInfo::exists( $handler ) ) - { - user_error("Bulk action handler for $name not found: $handler", E_USER_ERROR); - } + if (!$handler) { + $handler = 'GridFieldBulkAction'.ucfirst($name).'Handler'; + } - if ( $config && !is_array($config) ) - { - user_error("Bulk action front-end config should be an array of key => value pairs.", E_USER_ERROR); - } - else{ - $config = array( - 'isAjax' => isset($config['isAjax']) ? $config['isAjax'] : true, - 'icon' => isset($config['icon']) ? $config['icon'] : 'accept', - 'isDestructive' => isset($config['isDestructive']) ? $config['isDestructive'] : false - ); - } + if (!ClassInfo::exists($handler)) { + user_error("Bulk action handler for $name not found: $handler", E_USER_ERROR); + } - $this->config['actions'][$name] = array( - 'label' => $label, + if ($config && !is_array($config)) { + user_error('Bulk action front-end config should be an array of key => value pairs.', E_USER_ERROR); + } else { + $config = array( + 'isAjax' => isset($config['isAjax']) ? $config['isAjax'] : true, + 'icon' => isset($config['icon']) ? $config['icon'] : 'accept', + 'isDestructive' => isset($config['isDestructive']) ? $config['isDestructive'] : false, + ); + } + + $this->config['actions'][$name] = array( + 'label' => $label, 'handler' => $handler, - 'config' => $config + 'config' => $config, ); - return $this; - } + return $this; + } + /** + * Removes a bulk actions from the bulk manager interface. + * + * @param string $name Bulk action's name + * + * @return GridFieldBulkManager Current GridFieldBulkManager instance + */ + public function removeBulkAction($name) + { + if (!array_key_exists($name, $this->config['actions'])) { + user_error("Bulk action '$name' doesn't exists.", E_USER_ERROR); + } - /** - * Removes a bulk actions from the bulk manager interface - * - * @param string $name Bulk action's name - * @return GridFieldBulkManager Current GridFieldBulkManager instance - */ - function removeBulkAction($name) - { - if ( !array_key_exists($name, $this->config['actions']) ) - { - user_error("Bulk action '$name' doesn't exists.", E_USER_ERROR); - } + unset($this->config['actions'][$name]); - unset( $this->config['actions'][$name] ); + return $this; + } - return $this; - } + /* ********************************************************************** + * GridField_ColumnProvider + * */ + /** + * Add bulk select column. + * + * @param GridField $gridField Current GridField instance + * @param array $columns Columns list + */ + public function augmentColumns($gridField, &$columns) + { + if (!in_array('BulkSelect', $columns)) { + $columns[] = 'BulkSelect'; + } + } + /** + * Which columns are handled by the component. + * + * @param GridField $gridField Current GridField instance + * + * @return array List of handled column names + */ + public function getColumnsHandled($gridField) + { + return array('BulkSelect'); + } - /* ********************************************************************** - * GridField_ColumnProvider - * */ - - /** - * Add bulk select column - * - * @param GridField $gridField Current GridField instance - * @param array $columns Columns list - */ - function augmentColumns($gridField, &$columns) - { - if(!in_array('BulkSelect', $columns)) $columns[] = 'BulkSelect'; - } + /** + * Sets the column's content. + * + * @param GridField $gridField Current GridField instance + * @param DataObject $record Record intance for this row + * @param string $columnName Column's name for which we need content + * + * @return mixed Column's field content + */ + public function getColumnContent($gridField, $record, $columnName) + { + $cb = CheckboxField::create('bulkSelect_'.$record->ID) + ->addExtraClass('bulkSelect no-change-track') + ->setAttribute('data-record', $record->ID); - - /** - * Which columns are handled by the component - * - * @param GridField $gridField Current GridField instance - * @return array List of handled column names - */ - function getColumnsHandled($gridField) - { - return array('BulkSelect'); - } + return $cb->Field(); + } - - /** - * Sets the column's content - * - * @param GridField $gridField Current GridField instance - * @param DataObject $record Record intance for this row - * @param string $columnName Column's name for which we need content - * @return mixed Column's field content - */ - function getColumnContent($gridField, $record, $columnName) - { - $cb = CheckboxField::create('bulkSelect_'.$record->ID) - ->addExtraClass('bulkSelect no-change-track') - ->setAttribute('data-record', $record->ID); - return $cb->Field(); - } + /** + * Set the column's HTML attributes. + * + * @param GridField $gridField Current GridField instance + * @param DataObject $record Record intance for this row + * @param string $columnName Column's name for which we need attributes + * + * @return array List of HTML attributes + */ + public function getColumnAttributes($gridField, $record, $columnName) + { + return array('class' => 'col-bulkSelect'); + } - - /** - * Set the column's HTML attributes - * - * @param GridField $gridField Current GridField instance - * @param DataObject $record Record intance for this row - * @param string $columnName Column's name for which we need attributes - * @return array List of HTML attributes - */ - function getColumnAttributes($gridField, $record, $columnName) - { - return array('class' => 'col-bulkSelect'); - } - + /** + * Set the column's meta data. + * + * @param GridField $gridField Current GridField instance + * @param string $columnName Column's name for which we need meta data + * + * @return array List of meta data + */ + public function getColumnMetadata($gridField, $columnName) + { + if ($columnName == 'BulkSelect') { + return array('title' => 'Select'); + } + } - /** - * Set the column's meta data - * - * @param GridField $gridField Current GridField instance - * @param string $columnName Column's name for which we need meta data - * @return array List of meta data - */ - function getColumnMetadata($gridField, $columnName) - { - if($columnName == 'BulkSelect') { - return array('title' => 'Select'); - } - } + /* ********************************************************************** + * GridField_HTMLProvider + * */ + /** + * @param GridField $gridField + * + * @return array + */ + public function getHTMLFragments($gridField) + { + Requirements::css(BULKEDITTOOLS_MANAGER_PATH.'/css/GridFieldBulkManager.css'); + Requirements::javascript(BULKEDITTOOLS_MANAGER_PATH.'/javascript/GridFieldBulkManager.js'); + Requirements::add_i18n_javascript(BULKEDITTOOLS_PATH.'/lang/js'); + if (!count($this->config['actions'])) { + user_error('Trying to use GridFieldBulkManager without any bulk action.', E_USER_ERROR); + } - /* ********************************************************************** - * GridField_HTMLProvider - * */ - - /** - * - * @param GridField $gridField - * @return array - */ - public function getHTMLFragments($gridField) - { - Requirements::css(BULKEDITTOOLS_MANAGER_PATH . '/css/GridFieldBulkManager.css'); - Requirements::javascript(BULKEDITTOOLS_MANAGER_PATH . '/javascript/GridFieldBulkManager.js'); - Requirements::add_i18n_javascript(BULKEDITTOOLS_PATH . '/lang/js'); - - if ( !count($this->config['actions']) ) - { - user_error("Trying to use GridFieldBulkManager without any bulk action.", E_USER_ERROR); - } + $actionsListSource = array(); + $actionsConfig = array(); - $actionsListSource = array(); - $actionsConfig = array(); + foreach ($this->config['actions'] as $action => $actionData) { + $actionsListSource[$action] = $actionData['label']; + $actionsConfig[$action] = $actionData['config']; + } - foreach ($this->config['actions'] as $action => $actionData) - { - $actionsListSource[$action] = $actionData['label']; - $actionsConfig[$action] = $actionData['config']; - } + reset($this->config['actions']); + $firstAction = key($this->config['actions']); - reset($this->config['actions']); - $firstAction = key($this->config['actions']); + $dropDownActionsList = DropdownField::create('bulkActionName', '') + ->setSource($actionsListSource) + ->setAttribute('class', 'bulkActionName no-change-track') + ->setAttribute('id', ''); - $dropDownActionsList = DropdownField::create('bulkActionName', '') - ->setSource( $actionsListSource ) - ->setAttribute('class', 'bulkActionName no-change-track') - ->setAttribute('id', ''); - - $templateData = array( - 'Menu' => $dropDownActionsList->FieldHolder(), - 'Button' => array( - 'Label' => _t('GRIDFIELD_BULK_MANAGER.ACTION_BTN_LABEL', 'Go'), - 'DataURL' => $gridField->Link('bulkAction'), - 'Icon' => $this->config['actions'][$firstAction]['config']['icon'], - 'DataConfig' => htmlspecialchars(json_encode($actionsConfig), ENT_QUOTES, 'UTF-8') - ), - 'Select' => array( - 'Label' => _t('GRIDFIELD_BULK_MANAGER.SELECT_ALL_LABEL', 'Select all') - ), - 'Colspan' => (count($gridField->getColumns()) - 1) + $templateData = array( + 'Menu' => $dropDownActionsList->FieldHolder(), + 'Button' => array( + 'Label' => _t('GRIDFIELD_BULK_MANAGER.ACTION_BTN_LABEL', 'Go'), + 'DataURL' => $gridField->Link('bulkAction'), + 'Icon' => $this->config['actions'][$firstAction]['config']['icon'], + 'DataConfig' => htmlspecialchars(json_encode($actionsConfig), ENT_QUOTES, 'UTF-8'), + ), + 'Select' => array( + 'Label' => _t('GRIDFIELD_BULK_MANAGER.SELECT_ALL_LABEL', 'Select all'), + ), + 'Colspan' => (count($gridField->getColumns()) - 1), ); - $templateData = new ArrayData($templateData); + $templateData = new ArrayData($templateData); - return array( - 'header' => $templateData->renderWith('BulkManagerButtons') - ); - } + return array( + 'header' => $templateData->renderWith('BulkManagerButtons'), + ); + } + /* ********************************************************************** + * GridField_URLHandler + * */ + /** + * Returns an action => handler list. + * + * @param GridField $gridField + * + * @return array + */ + public function getURLHandlers($gridField) + { + return array( + 'bulkAction' => 'handleBulkAction', + ); + } - /* ********************************************************************** - * GridField_URLHandler - * */ - - /** - * Returns an action => handler list - * - * @param GridField $gridField - * @return array - */ - public function getURLHandlers($gridField) { - return array( - 'bulkAction' => 'handleBulkAction' - ); - } + /** + * Pass control over to the RequestHandler + * loop through the handlers provided in config['actions'] + * and find matching url_handlers. + * + * $url_handlers rule should not use wildcards like '$Action' => '$Action' + * but have more specific path defined + * + * @param GridField $gridField + * @param SS_HTTPRequest $request + * + * @return mixed + */ + public function handleBulkAction($gridField, $request) + { + $controller = $gridField->getForm()->Controller(); - - /** - * Pass control over to the RequestHandler - * loop through the handlers provided in config['actions'] - * and find matching url_handlers. - * - * $url_handlers rule should not use wildcards like '$Action' => '$Action' - * but have more specific path defined - * - * @param GridField $gridField - * @param SS_HTTPRequest $request - * @return mixed - */ - public function handleBulkAction($gridField, $request) - { - $controller = $gridField->getForm()->Controller(); + foreach ($this->config['actions'] as $name => $data) { + $handlerClass = $data['handler']; + $urlHandlers = Config::inst()->get($handlerClass, 'url_handlers', Config::UNINHERITED); - foreach ($this->config['actions'] as $name => $data) - { - $handlerClass = $data['handler']; - $urlHandlers = Config::inst()->get($handlerClass, 'url_handlers', Config::UNINHERITED); + if ($urlHandlers) { + foreach ($urlHandlers as $rule => $action) { + if ($request->match($rule, false)) { + //print_r('matched ' . $handlerClass . ' to ' . $rule); + $handler = Injector::inst()->create($handlerClass, $gridField, $this, $controller); - if($urlHandlers) foreach($urlHandlers as $rule => $action) - { - if($request->match($rule, false)) - { - //print_r('matched ' . $handlerClass . ' to ' . $rule); - $handler = Injector::inst()->create($handlerClass, $gridField, $this, $controller); - return $handler->handleRequest($request, DataModel::inst()); - } - } - } + return $handler->handleRequest($request, DataModel::inst()); + } + } + } + } - user_error("Unable to find matching bulk action handler for ".$request->remaining().'.', E_USER_ERROR); - } + user_error('Unable to find matching bulk action handler for '.$request->remaining().'.', E_USER_ERROR); + } } diff --git a/bulkUpload/code/GridFieldBulkImageUpload.php b/bulkUpload/code/GridFieldBulkImageUpload.php index aade985..4e01af7 100644 --- a/bulkUpload/code/GridFieldBulkImageUpload.php +++ b/bulkUpload/code/GridFieldBulkImageUpload.php @@ -1,25 +1,24 @@ field name of the $has_one File/Image relation - * @var array - */ - protected $config = array( - 'fileRelationName' => null - ); +{ + /** + * component configuration. + * + * 'fileRelationName' => field name of the $has_one File/Image relation + * + * @var array + */ + protected $config = array( + 'fileRelationName' => null, + ); - - /** - * UploadField configuration. - * These options are passed on directly to the UploadField - * via {@link UploadField::setConfig()} api - * - * Defaults are: * - * 'sequentialUploads' => false : process uploads 1 after the other rather than all at once - * 'canAttachExisting' => true : displays "From files" button in the UploadField - * 'canPreviewFolder' => true : displays the upload location in the UploadField - * - * @var array - */ - protected $ufConfig = array( - 'sequentialUploads' => false, + /** + * UploadField configuration. + * These options are passed on directly to the UploadField + * via {@link UploadField::setConfig()} api. + * + * Defaults are: * + * 'sequentialUploads' => false : process uploads 1 after the other rather than all at once + * 'canAttachExisting' => true : displays "From files" button in the UploadField + * 'canPreviewFolder' => true : displays the upload location in the UploadField + * + * @var array + */ + protected $ufConfig = array( + 'sequentialUploads' => false, 'canAttachExisting' => true, - 'canPreviewFolder' => true - ); + 'canPreviewFolder' => true, + ); + /** + * UploadField setup function calls. + * List of setup functions to call on {@link UploadField} with the value to pass. + * + * e.g. array('setFolderName' => 'bulkUpload') will result in: + * $uploadField->setFolderName('bulkUpload') + * + * @var array + */ + protected $ufSetup = array( + 'setFolderName' => 'bulkUpload', + ); - /** - * UploadField setup function calls. - * List of setup functions to call on {@link UploadField} with the value to pass - * - * e.g. array('setFolderName' => 'bulkUpload') will result in: - * $uploadField->setFolderName('bulkUpload') - * - * @var array - */ - protected $ufSetup = array( - 'setFolderName' => 'bulkUpload' - ); + /** + * UploadField Validator setup function calls. + * List of setup functions to call on {@link Upload::validator} with the value to pass. + * + * e.g. array('setAllowedMaxFileSize' => 10) will result in: + * $uploadField->getValidator()->setAllowedMaxFileSize(10) + * + * @var array + */ + protected $ufValidatorSetup = array( + 'setAllowedMaxFileSize' => null, + ); + /** + * Component constructor. + * + * @param string $fileRelationName + */ + public function __construct($fileRelationName = null) + { + if ($fileRelationName != null) { + $this->setConfig('fileRelationName', $fileRelationName); + } + } - /** - * UploadField Validator setup function calls. - * List of setup functions to call on {@link Upload::validator} with the value to pass - * - * e.g. array('setAllowedMaxFileSize' => 10) will result in: - * $uploadField->getValidator()->setAllowedMaxFileSize(10) - * - * @var array - */ - protected $ufValidatorSetup = array( - 'setAllowedMaxFileSize' => null - ); + /* ********************************************************************** + * Components settings and custom methodes + * */ + /** + * Set a component configuration parameter. + * + * @param string $reference + * @param mixed $value + */ + public function setConfig($reference, $value) + { + if (in_array($reference, array('folderName', 'maxFileSize', 'sequentialUploads', 'canAttachExisting', 'canPreviewFolder'))) { + Deprecation::notice('2.1.0', "GridFieldBulkUpload 'setConfig()' doesn't support '$reference' anymore. Please use 'setUfConfig()', 'setUfSetup()' or 'setUfValidatorSetup()' instead."); - /** - * Component constructor - * - * @param string $fileRelationName - */ - public function __construct($fileRelationName = null) - { - if ( $fileRelationName != null ) $this->setConfig ( 'fileRelationName', $fileRelationName ); - } - + if ($reference === 'folderName') { + $this->setUfSetup('setFolderName', $value); + } elseif ($reference === 'maxFileSize') { + $this->setUfValidatorSetup('setAllowedMaxFileSize', $value); + } else { + $this->setUfConfig($reference, $value); + } + } elseif (!array_key_exists($reference, $this->config)) { + user_error("Unknown option reference: $reference", E_USER_ERROR); + } + $this->config[$reference] = $value; - /* ********************************************************************** - * Components settings and custom methodes - * */ - - /** - * Set a component configuration parameter - * - * @param string $reference - * @param mixed $value - */ - function setConfig ( $reference, $value ) - { - if ( in_array($reference, array('folderName', 'maxFileSize', 'sequentialUploads', 'canAttachExisting', 'canPreviewFolder')) ) - { - Deprecation::notice('2.1.0', "GridFieldBulkUpload 'setConfig()' doesn't support '$reference' anymore. Please use 'setUfConfig()', 'setUfSetup()' or 'setUfValidatorSetup()' instead."); + return $this; + } - if ( $reference === 'folderName' ) - { - $this->setUfSetup('setFolderName', $value); - } - else if ( $reference === 'maxFileSize' ) - { - $this->setUfValidatorSetup('setAllowedMaxFileSize', $value); - } - else{ - $this->setUfConfig($reference, $value); - } - } - else if (!array_key_exists($reference, $this->config) ) { - user_error("Unknown option reference: $reference", E_USER_ERROR); - } + /** + * Set an UploadField configuration parameter. + * + * @param string $reference + * @param mixed $value + */ + public function setUfConfig($reference, $value) + { + $this->ufConfig[$reference] = $value; - $this->config[$reference] = $value; - return $this; - } + return $this; + } + /** + * Set an UploadField setup function call. + * + * @param string $function + * @param mixed $param + */ + public function setUfSetup($function, $param) + { + $this->ufSetup[$function] = $param; - /** - * Set an UploadField configuration parameter - * - * @param string $reference - * @param mixed $value - */ - function setUfConfig ( $reference, $value ) - { - $this->ufConfig[$reference] = $value; - return $this; - } + return $this; + } + /** + * Set an UploadField Validator setup function call. + * + * @param string $function + * @param mixed $param + */ + public function setUfValidatorSetup($function, $param) + { + $this->ufValidatorSetup[$function] = $param; - /** - * Set an UploadField setup function call - * - * @param string $function - * @param mixed $param - */ - function setUfSetup ( $function, $param ) - { - $this->ufSetup[$function] = $param; - return $this; - } + return $this; + } + /** + * Returns one $config reference or the full $config. + * + * @param string $reference $congif parameter to return + * + * @return mixed + */ + public function getConfig($reference = false) + { + if ($reference) { + return $this->config[$reference]; + } else { + return $this->config; + } + } - /** - * Set an UploadField Validator setup function call - * - * @param string $function - * @param mixed $param - */ - function setUfValidatorSetup ( $function, $param ) - { - $this->ufValidatorSetup[$function] = $param; - return $this; - } - + /** + * Returns one $ufConfig reference or the full config. + * + * @param string $reference $ufConfig parameter to return + * + * @return mixed + */ + public function getUfConfig($reference = false) + { + if ($reference) { + return $this->ufConfig[$reference]; + } else { + return $this->ufConfig; + } + } - /** - * Returns one $config reference or the full $config - * - * @param string $reference $congif parameter to return - * @return mixed - */ - function getConfig ( $reference = false ) - { - if ( $reference ) return $this->config[$reference]; - else return $this->config; - } - + /** + * Returns one $ufSetup reference or the full config. + * + * @param string $reference $ufSetup parameter to return + * + * @return mixed + */ + public function getUfSetup($reference = false) + { + if ($reference) { + return $this->ufSetup[$reference]; + } else { + return $this->ufSetup; + } + } - /** - * Returns one $ufConfig reference or the full config. - * - * @param string $reference $ufConfig parameter to return - * @return mixed - */ - function getUfConfig ( $reference = false ) - { - if ( $reference ) return $this->ufConfig[$reference]; - else return $this->ufConfig; - } - + /** + * Returns one $ufValidatorSetup reference or the full config. + * + * @param string $reference $ufValidatorSetup parameter to return + * + * @return mixed + */ + public function getUfValidatorSetup($reference = false) + { + if ($reference) { + return $this->ufValidatorSetup[$reference]; + } else { + return $this->ufValidatorSetup; + } + } - /** - * Returns one $ufSetup reference or the full config. - * - * @param string $reference $ufSetup parameter to return - * @return mixed - */ - function getUfSetup ( $reference = false ) - { - if ( $reference ) return $this->ufSetup[$reference]; - else return $this->ufSetup; - } - + /** + * Get the first has_one Image/File relation from the GridField managed DataObject + * i.e. 'MyImage' => 'Image' will return 'MyImage'. + * + * @return string Name of the $has_one relation + */ + public function getDefaultFileRelationName($gridField) + { + $recordClass = $gridField->list->dataClass; + $hasOneFields = Config::inst()->get($recordClass, 'has_one', Config::INHERITED); - /** - * Returns one $ufValidatorSetup reference or the full config. - * - * @param string $reference $ufValidatorSetup parameter to return - * @return mixed - */ - function getUfValidatorSetup ( $reference = false ) - { - if ( $reference ) return $this->ufValidatorSetup[$reference]; - else return $this->ufValidatorSetup; - } + $imageField = null; + foreach ($hasOneFields as $field => $type) { + if ($type === 'Image' || $type === 'File' || is_subclass_of($type, 'File')) { + $imageField = $field; + break; + } + } + return $imageField; + } - /** - * Get the first has_one Image/File relation from the GridField managed DataObject - * i.e. 'MyImage' => 'Image' will return 'MyImage' - * - * @return string Name of the $has_one relation - */ - public function getDefaultFileRelationName($gridField) - { - $recordClass = $gridField->list->dataClass; - $hasOneFields = Config::inst()->get($recordClass, 'has_one', Config::INHERITED); - - $imageField = null; - foreach( $hasOneFields as $field => $type ) - { - if( $type === 'Image' || $type === 'File' || is_subclass_of($type, 'File') ) - { - $imageField = $field; - break; - } - } - - return $imageField; - } + /** + * Returns the name of the Image/File field name from the managed record + * Either as set in the component config or the default one. + * + * @return string + */ + public function getFileRelationName($gridField) + { + $configFileRelationName = $this->getConfig('fileRelationName'); + return $configFileRelationName ? $configFileRelationName : $this->getDefaultFileRelationName($gridField); + } - /** - * Returns the name of the Image/File field name from the managed record - * Either as set in the component config or the default one - * - * @return string - */ - public function getFileRelationName($gridField) - { - $configFileRelationName = $this->getConfig('fileRelationName'); - return $configFileRelationName ? $configFileRelationName : $this->getDefaultFileRelationName($gridField); - } + /** + * Return the ClassName of the fileRelation + * i.e. 'MyImage' => 'Image' will return 'Image' + * i.e. 'MyImage' => 'File' will return 'File'. + * + * @return string file relation className + */ + public function getFileRelationClassName($gridField) + { + $recordClass = $gridField->list->dataClass; + $hasOneFields = Config::inst()->get($recordClass, 'has_one', Config::INHERITED); + $fieldName = $this->getFileRelationName($gridField); + if ($fieldName) { + return $hasOneFields[$fieldName]; + } else { + return 'File'; + } + } - /** - * Return the ClassName of the fileRelation - * i.e. 'MyImage' => 'Image' will return 'Image' - * i.e. 'MyImage' => 'File' will return 'File' - * - * @return string file relation className - */ - public function getFileRelationClassName($gridField) - { - $recordClass = $gridField->list->dataClass; - $hasOneFields = Config::inst()->get($recordClass, 'has_one', Config::INHERITED); + /** + * Returned a configured UploadField instance + * embedded in the gridfield heard. + * + * @param GridField $gridField Current GridField + * + * @return UploadField Configured UploadField instance + */ + public function bulkUploadField($gridField) + { + $fileRelationName = $this->getFileRelationName($gridField); + $uploadField = UploadField::create($fileRelationName, '') + ->setForm($gridField->getForm()) - $fieldName = $this->getFileRelationName($gridField); - if($fieldName) - { - return $hasOneFields[$fieldName]; - } - else{ - return 'File'; - } - } - + ->setConfig('previewMaxWidth', 20) + ->setConfig('previewMaxHeight', 20) + ->setConfig('changeDetection', false) - /** - * Returned a configured UploadField instance - * embedded in the gridfield heard - * @param GridField $gridField Current GridField - * @return UploadField Configured UploadField instance - */ - public function bulkUploadField($gridField) - { - $fileRelationName = $this->getFileRelationName($gridField); - $uploadField = UploadField::create($fileRelationName, '') - ->setForm($gridField->getForm()) + ->setRecord(DataObject::create()) // avoid UploadField to get auto-config from the Page (e.g fix allowedMaxFileNumber) - ->setConfig('previewMaxWidth', 20) - ->setConfig('previewMaxHeight', 20) - ->setConfig('changeDetection', false) - - ->setRecord(DataObject::create()) // avoid UploadField to get auto-config from the Page (e.g fix allowedMaxFileNumber) + ->setTemplate('GridFieldBulkUploadField') + ->setDownloadTemplateName('colymba-bulkuploaddownloadtemplate') - ->setTemplate('GridFieldBulkUploadField') - ->setDownloadTemplateName('colymba-bulkuploaddownloadtemplate') - - ->setConfig('url', $gridField->Link('bulkupload/upload')) - ->setConfig('urlSelectDialog', $gridField->Link('bulkupload/select')) - ->setConfig('urlAttach', $gridField->Link('bulkupload/attach')) - ->setConfig('urlFileExists', $gridField->Link('bulkupload/fileexists')) - ; + ->setConfig('url', $gridField->Link('bulkupload/upload')) + ->setConfig('urlSelectDialog', $gridField->Link('bulkupload/select')) + ->setConfig('urlAttach', $gridField->Link('bulkupload/attach')) + ->setConfig('urlFileExists', $gridField->Link('bulkupload/fileexists')) + ; //set UploadField config - foreach ($this->ufConfig as $key => $val) - { - $uploadField->setConfig($key, $val); + foreach ($this->ufConfig as $key => $val) { + $uploadField->setConfig($key, $val); } //UploadField setup - foreach ($this->ufSetup as $fn => $param) - { - $uploadField->{$fn}($param); + foreach ($this->ufSetup as $fn => $param) { + $uploadField->{$fn}($param); } //UploadField Validator setup - foreach ($this->ufValidatorSetup as $fn => $param) - { - $uploadField->getValidator()->{$fn}($param); + foreach ($this->ufValidatorSetup as $fn => $param) { + $uploadField->getValidator()->{$fn}($param); } - - return $uploadField; - } + return $uploadField; + } + /* ********************************************************************** + * GridField_HTMLProvider + * */ - /* ********************************************************************** - * GridField_HTMLProvider - * */ - - /** - * HTML to be embedded into the GridField - * - * @param GridField $gridField - * @return array - */ - public function getHTMLFragments($gridField) - { - // permission check - if( !singleton($gridField->getModelClass())->canEdit() ) - { - return array(); - } + /** + * HTML to be embedded into the GridField. + * + * @param GridField $gridField + * + * @return array + */ + public function getHTMLFragments($gridField) + { + // permission check + if (!singleton($gridField->getModelClass())->canEdit()) { + return array(); + } - // check BulkManager exists - $bulkManager = $gridField->getConfig()->getComponentsByType('GridFieldBulkManager'); + // check BulkManager exists + $bulkManager = $gridField->getConfig()->getComponentsByType('GridFieldBulkManager'); - // upload management buttons - $finishButton = FormAction::create('Finish', _t('GRIDFIELD_BULK_UPLOAD.FINISH_BTN_LABEL', 'Finish')) - ->addExtraClass('bulkUploadFinishButton') - ->setAttribute('data-icon', 'accept') - ->setUseButtonTag(true); + // upload management buttons + $finishButton = FormAction::create('Finish', _t('GRIDFIELD_BULK_UPLOAD.FINISH_BTN_LABEL', 'Finish')) + ->addExtraClass('bulkUploadFinishButton') + ->setAttribute('data-icon', 'accept') + ->setUseButtonTag(true); - $clearErrorButton = FormAction::create('ClearError', _t('GRIDFIELD_BULK_UPLOAD.CLEAR_ERROR_BTN_LABEL', 'Clear errors')) - ->addExtraClass('bulkUploadClearErrorButton') - ->setAttribute('data-icon', 'arrow-circle-double') - ->setUseButtonTag(true); + $clearErrorButton = FormAction::create('ClearError', _t('GRIDFIELD_BULK_UPLOAD.CLEAR_ERROR_BTN_LABEL', 'Clear errors')) + ->addExtraClass('bulkUploadClearErrorButton') + ->setAttribute('data-icon', 'arrow-circle-double') + ->setUseButtonTag(true); - if ( count($bulkManager) ) - { - $cancelButton = FormAction::create('Cancel', _t('GRIDFIELD_BULK_UPLOAD.CANCEL_BTN_LABEL', 'Cancel')) - ->addExtraClass('bulkUploadCancelButton ss-ui-action-destructive') - ->setAttribute('data-icon', 'decline') - ->setAttribute('data-url', $gridField->Link('bulkupload/cancel')) - ->setUseButtonTag(true); + if (count($bulkManager)) { + $cancelButton = FormAction::create('Cancel', _t('GRIDFIELD_BULK_UPLOAD.CANCEL_BTN_LABEL', 'Cancel')) + ->addExtraClass('bulkUploadCancelButton ss-ui-action-destructive') + ->setAttribute('data-icon', 'decline') + ->setAttribute('data-url', $gridField->Link('bulkupload/cancel')) + ->setUseButtonTag(true); - $bulkManager_config = $bulkManager->first()->getConfig(); - $bulkManager_actions = $bulkManager_config['actions']; - if(array_key_exists('bulkedit' , $bulkManager_actions)){ - $editAllButton = FormAction::create('EditAll', _t('GRIDFIELD_BULK_UPLOAD.EDIT_ALL_BTN_LABEL', 'Edit all')) + $bulkManager_config = $bulkManager->first()->getConfig(); + $bulkManager_actions = $bulkManager_config['actions']; + if (array_key_exists('bulkedit', $bulkManager_actions)) { + $editAllButton = FormAction::create('EditAll', _t('GRIDFIELD_BULK_UPLOAD.EDIT_ALL_BTN_LABEL', 'Edit all')) ->addExtraClass('bulkUploadEditButton') ->setAttribute('data-icon', 'pencil') ->setAttribute('data-url', $gridField->Link('bulkupload/edit')) ->setUseButtonTag(true); - }else{ - $editAllButton = ''; - } - } - else{ - $cancelButton = ''; - $editAllButton = ''; - } + } else { + $editAllButton = ''; + } + } else { + $cancelButton = ''; + $editAllButton = ''; + } - // get uploadField + inject extra buttons - $uploadField = $this->bulkUploadField($gridField); - $uploadField->FinishButton = $finishButton; - $uploadField->CancelButton = $cancelButton; - $uploadField->EditAllButton = $editAllButton; - $uploadField->ClearErrorButton = $clearErrorButton; + // get uploadField + inject extra buttons + $uploadField = $this->bulkUploadField($gridField); + $uploadField->FinishButton = $finishButton; + $uploadField->CancelButton = $cancelButton; + $uploadField->EditAllButton = $editAllButton; + $uploadField->ClearErrorButton = $clearErrorButton; - $data = ArrayData::create(array( - 'Colspan' => count($gridField->getColumns()), - 'UploadField' => $uploadField->Field() // call ->Field() to get requirements in right order - )); + $data = ArrayData::create(array( + 'Colspan' => count($gridField->getColumns()), + 'UploadField' => $uploadField->Field(), // call ->Field() to get requirements in right order + )); - Requirements::css(BULKEDITTOOLS_UPLOAD_PATH . '/css/GridFieldBulkUpload.css'); - Requirements::javascript(BULKEDITTOOLS_UPLOAD_PATH . '/javascript/GridFieldBulkUpload.js'); - Requirements::javascript(BULKEDITTOOLS_UPLOAD_PATH . '/javascript/GridFieldBulkUpload_downloadtemplate.js'); - Requirements::add_i18n_javascript(BULKEDITTOOLS_PATH . '/lang/js'); - - return array( - 'header' => $data->renderWith('GridFieldBulkUpload') - ); - } + Requirements::css(BULKEDITTOOLS_UPLOAD_PATH.'/css/GridFieldBulkUpload.css'); + Requirements::javascript(BULKEDITTOOLS_UPLOAD_PATH.'/javascript/GridFieldBulkUpload.js'); + Requirements::javascript(BULKEDITTOOLS_UPLOAD_PATH.'/javascript/GridFieldBulkUpload_downloadtemplate.js'); + Requirements::add_i18n_javascript(BULKEDITTOOLS_PATH.'/lang/js'); + return array( + 'header' => $data->renderWith('GridFieldBulkUpload'), + ); + } + /* ********************************************************************** + * GridField_URLHandler + * */ - /* ********************************************************************** - * GridField_URLHandler - * */ - - /** - * Component URL handlers - * - * @param GridField $gridField - * @return array - */ - public function getURLHandlers($gridField) { - return array( - 'bulkupload' => 'handleBulkUpload' - ); - } - + /** + * Component URL handlers. + * + * @param GridField $gridField + * + * @return array + */ + public function getURLHandlers($gridField) + { + return array( + 'bulkupload' => 'handleBulkUpload', + ); + } - /** - * Pass control over to the RequestHandler - * - * @param GridField $gridField - * @param SS_HTTPRequest $request - * @return mixed - */ - public function handleBulkUpload($gridField, $request) - { - $controller = $gridField->getForm()->Controller(); - $handler = new GridFieldBulkUpload_Request($gridField, $this, $controller); - - return $handler->handleRequest($request, DataModel::inst()); - } + /** + * Pass control over to the RequestHandler. + * + * @param GridField $gridField + * @param SS_HTTPRequest $request + * + * @return mixed + */ + public function handleBulkUpload($gridField, $request) + { + $controller = $gridField->getForm()->Controller(); + $handler = new GridFieldBulkUpload_Request($gridField, $this, $controller); + + return $handler->handleRequest($request, DataModel::inst()); + } } diff --git a/bulkUpload/code/GridFieldBulkUpload_Request.php b/bulkUpload/code/GridFieldBulkUpload_Request.php index 4e3dc17..7d1e2be 100644 --- a/bulkUpload/code/GridFieldBulkUpload_Request.php +++ b/bulkUpload/code/GridFieldBulkUpload_Request.php @@ -1,305 +1,295 @@ action map. + * + * @var array + */ + private static $url_handlers = array( + '$Action!' => '$Action', + ); - /** - * RequestHandler url => action map - * @var array - */ - private static $url_handlers = array( - '$Action!' => '$Action' - ); - + /** + * Handler's constructor. + * + * @param GridFIeld $gridField + * @param GridField_URLHandler $component + * @param Controller $controller + */ + public function __construct($gridField, $component, $controller) + { + $this->gridField = $gridField; + $this->component = $component; + $this->controller = $controller; + parent::__construct(); + } - /** - * Handler's constructor - * - * @param GridFIeld $gridField - * @param GridField_URLHandler $component - * @param Controller $controller - */ - public function __construct($gridField, $component, $controller) - { - $this->gridField = $gridField; - $this->component = $component; - $this->controller = $controller; - parent::__construct(); - } + /** + * Return the original component's UploadField. + * + * @return UploadField UploadField instance as defined in the component + */ + public function getUploadField() + { + return $this->component->bulkUploadField($this->gridField); + } + /** + * Process upload through UploadField, + * creates new record and link newly uploaded file + * adds record to GrifField relation list + * and return image/file data and record edit form. + * + * @param SS_HTTPRequest $request + * + * @return string json + */ + public function upload(SS_HTTPRequest $request) + { + //create record + $recordClass = $this->gridField->list->dataClass; + $record = Object::create($recordClass); + $record->write(); - /** - * Return the original component's UploadField - * - * @return UploadField UploadField instance as defined in the component - */ - public function getUploadField() - { - return $this->component->bulkUploadField($this->gridField); - } + // passes the current gridfield-instance to a call-back method on the new object + $record->extend('onBulkUpload', $this->gridField); + if ($record->hasMethod('onBulkImageUpload')) { + Deprecation::notice('2.0', '"onBulkImageUpload" callback is deprecated, use "onBulkUpload" instead.'); + $record->extend('onBulkImageUpload', $this->gridField); + } - - /** - * Process upload through UploadField, - * creates new record and link newly uploaded file - * adds record to GrifField relation list - * and return image/file data and record edit form - * - * @param SS_HTTPRequest $request - * @return string json - */ - public function upload(SS_HTTPRequest $request) - { - //create record - $recordClass = $this->gridField->list->dataClass; - $record = Object::create($recordClass); - $record->write(); + //get uploadField and process upload + $uploadField = $this->getUploadField(); + $uploadField->setRecord($record); - // passes the current gridfield-instance to a call-back method on the new object - $record->extend("onBulkUpload", $this->gridField); - if ( $record->hasMethod('onBulkImageUpload') ) - { - Deprecation::notice('2.0', '"onBulkImageUpload" callback is deprecated, use "onBulkUpload" instead.'); - $record->extend("onBulkImageUpload", $this->gridField); - } + $fileRelationName = $uploadField->getName(); + $uploadResponse = $uploadField->upload($request); - //get uploadField and process upload - $uploadField = $this->getUploadField(); - $uploadField->setRecord($record); + //get uploaded File response datas + $uploadResponse = Convert::json2array($uploadResponse->getBody()); + $uploadResponse = array_shift($uploadResponse); - $fileRelationName = $uploadField->getName(); - $uploadResponse = $uploadField->upload($request); + // Attach the file to record. + $record->{"{$fileRelationName}ID"} = $uploadResponse['id']; + $record->write(); - //get uploaded File response datas - $uploadResponse = Convert::json2array( $uploadResponse->getBody() ); - $uploadResponse = array_shift( $uploadResponse ); - - // Attach the file to record. - $record->{"{$fileRelationName}ID"} = $uploadResponse['id']; - $record->write(); + // attached record to gridField relation + $this->gridField->list->add($record->ID); - // attached record to gridField relation - $this->gridField->list->add($record->ID); - - // JS Template Data - $responseData = $this->newRecordJSTemplateData($record, $uploadResponse); - - $response = new SS_HTTPResponse(Convert::raw2json(array($responseData))); - $this->contentTypeNegotiation($response); - - return $response; - } + // JS Template Data + $responseData = $this->newRecordJSTemplateData($record, $uploadResponse); + $response = new SS_HTTPResponse(Convert::raw2json(array($responseData))); + $this->contentTypeNegotiation($response); - /** - * Updates the Upload/Attach response from the UploadField - * with the new DataObject records for the JS template - * - * @param DataObject $record Newly create DataObject record - * @param array $uploadResponse Upload or Attach response from UploadField - * @return array Updated $uploadResponse with $record data - */ - protected function newRecordJSTemplateData(DataObject &$record, &$uploadResponse) - { - // fetch uploadedFile record and sort out previewURL - // update $uploadResponse datas in case changes happened onAfterWrite() - $uploadedFile = DataObject::get_by_id( $this->component->getFileRelationClassName($this->gridField), $uploadResponse['id'] ); - - if ( $uploadedFile ) - { - $uploadResponse['name'] = $uploadedFile->Name; - $uploadResponse['url'] = $uploadedFile->getURL(); + return $response; + } - if ( $uploadedFile instanceof Image ) - { - $uploadResponse['thumbnail_url'] = $uploadedFile->CroppedImage(30,30)->getURL(); - } - else{ - $uploadResponse['thumbnail_url'] = $uploadedFile->Icon(); - } + /** + * Updates the Upload/Attach response from the UploadField + * with the new DataObject records for the JS template. + * + * @param DataObject $record Newly create DataObject record + * @param array $uploadResponse Upload or Attach response from UploadField + * + * @return array Updated $uploadResponse with $record data + */ + protected function newRecordJSTemplateData(DataObject &$record, &$uploadResponse) + { + // fetch uploadedFile record and sort out previewURL + // update $uploadResponse datas in case changes happened onAfterWrite() + $uploadedFile = DataObject::get_by_id($this->component->getFileRelationClassName($this->gridField), $uploadResponse['id']); - // check if our new record has a Title, if not create one automatically - $title = $record->getTitle(); - if ( !$title || $title === $record->ID ) - { - if ( $record->hasDatabaseField('Title') ) - { - $record->Title = $uploadedFile->Title; - $record->write(); - } - else if ($record->hasDatabaseField('Name')){ - $record->Name = $uploadedFile->Title; - $record->write(); - } - } - } + if ($uploadedFile) { + $uploadResponse['name'] = $uploadedFile->Name; + $uploadResponse['url'] = $uploadedFile->getURL(); - // Collect all data for JS template - $return = array_merge($uploadResponse, array( - 'record' => array( - 'id' => $record->ID - ) - )); + if ($uploadedFile instanceof Image) { + $uploadResponse['thumbnail_url'] = $uploadedFile->CroppedImage(30, 30)->getURL(); + } else { + $uploadResponse['thumbnail_url'] = $uploadedFile->Icon(); + } - return $return; - } + // check if our new record has a Title, if not create one automatically + $title = $record->getTitle(); + if (!$title || $title === $record->ID) { + if ($record->hasDatabaseField('Title')) { + $record->Title = $uploadedFile->Title; + $record->write(); + } elseif ($record->hasDatabaseField('Name')) { + $record->Name = $uploadedFile->Title; + $record->write(); + } + } + } + // Collect all data for JS template + $return = array_merge($uploadResponse, array( + 'record' => array( + 'id' => $record->ID, + ), + )); - /** - * Pass select request to UploadField - * - * @link UploadField->select() - */ - public function select(SS_HTTPRequest $request) - { - /* - $uploadField = $this->getUploadField(); - return $uploadField->handleSelect($request); - */ - $uploadField = $this->getUploadField(); - return UploadField_SelectHandler::create($this, $uploadField->getFolderName()); - } + return $return; + } + /** + * Pass select request to UploadField. + * + * @link UploadField->select() + */ + public function select(SS_HTTPRequest $request) + { + /* + $uploadField = $this->getUploadField(); + return $uploadField->handleSelect($request); + */ + $uploadField = $this->getUploadField(); - /** - * Pass getRelationAutosetClass request to UploadField - * Used by select dialog - * - * @link UploadField->getRelationAutosetClass() - */ - public function getRelationAutosetClass($default = 'File') - { - $uploadField = $this->getUploadField(); - return $uploadField->getRelationAutosetClass($default); - } - + return UploadField_SelectHandler::create($this, $uploadField->getFolderName()); + } - /** - * Pass getAllowedMaxFileNumber request to UploadField - * Used by select dialog - * - * @link UploadField->getAllowedMaxFileNumber() - */ - public function getAllowedMaxFileNumber() - { - $uploadField = $this->getUploadField(); - return $uploadField->getAllowedMaxFileNumber(); - } + /** + * Pass getRelationAutosetClass request to UploadField + * Used by select dialog. + * + * @link UploadField->getRelationAutosetClass() + */ + public function getRelationAutosetClass($default = 'File') + { + $uploadField = $this->getUploadField(); + return $uploadField->getRelationAutosetClass($default); + } - /** - * Retrieve Files to be attached - * and generated DataObjects for each one - * - * @param SS_HTTPRequest $request - * @return SS_HTTPResponse - */ - public function attach(SS_HTTPRequest $request) - { - $uploadField = $this->getUploadField(); - $attachResponses = $uploadField->attach($request); - $attachResponses = json_decode($attachResponses->getBody(), true); + /** + * Pass getAllowedMaxFileNumber request to UploadField + * Used by select dialog. + * + * @link UploadField->getAllowedMaxFileNumber() + */ + public function getAllowedMaxFileNumber() + { + $uploadField = $this->getUploadField(); - $fileRelationName = $uploadField->getName(); - $recordClass = $this->gridField->list->dataClass; - $return = array(); + return $uploadField->getAllowedMaxFileNumber(); + } - foreach ($attachResponses as $attachResponse) - { - // create record - $record = Object::create($recordClass); - $record->write(); - $record->extend("onBulkUpload", $this->gridField); + /** + * Retrieve Files to be attached + * and generated DataObjects for each one. + * + * @param SS_HTTPRequest $request + * + * @return SS_HTTPResponse + */ + public function attach(SS_HTTPRequest $request) + { + $uploadField = $this->getUploadField(); + $attachResponses = $uploadField->attach($request); + $attachResponses = json_decode($attachResponses->getBody(), true); - // attach file - $record->{"{$fileRelationName}ID"} = $attachResponse['id']; - $record->write(); + $fileRelationName = $uploadField->getName(); + $recordClass = $this->gridField->list->dataClass; + $return = array(); - // attached record to gridField relation - $this->gridField->list->add($record->ID); + foreach ($attachResponses as $attachResponse) { + // create record + $record = Object::create($recordClass); + $record->write(); + $record->extend('onBulkUpload', $this->gridField); - // JS Template Data - $responseData = $this->newRecordJSTemplateData($record, $attachResponse); + // attach file + $record->{"{$fileRelationName}ID"} = $attachResponse['id']; + $record->write(); - // add to returned dataset - array_push($return, $responseData); - } + // attached record to gridField relation + $this->gridField->list->add($record->ID); - $response = new SS_HTTPResponse(Convert::raw2json($return)); - $this->contentTypeNegotiation($response); + // JS Template Data + $responseData = $this->newRecordJSTemplateData($record, $attachResponse); - return $response; - } + // add to returned dataset + array_push($return, $responseData); + } + $response = new SS_HTTPResponse(Convert::raw2json($return)); + $this->contentTypeNegotiation($response); - /** - * Pass fileexists request to UploadField - * - * @link UploadField->fileexists() - */ - public function fileexists(SS_HTTPRequest $request) - { - $uploadField = $this->getUploadField(); - return $uploadField->fileexists($request); - } + return $response; + } + /** + * Pass fileexists request to UploadField. + * + * @link UploadField->fileexists() + */ + public function fileexists(SS_HTTPRequest $request) + { + $uploadField = $this->getUploadField(); - /** - * @param string $action - * @return string - */ - public function Link($action = null) { - return Controller::join_links($this->gridField->Link(), '/bulkupload/', $action); - } + return $uploadField->fileexists($request); + } - /** - * Sets response 'Content-Type' depending on browser capabilities - * e.g. IE needs text/plain for iframe transport - * https://github.com/blueimp/jQuery-File-Upload/issues/1795 - * @param SS_HTTPResponse $response HTTP Response to set content-type on - */ - protected function contentTypeNegotiation(&$response) - { - if (isset($_SERVER['HTTP_ACCEPT']) && ((strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false) || $_SERVER['HTTP_ACCEPT'] === '*/*' )) - { - $response->addHeader('Content-Type', 'application/json'); - }else{ - $response->addHeader('Content-Type', 'text/plain'); - } - } + /** + * @param string $action + * + * @return string + */ + public function Link($action = null) + { + return Controller::join_links($this->gridField->Link(), '/bulkupload/', $action); + } + + /** + * Sets response 'Content-Type' depending on browser capabilities + * e.g. IE needs text/plain for iframe transport + * https://github.com/blueimp/jQuery-File-Upload/issues/1795. + * + * @param SS_HTTPResponse $response HTTP Response to set content-type on + */ + protected function contentTypeNegotiation(&$response) + { + if (isset($_SERVER['HTTP_ACCEPT']) && ((strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false) || $_SERVER['HTTP_ACCEPT'] === '*/*')) { + $response->addHeader('Content-Type', 'application/json'); + } else { + $response->addHeader('Content-Type', 'text/plain'); + } + } } diff --git a/tasks/BuildTransifexTranslations.php b/tasks/BuildTransifexTranslations.php index 3438e5d..9df0d49 100644 --- a/tasks/BuildTransifexTranslations.php +++ b/tasks/BuildTransifexTranslations.php @@ -4,66 +4,63 @@ * from Transifex data. This tasks assumes that: * - Javascript translations are from the Transifex resource called 'js' * - YML translations are from the Transifex resource called 'yml' - * - Transifex AUTH credentials to be saved in $txAuthFile with content {"username": "user", "password": "pwd"} + * - Transifex AUTH credentials to be saved in $txAuthFile with content {"username": "user", "password": "pwd"}. * * This is inspired by SilverStripe build tools. Thanks + * * @see https://github.com/silverstripe/silverstripe-buildtools/blob/master/src/GenerateJavascriptI18nTask.php */ -include_once "phing/Task.php"; +include_once 'phing/Task.php'; // Ignore this file if phing is not installed -if(!class_exists('Task')) { - return; +if (!class_exists('Task')) { + return; } class BuildTransifexTranslations extends Task { - private $txapi = 'https://www.transifex.com/api/2'; - private $txproject = ''; - private $txAuthFile = 'transifexAuth.json'; - private $txAuth = null; + private $txapi = 'https://www.transifex.com/api/2'; + private $txproject = ''; + private $txAuthFile = 'transifexAuth.json'; + private $txAuth = null; - private $root = ''; - private $jsDir = '/lang/js'; - private $ymlDir = '/lang'; + private $root = ''; + private $jsDir = '/lang/js'; + private $ymlDir = '/lang'; - public function settxapi($txapi) - { - $this->txapi = $txapi; - } + public function settxapi($txapi) + { + $this->txapi = $txapi; + } - public function settxproject($txproject) - { - $this->txproject = $txproject; - } + public function settxproject($txproject) + { + $this->txproject = $txproject; + } /** - * Task init + * Task init. */ public function init() - { - $root = realpath(__DIR__ . DIRECTORY_SEPARATOR . '..'); - $authFile = $root . DIRECTORY_SEPARATOR . $this->txAuthFile; + { + $root = realpath(__DIR__.DIRECTORY_SEPARATOR.'..'); + $authFile = $root.DIRECTORY_SEPARATOR.$this->txAuthFile; - if ( file_exists($authFile) ) - { - $txAuthData = file_get_contents($authFile); - $txAuthData = json_decode($txAuthData); - if ( $txAuthData->username && $txAuthData->password ) - { - $this->txAuth = $txAuthData; + if (file_exists($authFile)) { + $txAuthData = file_get_contents($authFile); + $txAuthData = json_decode($txAuthData); + if ($txAuthData->username && $txAuthData->password) { + $this->txAuth = $txAuthData; + } else { + throw new BuildException("Transifex credentials malformat. Check your $authFile for 'username' and 'password' keys."); + } + } else { + throw new BuildException("Transifex credentials not found. $authFile missing."); } - else{ - throw new BuildException("Transifex credentials malformat. Check your $authFile for 'username' and 'password' keys."); - } - } - else{ - throw new BuildException("Transifex credentials not found. $authFile missing."); - } - $this->root = $root; - $this->jsDir = $root . $this->jsDir; - $this->ymlDir = $root . $this->ymlDir; + $this->root = $root; + $this->jsDir = $root.$this->jsDir; + $this->ymlDir = $root.$this->ymlDir; } /** @@ -71,138 +68,120 @@ class BuildTransifexTranslations extends Task */ public function main() { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($ch, CURLOPT_USERPWD, $this->txAuth->username . ":" . $this->txAuth->password); - + $ch = curl_init(); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($ch, CURLOPT_USERPWD, $this->txAuth->username.':'.$this->txAuth->password); + // get resources $url = $this->txapi.'/project/'.$this->txproject.'/resources/'; - curl_setopt($ch, CURLOPT_URL, $url); - $resources = curl_exec($ch); + curl_setopt($ch, CURLOPT_URL, $url); + $resources = curl_exec($ch); - if ( !$resources ) - { - throw new BuildException("Cannot fetch resources"); - } - else{ - $resources = json_decode($resources); - } + if (!$resources) { + throw new BuildException('Cannot fetch resources'); + } else { + $resources = json_decode($resources); + } // get langs $url = $this->txapi.'/project/'.$this->txproject.'/languages/'; - curl_setopt($ch, CURLOPT_URL, $url); - $languages = curl_exec($ch); + curl_setopt($ch, CURLOPT_URL, $url); + $languages = curl_exec($ch); - if ( !$languages ) - { - throw new BuildException("Cannot fetch languages"); - } - else{ - $languages = json_decode($languages); - } + if (!$languages) { + throw new BuildException('Cannot fetch languages'); + } else { + $languages = json_decode($languages); + } // clear existing translation files and/or setup folders $this->resetTranslations(); // add source_language_code to languages list $sourceLangs = array(); - foreach ($resources as $resource) - { - $lang = new StdClass(); - $locale = $resource->source_language_code; - $lang->language_code = $locale; - if ( !array_key_exists($locale, $sourceLangs) ) - { - $sourceLangs[$locale] = $lang; - } - } - $sourceLangs = array_values($sourceLangs); - $languages = array_merge($languages, $sourceLangs); + foreach ($resources as $resource) { + $lang = new StdClass(); + $locale = $resource->source_language_code; + $lang->language_code = $locale; + if (!array_key_exists($locale, $sourceLangs)) { + $sourceLangs[$locale] = $lang; + } + } + $sourceLangs = array_values($sourceLangs); + $languages = array_merge($languages, $sourceLangs); // get each resource translations - foreach ($resources as $resource) - { - foreach ($languages as $language) - { - $url = $this->txapi.'/project/'.$this->txproject.'/resource/'.$resource->slug.'/translation/'.$language->language_code; - curl_setopt($ch, CURLOPT_URL, $url); - $data = curl_exec($ch); - if ( $data ) - { - $this->saveTranslation($resource->slug, $language->language_code, $data); + foreach ($resources as $resource) { + foreach ($languages as $language) { + $url = $this->txapi.'/project/'.$this->txproject.'/resource/'.$resource->slug.'/translation/'.$language->language_code; + curl_setopt($ch, CURLOPT_URL, $url); + $data = curl_exec($ch); + if ($data) { + $this->saveTranslation($resource->slug, $language->language_code, $data); + } } - } } - - curl_close($ch); + + curl_close($ch); } /** * Clear any existing translation files - * and create directory structure if needed + * and create directory structure if needed. */ private function resetTranslations() { - if ( file_exists($this->jsDir) ) - { - echo "Clearing js translations...\n"; - $iterator = new GlobIterator($this->jsDir . DIRECTORY_SEPARATOR . '*.js'); - foreach ($iterator as $fileInfo) - { - if ( $fileInfo->isFile() ) - { - $del = unlink($fileInfo->getRealPath()); - } + if (file_exists($this->jsDir)) { + echo "Clearing js translations...\n"; + $iterator = new GlobIterator($this->jsDir.DIRECTORY_SEPARATOR.'*.js'); + foreach ($iterator as $fileInfo) { + if ($fileInfo->isFile()) { + $del = unlink($fileInfo->getRealPath()); + } + } } - } - if ( file_exists($this->ymlDir) ) - { - echo "Clearing yml translations...\n"; - $iterator = new GlobIterator($this->ymlDir . DIRECTORY_SEPARATOR . '*.yml'); - foreach ($iterator as $fileInfo) - { - if ( $fileInfo->isFile() ) - { - $del = unlink($fileInfo->getRealPath()); - } + if (file_exists($this->ymlDir)) { + echo "Clearing yml translations...\n"; + $iterator = new GlobIterator($this->ymlDir.DIRECTORY_SEPARATOR.'*.yml'); + foreach ($iterator as $fileInfo) { + if ($fileInfo->isFile()) { + $del = unlink($fileInfo->getRealPath()); + } + } } - } - if ( !file_exists($this->jsDir) ) - { - echo "Creating js folders...\n"; - mkdir($this->jsDir); - } + if (!file_exists($this->jsDir)) { + echo "Creating js folders...\n"; + mkdir($this->jsDir); + } - if ( !file_exists($this->ymlDir) ) - { - echo "Creating yml folders...\n"; - mkdir($this->ymlDir); - } + if (!file_exists($this->ymlDir)) { + echo "Creating yml folders...\n"; + mkdir($this->ymlDir); + } } /** * Hook that detect the translation type via resource slug - * and call corect saving function with data + * and call corect saving function with data. + * * @param string $resource Transifex resrouce slug * @param string $locale Transifex locale * @param string $data Raw Transifex translation data */ private function saveTranslation($resource, $locale, $data) { - if ( !$resource || !$locale || !$data ) - { - return; - } + if (!$resource || !$locale || !$data) { + return; + } - $data = json_decode($data); - $translation = rtrim($data->content); + $data = json_decode($data); + $translation = rtrim($data->content); - switch ($resource) - { + switch ($resource) { case 'js': $this->saveJSTranslation($locale, $translation); break; @@ -215,24 +194,25 @@ class BuildTransifexTranslations extends Task /** * Save a JS translation file - * Uses JSTemplate to fit with SilverStripe requirements + * Uses JSTemplate to fit with SilverStripe requirements. + * * @param string $locale Locale code * @param string $json JSON translation key:value */ private function saveJSTranslation($locale, $json) - { - echo "Saving $locale.js\n"; - file_put_contents( - $this->jsDir . DIRECTORY_SEPARATOR . $locale . '.js', - $this->getBanner('js') . + { + echo "Saving $locale.js\n"; + file_put_contents( + $this->jsDir.DIRECTORY_SEPARATOR.$locale.'.js', + $this->getBanner('js'). str_replace( array( '%TRANSLATIONS%', - '%LOCALE%' + '%LOCALE%', ), array( $json, - $locale + $locale, ), $this->getJSTemplate() ) @@ -240,67 +220,70 @@ class BuildTransifexTranslations extends Task } /** - * Save a YML translation file + * Save a YML translation file. + * * @param string $locale Locale code * @param string $yml YML translation */ public function saveYMLTranslation($locale, $yml) { - echo "Saving $locale.yml\n"; - - if ($locale !== 'en') - { - $content = $this->getBanner('yml') . $yml; - } - else{ - $content = $yml; - } + echo "Saving $locale.yml\n"; - file_put_contents( - $this->ymlDir . DIRECTORY_SEPARATOR . $locale . '.yml', + if ($locale !== 'en') { + $content = $this->getBanner('yml').$yml; + } else { + $content = $yml; + } + + file_put_contents( + $this->ymlDir.DIRECTORY_SEPARATOR.$locale.'.yml', $content ); } /** - * Return the commented file banner + * Return the commented file banner. + * * @param string $type File type e.g js + * * @return string The commented file banner */ private function getBanner($type) { - switch ( strtolower($type) ) - { + switch (strtolower($type)) { case 'yml': - $comment = "#"; + $comment = '#'; break; - + default: - $comment = "//"; + $comment = '//'; break; } - $banner = <<