Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F774093
in-portal
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Feb 3, 8:05 AM
Size
47 KB
Mime Type
text/x-diff
Expires
Wed, Feb 5, 8:05 AM (4 h, 18 m)
Engine
blob
Format
Raw Data
Handle
557223
Attached To
rINP In-Portal
in-portal
View Options
Index: branches/5.3.x/admin/system_presets/simple/email_templates_email-template.php
===================================================================
--- branches/5.3.x/admin/system_presets/simple/email_templates_email-template.php (revision 16322)
+++ branches/5.3.x/admin/system_presets/simple/email_templates_email-template.php (revision 16323)
@@ -1,64 +1,68 @@
<?php
defined('FULL_PATH') or die('restricted access!');
// section removal
$remove_sections = Array (
// 'in-portal:configemail',
);
// sections shown with debug on
$debug_only_sections = Array (
'in-portal:configemail',
);
// toolbar buttons
$remove_buttons = Array (
// list of all email templates
'email_template_list' => Array (/*'new_item', 'edit', 'delete', 'approve', 'decline', 'frontend_mail', 'view',*/ 'export', /*'dbl-click'*/),
// edit email template - general tab
-// 'email_template_edit' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
+ 'email_template_edit' => Array (/*'select',*/ 'setprimary', /*'cancel', 'reset_edit', 'prev', 'next'*/),
// edit email template - settings tab
// 'email_template_edit_settings' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
);
// fields to hide
$hidden_fields = Array (
/*'TemplateId', 'TemplateName', 'ReplacementTags', 'AllowChangingSender', 'CustomSender',
'SenderName', 'SenderAddressType', 'SenderAddress', 'AllowChangingRecipient',
'CustomRecipient', 'Recipients', 'Subject', 'HtmlBody', 'PlainTextBody', 'Headers',
'Enabled', 'FrontEndOnly', 'Module', 'BindToSystemEvent', 'Description', 'Type'*/
);
// virtual fields to hide
$virtual_hidden_fields = Array (
/*'RecipientType', 'RecipientName', 'RecipientAddressType',
- 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/
+ 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/ 'TranslationInSync', 'TranslateFromLanguage'
);
// fields to make required
$required_fields = Array (
/*'TemplateId',*/ 'TemplateName', /*'ReplacementTags', 'AllowChangingSender', 'CustomSender',
'SenderName', 'SenderAddressType', 'SenderAddress', 'AllowChangingRecipient',
'CustomRecipient', 'Recipients',*/ 'Subject', /*'HtmlBody', 'PlainTextBody', 'Headers',*/
/*'Enabled', 'FrontEndOnly',*/ 'Module', /*'BindToSystemEvent', 'Description',*/ 'Type'
);
// virtual fields to make required
$virtual_required_fields = Array (
/*'RecipientType', 'RecipientName', 'RecipientAddressType',
'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/
);
+ $debug_only_virtual_fields = Array (
+ 'SourceSubject', 'SourceHtmlBody', 'SourcePlainTextBody',
+ );
+
// tabs during editing
$hide_edit_tabs = Array (
'Default' => Array (/*'general',*/ 'settings'),
);
// hide columns in grids
$hide_columns = Array (
// 'Default' => Array ('TemplateId', 'Description', 'TemplateName', 'Module', 'Type', 'Enabled', 'LastChanged'),
-// 'Emails' => Array ('TemplateId', 'TemplateName', 'Subject', 'Description', 'Type', 'Enabled', 'Module', 'FrontEndOnly', 'LastChanged'),
- );
\ No newline at end of file
+ 'Emails' => Array (/*'EventId', 'Event', 'Subject', 'Description', 'Type', 'Enabled', 'Module', 'FrontEndOnly', 'LastChanged',*/ 'TranslationInSync', 'TranslateFromLanguage'),
+ );
Index: branches/5.3.x/core/units/email_templates/email_templates_config.php
===================================================================
--- branches/5.3.x/core/units/email_templates/email_templates_config.php (revision 16322)
+++ branches/5.3.x/core/units/email_templates/email_templates_config.php (revision 16323)
@@ -1,264 +1,309 @@
<?php
/**
* @version $Id$
* @package In-Portal
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
$config = Array (
'Prefix' => 'email-template',
'ItemClass' => Array ('class' => 'kDBItem', 'file' => '', 'build_event' => 'OnItemBuild'),
'ListClass' => Array ('class' => 'kDBList', 'file' => '', 'build_event' => 'OnListBuild'),
'EventHandlerClass' => Array ('class' => 'EmailTemplateEventHandler', 'file' => 'email_template_eh.php', 'build_event' => 'OnBuild'),
'TagProcessorClass' => Array ('class' => 'EmailTemplateTagProcessor', 'file' => 'email_template_tp.php', 'build_event' => 'OnBuild'),
'AutoLoad' => true,
'QueryString' => Array (
1 => 'id',
2 => 'Page',
3 => 'PerPage',
4 => 'event',
5 => 'mode',
),
'IDField' => 'TemplateId',
'StatusField' => Array ('Enabled'),
'TitleField' => 'TemplateName',
'TitlePresets' => Array (
'default' => Array (
'new_status_labels' => Array ('email-template' => '!la_title_AddingEmailTemplate!'),
'edit_status_labels' => Array ('email-template' => '!la_title_EditingEmailTemplate!'),
'new_titlefield' => Array ('email-template' => '!la_title_NewEmailTemplate!'),
),
// for separate grid with email editing
'email_template_list' => Array (
'prefixes' => Array ('email-template_List'), 'format' => "!la_title_EmailTemplates!",
'toolbar_buttons' => Array ('new_item', 'edit', 'delete', 'approve', 'decline', 'frontend_mail', 'export', 'process', 'view', 'dbl-click'),
),
'email_template_edit' => Array (
'prefixes' => Array ('email-template'),
'format' => '#email-template_status# - #email-template_titlefield# - !la_section_General!',
- 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
+ 'toolbar_buttons' => Array ('select', 'setprimary', 'cancel', 'reset_edit', 'prev', 'next'),
),
'email_template_edit_settings' => Array (
'prefixes' => Array ('email-template'),
'format' => '#email-template_status# - #email-template_titlefield# - !la_section_Settings!',
'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
),
// for mass mailing
'email_send_form' => Array ('prefixes' => Array (), 'format' => '!la_title_SendEmail!'),
),
'EditTabPresets' => Array (
'Default' => Array (
'general' => Array ('title' => 'la_tab_General', 't' => 'languages/email_template_edit', 'priority' => 1),
'settings' => Array ('title' => 'la_tab_Settings', 't' => 'languages/email_template_settings', 'priority' => 2),
),
),
+ 'CheckSimulatniousEdit' => true,
+
'PermSection' => Array ('main' => 'in-portal:configemail'),
'Sections' => Array (
'in-portal:configemail' => Array (
'parent' => 'in-portal:site',
'icon' => 'email_templates',
'label' => 'la_title_EmailTemplates',
'url' => Array ('t' => 'languages/email_template_list', 'pass' => 'm'),
'permissions' => Array ('view', 'add', 'edit', 'delete'),
'priority' => 5,
'type' => stTREE,
),
),
'TableName' => TABLE_PREFIX . 'EmailTemplates',
+ 'CalculatedFields' => Array (
+ '' => Array (
+ 'SourceSubject' => 'l%4$s_Subject',
+ 'SourceHtmlBody' => 'l%4$s_HtmlBody',
+ 'SourcePlainTextBody' => 'l%4$s_PlainTextBody',
+
+ 'CurrentSubject' => 'l%5$s_Subject',
+ 'CurrentHtmlBody' => 'l%5$s_HtmlBody',
+ 'CurrentPlainTextBody' => 'l%5$s_PlainTextBody',
+
+ 'TranslationInSync' => 'IF(l%5$s_TranslateFrom = 0, 1, 0)',
+ 'TranslateFromLanguage' => 'l%5$s_TranslateFrom',
+ ),
+ ),
+
'ListSQLs' => Array (
- '' => ' SELECT %1$s.* %2$s FROM %1$s',
+ '' => ' SELECT %1$s.* %2$s
+ FROM %1$s',
),
'ListSortings' => Array (
'' => Array (
'ForcedSorting' => Array ('Enabled' => 'desc'),
'Sorting' => Array ('TemplateName' => 'asc'),
),
'module' => Array (
'ForcedSorting' => Array ('Enabled' => 'desc'),
'Sorting' => Array ('Description' => 'asc')
),
),
'Fields' => Array (
'TemplateId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
'TemplateName' => Array ('type' => 'string', 'not_null' => 1, 'unique' => Array ('Type'), 'required' => 1, 'default' => ''),
'Headers' => Array ('type' => 'string', 'default' => NULL),
'ReplacementTags' => Array ('type' => 'string', 'default' => NULL),
'AllowChangingSender' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
'CustomSender' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_opt_DefaultAddress', 1 => 'la_opt_CustomSender'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
'SenderName' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
'SenderAddressType' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Email', 2 => 'la_opt_User'), 'use_phrases' => 1,
'not_null' => 1, 'error_field' => 'SenderAddress', 'default' => 0
),
'SenderAddress' => Array (
'type' => 'string', 'max_len' => 255,
'error_msgs' => Array (
'invalid_email' => '!la_err_invalid_format!',
'invalid_user' => '!la_error_UserNotFound!',
),
'not_null' => 1, 'default' => ''
),
'AllowChangingRecipient' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
'CustomRecipient' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_opt_DefaultAddress', 1 => 'la_opt_CustomRecipients'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
'Recipients' => Array ('type' => 'string', 'default' => NULL),
'Subject' => Array (
'type' => 'string',
'formatter' => 'kMultiLanguage', 'db_type' => 'text',
'error_msgs' => Array ('parsing_error' => '!la_error_ParsingError!'),
'required' => 1, 'default' => null
),
'HtmlBody' => Array (
'type' => 'string',
'formatter' => 'kMultiLanguage', 'db_type' => 'longtext',
'error_msgs' => Array ('parsing_error' => '!la_error_ParsingError!'),
'default' => null
),
'PlainTextBody' => Array (
'type' => 'string',
'formatter' => 'kMultiLanguage', 'db_type' => 'longtext',
'error_msgs' => Array ('parsing_error' => '!la_error_ParsingError!'),
'default' => null
),
+ 'TranslateFrom' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kMultiLanguage', 'db_type' => 'int', 'index_type' => 'int',
+ 'not_null' => 1, 'default' => 0
+ ),
+
'Enabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 1
),
'FrontEndOnly' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
'Module' => Array (
'type' => 'string',
'formatter' => 'kOptionsFormatter', 'options' => Array (),
'not_null' => 1, 'required' => 1, 'default' => 'Core'
),
'Description' => Array ('type' => 'string', 'default' => NULL),
'Type' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Text_Admin', 0 => 'la_Text_User'), 'use_phrases' => 1,
'not_null' => 1, 'unique' => Array ('TemplateName'), 'required' => 1, 'default' => 0
),
'LastChanged' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL),
'BindToSystemEvent' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
),
'VirtualFields' => Array (
'RecipientType' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'To', 2 => 'Cc', 3 => 'Bcc'),
'default' => 1
),
'RecipientName' => Array ('type' => 'string', 'max_len' => 255, 'default' => ''),
'RecipientAddressType' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Email', 2 => 'la_opt_User', 3 => 'la_opt_Group'), 'use_phrases' => 1,
'error_field' => 'RecipientAddress', 'default' => 0
),
'RecipientAddress' => Array (
'type' => 'string', 'max_len' => 255,
'error_msgs' => Array (
'invalid_email' => '!la_err_invalid_format!',
'invalid_user' => '!la_error_UserNotFound!',
'invalid_group' => '!la_error_GroupNotFound!',
),
'default' => ''
),
'Tag' => Array ('type' => 'string', 'default' => ''),
'Replacement' => Array ('type' => 'string', 'default' => ''),
'ReplacementTagsXML' => Array ('type' => 'string', 'default' => ''),
+
+ 'SourceSubject' => Array ('type' => 'string', 'default' => ''),
+ 'SourceHtmlBody' => Array ('type' => 'string', 'default' => ''),
+ 'SourcePlainTextBody' => Array ('type' => 'string', 'default' => ''),
+
+ 'CurrentSubject' => Array ('type' => 'string', 'default' => ''),
+ 'CurrentHtmlBody' => Array ('type' => 'string', 'default' => ''),
+ 'CurrentPlainTextBody' => Array ('type' => 'string', 'default' => ''),
+
+ 'TranslationInSync' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 0,
+ ),
+ 'TranslateFromLanguage' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM ' . TABLE_PREFIX . 'Languages ORDER BY PackName', 'option_title_field' => 'PackName', 'option_key_field' => 'LanguageId',
+ 'default' => 0,
+ ),
),
'Grids' => Array (
// used on "Email Events" tab in language editing in "Regional" section
'Default' => Array (
'Icons' => Array (
'default' => 'icon16_item.png',
0 => 'icon16_disabled.png',
1 => 'icon16_item.png',
),
'Fields' => Array (
'TemplateId' => Array ('title' => 'column:la_fld_Id', 'filter_block' => 'grid_range_filter', 'width' => 70, ),
'Description' => Array ('filter_block' => 'grid_like_filter', 'width' => 250, ),
'TemplateName' => Array ('filter_block' => 'grid_like_filter', 'width' => 250, ),
'Module' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, ),
'Type' => Array ('filter_block' => 'grid_options_filter', 'width' => 120, ),
'Enabled' => Array ('title' => 'column:la_fld_Status', 'filter_block' => 'grid_options_filter', 'width' => 80, ),
'LastChanged' => Array ('title' => 'column:la_fld_Modified', 'filter_block' => 'grid_date_range_filter', 'width' => 150),
),
),
// used on "Email Templates" section
'Emails' => Array (
'Icons' => Array (
'default' => 'icon16_item.png',
0 => 'icon16_disabled.png',
1 => 'icon16_item.png',
),
'Fields' => Array (
'TemplateId' => Array ('title' => 'column:la_fld_Id', 'filter_block' => 'grid_range_filter', 'width' => 60, ),
'TemplateName' => Array ('filter_block' => 'grid_like_combo_filter', 'width' => 250, ),
- 'Subject' => Array ('filter_block' => 'grid_like_filter', 'no_special' => 0, 'width' => 300, ),
+ 'CurrentSubject' => Array ('title' => 'column:la_fld_Subject', 'filter_block' => 'grid_like_filter', 'no_special' => 0, 'width' => 300, ),
'Description' => Array ('filter_block' => 'grid_like_filter', 'width' => 250, ),
'Type' => Array ('filter_block' => 'grid_options_filter', 'width' => 60, ),
'Enabled' => Array ('filter_block' => 'grid_options_filter', 'width' => 70, ),
'Module' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, ),
'FrontEndOnly' => Array ('filter_block' => 'grid_options_filter', 'width' => 120, 'hidden' => 1),
'LastChanged' => Array ('title' => 'column:la_fld_Modified', 'filter_block' => 'grid_date_range_filter', 'width' => 150),
+ 'TranslationInSync' => Array ('filter_block' => 'grid_options_filter', 'width' => 100, 'hidden' => 1),
+ 'TranslateFromLanguage' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, 'hidden' => 1),
),
),
),
- );
\ No newline at end of file
+ );
Index: branches/5.3.x/core/units/email_templates/email_template_eh.php
===================================================================
--- branches/5.3.x/core/units/email_templates/email_template_eh.php (revision 16322)
+++ branches/5.3.x/core/units/email_templates/email_template_eh.php (revision 16323)
@@ -1,681 +1,741 @@
<?php
/**
* @version $Id$
* @package In-Portal
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class EmailTemplateEventHandler extends kDBEventHandler
{
/**
* Allows to override standard permission mapping
*
* @return void
* @access protected
* @see kEventHandler::$permMapping
*/
protected function mapPermissions()
{
parent::mapPermissions();
$permissions = Array (
'OnFrontOnly' => Array ('self' => 'edit'),
'OnSaveSelected' => Array ('self' => 'view'),
'OnExportEmailTemplates' => Array ('self' => 'view'),
'OnSuggestAddressJSON' => Array ('self' => 'add|edit'),
// events only for developers
'OnPreCreate' => Array ('self' => 'debug'),
'OnDelete' => Array ('self' => 'debug'),
'OnDeleteAll' => Array ('self' => 'debug'),
'OnMassDelete' => Array ('self' => 'debug'),
'OnMassApprove' => Array ('self' => 'debug'),
'OnMassDecline' => Array ('self' => 'debug'),
'OnSend' => Array ('self' => 'debug'),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
}
/**
* Changes permission section to one from REQUEST, not from config
*
* @param kEvent $event
* @return bool
* @access public
*/
public function CheckPermission(kEvent $event)
{
$module = $this->Application->GetVar('module');
if ( strlen($module) > 0 ) {
// checking permission when listing module email events in separate section
$module = explode(':', $module, 2);
if ( count($module) == 1 ) {
$main_prefix = $this->Application->findModule('Name', $module[0], 'Var');
}
else {
$exceptions = Array ('Category' => 'c', 'Users' => 'u');
$main_prefix = $exceptions[$module[1]];
}
$section = $this->Application->getUnitConfig($main_prefix)->getPermSectionByName('email');
$event->setEventParam('PermSection', $section);
}
// checking permission when listing all email events when editing language
return parent::CheckPermission($event);
}
/**
* Apply any custom changes to list's sql query
*
* @param kEvent $event
* @return void
* @access protected
* @see kDBEventHandler::OnListBuild()
*/
protected function SetCustomQuery(kEvent $event)
{
parent::SetCustomQuery($event);
$object = $event->getObject();
/* @var $object kDBList */
if ( $event->Special == 'module' ) {
$module = $this->Application->GetVar('module');
$object->addFilter('module_filter', '%1$s.Module = ' . $this->Conn->qstr($module));
}
else {
$object->addFilter('module_filter', '%1$s.Module IN (SELECT Name FROM ' . TABLE_PREFIX . 'Modules WHERE Loaded = 1)');
}
if ( !$event->Special && !$this->Application->isDebugMode() ) {
// no special
$object->addFilter('enabled_filter', '%1$s.Enabled <> ' . STATUS_DISABLED);
}
}
/**
* Prepares new kDBItem object
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnNew(kEvent $event)
{
parent::OnNew($event);
$mapping = Array ('conf' => 'VariableValue', 'site-domain' => 'DefaultEmailRecipients');
if ( isset($mapping[$event->Special]) ) {
$object = $event->getObject();
/* @var $object kDBItem */
$target_object = $this->Application->recallObject($event->Special);
/* @var $target_object kDBList */
$object->SetDBField('Recipients', $target_object->GetDBField($mapping[$event->Special]));
}
}
/**
* Set default headers
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnPreCreate(kEvent $event)
{
parent::OnPreCreate($event);
$object = $event->getObject();
/* @var $object kDBItem */
$object->SetDBField('Headers', $this->Application->ConfigValue('Smtp_DefaultHeaders'));
$this->setRequired($event);
}
/**
* Sets status Front-End Only to selected email events
*
* @param kEvent $event
*/
function OnFrontOnly($event)
{
if ( $this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1) ) {
$event->status = kEvent::erFAIL;
return;
}
$config = $event->getUnitConfig();
$sql = 'UPDATE ' . $config->getTableName() . '
SET FrontEndOnly = 1
WHERE ' . $config->getIDField() . ' IN (' . implode(',', $this->StoreSelectedIDs($event)) . ')';
$this->Conn->Query($sql);
$this->clearSelectedIDs($event);
}
/**
* Sets selected user to email events selected
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnSelectUser(kEvent $event)
{
if ( $event->Special != 'module' ) {
parent::OnSelectUser($event);
return;
}
if ( $this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1) ) {
$event->status = kEvent::erFAIL;
return;
}
$items_info = $this->Application->GetVar('u');
if ( $items_info ) {
list ($user_id, ) = each($items_info);
$config = $event->getUnitConfig();
$ids = $this->Application->RecallVar($event->getPrefixSpecial() . '_selected_ids');
$sql = 'UPDATE ' . $config->getTableName() . '
SET ' . $this->Application->RecallVar('dst_field') . ' = ' . $user_id . '
WHERE ' . $config->getIDField() . ' IN (' . $ids . ')';
$this->Conn->Query($sql);
}
$this->finalizePopup($event);
}
/**
* Saves selected ids to session
*
* @param kEvent $event
*/
function OnSaveSelected($event)
{
$this->StoreSelectedIDs($event);
}
/**
* Prefills module dropdown
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterConfigRead(kEvent $event)
{
parent::OnAfterConfigRead($event);
- $options = Array ();
+ $config = $event->getUnitConfig();
- foreach ($this->Application->ModuleInfo as $module_name => $module_info) {
- if ( $module_name == 'In-Portal' ) {
- continue;
- }
+ $fields = $config->getFields();
+ $fields['Module']['options'] = $this->_getModules();
- $options[$module_name] = $module_name;
+ if ( $this->Application->findModule('Name', 'Custom') ) {
+ $fields['Module']['default'] = 'Custom';
}
- $config = $event->getUnitConfig();
-
- $fields = $config->getFields();
- $fields['Module']['options'] = $options;
$config->setFields($fields);
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $ml_helper->replaceMLCalculatedFields($event);
+
if ( $this->Application->GetVar('regional') ) {
$config->setPopulateMlFields(true);
}
}
/**
+ * Returns modules, where e-mail event can be added to
+ *
+ * @return Array
+ * @access protected
+ */
+ protected function _getModules()
+ {
+ $ret = Array ();
+
+ foreach ($this->Application->ModuleInfo as $module_name => $module_info) {
+ if ( $module_name == 'In-Portal' ) {
+ continue;
+ }
+
+ $ret[$module_name] = $module_name;
+ }
+
+ return $ret;
+ }
+
+ /**
* Prepare temp tables and populate it
* with items selected in the grid
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnEdit(kEvent $event)
{
parent::OnEdit($event);
// use language from grid, instead of primary language used by default
$event->SetRedirectParam('m_lang', $this->Application->GetVar('m_lang'));
}
/**
* Fixes default recipient type
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemLoad(kEvent $event)
{
parent::OnAfterItemLoad($event);
$object = $event->getObject();
/* @var $object kDBItem */
if ( !$this->Application->isDebugMode(false) ) {
if ( $object->GetDBField('AllowChangingRecipient') ) {
$object->SetDBField('RecipientType', EmailTemplate::RECIPIENT_TYPE_TO);
}
else {
$object->SetDBField('RecipientType', EmailTemplate::RECIPIENT_TYPE_CC);
}
}
// process replacement tags
$records = Array ();
$replacement_tags = $object->GetDBField('ReplacementTags');
$replacement_tags = $replacement_tags ? unserialize($replacement_tags) : Array ();
foreach ($replacement_tags as $tag => $replacement) {
$records[] = Array ('Tag' => $tag, 'Replacement' => $replacement);
}
$minput_helper = $this->Application->recallObject('MInputHelper');
/* @var $minput_helper MInputHelper */
$xml = $minput_helper->prepareMInputXML($records, Array ('Tag', 'Replacement'));
$object->SetDBField('ReplacementTagsXML', $xml);
$this->setRequired($event);
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $translation_fields = $this->getTranslationFields();
+ $source_language = $ml_helper->getSourceLanguage($object->GetDBField('TranslateFromLanguage'));
+
+ foreach ($translation_fields as $translation_field) {
+ $object->SetDBField('Source' . $translation_field, $object->GetDBField('l' . $source_language . '_' . $translation_field));
+ }
}
/**
* Performs custom validation + keep read-only fields
*
* @param kEvent $event
*/
function _itemChanged($event)
{
$object = $event->getObject();
/* @var $object kDBItem */
if ( !$this->Application->isDebugMode(false) ) {
// only allow to enable/disable event while in debug mode
$to_restore = Array ('Enabled', 'AllowChangingSender', 'AllowChangingRecipient');
if ( !$object->GetOriginalField('AllowChangingSender') ) {
$to_restore = array_merge($to_restore, Array ('CustomSender', 'SenderName', 'SenderAddressType', 'SenderAddress'));
}
if ( !$object->GetOriginalField('AllowChangingRecipient') ) {
$to_restore = array_merge($to_restore, Array ('CustomRecipient' /*, 'Recipients'*/));
}
// prevent specific fields from editing
foreach ($to_restore as $restore_field) {
$original_value = $object->GetOriginalField($restore_field);
if ( $object->GetDBField($restore_field) != $original_value ) {
$object->SetDBField($restore_field, $original_value);
}
}
}
// process replacement tags
if ( $object->GetDBField('ReplacementTagsXML') ) {
$minput_helper = $this->Application->recallObject('MInputHelper');
/* @var $minput_helper MInputHelper */
$replacement_tags = Array ();
$records = $minput_helper->parseMInputXML($object->GetDBField('ReplacementTagsXML'));
foreach ($records as $record) {
$replacement_tags[trim($record['Tag'])] = trim($record['Replacement']);
}
$object->SetDBField('ReplacementTags', $replacement_tags ? serialize($replacement_tags) : NULL);
}
if ( $this->translationChanged($object) ) {
$object->SetDBField('LastChanged_date', TIMENOW);
$object->SetDBField('LastChanged_time', TIMENOW);
}
$this->setRequired($event);
}
/**
* Dynamically changes required fields
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function setRequired(kEvent $event)
{
$object = $event->getObject();
/* @var $object kDBItem */
$language_prefix = 'l' . $this->Application->GetVar('m_lang') . '_';
$object->setRequired($language_prefix . 'HtmlBody', !$object->GetField('PlainTextBody'));
$object->setRequired($language_prefix . 'PlainTextBody', !$object->GetField('HtmlBody'));
}
/**
* Checks, that at least one of phrase's translations was changed
*
* @param kDBItem $object
* @return bool
*/
function translationChanged($object)
{
+ $translation_fields = $this->getTranslationFields();
$changed_fields = array_keys($object->GetChangedFields());
- $translation_fields = Array ('Subject', 'HtmlBody', 'PlainTextBody');
foreach ($changed_fields as $changed_field) {
$changed_field = preg_replace('/^l[\d]+_/', '', $changed_field);
if ( in_array($changed_field, $translation_fields) ) {
return true;
}
}
return false;
}
/**
+ * Returns fields, that can be translated
+ *
+ * @return Array
+ * @access protected
+ */
+ protected function getTranslationFields()
+ {
+ return Array ('Subject', 'HtmlBody', 'PlainTextBody');
+ }
+
+ /**
* Don't allow to enable/disable events in non-debug mode
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemCreate(kEvent $event)
{
parent::OnBeforeItemCreate($event);
$this->_itemChanged($event);
}
/**
* Don't allow to enable/disable events in non-debug mode
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemUpdate(kEvent $event)
{
parent::OnBeforeItemUpdate($event);
$this->_itemChanged($event);
}
/**
* Suggest address based on typed address and selected address type
*
* @param kEvent $event
*/
function OnSuggestAddressJSON($event)
{
$event->status = kEvent::erSTOP;
$address_type = $this->Application->GetVar('type');
$address = $this->Application->GetVar('term');
$limit = $this->Application->GetVar('limit');
if ( !$limit ) {
$limit = 20;
}
switch ($address_type) {
case EmailTemplate::ADDRESS_TYPE_EMAIL:
$field = 'Email';
$table_name = TABLE_PREFIX . 'Users';
break;
case EmailTemplate::ADDRESS_TYPE_USER:
$field = 'Username';
$table_name = TABLE_PREFIX . 'Users';
break;
case EmailTemplate::ADDRESS_TYPE_GROUP:
$field = 'Name';
$table_name = TABLE_PREFIX . 'UserGroups';
break;
default:
$field = $table_name = '';
break;
}
if ( $field ) {
$sql = 'SELECT DISTINCT ' . $field . '
FROM ' . $table_name . '
WHERE ' . $field . ' LIKE ' . $this->Conn->qstr($address . '%') . '
ORDER BY ' . $field . ' ASC
LIMIT 0,' . $limit;
$data = $this->Conn->GetCol($sql);
}
else {
$data = Array ();
}
echo json_encode($data);
}
/**
* Does custom validation
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemValidate(kEvent $event)
{
parent::OnBeforeItemValidate($event);
$object = $event->getObject();
/* @var $object kDBItem */
// validate email subject and body for parsing errors
$this->_validateEmailTemplate($object);
// validate sender and recipient addresses
if ( $object->GetDBField('CustomSender') ) {
$this->_validateAddress($event, 'Sender');
}
$this->_validateAddress($event, 'Recipient');
$this->_validateBindEvent($object);
}
/**
* Validates subject and body fields of Email template
*
* @param kDBItem $object
* @return void
* @access protected
*/
protected function _validateEmailTemplate($object)
{
$email_template_helper = $this->Application->recallObject('kEmailTemplateHelper');
/* @var $email_template_helper kEmailTemplateHelper */
$email_template_helper->parseField($object, 'Subject');
$email_template_helper->parseField($object, 'HtmlBody');
$email_template_helper->parseField($object, 'PlainTextBody');
}
/**
* Validates address using given field prefix
*
* @param kEvent $event
* @param string $field_prefix
* @return void
* @access protected
*/
protected function _validateAddress($event, $field_prefix)
{
$object = $event->getObject();
/* @var $object kDBItem */
$address_type = $object->GetDBField($field_prefix . 'AddressType');
$object->setRequired($field_prefix . 'Address', $address_type > 0);
$address = $object->GetDBField($field_prefix . 'Address');
if ( !$address ) {
// don't validate against empty address
return;
}
switch ($address_type) {
case EmailTemplate::ADDRESS_TYPE_EMAIL:
if ( !preg_match('/^(' . REGEX_EMAIL_USER . '@' . REGEX_EMAIL_DOMAIN . ')$/i', $address) ) {
$object->SetError($field_prefix . 'Address', 'invalid_email');
}
break;
case EmailTemplate::ADDRESS_TYPE_USER:
$sql = 'SELECT PortalUserId
FROM ' . TABLE_PREFIX . 'Users
WHERE Username = ' . $this->Conn->qstr($address);
if ( !$this->Conn->GetOne($sql) ) {
$object->SetError($field_prefix . 'Address', 'invalid_user');
}
break;
case EmailTemplate::ADDRESS_TYPE_GROUP:
$sql = 'SELECT GroupId
FROM ' . TABLE_PREFIX . 'UserGroups
WHERE Name = ' . $this->Conn->qstr($address);
if ( !$this->Conn->GetOne($sql) ) {
$object->SetError($field_prefix . 'Address', 'invalid_group');
}
break;
}
}
/**
* Checks that bind event is specified in correct format and exists
*
* @param kDBItem $object
*/
protected function _validateBindEvent($object)
{
$event_string = $object->GetDBField('BindToSystemEvent');
if ( !$event_string ) {
return;
}
try {
$this->Application->eventImplemented(new kEvent($event_string));
}
catch (Exception $e) {
$object->SetError('BindToSystemEvent', 'invalid_event', '+' . $e->getMessage());
}
}
/**
* Stores ids of selected phrases and redirects to export language step 1
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnExportEmailTemplates(kEvent $event)
{
if ( $this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1) ) {
$event->status = kEvent::erFAIL;
return;
}
$this->Application->getUnitConfig('phrases')->setAutoLoad(false);
$this->StoreSelectedIDs($event);
$this->Application->StoreVar('export_language_ids', $this->Application->GetVar('m_lang'));
$event->setRedirectParams(
Array (
'phrases.export_event' => 'OnNew',
'pass' => 'all,phrases.export',
'export_mode' => $event->Prefix,
)
);
}
/**
* Deletes all subscribers to e-mail event after it was deleted
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemDelete(kEvent $event)
{
parent::OnAfterItemDelete($event);
$object = $event->getObject();
/* @var $object kDBItem */
$sql = 'SELECT SubscriptionId
FROM ' . TABLE_PREFIX . 'SystemEventSubscriptions
WHERE EmailTemplateId = ' . $object->GetID();
$ids = $this->Conn->GetCol($sql);
if ( !$ids ) {
return;
}
$temp_handler = $this->Application->recallObject('system-event-subscription_TempHandler', 'kTempTablesHandler', Array ('parent_event' => $event->MasterEvent));
/* @var $temp_handler kTempTablesHandler */
$temp_handler->DeleteItems('system-event-subscription', '', $ids);
}
/**
* Sends selected e-mail event
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnSend(kEvent $event)
{
$object = $event->getObject(Array ('skip_autoload' => true));
/* @var $object kDBItem */
$ids = $this->StoreSelectedIDs($event);
foreach ($ids as $id) {
$object->Load($id);
if ( $object->GetDBField('Type') == EmailTemplate::TEMPLATE_TYPE_ADMIN ) {
$this->Application->emailAdmin($object->GetDBField('TemplateName'));
}
else {
$this->Application->emailUser($object->GetDBField('TemplateName'));
}
}
$this->clearSelectedIDs($event);
}
- }
\ No newline at end of file
+
+ /**
+ * Updates translation state for all saved phrases
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnBeforeCopyToLive(kEvent $event)
+ {
+ parent::OnBeforeCopyToLive($event);
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $ml_helper->updateTranslationState($event);
+ }
+
+ }
Index: branches/5.3.x/core/units/email_templates/email_template_tp.php
===================================================================
--- branches/5.3.x/core/units/email_templates/email_template_tp.php (revision 16322)
+++ branches/5.3.x/core/units/email_templates/email_template_tp.php (revision 16323)
@@ -1,102 +1,142 @@
<?php
/**
* @version $Id$
* @package In-Portal
* @copyright Copyright (C) 1997 - 2010 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class EmailTemplateTagProcessor extends kDBTagProcessor
{
/**
* Removes "Enabled" column, when not in debug mode
*
* @param Array $params
*/
function ModifyUnitConfig($params)
{
if ( !$this->Application->isDebugMode() ) {
$config = $this->getUnitConfig();
$grids = $config->getGrids(Array ());
foreach ($grids as $grid_name => $grid_data) {
if ( array_key_exists('Enabled', $grid_data['Fields']) ) {
unset($grids[$grid_name]['Fields']['Enabled']);
}
}
$config->setGrids($grids);
}
}
/**
* Checks, that field can be edited
*
* @param Array $params
* @return string
*/
function IsEditable($params)
{
if ($this->Application->isDebugMode()) {
return true;
}
$object = $this->getObject($params);
/* @var $object kDBItem */
return $object->GetDBField($params['check_field']);
}
/**
* To recipient read-only
*
* @param Array $params
* @return string
* @access protected
*/
protected function ToRecipientReadOnly($params)
{
return !$this->IsEditable(Array ('check_field' => 'AllowChangingRecipient'));
}
/**
* Removes "To" options from possible options in "RecipientType" field
*
* @param Array $params
*/
function RemoveToRecipientType($params)
{
$object = $this->getObject($params);
/* @var $object kDBItem */
$field_options = $object->GetFieldOptions('RecipientType');
unset($field_options['options'][ EmailTemplate::RECIPIENT_TYPE_TO ]);
$object->SetFieldOptions('RecipientType', $field_options);
}
/**
* Restores "To" option in possible option list in "RecipientType" field
*
* @param Array $params
*/
function RestoreRecipientType($params)
{
$object = $this->getObject($params);
/* @var $object kDBItem */
$field_options = $object->GetFieldOptions('RecipientType');
$virtual_field_options = $this->getUnitConfig()->getVirtualFieldByName('RecipientType');
$field_options['options'] = $virtual_field_options['options'];
$object->SetFieldOptions('RecipientType', $field_options);
}
- }
\ No newline at end of file
+ /**
+ * Determine if primary translation should be shown
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function ShowSourceLanguage($params)
+ {
+ if ( $this->IsNewItem($params) ) {
+ return false;
+ }
+
+ $object = $this->getObject($params);
+ /* @var $object kDBItem */
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ return !$ml_helper->editingInSourceLanguage($object->GetDBField('TranslateFromLanguage'));
+ }
+
+ /**
+ * Shows field label with %s replaced with source translation language
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function SourceLanguageTitle($params)
+ {
+ $object = $this->getObject($params);
+ /* @var $object kDBItem */
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ return $ml_helper->replaceSourceLanguage($object, $params['label']);
+ }
+
+ }
Index: branches/5.3.x/core/admin_templates/languages/email_template_edit.tpl
===================================================================
--- branches/5.3.x/core/admin_templates/languages/email_template_edit.tpl (revision 16322)
+++ branches/5.3.x/core/admin_templates/languages/email_template_edit.tpl (revision 16323)
@@ -1,82 +1,124 @@
<inp2:adm_SetPopupSize width="875" height="650"/>
<inp2:m_include t="incs/header"/>
<inp2:m_RenderElement name="combined_header" section="in-portal:configemail" prefix="email-template" title_preset="email_template_edit" tab_preset="Default"/>
<!-- ToolBar -->
<table class="toolbar" height="30" cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td>
<script type="text/javascript">
a_toolbar = new ToolBar();
a_toolbar.AddButton( new ToolBarButton('select', '<inp2:m_phrase label="la_ToolTip_Save" escape="1"/>', function() {
+ Application.SetVar('translation_save_mode', 1);
submit_event('email-template','<inp2:email-template_SaveEvent/>');
}
) );
+ <inp2:m_if check="lang_IsMultiLanguage">
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'setprimary',
+ '<inp2:m_Phrase label="hint:la_ToolTip_SetPrimaryTranslation" escape="1"/>::<inp2:m_Phrase label="la_ToolTip_SetPrimaryTranslation" escape="1"/>',
+ function() {
+ Application.SetVar('translation_save_mode', 2);
+ submit_event('email-template','<inp2:email-template_SaveEvent/>');
+ }
+ )
+ );
+ </inp2:m_if>
+
+ a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+
a_toolbar.AddButton( new ToolBarButton('cancel', '<inp2:m_phrase label="la_ToolTip_Cancel" escape="1"/>', function() {
cancel_edit('email-template','OnCancelEdit','<inp2:email-template_SaveEvent/>','<inp2:m_Phrase label="la_FormCancelConfirmation" escape="1"/>');
}
) );
a_toolbar.AddButton( new ToolBarButton('reset_edit', '<inp2:m_phrase label="la_ToolTip_Reset" escape="1"/>', function() {
reset_form('email-template', 'OnReset', '<inp2:m_Phrase label="la_FormResetConfirmation" escape="1"/>');
}
) );
<inp2:m_if check="email-template_IsSingle" inverse="inverse">
- a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+ a_toolbar.AddButton( new ToolBarSeparator('sep2') );
</inp2:m_if>
a_toolbar.AddButton( new ToolBarButton('prev', '<inp2:m_phrase label="la_ToolTip_Prev" escape="1"/>', function() {
go_to_id('email-template', '<inp2:email-template_PrevId/>');
}
) );
a_toolbar.AddButton( new ToolBarButton('next', '<inp2:m_phrase label="la_ToolTip_Next" escape="1"/>', function() {
go_to_id('email-template', '<inp2:email-template_NextId/>');
}
) );
a_toolbar.Render();
<inp2:m_RenderElement name="edit_navigation" prefix="email-template"/>
</script>
</td>
<inp2:m_RenderElement name="ml_selector" prefix="email-template"/>
</tr>
</tbody>
</table>
<inp2:email-template_SaveWarning name="grid_save_warning"/>
<inp2:email-template_ErrorWarning name="form_error_warning"/>
+<inp2:m_DefineElement name="inp_primary_label">
+ <inp2:m_RenderElement design="form_row" pass_params="1">
+ <td class="control-cell" valign="top">
+ <div class="highlight-area" style="width: 735px; height: 234px;">
+ <inp2:{$prefix}_Field field="$field" nl2br="$nl2br"/>
+ </div>
+ </td>
+ </inp2:m_RenderElement>
+</inp2:m_DefineElement>
+
<div id="scroll_container">
<table class="edit-form">
<inp2:m_RenderElement name="subsection" prefix="email-template" fields="TemplateId,Description,Subject" title="la_section_General"/>
<inp2:m_RenderElement name="inp_id_label" prefix="email-template" field="TemplateId" title="la_fld_Id"/>
<inp2:m_if check="m_IsDebugMode">
<inp2:m_RenderElement name="inp_edit_box" prefix="email-template" field="TemplateName"/>
<inp2:m_else/>
<inp2:m_RenderElement name="inp_label" prefix="email-template" field="TemplateName"/>
</inp2:m_if>
<inp2:m_RenderElement name="inp_label" prefix="email-template" field="Description" title="la_fld_Description"/>
+
+ <inp2:m_if check="email-template_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="email-template" field="TranslationInSync"/>
+ </inp2:m_if>
+
<inp2:m_RenderElement name="inp_edit_box_ml" prefix="email-template" field="Subject" format="no_default" title="la_fld_Subject"/>
+ <inp2:m_if check="email-template_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="email-template" field="SourceSubject" caption_render_as="source_language_field_caption_element"/>
+ </inp2:m_if>
<inp2:m_RenderElement name="subsection" prefix="email-template" fields="HtmlBody,PlainTextBody" title="la_section_Message"/>
<inp2:m_if check="m_IsDebugMode">
<inp2:m_RenderElement name="inp_edit_codemirror" prefix="email-template" field="HtmlBody" format="no_default" title="la_fld_HtmlVersion" language="text/html" allow_html="1" control_options="{min_height: 200}"/>
<inp2:m_else/>
<inp2:m_RenderElement name="inp_edit_fck" prefix="email-template" field="HtmlBody" format="no_default" title="la_fld_HtmlVersion" rows="5" cols="60" control_options="{min_height: 200}"/>
</inp2:m_if>
+ <inp2:m_if check="email-template_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_primary_label" prefix="email-template" field="SourceHtmlBody" caption_render_as="source_language_field_caption_element" nl2br="1"/>
+ </inp2:m_if>
+
<inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="email-template" field="PlainTextBody" format="no_default" title="la_fld_TextVersion" control_options="{min_height: 200}"/>
+
+ <inp2:m_if check="email-template_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_primary_label" prefix="email-template" field="SourcePlainTextBody" caption_render_as="source_language_field_caption_element" nl2br="1"/>
+ </inp2:m_if>
<inp2:m_RenderElement name="inp_edit_filler" control_options="{max_height: 8}"/>
</table>
</div>
-<inp2:m_include t="incs/footer"/>
\ No newline at end of file
+<inp2:m_include t="incs/footer"/>
Event Timeline
Log In to Comment