Index: trunk/core/units/general/cat_event_handler.php =================================================================== diff -u -r3299 -r3543 --- trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 3299) +++ trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 3543) @@ -237,9 +237,25 @@ * @param kCatDBItem $object * @param kEvent $event */ - function PrepareObject(&$object, &$event) + function prepareObject(&$object, &$event) { + $this->prepareItemStatuses($event); + + if ($event->Special == 'export' || $event->Special == 'import') + { + $this->prepareExportColumns($event); + } + } + /** + * Creates calculated fields for all item statuses based on config settings + * + * @param kEvent $event + */ + function prepareItemStatuses(&$event) + { + $object =& $event->getObject( Array('skip_autoload' => true) ); + $property_mappings = $this->Application->getUnitOption($event->Prefix, 'ItemPropertyMappings'); $new_days_var = getArrayValue($property_mappings, 'NewDays'); @@ -279,7 +295,7 @@ %1$s.PopItem)'); } } - + function CalculateHotLimit(&$event) { $property_mappings = $this->Application->getUnitOption($event->Prefix, 'ItemPropertyMappings'); @@ -1005,7 +1021,365 @@ $object->SetPage($page); } + +/* === RELATED TO IMPORT/EXPORT: BEGIN === */ + + /** + * Returns module folder + * + * @param kEvent $event + * @return string + */ + function getModuleFolder(&$event) + { + return $this->Application->getUnitOption($event->Prefix, 'ModuleFolder'); + } + + /** + * Shows export dialog + * + * @param kEvent $event + */ + function OnExport(&$event) + { + $selected_ids = $this->Application->GetVar('linklist'); + $selected_cats_ids = $this->Application->GetVar('export_categories'); + + $this->Application->StoreVar($event->Prefix.'_export_ids', $selected_ids ? implode(',', $selected_ids) : '' ); + $this->Application->StoreVar($event->Prefix.'_export_cats_ids', $selected_cats_ids); + + $event->redirect = $this->getModuleFolder($event).'/export'; + + $redirect_params = Array( 'm_opener' => 'd', + 'index_file' => 'index4.php', + $this->Prefix.'.export_event' => 'OnNew', + 'pass' => 'all,'.$this->Prefix.'.export'); + + $event->setRedirectParams($redirect_params); + } + + /** + * Export form validation & processing + * + * @param kEvent $event + */ + function OnExportBegin(&$event) + { + $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) ); + if (!$items_info) + { + $items_info = unserialize( $this->Application->RecallVar($event->getPrefixSpecial().'_ItemsInfo') ); + } + + list($item_id, $field_values) = each($items_info); + + $object =& $event->getObject( Array('skip_autoload' => true) ); + $object->SetFieldsFromHash($field_values); + $object->setID($item_id); + $this->setRequiredFields($event); + + $export_object =& $this->Application->recallObject('CatItemExportHelper'); + + // save export/import options + if ($event->Special == 'export') + { + $export_ids = $this->Application->RecallVar($event->Prefix.'_export_ids'); + $export_cats_ids = $this->Application->RecallVar($event->Prefix.'_export_cats_ids'); + + // used for multistep export + $field_values['export_ids'] = $export_ids ? explode(',', $export_ids) : false; + $field_values['export_cats_ids'] = $export_cats_ids ? explode(',', $export_cats_ids) : Array( $this->Application->GetVar('m_cat_id') ); + } + + $field_values['ExportColumns'] = $field_values['ExportColumns'] ? explode('|', substr($field_values['ExportColumns'], 1, -1) ) : Array(); + $field_values['start_from'] = 0; + $this->Application->StoreVar($event->getPrefixSpecial().'_options', serialize($field_values) ); + + if( $export_object->verifyOptions($event) ) + { + $this->doExport($event); + } + else + { + $event->status = erFAIL; + $event->redirect = false; + } + } + + /** + * Enter description here... + * + * @param kEvent $event + */ + function doExport(&$event) + { + if ($event->Name == 'OnExportBegin') + { + $done_percent = 0; + } + else { + $export_options = unserialize($this->Application->RecallVar($event->getPrefixSpecial().'_options')); + $done_percent = round($export_options['start_from'] * 100 / $export_options['total_records'], 0); + } + + $block_params = Array( 'name' => $this->getModuleFolder($event).'/'.$event->Special.'_progress', + 'percent_done' => $done_percent, + 'percent_left' => 100 - $done_percent); + $this->Application->InitParser(); + $this->Application->setUnitOption($event->Prefix, 'AutoLoad', false); + echo $this->Application->ParseBlock($block_params); + flush(); + + $export_object =& $this->Application->recallObject('CatItemExportHelper'); + + $action_method = 'perform'.ucfirst($event->Special); + $field_values = $export_object->$action_method($event); + + if ($field_values['start_from'] == $field_values['total_records']) + { + if ($event->Special == 'import') { + $this->Application->StoreVar('PermCache_UpdateRequired', 1); + $event->SetRedirectParam('index_file', 'category/category_maint.php'); + } + else { + $event->redirect = $this->getModuleFolder($event).'/'.$event->Special.'_finish'; + } + } + else { + $event->redirect = $this->getModuleFolder($event).'/'.$event->Special.'_progress'; + $redirect_params = Array($event->getPrefixSpecial().'_event' => 'OnExportProgress', 'pass' => 'm,'.$event->getPrefixSpecial()); + $event->setRedirectParams($redirect_params); + } + } + + /** + * Next export steps + * + * @param kEvent $event + */ + function OnExportProgress(&$event) + { + $this->doExport($event); + } + + /** + * Sets correct available & export fields + * + * @param kEvent $event + */ + function prepareExportColumns(&$event) + { + $object =& $event->getObject( Array('skip_autoload' => true) ); + + $available_columns = Array(); + + // category field (mixed) + $available_columns['__CATEGORY__CategoryPath'] = 'CategoryPath'; + + if ($event->Special == 'import') { + // category field (separated fields) + $max_level = $this->Application->ConfigValue('MaxImportCategoryLevels'); + $i = 0; + while ($i < $max_level) { + $available_columns['__CATEGORY__Category'.($i + 1)] = 'Category'.($i + 1); + $i++; + } + } + + // db fields + $fields = array_keys($object->Fields); + foreach ($fields as $field_name) + { + if (!$object->SkipField($field_name)) + { + $available_columns[$field_name] = $field_name; + } + } + + // custom fields + $fields = array_keys($object->CustomFields); + foreach ($fields as $field_name) + { + $available_columns['__CUSTOM__'.$field_name] = $field_name; + } + + // columns already in use + $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) ); + if ($items_info) + { + list($item_id, $field_values) = each($items_info); + $export_keys = $field_values['ExportColumns']; + $export_keys = $export_keys ? explode('|', substr($export_keys, 1, -1) ) : Array(); + } + else { + $export_keys = Array(); + } + + $export_columns = Array(); + foreach ($export_keys as $field_key) + { + $field_name = $this->getExportField($field_key); + $export_columns[$field_key] = $field_name; + unset($available_columns[$field_key]); + } + + $options = $object->GetFieldOptions('ExportColumns'); + $options['options'] = $export_columns; + $object->SetFieldOptions('ExportColumns', $options); + + $options = $object->GetFieldOptions('AvailableColumns'); + $options['options'] = $available_columns; + $object->SetFieldOptions('AvailableColumns', $options); + + if ($event->Special == 'import') + { + $import_filenames = Array(); + + if ($folder_handle = opendir(EXPORT_PATH)) { + while (false !== ($file = readdir($folder_handle))) { + if ( substr($file, 0, 1) == '.' || strtolower($file) == 'cvs' || strtolower($file) == 'dummy' || filesize(EXPORT_PATH.'/'.$file) == 0) continue; + + $file_size = formatSize( filesize(EXPORT_PATH.'/'.$file) ); + $import_filenames[$file] = $file.' ('.$file_size.')'; + } + closedir($folder_handle); + } + $options = $object->GetFieldOptions('ImportLocalFilename'); + $options['options'] = $import_filenames; + $object->SetFieldOptions('ImportLocalFilename', $options); + } + } + + +// ImportLocalFilename + + function getExportField($field_key) + { + $prepends = Array('__CUSTOM__', '__CATEGORY__'); + foreach ($prepends as $prepend) + { + if (substr($field_key, 0, strlen($prepend) ) == $prepend) + { + $field_key = substr($field_key, strlen($prepend), strlen($field_key) ); + break; + } + } + return $field_key; + } + + /** + * Shows export dialog + * + * @param kEvent $event + */ + function OnImport(&$event) + { + + $event->redirect = $this->getModuleFolder($event).'/import'; + + $redirect_params = Array( 'm_opener' => 'd', + 'index_file' => 'index4.php', + $this->Prefix.'.import_event' => 'OnNew', + 'pass' => 'all,'.$this->Prefix.'.import'); + + $event->setRedirectParams($redirect_params); + } + + /** + * Prepares item for import/export operations + * + * @param kEvent $event + */ + function OnNew(&$event) + { + parent::OnNew($event); + + if ($event->Special != 'import' && $event->Special != 'export') return ; + $this->setRequiredFields($event); + } + + /** + * set required fields based on import or export params + * + * @param kEvent $event + */ + function setRequiredFields(&$event) + { + $required_fields['common'] = Array('FieldsSeparatedBy', 'FieldsEnclosedBy', 'LineEndings', 'CategoryFormat'); + + $required_fields['export'] = Array('ExportFormat', 'ExportFilename','ExportColumns'); + $required_fields['import'] = Array('FieldTitles', 'ImportSource', 'CheckDuplicatesMethod'); // ImportFilename, ImportLocalFilename + + $object =& $event->getObject(); + if ($event->Special == 'import') + { + $import_source = Array(1 => 'ImportFilename', 2 => 'ImportLocalFilename'); + $used_field = $import_source[ $object->GetDBField('ImportSource') ]; + + $required_fields[$event->Special][] = $used_field; + $object->Fields[$used_field]['error_field'] = 'ImportSource'; + + if ($object->GetDBField('FieldTitles') == 2) $required_fields[$event->Special][] = 'ExportColumns'; // manual field titles + } + + $required_fields = array_merge($required_fields['common'], $required_fields[$event->Special]); + foreach ($required_fields as $required_field) { + $object->setRequired($required_field, true); + } + } + + /** + * Saves selected category as new import category + * + * @param kEvent $event + */ + function OnSelectItems(&$event) + { + $items_info = $this->Application->GetVar('c'); + + if ($items_info) + { + $selected_categories = array_keys($items_info); + $cat_id = array_shift($selected_categories); + + $sql = 'SELECT CategoryId FROM '.TABLE_PREFIX.'Category WHERE ResourceId = '.$cat_id; + $cat_id = $this->Conn->GetOne($sql); + } + else { + $cat_id = 0; + } + + $this->Application->StoreVar('ImportCategory', $cat_id); + $this->Application->StoreVar($event->getPrefixSpecial().'_ForceNotValid', 1); // not to loose import/export values on form refresh + + $this->Application->SetVar($event->getPrefixSpecial().'_id', 0); + $this->Application->SetVar($event->getPrefixSpecial().'_event', 'OnExportBegin'); + + $passed = $this->Application->GetVar('passed'); + $this->Application->SetVar('passed', $passed.','.$event->getPrefixSpecial()); + $event->setEventParam('pass_events', true); + + $this->finalizePopup($event, null, $this->getModuleFolder($event).'/'.$event->Special); + + } + + /** + * Saves Import/Export settings to session + * + * @param kEvent $event + */ + function OnSaveSettings(&$event) + { + $event->redirect = false; + $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) ); + if ($items_info) { + $this->Application->StoreVar($event->getPrefixSpecial().'_ItemsInfo', serialize($items_info)); + } + } + +/* === RELATED TO IMPORT/EXPORT: END === */ + } ?> \ No newline at end of file