/** * Bulk export: Tabular export: abstract base class for all "tabular" exports. * Provides the user interface for selecting the column to be exported * * @copyright Copyright (C) 2015 Combodo SARL * @license http://opensource.org/licenses/AGPL-3.0 */ abstract class TabularBulkExport extends BulkExport { public function EnumFormParts() { return array_merge(parent::EnumFormParts(), array('tabular_fields' => array('fields'))); } public function DisplayFormPart(WebPage $oP, $sPartId) { switch($sPartId) { case 'tabular_fields': $sFields = utils::ReadParam('fields', '', true, 'raw_data'); $sSuggestedFields = utils::ReadParam('suggested_fields', null, true, 'raw_data'); if (($sSuggestedFields !== null) && ($sSuggestedFields !== '')) { $aSuggestedFields = explode(',', $sSuggestedFields); $sFields = implode(',', $this->SuggestFields($aSuggestedFields)); } $oP->add(''); break; default: return parent:: DisplayFormPart($oP, $sPartId); } } protected function SuggestFields($aSuggestedFields) { // By defaults all fields are Ok, nothing gets translated but // you can overload this method if some fields are better exported // (in a given format) by using an alternate field, for example id => friendlyname $aAliases = $this->oSearch->GetSelectedClasses(); foreach($aSuggestedFields as $idx => $sField) { if (preg_match('/^([^\\.]+)\\.(.+)$/', $sField, $aMatches)) { $sAlias = $aMatches[1]; $sAttCode = $aMatches[2]; $sClass = $aAliases[$sAlias]; } else { $sAlias = ''; $sAttCode = $sField; $sClass = reset($aAliases); } $aSuggestedFields[$idx] = $this->SuggestField($aAliases, $sClass, $sAlias, $sAttCode); } return $aSuggestedFields; } protected function SuggestField($aAliases, $sClass, $sAlias, $sAttCode) { // Remove the aliases (if any) from the field names to make them compatible // with the 'short' notation used in this case by the widget if (count($aAliases) == 1) { return $sAttCode; } return $sAlias.'.'.$sAttCode; } protected function IsSubAttribute($sClass, $sAttCode, $oAttDef) { return (($oAttDef instanceof AttributeFriendlyName) || ($oAttDef instanceof AttributeExternalField) || ($oAttDef instanceof AttributeSubItem)); } protected function GetSubAttributes($sClass, $sAttCode, $oAttDef) { $aResult = array(); switch(get_class($oAttDef)) { case 'AttributeExternalKey': case 'AttributeHierarchicalKey': $aResult[] = array('code' => $sAttCode, 'unique_label' => $oAttDef->GetLabel(), 'label' => Dict::S('Core:BulkExport:Identifier'), 'attdef' => $oAttDef); $aResult[] = array('code' => $sAttCode.'_friendlyname', 'unique_label' => $oAttDef->GetLabel().'->'.Dict::S('Core:BulkExport:Friendlyname'), 'label' => Dict::S('Core:BulkExport:Friendlyname'), 'attdef' => MetaModel::GetAttributeDef($sClass, $sAttCode.'_friendlyname')); foreach(MetaModel::ListAttributeDefs($sClass) as $sSubAttCode => $oSubAttDef) { if ($oSubAttDef instanceof AttributeExternalField) { if ($oSubAttDef->GetKeyAttCode() == $sAttCode) { $aResult[] = array('code' => $sSubAttCode, 'unique_label' => $oAttDef->GetLabel().'->'.$oSubAttDef->GetExtAttDef()->GetLabel(), 'label' => $oSubAttDef->GetExtAttDef()->GetLabel(), 'attdef' => $oSubAttDef); } } } break; case 'AttributeStopWatch': foreach(MetaModel::ListAttributeDefs($sClass) as $sSubAttCode => $oSubAttDef) { if ($oSubAttDef instanceof AttributeSubItem) { if ($oSubAttDef->GetParentAttCode() == $sAttCode) { $aResult[] = array('code' => $sSubAttCode, 'unique_label' => $oSubAttDef->GetLabel(), 'label' => $oSubAttDef->GetLabel(), 'attdef' => $oSubAttDef); } } } break; } return $aResult; } protected function GetInteractiveFieldsWidget(WebPage $oP, $sWidgetId) { $oSet = new DBObjectSet($this->oSearch); $aSelectedClasses = $this->oSearch->GetSelectedClasses(); $aAuthorizedClasses = array(); foreach($aSelectedClasses as $sAlias => $sClassName) { if (UserRights::IsActionAllowed($sClassName, UR_ACTION_BULK_READ, $oSet) && (UR_ALLOWED_YES || UR_ALLOWED_DEPENDS)) { $aAuthorizedClasses[$sAlias] = $sClassName; } } $aAllFieldsByAlias = array(); foreach($aAuthorizedClasses as $sAlias => $sClass) { $aAllFields = array(); if (count($aAuthorizedClasses) > 1 ) { $sShortAlias = $sAlias.'.'; } else { $sShortAlias = ''; } if ($this->IsValidField($sClass, 'id')) { $aAllFields[] = array('code' => $sShortAlias.'id', 'unique_label' => $sShortAlias.Dict::S('Core:BulkExport:Identifier'), 'label' => $sShortAlias.'id', 'subattr' => array( array('code' => $sShortAlias.'id', 'unique_label' => $sShortAlias.Dict::S('Core:BulkExport:Identifier'), 'label' => $sShortAlias.'id'), array('code' => $sShortAlias.'friendlyname', 'unique_label' => $sShortAlias.Dict::S('Core:BulkExport:Friendlyname'), 'label' => $sShortAlias.Dict::S('Core:BulkExport:Friendlyname')), )); } foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) { if($this->IsSubAttribute($sClass, $sAttCode, $oAttDef)) continue; if ($this->IsValidField($sClass, $sAttCode, $oAttDef)) { $sShortLabel = $oAttDef->GetLabel(); $sLabel = $sShortAlias.$oAttDef->GetLabel(); $aSubAttr = $this->GetSubAttributes($sClass, $sAttCode, $oAttDef); $aValidSubAttr = array(); foreach($aSubAttr as $aSubAttDef) { if ($this->IsValidField($sClass, $aSubAttDef['code'], $aSubAttDef['attdef'])) { $aValidSubAttr[] = array('code' => $sShortAlias.$aSubAttDef['code'], 'label' => $aSubAttDef['label'], 'unique_label' => $aSubAttDef['unique_label']); } } $aAllFields[] = array('code' => $sShortAlias.$sAttCode, 'label' => $sShortLabel, 'unique_label' => $sLabel, 'subattr' => $aValidSubAttr); } } usort($aAllFields, array(get_class($this), 'SortOnLabel')); if (count($aAuthorizedClasses) > 1) { $sKey = MetaModel::GetName($sClass).' ('.$sAlias.')'; } else { $sKey = MetaModel::GetName($sClass); } $aAllFieldsByAlias[$sKey] = $aAllFields; } $oP->add('
'); $JSAllFields = json_encode($aAllFieldsByAlias); $oSet = new DBObjectSet($this->oSearch); $iCount = $oSet->Count(); $iPreviewLimit = 3; $oSet->SetLimit($iPreviewLimit); $aSampleData = array(); while($aRow = $oSet->FetchAssoc()) { $aSampleRow = array(); foreach($aAuthorizedClasses as $sAlias => $sClass) { if (count($aAuthorizedClasses) > 1 ) { $sShortAlias = $sAlias.'.'; } else { $sShortAlias = ''; } if ($this->IsValidField($sClass, 'id')) { $aSampleRow[$sShortAlias.'id'] = $this->GetSampleKey($aRow[$sAlias]); } foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) { if ($this->IsValidField($sClass, $sAttCode, $oAttDef)) { $aSampleRow[$sShortAlias.$sAttCode] = $this->GetSampleData($aRow[$sAlias], $sAttCode); } } } $aSampleData[] = $aSampleRow; } $sJSSampleData = json_encode($aSampleData); $aLabels = array( 'preview_header' => Dict::S('Core:BulkExport:DragAndDropHelp'), 'empty_preview' => Dict::S('Core:BulkExport:EmptyPreview'), 'columns_order' => Dict::S('Core:BulkExport:ColumnsOrder'), 'columns_selection' => Dict::S('Core:BulkExport:AvailableColumnsFrom_Class'), 'check_all' => Dict::S('Core:BulkExport:CheckAll'), 'uncheck_all' => Dict::S('Core:BulkExport:UncheckAll'), 'no_field_selected' => Dict::S('Core:BulkExport:NoFieldSelected'), ); $sJSLabels = json_encode($aLabels); $oP->add_ready_script( <<