Page MenuHomeIn-Portal Phabricator

in-portal
No OneTemporary

File Metadata

Created
Sat, Jul 19, 1:43 AM

in-portal

Index: branches/unlabeled/unlabeled-1.22.2/kernel/units/visits/visits_config.php
===================================================================
--- branches/unlabeled/unlabeled-1.22.2/kernel/units/visits/visits_config.php (nonexistent)
+++ branches/unlabeled/unlabeled-1.22.2/kernel/units/visits/visits_config.php (revision 6688)
@@ -0,0 +1,129 @@
+<?php
+
+$config = Array(
+ 'Prefix' => 'visits',
+ 'ItemClass' => Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+ 'ListClass' => Array('class'=>'VisitsList','file'=>'visits_list.php','build_event'=>'OnListBuild'),
+ 'EventHandlerClass' => Array('class'=>'VisitsEventHandler','file'=>'visits_event_handler.php','build_event'=>'OnBuild'),
+ 'TagProcessorClass' => Array('class'=>'VisitsTagProcessor','file'=>'visits_tag_processor.php','build_event'=>'OnBuild'),
+ 'AutoLoad' => true,
+
+ 'QueryString' => Array(
+ 1 => 'id',
+ 2 => 'Page',
+ 3 => 'event',
+ 4 => 'mode',
+ ),
+
+ 'Hooks' => Array(
+ Array(
+ 'Mode' => hBEFORE,
+ 'Conditional' => false,
+ 'HookToPrefix' => 'adm',
+ 'HookToSpecial' => '',
+ 'HookToEvent' => Array( 'OnStartup' ),
+ 'DoPrefix' => '',
+ 'DoSpecial' => '',
+ 'DoEvent' => 'OnRegisterVisit',
+ ),
+ ),
+
+ 'IDField' => 'VisitId',
+ 'TableName' => TABLE_PREFIX.'Visits',
+ 'TitlePresets' => Array(
+ 'default' => Array(),
+ 'visits_list' => Array('prefixes' => Array('visits_List'), 'format' => "!la_title_Visits! (#visits_recordcount#)"),
+ 'visits.incommerce_list' => Array('prefixes' => Array('visits.incommerce_List'), 'format' => "!la_title_Visits! (#visits.incommerce_recordcount#)"),
+ ),
+ 'CalculatedFields' => Array(
+ '' => Array (
+ 'UserName' => 'IF( ISNULL(u.Login), IF (%1$s.PortalUserId = -1, \'root\', IF (%1$s.PortalUserId = -2, \'Guest\', \'n/a\')), u.Login)',
+ ),
+ 'incommerce' => Array (
+ 'UserName' => 'IF( ISNULL(u.Login), IF (%1$s.PortalUserId = -1, \'root\', IF (%1$s.PortalUserId = -2, \'Guest\', \'n/a\')), u.Login)',
+ 'AffiliateUser' => 'IF( LENGTH(au.Login),au.Login,\'!la_None!\')',
+ 'AffiliatePortalUserId' => 'af.PortalUserId',
+ 'OrderTotalAmount' => 'IF(ord.Status = 4, ord.SubTotal+ord.ShippingCost+ord.VAT, 0)',
+ 'OrderAffiliateCommission' => 'IF(ord.Status = 4, ord.AffiliateCommission, 0)',
+ 'OrderNumber' => 'CONCAT(LPAD(Number,6,"0"),\'-\',LPAD(SubNumber,3,"0") )',
+ 'OrderId' => 'ord.OrderId',
+ ),
+ ),
+
+ 'ListSQLs' => Array( ''=>' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId',
+ 'incommerce'=>'
+ SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Affiliates af ON %1$s.AffiliateId = af.AffiliateId
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser au ON af.PortalUserId = au.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Orders ord ON %1$s.VisitId = ord.VisitId',
+ ),
+
+
+ 'ItemSQLs' => Array( ''=>' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId',
+ 'incommerce'=>' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Affiliates af ON %1$s.AffiliateId = af.AffiliateId
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser au ON af.PortalUserId = au.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Orders ord ON %1$s.VisitId = ord.VisitId',
+ ),
+
+ 'ListSortings' => Array(
+ '' => Array(
+ 'Sorting' => Array('VisitDate' => 'desc'),
+ )
+ ),
+
+ 'Fields' => Array(
+ 'VisitId' => Array('type' => 'int'),
+ 'VisitDate' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'custom_filter' => 'date_range', 'not_null' => '1','default' => '0'),
+ 'Referer' => Array('type' => 'string','not_null' => '1','default' => ''),
+ 'IPAddress' => Array('type' => 'string','not_null' => '1','default' => ''),
+ 'AffiliateId' => Array('type'=>'int','formatter'=>'kLEFTFormatter','options'=>Array(0=>'lu_none'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'Affiliates af LEFT JOIN '.TABLE_PREFIX.'PortalUser pu ON pu.PortalUserId = af.PortalUserId WHERE `%s` = \'%s\'','left_key_field'=>'AffiliateId','left_title_field'=>'Login','not_null'=>1,'default'=>0),
+ 'PortalUserId' => Array('type' => 'int','not_null' => '1','default' => -2),
+ ),
+
+ 'VirtualFields' => Array(
+ 'UserName' => Array('type'=>'string'),
+ 'AffiliateUser' => Array('type'=>'string'),
+ 'AffiliatePortalUserId' => Array('type'=>'int'),
+ 'OrderTotalAmount' => Array('type' => 'float', 'formatter'=>'kFormatter', 'format'=>'%01.2f', 'not_null' => '1','default' => '0.00', 'totals' => 'SUM'),
+ 'OrderTotalAmountSum' => Array('type' => 'float', 'formatter'=>'kFormatter', 'format'=>'%01.2f', 'not_null' => '1','default' => '0.00'),
+ 'OrderAffiliateCommission' => Array('type' => 'double', 'formatter'=>'kFormatter','format'=>'%.02f', 'not_null' => '1','default' => '0.0000', 'totals' => 'SUM'),
+ 'OrderAffiliateCommissionSum' => Array('type' => 'double', 'formatter'=>'kFormatter','format'=>'%.02f', 'not_null' => '1','default' => '0.0000'),
+ 'OrderId' => Array('type' => 'int', 'default' => '0'),
+ ),
+
+ 'Grids' => Array(
+ 'Default' => Array(
+ 'Icons' => Array('default'=>'icon16_custom.gif'), // icons for each StatusField values, if no matches or no statusfield selected, then "default" icon is used
+ 'Fields' => Array(
+ 'VisitDate' => Array( 'title'=>'la_col_VisitDate', 'data_block' => 'grid_checkbox_td' ),
+ 'IPAddress' => Array( 'title'=>'la_col_IPAddress' ),
+ 'Referer' => Array( 'title'=>'la_col_Referer', 'data_block' => 'grid_referer_td' ),
+ 'UserName' => Array('title' => 'la_col_Username', 'data_block' => 'grid_userlink_td', 'user_field' => 'PortalUserId'),
+ ),
+ ),
+ 'visitsincommerce' => Array(
+ 'Icons' => Array('default'=>'icon16_custom.gif'), // icons for each StatusField values, if no matches or no statusfield selected, then "default" icon is used
+ 'Fields' => Array(
+ 'VisitDate' => Array( 'title'=>'la_col_VisitDate', 'data_block' => 'grid_checkbox_td' ),
+ 'IPAddress' => Array( 'title'=>'la_col_IPAddress' ),
+ 'Referer' => Array( 'title'=>'la_col_Referer', 'data_block' => 'grid_referer_td' ),
+ 'UserName' => Array('title' => 'la_col_Username', 'data_block' => 'grid_userlink_td', 'user_field' => 'PortalUserId'),
+ 'AffiliateUser' => Array( 'title' => 'la_col_AffiliateUser', 'data_block' => 'grid_userlink_td', 'user_field' => 'AffiliatePortalUserId'),
+ 'OrderTotalAmountSum' => Array( 'title' => 'la_col_OrderTotal'),
+ 'OrderAffiliateCommissionSum' => Array( 'title' => 'la_col_Commission'),
+ ),
+ ),
+ ),
+
+ );
+
+?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.22.2/kernel/units/visits/visits_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.22
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/unlabeled/unlabeled-1.22.2/core/units/visits/visits_config.php
===================================================================
--- branches/unlabeled/unlabeled-1.22.2/core/units/visits/visits_config.php (nonexistent)
+++ branches/unlabeled/unlabeled-1.22.2/core/units/visits/visits_config.php (revision 6688)
@@ -0,0 +1,129 @@
+<?php
+
+$config = Array(
+ 'Prefix' => 'visits',
+ 'ItemClass' => Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+ 'ListClass' => Array('class'=>'VisitsList','file'=>'visits_list.php','build_event'=>'OnListBuild'),
+ 'EventHandlerClass' => Array('class'=>'VisitsEventHandler','file'=>'visits_event_handler.php','build_event'=>'OnBuild'),
+ 'TagProcessorClass' => Array('class'=>'VisitsTagProcessor','file'=>'visits_tag_processor.php','build_event'=>'OnBuild'),
+ 'AutoLoad' => true,
+
+ 'QueryString' => Array(
+ 1 => 'id',
+ 2 => 'Page',
+ 3 => 'event',
+ 4 => 'mode',
+ ),
+
+ 'Hooks' => Array(
+ Array(
+ 'Mode' => hBEFORE,
+ 'Conditional' => false,
+ 'HookToPrefix' => 'adm',
+ 'HookToSpecial' => '',
+ 'HookToEvent' => Array( 'OnStartup' ),
+ 'DoPrefix' => '',
+ 'DoSpecial' => '',
+ 'DoEvent' => 'OnRegisterVisit',
+ ),
+ ),
+
+ 'IDField' => 'VisitId',
+ 'TableName' => TABLE_PREFIX.'Visits',
+ 'TitlePresets' => Array(
+ 'default' => Array(),
+ 'visits_list' => Array('prefixes' => Array('visits_List'), 'format' => "!la_title_Visits! (#visits_recordcount#)"),
+ 'visits.incommerce_list' => Array('prefixes' => Array('visits.incommerce_List'), 'format' => "!la_title_Visits! (#visits.incommerce_recordcount#)"),
+ ),
+ 'CalculatedFields' => Array(
+ '' => Array (
+ 'UserName' => 'IF( ISNULL(u.Login), IF (%1$s.PortalUserId = -1, \'root\', IF (%1$s.PortalUserId = -2, \'Guest\', \'n/a\')), u.Login)',
+ ),
+ 'incommerce' => Array (
+ 'UserName' => 'IF( ISNULL(u.Login), IF (%1$s.PortalUserId = -1, \'root\', IF (%1$s.PortalUserId = -2, \'Guest\', \'n/a\')), u.Login)',
+ 'AffiliateUser' => 'IF( LENGTH(au.Login),au.Login,\'!la_None!\')',
+ 'AffiliatePortalUserId' => 'af.PortalUserId',
+ 'OrderTotalAmount' => 'IF(ord.Status = 4, ord.SubTotal+ord.ShippingCost+ord.VAT, 0)',
+ 'OrderAffiliateCommission' => 'IF(ord.Status = 4, ord.AffiliateCommission, 0)',
+ 'OrderNumber' => 'CONCAT(LPAD(Number,6,"0"),\'-\',LPAD(SubNumber,3,"0") )',
+ 'OrderId' => 'ord.OrderId',
+ ),
+ ),
+
+ 'ListSQLs' => Array( ''=>' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId',
+ 'incommerce'=>'
+ SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Affiliates af ON %1$s.AffiliateId = af.AffiliateId
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser au ON af.PortalUserId = au.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Orders ord ON %1$s.VisitId = ord.VisitId',
+ ),
+
+
+ 'ItemSQLs' => Array( ''=>' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId',
+ 'incommerce'=>' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.PortalUserId = u.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Affiliates af ON %1$s.AffiliateId = af.AffiliateId
+ LEFT JOIN '.TABLE_PREFIX.'PortalUser au ON af.PortalUserId = au.PortalUserId
+ LEFT JOIN '.TABLE_PREFIX.'Orders ord ON %1$s.VisitId = ord.VisitId',
+ ),
+
+ 'ListSortings' => Array(
+ '' => Array(
+ 'Sorting' => Array('VisitDate' => 'desc'),
+ )
+ ),
+
+ 'Fields' => Array(
+ 'VisitId' => Array('type' => 'int'),
+ 'VisitDate' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'custom_filter' => 'date_range', 'not_null' => '1','default' => '0'),
+ 'Referer' => Array('type' => 'string','not_null' => '1','default' => ''),
+ 'IPAddress' => Array('type' => 'string','not_null' => '1','default' => ''),
+ 'AffiliateId' => Array('type'=>'int','formatter'=>'kLEFTFormatter','options'=>Array(0=>'lu_none'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'Affiliates af LEFT JOIN '.TABLE_PREFIX.'PortalUser pu ON pu.PortalUserId = af.PortalUserId WHERE `%s` = \'%s\'','left_key_field'=>'AffiliateId','left_title_field'=>'Login','not_null'=>1,'default'=>0),
+ 'PortalUserId' => Array('type' => 'int','not_null' => '1','default' => -2),
+ ),
+
+ 'VirtualFields' => Array(
+ 'UserName' => Array('type'=>'string'),
+ 'AffiliateUser' => Array('type'=>'string'),
+ 'AffiliatePortalUserId' => Array('type'=>'int'),
+ 'OrderTotalAmount' => Array('type' => 'float', 'formatter'=>'kFormatter', 'format'=>'%01.2f', 'not_null' => '1','default' => '0.00', 'totals' => 'SUM'),
+ 'OrderTotalAmountSum' => Array('type' => 'float', 'formatter'=>'kFormatter', 'format'=>'%01.2f', 'not_null' => '1','default' => '0.00'),
+ 'OrderAffiliateCommission' => Array('type' => 'double', 'formatter'=>'kFormatter','format'=>'%.02f', 'not_null' => '1','default' => '0.0000', 'totals' => 'SUM'),
+ 'OrderAffiliateCommissionSum' => Array('type' => 'double', 'formatter'=>'kFormatter','format'=>'%.02f', 'not_null' => '1','default' => '0.0000'),
+ 'OrderId' => Array('type' => 'int', 'default' => '0'),
+ ),
+
+ 'Grids' => Array(
+ 'Default' => Array(
+ 'Icons' => Array('default'=>'icon16_custom.gif'), // icons for each StatusField values, if no matches or no statusfield selected, then "default" icon is used
+ 'Fields' => Array(
+ 'VisitDate' => Array( 'title'=>'la_col_VisitDate', 'data_block' => 'grid_checkbox_td' ),
+ 'IPAddress' => Array( 'title'=>'la_col_IPAddress' ),
+ 'Referer' => Array( 'title'=>'la_col_Referer', 'data_block' => 'grid_referer_td' ),
+ 'UserName' => Array('title' => 'la_col_Username', 'data_block' => 'grid_userlink_td', 'user_field' => 'PortalUserId'),
+ ),
+ ),
+ 'visitsincommerce' => Array(
+ 'Icons' => Array('default'=>'icon16_custom.gif'), // icons for each StatusField values, if no matches or no statusfield selected, then "default" icon is used
+ 'Fields' => Array(
+ 'VisitDate' => Array( 'title'=>'la_col_VisitDate', 'data_block' => 'grid_checkbox_td' ),
+ 'IPAddress' => Array( 'title'=>'la_col_IPAddress' ),
+ 'Referer' => Array( 'title'=>'la_col_Referer', 'data_block' => 'grid_referer_td' ),
+ 'UserName' => Array('title' => 'la_col_Username', 'data_block' => 'grid_userlink_td', 'user_field' => 'PortalUserId'),
+ 'AffiliateUser' => Array( 'title' => 'la_col_AffiliateUser', 'data_block' => 'grid_userlink_td', 'user_field' => 'AffiliatePortalUserId'),
+ 'OrderTotalAmountSum' => Array( 'title' => 'la_col_OrderTotal'),
+ 'OrderAffiliateCommissionSum' => Array( 'title' => 'la_col_Commission'),
+ ),
+ ),
+ ),
+
+ );
+
+?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.22.2/core/units/visits/visits_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.22
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/unlabeled/unlabeled-1.22.2/core/units/languages/import_xml.php
===================================================================
--- branches/unlabeled/unlabeled-1.22.2/core/units/languages/import_xml.php (nonexistent)
+++ branches/unlabeled/unlabeled-1.22.2/core/units/languages/import_xml.php (revision 6688)
@@ -0,0 +1,432 @@
+<?php
+
+ define('LANG_OVERWRITE_EXISTING', 1);
+ define('LANG_SKIP_EXISTING', 2);
+
+ class LangXML_Parser extends kBase {
+
+ /**
+ * Path to current node beeing processed
+ *
+ * @var Array
+ */
+ var $path = Array();
+
+ /**
+ * Connection to database
+ *
+ * @var kDBConnection
+ */
+ var $Conn = null;
+
+ /**
+ * Fields of language currently beeing processed
+ *
+ * @var Array
+ */
+ var $current_language = Array();
+
+ /**
+ * Fields of phrase currently beeing processed
+ *
+ * @var Array
+ */
+ var $current_phrase = Array();
+
+ /**
+ * Fields of event currently beeing processed
+ *
+ * @var Array
+ */
+ var $current_event = Array();
+
+ /**
+ * Event type + name mapping to id (from system)
+ *
+ * @var Array
+ */
+ var $events_hash = Array();
+
+
+ /**
+ * Phrase types allowed for import/export operations
+ *
+ * @var Array
+ */
+ var $phrase_types_allowed = Array();
+
+ /**
+ * Modules allowed for export (import in development)
+ *
+ * @var Array
+ */
+ var $modules_allowed = Array();
+
+ var $lang_object = null;
+
+ var $tables = Array();
+
+ var $ip_address = '';
+
+ var $import_mode = LANG_SKIP_EXISTING;
+
+ var $Encoding = 'base64';
+
+ function LangXML_Parser($temp_mode = true)
+ {
+ parent::kBase();
+ $this->Conn =& $this->Application->GetADODBConnection();
+
+ if ($temp_mode) {
+ $this->Application->SetVar('lang_mode', 't');
+ $this->tables['lang'] = $this->prepareTempTable('lang');
+ $this->tables['phrases'] = $this->prepareTempTable('phrases');
+ $this->tables['emailmessages'] = $this->prepareTempTable('emailmessages');
+ }
+ else {
+ $this->tables['lang'] = $this->Application->getUnitOption('lang', 'TableName');
+ $this->tables['phrases'] = $this->Application->getUnitOption('phrases', 'TableName');
+ $this->tables['emailmessages'] = $this->Application->getUnitOption('emailmessages', 'TableName');
+ }
+
+ $this->lang_object =& $this->Application->recallObject('lang.imp', null, Array('skip_autoload' => true));
+
+ $sql = 'SELECT EventId, CONCAT(Event,"_",Type) AS EventMix FROM '.TABLE_PREFIX.'Events';
+ $this->events_hash = $this->Conn->GetCol($sql, 'EventMix');
+
+ $this->ip_address = getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : getenv('REMOTE_ADDR');
+ }
+
+ function SetEncoding($enc)
+ {
+ $this->Encoding = $enc;
+ }
+
+ function renameTable($table_prefix, $new_name)
+ {
+ $this->Conn->Query('ALTER TABLE '.$this->tables[$table_prefix].' RENAME '.$new_name);
+ $this->tables[$table_prefix] = $new_name;
+ }
+
+ /**
+ * Create temp table for prefix, if table already exists, then delete it and create again
+ *
+ * @param string $prefix
+ */
+ function prepareTempTable($prefix)
+ {
+ $idfield = $this->Application->getUnitOption($prefix, 'IDField');
+ $table = $this->Application->getUnitOption($prefix,'TableName');
+ $temp_table = $this->Application->GetTempName($table);
+
+ $sql = 'DROP TABLE IF EXISTS %s';
+ $this->Conn->Query( sprintf($sql, $temp_table) );
+
+ $sql = 'CREATE TABLE %s SELECT * FROM %s WHERE 0';
+ $this->Conn->Query( sprintf($sql, $temp_table, $table) );
+
+ $sql = 'ALTER TABLE %1$s CHANGE %2$s %2$s INT(11) NOT NULL';
+ $this->Conn->Query( sprintf($sql, $temp_table, $idfield) );
+
+ return $temp_table;
+ }
+
+ function Parse($filename, $phrase_types, $module_ids, $import_mode = LANG_SKIP_EXISTING)
+ {
+ // define the XML parsing routines/functions to call based on the handler path
+ if( !file_exists($filename) || !$phrase_types /*|| !$module_ids*/ ) return false;
+
+ $phrase_types = explode('|', substr($phrase_types, 1, -1) );
+// $module_ids = explode('|', substr($module_ids, 1, -1) );
+
+ $this->phrase_types_allowed = array_flip($phrase_types);
+ $this->import_mode = $import_mode;
+
+ //if (in_array('In-Portal',)
+
+ $xml_parser = xml_parser_create();
+ xml_set_element_handler( $xml_parser, Array(&$this, 'startElement'), Array(&$this, 'endElement') );
+ xml_set_character_data_handler( $xml_parser, Array(&$this, 'characterData') );
+
+ $fdata = file_get_contents($filename);
+
+ $ret = xml_parse($xml_parser, $fdata);
+ xml_parser_free($xml_parser); // clean up the parser object
+
+ $this->Application->SetVar('lang_mode', '');
+ return $ret;
+ }
+
+ function startElement(&$parser, $element, $attributes)
+ {
+ array_push($this->path, $element);
+ $path = implode(' ',$this->path);
+ //check what path we are in
+
+ $this->LastLine = xml_get_current_line_number($parser);
+ $this->SecondData = false;
+
+ switch($path)
+ {
+ case 'LANGUAGES LANGUAGE':
+ $this->current_language = Array('PackName' => $attributes['PACKNAME'], 'LocalName' => $attributes['PACKNAME'], 'Encoding' => $attributes['ENCODING']);
+
+ $sql = 'SELECT %s FROM %s WHERE PackName = %s';
+ $sql = sprintf( $sql,
+ $this->lang_object->IDField,
+ $this->Application->GetLiveName($this->lang_object->TableName),
+ $this->Conn->qstr($this->current_language['PackName']) );
+ $language_id = $this->Conn->GetOne($sql);
+ if($language_id)
+ {
+ $this->current_language['LanguageId'] = $language_id;
+ $this->lang_object->SwitchToLive();
+ $this->lang_object->Load($language_id);
+ }
+ break;
+
+ case 'LANGUAGES LANGUAGE PHRASES':
+ case 'LANGUAGES LANGUAGE EVENTS':
+ if( !getArrayValue($this->current_language,'Charset') ) $this->current_language['Charset'] = 'iso-8859-1';
+ $this->lang_object->SetFieldsFromHash($this->current_language);
+
+ if( !getArrayValue($this->current_language,'LanguageId') )
+ {
+ if( $this->lang_object->Create() ) $this->current_language['LanguageId'] = $this->lang_object->GetID();
+ }
+ elseif($this->import_mode == LANG_OVERWRITE_EXISTING)
+ {
+ $this->lang_object->TableName = $this->Application->getUnitOption($this->lang_object->Prefix, 'TableName');
+ $this->lang_object->Update();
+ }
+ break;
+
+ case 'LANGUAGES LANGUAGE PHRASES PHRASE':
+ $phrase_module = getArrayValue($attributes,'MODULE');
+ if(!$phrase_module) $phrase_module = 'In-Portal';
+
+ $this->current_phrase = Array( 'LanguageId' => $this->current_language['LanguageId'],
+ 'Phrase' => $attributes['LABEL'],
+ 'PhraseType' => $attributes['TYPE'],
+ 'Module' => $phrase_module,
+ 'LastChanged' => adodb_mktime(),
+ 'LastChangeIP' => $this->ip_address,
+ 'Translation' => '');
+ break;
+
+ case 'LANGUAGES LANGUAGE EVENTS EVENT':
+ $this->current_event = Array( 'LanguageId' => $this->current_language['LanguageId'],
+ 'EventId' => $this->events_hash[ $attributes['EVENT'].'_'.$attributes['TYPE'] ],
+ 'MessageType' => $attributes['MESSAGETYPE'],
+ 'Template' => '');
+ break;
+
+
+ }
+
+ // if($path == 'SHIPMENT PACKAGE')
+ }
+
+ function characterData(&$parser, $line)
+ {
+ $line = trim($line);
+ if(!$line) return ;
+
+ $path = join (' ',$this->path);
+
+ $language_nodes = Array('DATEFORMAT','TIMEFORMAT','INPUTDATEFORMAT','INPUTTIMEFORMAT','DECIMAL','THOUSANDS','CHARSET','UNITSYSTEM');
+
+
+ $node_field_map = Array('LANGUAGES LANGUAGE DATEFORMAT' => 'DateFormat',
+ 'LANGUAGES LANGUAGE TIMEFORMAT' => 'TimeFormat',
+
+ 'LANGUAGES LANGUAGE INPUTDATEFORMAT'=> 'InputDateFormat',
+ 'LANGUAGES LANGUAGE INPUTTIMEFORMAT'=> 'InputTimeFormat',
+
+ 'LANGUAGES LANGUAGE DECIMAL' => 'DecimalPoint',
+ 'LANGUAGES LANGUAGE THOUSANDS' => 'ThousandSep',
+ 'LANGUAGES LANGUAGE CHARSET' => 'Charset',
+ 'LANGUAGES LANGUAGE UNITSYSTEM' => 'UnitSystem');
+
+ if( in_array( end($this->path), $language_nodes) )
+ {
+ $this->current_language[ $node_field_map[$path] ] = $line;
+ }
+ else
+ {
+ switch($path)
+ {
+ case 'LANGUAGES LANGUAGE PHRASES PHRASE':
+ if( isset($this->phrase_types_allowed[ $this->current_phrase['PhraseType'] ]) )
+ {
+ $this->current_phrase['Translation'] .= $line;
+ }
+ break;
+
+ case 'LANGUAGES LANGUAGE EVENTS EVENT':
+ $cur_line = xml_get_current_line_number($parser);
+ if ($cur_line != $this->LastLine) {
+ $this->current_event['Template'] .= str_repeat("\r\n", ($cur_line - $this->LastLine) );
+ $this->LastLine = $cur_line;
+ }
+ $this->current_event['Template'] .= $line;
+
+ $this->SecondData = true;
+ break;
+ }
+ }
+ }
+
+ function endElement(&$parser, $element)
+ {
+ $path = implode(' ',$this->path);
+
+ switch($path)
+ {
+ case 'LANGUAGES LANGUAGE PHRASES PHRASE':
+ if( isset($this->phrase_types_allowed[ $this->current_phrase['PhraseType'] ]) )
+ {
+ if ($this->current_language['Encoding'] == 'plain') {
+ // nothing to decode!
+ }
+ else {
+ $this->current_phrase['Translation'] = base64_decode($this->current_phrase['Translation']);
+ }
+ $this->insertRecord($this->tables['phrases'], $this->current_phrase);
+ }
+ break;
+
+ case 'LANGUAGES LANGUAGE EVENTS EVENT':
+ if ($this->current_language['Encoding'] == 'plain') {
+ $this->current_event['Template'] = rtrim($this->current_event['Template']);
+ // nothing to decode!
+ }
+ else {
+ $this->current_event['Template'] = base64_decode($this->current_event['Template']);
+ }
+ $this->insertRecord($this->tables['emailmessages'],$this->current_event);
+ break;
+ }
+
+ array_pop($this->path);
+ }
+
+ function insertRecord($table, $fields_hash)
+ {
+ $fields = '';
+ $values = '';
+
+ foreach($fields_hash as $field_name => $field_value)
+ {
+ $fields .= '`'.$field_name.'`,';
+ $values .= $this->Conn->qstr($field_value).',';
+ }
+
+ $fields = preg_replace('/(.*),$/', '\\1', $fields);
+ $values = preg_replace('/(.*),$/', '\\1', $values);
+
+ $sql = 'INSERT INTO `'.$table.'` ('.$fields.') VALUES ('.$values.')';
+ $this->Conn->Query($sql);
+
+// return $this->Conn->getInsertID(); // no need because of temp table without auto_increment column at all
+ }
+
+ /**
+ * Creates XML file with exported language data
+ *
+ * @param string $filename filename to export into
+ * @param Array $phrase_types phrases types to export from modules passed in $module_ids
+ * @param Array $language_ids IDs of languages to export
+ * @param Array $module_ids IDs of modules to export phrases from
+ */
+ function Create($filename, $phrase_types, $language_ids, $module_ids)
+ {
+ $fp = fopen($filename,'w');
+ if(!$fp || !$phrase_types || !$module_ids || !$language_ids) return false;
+
+ $phrase_types = explode('|', substr($phrase_types, 1, -1) );
+ $module_ids = explode('|', substr($module_ids, 1, -1) );
+
+ $this->events_hash = array_flip($this->events_hash);
+
+ $lang_table = $this->Application->getUnitOption('lang','TableName');
+ $phrases_table = $this->Application->getUnitOption('phrases','TableName');
+ $emailevents_table = $this->Application->getUnitOption('emailmessages','TableName');
+ $mainevents_table = $this->Application->getUnitOption('emailevents','TableName');
+
+ $phrase_tpl = "\t\t\t".'<PHRASE Label="%s" Module="%s" Type="%s">%s</PHRASE>'."\n";
+ $event_tpl = "\t\t\t".'<EVENT MessageType="%s" Event="%s" Type="%s">%s</EVENT>'."\n";
+ $sql = 'SELECT * FROM %s WHERE LanguageId = %s';
+ $ret = '<LANGUAGES>'."\n";
+ foreach($language_ids as $language_id)
+ {
+ // languages
+ $row = $this->Conn->GetRow( sprintf($sql, $lang_table, $language_id) );
+ $ret .= "\t".'<LANGUAGE PackName="'.$row['PackName'].'" Encoding="'.$this->Encoding.'"><DATEFORMAT>'.$row['DateFormat'].'</DATEFORMAT>';
+ $ret .= '<TIMEFORMAT>'.$row['TimeFormat'].'</TIMEFORMAT><INPUTDATEFORMAT>'.$row['InputDateFormat'].'</INPUTDATEFORMAT>';
+ $ret .= '<INPUTTIMEFORMAT>'.$row['InputTimeFormat'].'</INPUTTIMEFORMAT><DECIMAL>'.$row['DecimalPoint'].'</DECIMAL>';
+ $ret .= '<THOUSANDS>'.$row['ThousandSep'].'</THOUSANDS><CHARSET>'.$row['Charset'].'</CHARSET>';
+ $ret .= '<UNITSYSTEM>'.$row['UnitSystem'].'</UNITSYSTEM>'."\n";
+
+ // phrases
+ $phrases_sql = 'SELECT * FROM '.$phrases_table.' WHERE LanguageId = %s AND PhraseType IN (%s) AND Module IN (%s) ORDER BY Phrase';
+ if( in_array('In-Portal',$module_ids) ) array_push($module_ids, ''); // for old language packs
+ $rows = $this->Conn->Query( sprintf($phrases_sql,$language_id, implode(',',$phrase_types), '\''.implode('\',\'',$module_ids).'\'' ) );
+ if($rows)
+ {
+ $ret .= "\t\t".'<PHRASES>'."\n";
+ foreach($rows as $row)
+ {
+ $data = $this->Encoding == 'base64' ? base64_encode($row['Translation']) : '<![CDATA['.$row['Translation'].']]>';
+ $ret .= sprintf($phrase_tpl, $row['Phrase'], $row['Module'], $row['PhraseType'], $data );
+ }
+ $ret .= "\t\t".'</PHRASES>'."\n";
+ }
+
+ // email events
+ if( in_array('In-Portal',$module_ids) ) unset( $module_ids[array_search('',$module_ids)] ); // for old language packs
+ $module_sql = preg_replace('/(.*) OR $/', '\\1', preg_replace('/(.*),/U', 'INSTR(Module,\'\\1\') OR ', implode(',', $module_ids).',' ) );
+
+ $sql = 'SELECT EventId FROM '.$mainevents_table.' WHERE '.$module_sql;
+ $event_ids = $this->Conn->GetCol($sql);
+
+ if($event_ids)
+ {
+ $ret .= "\t\t".'<EVENTS>'."\n";
+ $event_sql = ' SELECT em.*
+ FROM '.$emailevents_table.' em
+ LEFT JOIN '.$mainevents_table.' e ON e.EventId = em.EventId
+ WHERE em.LanguageId = %s AND em.EventId IN (%s)
+ ORDER BY e.Event, e.Type';
+ $rows = $this->Conn->Query( sprintf($event_sql,$language_id, $event_ids ? implode(',',$event_ids) : '' ) );
+ foreach($rows as $row)
+ {
+ list($event_name, $event_type) = explode('_', $this->events_hash[ $row['EventId'] ] );
+ $data = $this->Encoding == 'base64' ? base64_encode($row['Template']) : '<![CDATA['.$row['Template'].']]>';
+ $ret .= sprintf($event_tpl, $row['MessageType'], $event_name, $event_type, $data );
+ }
+ $ret .= "\t\t".'</EVENTS>'."\n";
+ }
+ $ret .= "\t".'</LANGUAGE>'."\n";
+ }
+
+ $ret .= '</LANGUAGES>';
+ fwrite($fp, $ret);
+ fclose($fp);
+ return true;
+ }
+
+ /**
+ * Creates new instance of LangXML_Parser class
+ *
+ * @param int $type
+ * @return LangXML_Parser
+ */
+ function &makeClass($temp_mode = true)
+ {
+ $result = new LangXML_Parser($temp_mode);
+ return $result;
+ }
+ }
+
+?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.22.2/core/units/languages/import_xml.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.22
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/unlabeled/unlabeled-1.22.2/core/units/general/inp_ses_storage.php
===================================================================
--- branches/unlabeled/unlabeled-1.22.2/core/units/general/inp_ses_storage.php (nonexistent)
+++ branches/unlabeled/unlabeled-1.22.2/core/units/general/inp_ses_storage.php (revision 6688)
@@ -0,0 +1,123 @@
+<?php
+
+ class InpSession extends Session
+ {
+ function Init($prefix,$special)
+ {
+ $this->SessionTimeout = $this->Application->ConfigValue('SessionTimeout');
+
+ $path = (BASE_PATH == '') ? '/' : BASE_PATH;
+// if ( $this->Application->IsAdmin() ) $path = rtrim($path, '/').'/admin';
+ $this->SetCookiePath($path);
+
+ $cookie_name = $this->Application->ConfigValue('SessionCookieName');
+ if (!$cookie_name) $cookie_name = 'sid';
+ if (($this->Application->IsAdmin() && $special !== 'front') || $special == 'admin' ) { // || $this->Application->GetVar('admin') == 1
+ $cookie_name = 'adm_'.$cookie_name;
+ }
+ $this->SetCookieName($cookie_name);
+
+ $this->SetCookieDomain(SERVER_NAME);
+
+ if( $this->Application->IsAdmin()) { // && $this->Application->GetVar('admin') != 1
+ $mode = smAUTO;
+ }
+ elseif (constOn('IS_INSTALL')) {
+ $mode = smCOOKIES_ONLY;
+ }
+ else {
+ $ses_mode = $this->Application->ConfigValue('CookieSessions');
+ if ($ses_mode == 2) $mode = smAUTO;
+ if ($ses_mode == 1) $mode = smCOOKIES_ONLY;
+ if ($ses_mode == 0) $mode = smGET_ONLY;
+ }
+ $this->SetMode($mode);
+
+ parent::Init($prefix,$special);
+
+ if( !$this->Application->IsAdmin() && $this->GetField('PortalUserId') <= 0 )
+ {
+ $group_list = $this->Application->ConfigValue('User_GuestGroup').','.$this->Application->ConfigValue('User_LoggedInGroup');
+ $this->SetField('GroupId', $this->Application->ConfigValue('User_GuestGroup'));
+ $this->SetField('GroupList', $group_list);
+ }
+ }
+ }
+
+class InpSessionStorage extends SessionStorage {
+
+ function Init($prefix,$special)
+ {
+ parent::Init($prefix,$special);
+ $this->setTableName(TABLE_PREFIX.'UserSession');
+ $this->SessionDataTable = TABLE_PREFIX.'SessionData';
+ $this->setIDField('SessionKey');
+ $this->TimestampField = 'LastAccessed';
+ $this->DataValueField = 'VariableValue';
+ $this->DataVarField = 'VariableName';
+ }
+
+ function LocateSession($sid)
+ {
+ $res = parent::LocateSession($sid);
+ if ($res) {
+ $this->Expiration += $this->SessionTimeout;
+ }
+ return $res;
+ }
+
+ function UpdateSession(&$session)
+ {
+ $time = adodb_mktime();
+ // Update LastAccessed only if it's newer than 1/10 of session timeout - perfomance optimization to eliminate needless updates on every click
+ if ($time - $this->DirectVars['LastAccessed'] > $this->SessionTimeout/10) {
+ $this->SetField($session, $this->TimestampField, $time);
+ }
+ }
+
+
+ function StoreSession(&$session, $additional_fields = Array())
+ {
+ $fields_hash = Array( 'PortalUserId' => $this->Application->IsAdmin() ? 0 : -2, // Guest
+ 'Language' => $this->Application->GetDefaultLanguageId(),
+ 'Theme' => $this->Application->GetDefaultThemeId(),
+ 'IpAddress' => $_SERVER['REMOTE_ADDR'],
+ 'GroupId' => $this->Application->ConfigValue('User_GuestGroup'),
+ 'GroupList' => $this->Application->ConfigValue('User_GuestGroup'),
+ 'CurrentTempKey'=> $session->SID,
+ );
+
+ parent::StoreSession($session, $fields_hash);
+ }
+
+ function GetExpiredSIDs()
+ {
+ $query = ' SELECT '.$this->IDField.' FROM '.$this->TableName.' WHERE '.$this->TimestampField.' < '.(adodb_mktime()-$this->SessionTimeout);
+ $ret = $this->Conn->GetCol($query);
+ if($ret) {
+ $this->DeleteEditTables();
+ }
+ return $ret;
+
+ }
+
+ function DeleteEditTables()
+ {
+ $tables = $this->Conn->GetCol('SHOW TABLES');
+ $mask_edit_table = '/'.TABLE_PREFIX.'ses_(.*)_edit_(.*)/';
+ $mask_search_table = '/'.TABLE_PREFIX.'ses_(.*?)_(.*)/';
+
+ $sql='SELECT COUNT(*) FROM '.$this->TableName.' WHERE '.$this->IDField.' = \'%s\'';
+ foreach($tables as $table)
+ {
+ if( preg_match($mask_edit_table,$table,$rets) || preg_match($mask_search_table,$table,$rets) )
+ {
+ $sid=$rets[1];
+ $is_alive = $this->Conn->GetOne( sprintf($sql,$sid) );
+ if(!$is_alive) $this->Conn->Query('DROP TABLE IF EXISTS '.$table);
+ }
+ }
+ }
+}
+
+?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.22.2/core/units/general/inp_ses_storage.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.22
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/unlabeled/unlabeled-1.22.2/core/units/general/cat_dbitem_export.php
===================================================================
--- branches/unlabeled/unlabeled-1.22.2/core/units/general/cat_dbitem_export.php (nonexistent)
+++ branches/unlabeled/unlabeled-1.22.2/core/units/general/cat_dbitem_export.php (revision 6688)
@@ -0,0 +1,1397 @@
+<?php
+
+ define('EXPORT_STEP', 200); // export by 200 items (e.g. links)
+ define('IMPORT_CHUNK', 10240); // 10240); //30720); //50120); // 5 KB
+
+ define('IMPORT_TEMP', 1);
+ define('IMPORT_LIVE', 2);
+
+ class kCatDBItemExportHelper extends kHelper {
+
+ var $false = false;
+
+ var $cache = Array();
+
+ /**
+ * Allows to find out what items are new in cache
+ *
+ * @var Array
+ */
+ var $cacheStatus = Array();
+
+ var $cacheTable = '';
+
+ var $exportFields = Array();
+
+ /**
+ * Export options
+ *
+ * @var Array
+ */
+ var $exportOptions = Array();
+
+ /**
+ * Item beeing currenly exported
+ *
+ * @var kCatDBItem
+ */
+ var $curItem = null;
+
+ /**
+ * Dummy category object
+ *
+ * @var CategoriesItem
+ */
+ var $dummyCategory = null;
+
+ /**
+ * Pointer to opened file
+ *
+ * @var resource
+ */
+ var $filePointer = null;
+
+ /**
+ * Custom fields definition of current item
+ *
+ * @var Array
+ */
+ var $customFields = Array();
+
+ function kCatDBItemExportHelper()
+ {
+ parent::kHelper();
+ $this->cacheTable = TABLE_PREFIX.'ImportCache';
+ }
+
+ /**
+ * Returns value from cache if found or false otherwise
+ *
+ * @param string $type
+ * @param int $key
+ * @return mixed
+ */
+ function getFromCache($type, $key)
+ {
+ return getArrayValue($this->cache, $type, $key);
+ }
+
+ /**
+ * Adds value to be cached
+ *
+ * @param string $type
+ * @param int $key
+ * @param mixed $value
+ */
+ function addToCache($type, $key, $value, $is_new = true)
+ {
+// if (!isset($this->cache[$type])) $this->cache[$type] = Array();
+ $this->cache[$type][$key] = $value;
+ if ($is_new) {
+ $this->cacheStatus[$type][$key] = true;
+ }
+ }
+
+ function storeCache($cache_types)
+ {
+ $cache_types = explode(',', $cache_types);
+
+ $values_sql = '';
+ foreach ($cache_types as $cache_type) {
+ $sql_mask = '('.$this->Conn->qstr($cache_type).',%s,%s),';
+ $cache = getArrayValue($this->cacheStatus, $cache_type);
+ if (!$cache) $cache = Array();
+ foreach ($cache as $var_name => $cache_status) {
+ $var_value = $this->cache[$cache_type][$var_name];
+ $values_sql .= sprintf($sql_mask, $this->Conn->qstr($var_name), $this->Conn->qstr($var_value) );
+ }
+ }
+ $values_sql = preg_replace('/(.*),$/', '\\1', $values_sql);
+ if ($values_sql) {
+ $sql = 'INSERT INTO '.$this->cacheTable.'(`CacheName`,`VarName`,`VarValue`) VALUES '.$values_sql;
+ $this->Conn->Query($sql);
+ }
+
+ }
+
+ function loadCache()
+ {
+ $sql = 'SELECT * FROM '.$this->cacheTable;
+ $records = $this->Conn->Query($sql);
+
+ $this->cache = Array();
+ foreach ($records as $record) {
+ $this->addToCache($record['CacheName'], $record['VarName'], $record['VarValue'], false);
+ }
+ }
+
+ /**
+ * Fill required fields with dummy values
+ *
+ * @param kEvent $event
+ */
+ function fillRequiredFields(&$event, &$object, $set_status = false)
+ {
+ if ($object == $this->false) {
+ $object =& $event->getObject();
+ }
+
+ $has_empty = false;
+ $fields = array_keys($object->Fields);
+ foreach ($fields as $field_name)
+ {
+ $field_options =& $object->Fields[$field_name];
+ if (isset($object->VirtualFields[$field_name]) || !getArrayValue($field_options, 'required') ) continue;
+ if ( $object->GetDBField($field_name) ) continue;
+
+ $formatter_class = getArrayValue($field_options, 'formatter');
+ if ($formatter_class) // not tested
+ {
+ $formatter =& $this->Application->recallObject($formatter_class);
+ $sample_value = $formatter->GetSample($field_name, $field_options, $object);
+ }
+
+ $has_empty = true;
+ $object->SetDBField($field_name, isset($sample_value) && $sample_value ? $sample_value : 'no value');
+ }
+
+ if ($set_status && $has_empty) {
+ $object->SetDBField('Status', 0);
+ }
+ }
+
+ /**
+ * Verifies that all user entered export params are correct
+ *
+ * @param kEvent $event
+ */
+ function verifyOptions(&$event)
+ {
+ if ($this->Application->RecallVar($event->getPrefixSpecial().'_ForceNotValid'))
+ {
+ $this->Application->StoreVar($event->getPrefixSpecial().'_ForceNotValid', 0);
+ return false;
+ }
+
+ $this->fillRequiredFields($event, $this->false);
+
+ $object =& $event->getObject();
+ $cross_unique_fields = Array('FieldsSeparatedBy', 'FieldsEnclosedBy');
+ if (($object->GetDBField('CategoryFormat') == 1) || ($event->Special == 'import')) // in one field
+ {
+ $object->setRequired('CategorySeparator', true);
+ $cross_unique_fields[] = 'CategorySeparator';
+ }
+
+ $ret = $object->Validate();
+
+ // check if cross unique fields has no same values
+ foreach ($cross_unique_fields as $field_index => $field_name)
+ {
+ if (getArrayValue($object->FieldErrors, $field_name, 'pseudo') == 'required') continue;
+
+ $check_fields = $cross_unique_fields;
+ unset($check_fields[$field_index]);
+
+ foreach ($check_fields as $check_field)
+ {
+ if ($object->GetDBField($field_name) == $object->GetDBField($check_field))
+ {
+ $object->SetError($check_field, 'unique');
+ }
+ }
+ }
+
+ if ($event->Special == 'import')
+ {
+ $this->exportOptions = $this->loadOptions($event);
+
+ $automatic_fields = ($object->GetDBField('FieldTitles') == 1);
+ $object->setRequired('ExportColumns', !$automatic_fields);
+ $category_prefix = '__CATEGORY__';
+ if ( $automatic_fields && ($this->exportOptions['SkipFirstRow']) ) {
+ $this->openFile($event);
+ $this->exportOptions['ExportColumns'] = $this->readRecord();
+ $this->closeFile();
+
+ // remove additional (non-parseble columns)
+ foreach ($this->exportOptions['ExportColumns'] as $field_index => $field_name) {
+ if (!$this->validateField($field_name, $object)) {
+ unset($this->exportOptions['ExportColumns'][$field_index]);
+ }
+ }
+ $category_prefix = '';
+ }
+
+ // 1. check, that we have column definitions
+ if (!$this->exportOptions['ExportColumns']) {
+ $object->setError('ExportColumns', 'required');
+ $ret = false;
+ }
+ else {
+ // 1.1. check that all required fields are present in imported file
+ $missing_columns = Array();
+ foreach ($object->Fields as $field_name => $field_options) {
+ if ($object->SkipField($field_name)) continue;
+ if (getArrayValue($field_options, 'required') && !in_array($field_name, $this->exportOptions['ExportColumns']) ) {
+ $missing_columns[] = $field_name;
+ $object->setError('ExportColumns', 'required_fields_missing', 'la_error_RequiredColumnsMissing');
+ $ret = false;
+ }
+ }
+
+ if (!$ret && $this->Application->isDebugMode()) {
+ $this->Application->Debugger->appendHTML('Missing required for import/export:');
+ $this->Application->Debugger->dumpVars($missing_columns);
+ }
+ }
+
+
+ // 2. check, that we have only mixed category field or only separated category fields
+ $category_found['mixed'] = false;
+ $category_found['separated'] = false;
+
+ foreach ($this->exportOptions['ExportColumns'] as $import_field) {
+ if (preg_match('/^'.$category_prefix.'Category(Path|[0-9]+)/', $import_field, $rets)) {
+ $category_found[$rets[1] == 'Path' ? 'mixed' : 'separated'] = true;
+ }
+ }
+ if ($category_found['mixed'] && $category_found['separated']) {
+ $object->SetError('ExportColumns', 'unique_category', 'la_error_unique_category_field');
+ $ret = false;
+ }
+
+ // 3. check, that duplicates check fields are selected & present in imported fields
+ if ($this->exportOptions['ReplaceDuplicates']) {
+ if ($this->exportOptions['CheckDuplicatesMethod'] == 1) {
+ $check_fields = Array($object->IDField);
+ }
+ else {
+ $check_fields = $this->exportOptions['DuplicateCheckFields'] ? explode('|', substr($this->exportOptions['DuplicateCheckFields'], 1, -1)) : Array();
+ $object =& $event->getObject();
+
+ $language_id = $this->Application->GetDefaultLanguageId();
+ foreach ($check_fields as $index => $check_field) {
+ foreach ($object->Fields as $field_name => $field_options) {
+ if ($field_name == 'l'.$language_id.'_'.$check_field) {
+ $check_fields[$index] = 'l'.$language_id.'_'.$check_field;
+ break;
+ }
+ }
+ }
+ }
+ $this->exportOptions['DuplicateCheckFields'] = $check_fields;
+
+ if (!$check_fields) {
+ $object->setError('CheckDuplicatesMethod', 'required');
+ $ret = false;
+ }
+ else {
+ foreach ($check_fields as $check_field) {
+ $check_field = preg_replace('/^cust_(.*)/', 'Custom_\\1', $check_field);
+ if (!in_array($check_field, $this->exportOptions['ExportColumns'])) {
+ $object->setError('ExportColumns', 'required');
+ $ret = false;
+ break;
+ }
+ }
+ }
+ }
+ $this->saveOptions($event);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Returns filename to read import data from
+ *
+ * @return string
+ */
+ function getImportFilename()
+ {
+ if ($this->exportOptions['ImportSource'] == 1)
+ {
+ $ret = $this->exportOptions['ImportFilename']; // ['name']; commented by Kostja
+ }
+ else {
+ $ret = $this->exportOptions['ImportLocalFilename'];
+ }
+ return EXPORT_PATH.'/'.$ret;
+ }
+
+ /**
+ * Returns filename to write export data to
+ *
+ * @return string
+ */
+ function getExportFilename()
+ {
+ return EXPORT_PATH.'/'.$this->exportOptions['ExportFilename'].'.'.$this->getFileExtension();
+ }
+
+ /**
+ * Opens file required for export/import operations
+ *
+ * @param kEvent $event
+ */
+ function openFile(&$event)
+ {
+ if ($event->Special == 'export') {
+ $write_mode = ($this->exportOptions['start_from'] == 0) ? 'w' : 'a';
+ $this->filePointer = fopen($this->getExportFilename(), $write_mode);
+ }
+ else {
+ $this->filePointer = fopen($this->getImportFilename(), 'r');
+ }
+
+ // skip UTF-8 BOM Modifier
+ $first_chars = fread($this->filePointer, 3);
+ if (bin2hex($first_chars) != 'efbbbf') {
+ fseek($this->filePointer, 0);
+ }
+ }
+
+ /**
+ * Closes opened file
+ *
+ */
+ function closeFile()
+ {
+ fclose($this->filePointer);
+ }
+
+ function getCustomSQL()
+ {
+ $ml_formatter =& $this->Application->recallObject('kMultiLanguage');
+
+ $custom_sql = '';
+ foreach ($this->customFields as $custom_id => $custom_name) {
+ $custom_sql .= 'custom_data.'.$ml_formatter->LangFieldName('cust_'.$custom_id).' AS cust_'.$custom_name.', ';
+ }
+
+ return preg_replace('/(.*), /', '\\1', $custom_sql);
+ }
+
+ function getPlainExportSQL($count_only = false) {
+ if ($count_only && isset($this->exportOptions['ForceCountSQL'])) return $this->exportOptions['ForceCountSQL'];
+ if (!$count_only && isset($this->exportOptions['ForceSelectSQL'])) return $this->exportOptions['ForceSelectSQL'];
+
+ $items_list =& $this->Application->recallObject($this->curItem->Prefix.'.export-items-list', $this->curItem->Prefix.'_List');
+ $items_list->SetPerPage(-1);
+ return $items_list->GetSelectSQL($count_only);
+
+
+ if ($this->exportOptions['export_ids'] === false)
+ {
+ // get links from current category & all it's subcategories
+ $join_clauses = Array();
+
+ $custom_sql = $this->getCustomSQL();
+ if ($custom_sql) {
+ $custom_table = $this->Application->getUnitOption($this->curItem->Prefix.'-cdata', 'TableName');
+ $join_clauses[$custom_table.' custom_data'] = 'custom_data.ResourceId = item_table.ResourceId';
+ }
+
+ $sql = 'SELECT item_table.*'.($custom_sql ? ', '.$custom_sql : '').'
+ FROM '.$this->curItem->TableName.' item_table';
+
+ foreach ($join_clauses as $table_name => $join_expression) {
+ $sql .= ' LEFT JOIN '.$table_name.' ON '.$join_expression;
+ }
+ $sql .= ' WHERE 1';
+
+ $sql .= ' ORDER BY item_table.'.$this->curItem->IDField.' ASC'; // NEW
+ }
+ else {
+ // get only selected links
+ $sql = 'SELECT item_table.*
+ FROM '.$this->curItem->TableName.' item_table
+ WHERE '.$this->curItem->IDField.' IN ('.implode(',', $this->exportOptions['export_ids']).')';
+ }
+
+ if (!$count_only)
+ {
+ $sql .= ' LIMIT '.$this->exportOptions['start_from'].','.EXPORT_STEP;
+ }
+ else {
+ $sql = preg_replace("/^.*SELECT(.*?)FROM(?!_)/is", "SELECT COUNT(*) AS count FROM ", $sql);
+ }
+
+ return $sql;
+ }
+
+ function getExportSQL($count_only = false)
+ {
+ if (!$this->Application->getUnitOption($this->curItem->Prefix, 'CatalogItem')) {
+ return $this->GetPlainExportSQL($count_only); // in case this is not a CategoryItem
+ }
+
+ if ($this->exportOptions['export_ids'] === false)
+ {
+ // get links from current category & all it's subcategories
+ $join_clauses = Array();
+
+ $custom_sql = $this->getCustomSQL();
+ if ($custom_sql) {
+ $custom_table = $this->Application->getUnitOption($this->curItem->Prefix.'-cdata', 'TableName');
+ $join_clauses[$custom_table.' custom_data'] = 'custom_data.ResourceId = item_table.ResourceId';
+ }
+
+ $join_clauses[TABLE_PREFIX.'CategoryItems ci'] = 'ci.ItemResourceId = item_table.ResourceId';
+ $join_clauses[TABLE_PREFIX.'Category c'] = 'c.CategoryId = ci.CategoryId';
+
+ $sql = 'SELECT item_table.*, ci.CategoryId'.($custom_sql ? ', '.$custom_sql : '').'
+ FROM '.$this->curItem->TableName.' item_table';
+
+ foreach ($join_clauses as $table_name => $join_expression) {
+ $sql .= ' LEFT JOIN '.$table_name.' ON '.$join_expression;
+ }
+ $sql .= ' WHERE ';
+
+ if ($this->exportOptions['export_cats_ids'][0] == 0)
+ {
+ $sql .= '1';
+ }
+ else {
+ foreach ($this->exportOptions['export_cats_ids'] as $category_id) {
+ $sql .= '(c.ParentPath LIKE "%|'.$category_id.'|%") OR ';
+ }
+ $sql = preg_replace('/(.*) OR $/', '\\1', $sql);
+ }
+
+ $sql .= ' ORDER BY ci.PrimaryCat DESC'; // NEW
+ }
+ else {
+ // get only selected links
+ $sql = 'SELECT item_table.*, '.$this->exportOptions['export_cats_ids'][0].' AS CategoryId
+ FROM '.$this->curItem->TableName.' item_table
+ WHERE '.$this->curItem->IDField.' IN ('.implode(',', $this->exportOptions['export_ids']).')';
+ }
+
+ if (!$count_only)
+ {
+ $sql .= ' LIMIT '.$this->exportOptions['start_from'].','.EXPORT_STEP;
+ }
+ else {
+ $sql = preg_replace("/^.*SELECT(.*?)FROM(?!_)/is", "SELECT COUNT(*) AS count FROM ", $sql);
+ }
+
+ return $sql;
+ }
+
+ /**
+ * Enter description here...
+ *
+ * @param kEvent $event
+ */
+ function performExport(&$event)
+ {
+ $this->exportOptions = $this->loadOptions($event);
+ $this->exportFields = $this->exportOptions['ExportColumns'];
+ $this->curItem =& $event->getObject( Array('skip_autoload' => true) );
+ $this->customFields = $this->Application->getUnitOption($event->Prefix, 'CustomFields');
+ $this->openFile($event);
+
+ if ($this->exportOptions['start_from'] == 0) // first export step
+ {
+ if (!getArrayValue($this->exportOptions, 'IsBaseCategory')) {
+ $this->exportOptions['IsBaseCategory'] = 0;
+ }
+
+ if ($this->exportOptions['IsBaseCategory'] ) {
+ $sql = 'SELECT ParentPath
+ FROM '.TABLE_PREFIX.'Category
+ WHERE CategoryId = '.$this->Application->GetVar('m_cat_id');
+ $this->exportOptions['BaseLevel'] = substr_count($this->Conn->GetOne($sql), '|') - 1; // level to cut from other categories
+ }
+
+ // 1. export field titles if required
+ if ($this->exportOptions['IncludeFieldTitles'])
+ {
+ $data_array = Array();
+ foreach ($this->exportFields as $export_field)
+ {
+ $data_array = array_merge($data_array, $this->getFieldCaption($export_field));
+ }
+ $this->writeRecord($data_array);
+ }
+ $this->exportOptions['total_records'] = $this->Conn->GetOne( $this->getExportSQL(true) );
+ }
+
+ // 2. export data
+ $records = $this->Conn->Query( $this->getExportSQL() );
+ $records_exported = 0;
+ foreach ($records as $record_info) {
+ $this->curItem->Clear();
+ $this->curItem->SetDBFieldsFromHash($record_info);
+ $this->setCurrentID();
+ $this->curItem->raiseEvent('OnAfterItemLoad', $this->curItem->GetID() );
+
+ $data_array = Array();
+ foreach ($this->exportFields as $export_field)
+ {
+ $data_array = array_merge($data_array, $this->getFieldValue($export_field) );
+ }
+ $this->writeRecord($data_array);
+ $records_exported++;
+ }
+ $this->closeFile();
+
+ $this->exportOptions['start_from'] += $records_exported;
+ $this->saveOptions($event);
+
+ return $this->exportOptions;
+ }
+
+ function getItemFields()
+ {
+ // just in case dummy user selected automtic mode & moved columns too :(
+ return array_merge($this->curItem->Fields['AvailableColumns']['options'], $this->curItem->Fields['ExportColumns']['options']);
+ }
+
+ /**
+ * Checks if field really belongs to importable field list
+ *
+ * @param string $field_name
+ * @param kCatDBItem $object
+ * @return bool
+ */
+ function validateField($field_name, &$object)
+ {
+ // 1. convert custom field
+ $field_name = preg_replace('/^Custom_(.*)/', '__CUSTOM__\\1', $field_name);
+
+ // 2. convert category field (mixed version & serparated version)
+ $field_name = preg_replace('/^Category(Path|[0-9]+)/', '__CATEGORY__Category\\1', $field_name);
+
+ $valid_fields = $object->getPossibleExportColumns();
+ return isset($valid_fields[$field_name]) || isset($valid_fields['__VIRTUAL__'.$field_name]);
+ }
+
+ /**
+ * Enter description here...
+ *
+ * @param kEvent $event
+ */
+ function performImport(&$event)
+ {
+ if (!$this->exportOptions) {
+ // load import options in case if not previously loaded in verification function
+ $this->exportOptions = $this->loadOptions($event);
+ }
+
+ $backup_category_id = $this->Application->GetVar('m_cat_id');
+ $this->Application->SetVar('m_cat_id', (int)$this->Application->RecallVar('ImportCategory') );
+
+ $this->openFile($event);
+
+ $bytes_imported = 0;
+ if ($this->exportOptions['start_from'] == 0) // first export step
+ {
+ // 1st time run
+ if ($this->exportOptions['SkipFirstRow']) {
+ $this->readRecord();
+ $this->exportOptions['start_from'] = ftell($this->filePointer);
+ $bytes_imported = ftell($this->filePointer);
+ }
+
+ $current_category_id = $this->Application->GetVar('m_cat_id');
+ if ($current_category_id > 0) {
+ $sql = 'SELECT ParentPath FROM '.TABLE_PREFIX.'Category WHERE CategoryId = '.$current_category_id;
+ $this->exportOptions['ImportCategoryPath'] = $this->Conn->GetOne($sql);
+ }
+ else {
+ $this->exportOptions['ImportCategoryPath'] = '';
+ }
+ $this->exportOptions['total_records'] = filesize($this->getImportFilename());
+ }
+ else {
+ $this->loadCache();
+ }
+
+ $this->exportFields = $this->exportOptions['ExportColumns'];
+ $this->addToCache('category_parent_path', $this->Application->GetVar('m_cat_id'), $this->exportOptions['ImportCategoryPath']);
+
+ // 2. import data
+ $this->dummyCategory =& $this->Application->recallObject('c.-tmpitem', 'c', Array('skip_autoload' => true));
+ fseek($this->filePointer, $this->exportOptions['start_from']);
+
+ while (($bytes_imported < IMPORT_CHUNK) && !feof($this->filePointer)) {
+ $data = $this->readRecord();
+ if ($data) {
+ if ($this->exportOptions['ReplaceDuplicates']) {
+ // set fields used as keys for replace duplicates code
+ $this->resetImportObject($event, IMPORT_TEMP, $data);
+ }
+
+ $this->processCurrentItem($event, $data);
+ }
+ $bytes_imported = ftell($this->filePointer) - $this->exportOptions['start_from'];
+ }
+
+ $this->closeFile();
+ $this->Application->SetVar('m_cat_id', $backup_category_id);
+
+ $this->exportOptions['start_from'] += $bytes_imported;
+ $this->storeCache('new_ids');
+
+ $this->saveOptions($event);
+
+ if ($this->exportOptions['start_from'] == $this->exportOptions['total_records']) {
+ $this->Conn->Query('TRUNCATE TABLE '.$this->cacheTable);
+ }
+
+ return $this->exportOptions;
+ }
+
+ function setCurrentID()
+ {
+ $this->curItem->setID( $this->curItem->GetDBField($this->curItem->IDField) );
+ }
+
+ function setFieldValue($field_index, $value)
+ {
+ if (empty($value)) {
+ $value = null;
+ }
+
+ $field_name = getArrayValue($this->exportFields, $field_index);
+ if ($field_name == 'ResourceId') {
+ return false;
+ }
+
+ if (substr($field_name, 0, 7) == 'Custom_') {
+ $field_name = 'cust_'.substr($field_name, 7);
+ $this->curItem->SetField($field_name, $value);
+ }
+ elseif ($field_name == 'CategoryPath' || $field_name == '__CATEGORY__CategoryPath') {
+ $this->curItem->CategoryPath = $value ? explode($this->exportOptions['CategorySeparator'], $value) : Array();
+ }
+ elseif (substr($field_name, 0, 8) == 'Category') {
+ $this->curItem->CategoryPath[ (int)substr($field_name, 8) - 1 ] = $value;
+ }
+ elseif (substr($field_name, 0, 20) == '__CATEGORY__Category') {
+ $this->curItem->CategoryPath[ (int)substr($field_name, 20) ] = $value;
+ }
+ elseif (substr($field_name, 0, 11) == '__VIRTUAL__') {
+ $field_name = substr($field_name, 11);
+ $this->curItem->SetField($field_name, $value);
+ }
+ else {
+ $this->curItem->SetField($field_name, $value);
+ }
+
+ $pseudo_error = getArrayValue($this->curItem->FieldErrors, $field_name, 'pseudo');
+ if ($pseudo_error) {
+ $this->curItem->SetDBField($field_name, null);
+ unset($this->curItem->FieldErrors[$field_name]);
+ }
+ }
+
+ function resetImportObject(&$event, $object_type, $record_data = null)
+ {
+ switch ($object_type) {
+ case IMPORT_TEMP:
+ $this->curItem =& $event->getObject( Array('skip_autoload' => true) );
+ break;
+
+ case IMPORT_LIVE:
+ $this->curItem =& $this->Application->recallObject($event->Prefix.'.-tmpitem'.$event->Special, $event->Prefix, Array('skip_autoload' => true));
+ break;
+ }
+ $this->curItem->Clear();
+ $this->customFields = $this->Application->getUnitOption($event->Prefix, 'CustomFields');
+
+ if (isset($record_data)) {
+ $this->setImportData($record_data);
+ }
+ }
+
+ function setImportData($record_data)
+ {
+ foreach ($record_data as $field_index => $field_value) {
+ $this->setFieldValue($field_index, $field_value);
+ }
+ $this->setCurrentID();
+ }
+
+
+ function getItemCategory()
+ {
+ static $lang_prefix = null;
+ $backup_category_id = $this->Application->GetVar('m_cat_id');
+
+ $category_id = $this->getFromCache('category_names', implode(':', $this->curItem->CategoryPath));
+ if ($category_id) {
+ $this->Application->SetVar('m_cat_id', $category_id);
+ return $category_id;
+ }
+
+ if (is_null($lang_prefix)) {
+ $lang_prefix = 'l'.$this->Application->GetVar('m_lang').'_';
+ }
+
+ foreach ($this->curItem->CategoryPath as $category_index => $category_name) {
+ if (!$category_name) continue;
+ $category_key = crc32( implode(':', array_slice($this->curItem->CategoryPath, 0, $category_index + 1) ) );
+
+ $category_id = $this->getFromCache('category_names', $category_key);
+ if ($category_id === false) {
+ // get parent category path to search only in it
+ $current_category_id = $this->Application->GetVar('m_cat_id');
+// $parent_path = $this->getParentPath($current_category_id);
+
+ // get category id from database by name
+ $sql = 'SELECT CategoryId
+ FROM '.TABLE_PREFIX.'Category
+ WHERE ('.$lang_prefix.'Name = '.$this->Conn->qstr($category_name).') AND (ParentId = '.$current_category_id.')';
+ $category_id = $this->Conn->GetOne($sql);
+
+ if ($category_id === false) {
+ // category not in db -> create
+ $category_fields = Array( $lang_prefix.'Name' => $category_name, $lang_prefix.'Description' => $category_name,
+ 'Status' => STATUS_ACTIVE, 'ParentId' => $current_category_id, 'AutomaticFilename' => 1
+ );
+ $this->dummyCategory->SetDBFieldsFromHash($category_fields);
+ if ($this->dummyCategory->Create()) {
+ $category_id = $this->dummyCategory->GetID();
+ $this->addToCache('category_parent_path', $category_id, $this->dummyCategory->GetDBField('ParentPath'));
+ $this->addToCache('category_names', $category_key, $category_id);
+ }
+ }
+ else {
+ $this->addToCache('category_names', $category_key, $category_id);
+ }
+ }
+
+ if ($category_id) {
+ $this->Application->SetVar('m_cat_id', $category_id);
+ }
+ }
+ if (!$this->curItem->CategoryPath) {
+ $category_id = $backup_category_id;
+ }
+
+ return $category_id;
+ }
+
+ /**
+ * Enter description here...
+ *
+ * @param kEvent $event
+ */
+ function processCurrentItem(&$event, $record_data)
+ {
+ $save_method = 'Create';
+ $load_keys = Array();
+
+ // create/update categories
+ $backup_category_id = $this->Application->GetVar('m_cat_id');
+
+ // perform replace duplicates code
+ if ($this->exportOptions['ReplaceDuplicates']) {
+ // get replace keys first, then reset current item to empty one
+ $category_id = $this->getItemCategory();
+ if ($this->exportOptions['CheckDuplicatesMethod'] == 1) {
+ if ($this->curItem->GetID()) {
+ $load_keys = Array($this->curItem->IDField => $this->curItem->GetID());
+ }
+ }
+ else {
+ $key_fields = $this->exportOptions['DuplicateCheckFields'];
+ foreach ($key_fields as $key_field) {
+ $load_keys[$key_field] = $this->curItem->GetDBField($key_field);
+ }
+ }
+
+ $this->resetImportObject($event, IMPORT_LIVE);
+
+ if (count($load_keys)) {
+ $where_clause = '';
+ foreach ($load_keys as $field_name => $field_value) {
+ if (preg_match('/^cust_(.*)/', $field_name, $regs)) {
+ $custom_id = array_search($regs[1], $this->customFields);
+ $field_name = 'l'.$this->Application->GetVar('m_lang').'_cust_'.$custom_id;
+ $where_clause .= '(custom_data.`'.$field_name.'` = '.$this->Conn->qstr($field_value).') AND ';
+ }
+ else {
+ $where_clause .= '(item_table.`'.$field_name.'` = '.$this->Conn->qstr($field_value).') AND ';
+ }
+
+ }
+ $where_clause = preg_replace('/(.*) AND $/', '\\1', $where_clause);
+
+ $item_id = $this->getFromCache('new_ids', crc32($where_clause));
+ if (!$item_id) {
+ if ($this->exportOptions['CheckDuplicatesMethod'] == 2) {
+ // by other fields
+ $parent_path = $this->getParentPath($category_id);
+ $where_clause = '(c.ParentPath LIKE "'.$parent_path.'%") AND '.$where_clause;
+ }
+
+ $cdata_table = $this->Application->getUnitOption($event->Prefix.'-cdata', 'TableName');
+ $sql = 'SELECT '.$this->curItem->IDField.'
+ FROM '.$this->curItem->TableName.' item_table
+ LEFT JOIN '.$cdata_table.' custom_data ON custom_data.ResourceId = item_table.ResourceId
+ LEFT JOIN '.TABLE_PREFIX.'CategoryItems ci ON ci.ItemResourceId = item_table.ResourceId
+ LEFT JOIN '.TABLE_PREFIX.'Category c ON c.CategoryId = ci.CategoryId
+ WHERE '.$where_clause;
+ $item_id = $this->Conn->GetOne($sql);
+ }
+ $save_method = $item_id && $this->curItem->Load($item_id) ? 'Update' : 'Create';
+ if ($save_method == 'Update') {
+ // replace id from csv file with found id
+ $record_data[ array_search($this->curItem->IDField, $this->exportFields) ] = $item_id;
+ }
+ }
+
+ $this->setImportData($record_data);
+ }
+ else {
+ $this->resetImportObject($event, IMPORT_LIVE, $record_data);
+ $category_id = $this->getItemCategory();
+ }
+
+ // create main record
+ if ($save_method == 'Create') {
+ $this->fillRequiredFields($this->false, $this->curItem, true);
+ }
+
+// $sql_start = getmicrotime();
+ if (!$this->curItem->$save_method()) {
+ return false;
+ }
+// $sql_end = getmicrotime();
+// $this->saveLog('SQL ['.$save_method.'] Time: '.($sql_end - $sql_start).'s');
+
+ if ($load_keys && ($save_method == 'Create') && $this->exportOptions['ReplaceDuplicates']) {
+ // map new id to old id
+ $this->addToCache('new_ids', crc32($where_clause), $this->curItem->GetID() );
+ }
+
+ // assign item to categories
+ $this->curItem->assignToCategory($category_id, false);
+
+ $this->Application->SetVar('m_cat_id', $backup_category_id);
+ return true;
+ }
+
+ /*function saveLog($msg)
+ {
+ static $first_time = true;
+
+ $fp = fopen(FULL_PATH.'/sqls.log', $first_time ? 'w' : 'a');
+ fwrite($fp, $msg."\n");
+ fclose($fp);
+
+ $first_time = false;
+ }*/
+
+ /**
+ * Returns category parent path, if possible, then from cache
+ *
+ * @param int $category_id
+ * @return string
+ */
+ function getParentPath($category_id)
+ {
+ $parent_path = $this->getFromCache('category_parent_path', $category_id);
+ if ($parent_path === false) {
+ $sql = 'SELECT ParentPath
+ FROM '.TABLE_PREFIX.'Category
+ WHERE CategoryId = '.$category_id;
+ $parent_path = $this->Conn->GetOne($sql);
+ $this->addToCache('category_parent_path', $category_id, $parent_path);
+ }
+ return $parent_path;
+ }
+
+ function getFileExtension()
+ {
+ return $this->exportOptions['ExportFormat'] == 1 ? 'csv' : 'xml';
+ }
+
+ function getLineSeparator($option = 'LineEndings')
+ {
+ return $this->exportOptions[$option] == 1 ? "\r\n" : "\n";
+ }
+
+ /**
+ * Returns field caption for any exported field
+ *
+ * @param string $field
+ * @return string
+ */
+ function getFieldCaption($field)
+ {
+ if (substr($field, 0, 10) == '__CUSTOM__')
+ {
+ $ret = 'Custom_'.substr($field, 10, strlen($field) );
+ }
+ elseif (substr($field, 0, 12) == '__CATEGORY__')
+ {
+ return $this->getCategoryTitle();
+ }
+ elseif (substr($field, 0, 11) == '__VIRTUAL__') {
+ $ret = substr($field, 11);
+ }
+ else
+ {
+ $ret = $field;
+ }
+
+ return Array($ret);
+ }
+
+ /**
+ * Returns requested field value (including custom fields and category fields)
+ *
+ * @param string $field
+ * @return string
+ */
+ function getFieldValue($field)
+ {
+ if (substr($field, 0, 10) == '__CUSTOM__') {
+ $field = 'cust_'.substr($field, 10, strlen($field));
+ $ret = $this->curItem->GetField($field);
+ }
+ elseif (substr($field, 0, 12) == '__CATEGORY__') {
+ return $this->getCategoryPath();
+ }
+ elseif (substr($field, 0, 11) == '__VIRTUAL__') {
+ $field = substr($field, 11);
+ return $this->curItem->GetField($field);
+ }
+ else
+ {
+ $ret = $this->curItem->GetField($field);
+ }
+
+ $ret = str_replace("\r\n", $this->getLineSeparator('LineEndingsInside'), $ret);
+ return Array($ret);
+ }
+
+ /**
+ * Returns category field(-s) caption based on export mode
+ *
+ * @return string
+ */
+ function getCategoryTitle()
+ {
+ // category path in separated fields
+ $category_count = $this->getMaxCategoryLevel();
+ if ($this->exportOptions['CategoryFormat'] == 1)
+ {
+ // category path in one field
+ return $category_count ? Array('CategoryPath') : Array();
+ }
+ else
+ {
+ $i = 0;
+ $ret = Array();
+ while ($i < $category_count) {
+ $ret[] = 'Category'.($i + 1);
+ $i++;
+ }
+ return $ret;
+ }
+ }
+
+ /**
+ * Returns category path in required format for current link
+ *
+ * @return string
+ */
+ function getCategoryPath()
+ {
+ $category_id = $this->curItem->GetDBField('CategoryId');
+ $category_path = $this->getFromCache('category_path', $category_id);
+ if (!$category_path)
+ {
+ $ml_formatter =& $this->Application->recallObject('kMultiLanguage');
+ $sql = 'SELECT '.$ml_formatter->LangFieldName('CachedNavbar').'
+ FROM '.TABLE_PREFIX.'Category
+ WHERE CategoryId = '.$category_id;
+ $category_path = $this->Conn->GetOne($sql);
+ $category_path = $category_path ? explode('&|&', $category_path) : Array();
+
+ if ($this->exportOptions['IsBaseCategory']) {
+ $i = $this->exportOptions['BaseLevel'];
+ while ($i > 0) {
+ array_shift($category_path);
+ $i--;
+ }
+ }
+
+ $category_count = $this->getMaxCategoryLevel();
+ if ($this->exportOptions['CategoryFormat'] == 1) {
+ // category path in single field
+ $category_path = $category_count ? Array( implode($this->exportOptions['CategorySeparator'], $category_path) ) : Array();
+ }
+ else {
+ // category path in separated fields
+ $levels_used = count($category_path);
+ if ($levels_used < $category_count)
+ {
+ $i = 0;
+ while ($i < $category_count - $levels_used) {
+ $category_path[] = '';
+ $i++;
+ }
+ }
+ }
+ $this->addToCache('category_path', $category_id, $category_path);
+ }
+
+ return $category_path;
+ }
+
+ /**
+ * Get maximal category deep level from links beeing exported
+ *
+ * @return int
+ */
+ function getMaxCategoryLevel()
+ {
+ static $max_level = -1;
+
+ if ($max_level != -1)
+ {
+ return $max_level;
+ }
+
+ $sql = 'SELECT IF(c.CategoryId IS NULL, 0, MAX( LENGTH(c.ParentPath) - LENGTH( REPLACE(c.ParentPath, "|", "") ) - 1 ))
+ FROM '.$this->curItem->TableName.' item_table
+ LEFT JOIN '.TABLE_PREFIX.'CategoryItems ci ON item_table.ResourceId = ci.ItemResourceId
+ LEFT JOIN '.TABLE_PREFIX.'Category c ON c.CategoryId = ci.CategoryId
+ WHERE (ci.PrimaryCat = 1) AND ';
+
+ $where_clause = '';
+ if ($this->exportOptions['export_ids'] === false) {
+ // get links from current category & all it's subcategories
+ if ($this->exportOptions['export_cats_ids'][0] == 0) {
+ $where_clause = 1;
+ }
+ else {
+ foreach ($this->exportOptions['export_cats_ids'] as $category_id) {
+ $where_clause .= '(c.ParentPath LIKE "%|'.$category_id.'|%") OR ';
+ }
+ $where_clause = preg_replace('/(.*) OR $/', '\\1', $where_clause);
+ }
+ }
+ else {
+ // get only selected links
+ $where_clause = $this->curItem->IDField.' IN ('.implode(',', $this->exportOptions['export_ids']).')';
+ }
+
+ $max_level = $this->Conn->GetOne($sql.'('.$where_clause.')');
+
+ if ($this->exportOptions['IsBaseCategory'] ) {
+ $max_level -= $this->exportOptions['BaseLevel'];
+ }
+
+ return $max_level;
+ }
+
+ /**
+ * Saves one record to export file
+ *
+ * @param Array $fields_hash
+ */
+ function writeRecord($fields_hash)
+ {
+ fputcsv2($this->filePointer, $fields_hash, $this->exportOptions['FieldsSeparatedBy'], $this->exportOptions['FieldsEnclosedBy'], $this->getLineSeparator() );
+ }
+
+ function readRecord()
+ {
+ return fgetcsv($this->filePointer, 10000, $this->exportOptions['FieldsSeparatedBy'], $this->exportOptions['FieldsEnclosedBy']);
+ }
+
+ function saveOptions(&$event, $options = null)
+ {
+ if (!isset($options)) {
+ $options = $this->exportOptions;
+ }
+ $this->Application->StoreVar($event->getPrefixSpecial().'_options', serialize($options) );
+ }
+
+ function loadOptions(&$event)
+ {
+ return unserialize($this->Application->RecallVar($event->getPrefixSpecial().'_options'));
+ }
+
+ /**
+ * Sets correct available & export fields
+ *
+ * @param kEvent $event
+ */
+ function prepareExportColumns(&$event)
+ {
+ $object =& $event->getObject( Array('skip_autoload' => true) );
+
+ $available_columns = Array();
+
+ if ($this->Application->getUnitOption($event->Prefix, 'CatalogItem')) {
+ // 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
+ foreach ($object->Fields as $field_name => $field_options)
+ {
+ if (!$object->SkipField($field_name))
+ {
+ $available_columns[$field_name] = $field_name.(getArrayValue($field_options, 'required') ? '*' : '');
+ }
+ }
+
+ $handler =& $this->Application->recallObject($event->Prefix.'_EventHandler');
+ $available_columns = array_merge_recursive2($available_columns, $handler->getCustomExportColumns($event));
+
+ // custom fields
+ foreach ($object->customFields as $custom_id => $custom_name)
+ {
+ $available_columns['__CUSTOM__'.$custom_name] = $custom_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);
+
+ $this->updateImportFiles($event);
+ $this->PrepareExportPresets($event);
+ }
+
+ function PrepareExportPresets(&$event)
+ {
+ $object =& $event->getObject( Array('skip_autoload' => true) );
+ $options = $object->GetFieldOptions('ExportPresets');
+
+ $user =& $this->Application->recallObject('u');
+ $export_settings = $user->getPersistantVar('export_settings');
+ if (!$export_settings) return ;
+ $export_settings = unserialize($export_settings);
+
+ if (!isset($export_settings[$event->Prefix])) return ;
+
+
+ $export_presets = array(''=>'');
+ foreach ($export_settings[$event->Prefix] as $key => $val) {
+ $export_presets[implode('|', $val['ExportColumns'])] = $key;
+ }
+
+ $options['options'] = $export_presets;
+ $object->SetFieldOptions('ExportPresets', $options);
+ }
+
+ 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;
+ }
+
+ /**
+ * Updates uploaded files list
+ *
+ * @param kEvent $event
+ */
+ function updateImportFiles(&$event)
+ {
+ if ($event->Special != 'import') {
+ return false;
+ }
+
+ $object =& $event->getObject();
+
+ $import_filenames = Array();
+
+ if ($folder_handle = opendir(EXPORT_PATH)) {
+ while (false !== ($file = readdir($folder_handle))) {
+ if (is_dir(EXPORT_PATH.'/'.$file) || 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);
+ }
+
+ /**
+ * Returns module folder
+ *
+ * @param kEvent $event
+ * @return string
+ */
+ function getModuleFolder(&$event)
+ {
+ return $this->Application->getUnitOption($event->Prefix, 'ModuleFolder');
+ }
+
+ /**
+ * 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') );
+ $this->Application->SetVar($event->getPrefixSpecial(true), $items_info);
+ }
+
+ list($item_id, $field_values) = each($items_info);
+
+ $object =& $event->getObject( Array('skip_autoload' => true) );
+ $object->SetFieldsFromHash($field_values);
+ $field_values['ImportFilename'] = $object->GetDBField('ImportFilename'); //if upload formatter has renamed the file during moving !!!
+
+ $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->HandleEvent($nevent, $event->Prefix.':OnBeforeExportBegin', array('options'=>$field_values));
+ $field_values = $nevent->getEventParam('options');
+
+ $export_object->saveOptions($event, $field_values);
+
+ if( $export_object->verifyOptions($event) )
+ {
+ if ($object->GetDBField('ExportSavePreset')) {
+ $name = $object->GetDBField('ExportPresetName');
+ $user =& $this->Application->recallObject('u');
+ $export_settings = $user->getPersistantVar('export_settings');
+ $export_settings = $export_settings ? unserialize($export_settings) : array();
+ $export_settings[$event->Prefix][$name] = $field_values;
+ $user->setPersistantVar('export_settings', serialize($export_settings));
+ }
+
+ $progress_t = $this->Application->RecallVar('export_progress_t');
+ if ($progress_t) {
+ $this->Application->RemoveVar('export_progress_t');
+ }
+ else {
+ $progress_t = $export_object->getModuleFolder($event).'/'.$event->Special.'_progress';
+ }
+ $event->redirect = $progress_t;
+ }
+ else
+ {
+ // make uploaded file local & change source selection
+ $filename = getArrayValue($field_values, 'ImportFilename');
+ if ($filename) {
+ $export_object->updateImportFiles($event);
+ $object->SetDBField('ImportSource', 2);
+ $field_values['ImportSource'] = 2;
+ $object->SetDBField('ImportLocalFilename', $filename);
+ $field_values['ImportLocalFilename'] = $filename;
+ $export_object->saveOptions($event, $field_values);
+ }
+
+ $event->status = erFAIL;
+ $event->redirect = false;
+ }
+ }
+
+ /**
+ * set required fields based on import or export params
+ *
+ * @param kEvent $event
+ */
+ function setRequiredFields(&$event)
+ {
+ $required_fields['common'] = Array('FieldsSeparatedBy', 'LineEndings', 'CategoryFormat');
+
+ $required_fields['export'] = Array('ExportFormat', 'ExportFilename','ExportColumns');
+
+ $object =& $event->getObject();
+ if ($object->GetDBField('ExportSavePreset')) {
+ $required_fields['export'][] = 'ExportPresetName';
+ }
+
+ $required_fields['import'] = Array('FieldTitles', 'ImportSource', 'CheckDuplicatesMethod'); // ImportFilename, ImportLocalFilename
+
+ 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);
+ }
+ }
+
+ }
+
+?>
Property changes on: branches/unlabeled/unlabeled-1.22.2/core/units/general/cat_dbitem_export.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.22
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property

Event Timeline