Project

General

Profile

Feature #13095 ยป _13095.patch

Sonja Schubert, 2011-03-03 11:36

View differences:

Classes/Service/Stages.php (revision )
// ready to publish stage
const STAGE_PUBLISH_ID = -10;
const STAGE_EDIT_ID = 0;
const MODE_NOTIFY_SOMEONE = 0;
const MODE_NOTIFY_ALL = 1;
const MODE_NOTIFY_ALL_STRICT = 2;
/**
* Current workspace ID
......
* Get array of all responsilbe be_users for a stage
*
* @param int stage id
* @param boolean if field notification_defaults should be selected instead of responsible users
* @return array be_users with e-mail and name
*/
public function getResponsibleBeUser($stageId) {
public function getResponsibleBeUser($stageId, $selectDefaultUserField = false) {
$workspaceRec = t3lib_BEfunc::getRecord('sys_workspace', $this->getWorkspaceId());
$recipientArray = array();
switch ($stageId) {
case self::STAGE_PUBLISH_EXECUTE_ID:
case self::STAGE_PUBLISH_ID:
if ($selectDefaultUserField == false) {
$userList = $this->getResponsibleUser($workspaceRec['adminusers']);
$userList = $this->getResponsibleUser($workspaceRec['adminusers']);
} else {
$notification_default_user = $workspaceRec['publish_notification_defaults'];
$userList = $this->getResponsibleUser($notification_default_user);
}
break;
case self::STAGE_EDIT_ID:
if ($selectDefaultUserField == false) {
$userList = $this->getResponsibleUser($workspaceRec['members']);
$userList = $this->getResponsibleUser($workspaceRec['members']);
} else {
$notification_default_user = $workspaceRec['edit_notification_defaults'];
$userList = $this->getResponsibleUser($notification_default_user);
}
break;
default:
if ($selectDefaultUserField == false) {
$responsible_persons = $this->getPropertyOfCurrentWorkspaceStage($stageId, 'responsible_persons');
$userList = $this->getResponsibleUser($responsible_persons);
$responsible_persons = $this->getPropertyOfCurrentWorkspaceStage($stageId, 'responsible_persons');
$userList = $this->getResponsibleUser($responsible_persons);
} else {
$notification_default_user = $this->getPropertyOfCurrentWorkspaceStage($stageId, 'notification_defaults');
$userList = $this->getResponsibleUser($notification_default_user);
}
break;
}
......
return $isValid;
}
/**
* Returns the notification mode from stage configuration
*
* Return values:
* 0 = notify someone / old way / default setting
* 1 = notify all responsible users (some users checked per default and you're not allowed to uncheck them)
* 2 = notify all responsible users (all users are checked and nothing can be changed during stage change)
*
* @param integer stage id to return the notification mode for
* @return integer
*/
public function getNotificationMode($stageId) {
if (!t3lib_div::testInt($stageId)) {
throw new InvalidArgumentException($GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:error.stageId.integer'));
}
}
switch ($stageId) {
case self::STAGE_PUBLISH_EXECUTE_ID:
case self::STAGE_PUBLISH_ID:
$workspaceRecord = t3lib_BEfunc::getRecord('sys_workspace', $this->getWorkspaceId());
return $workspaceRecord['publish_notification_mode'];
break;
case self::STAGE_EDIT_ID:
$workspaceRecord = t3lib_BEfunc::getRecord('sys_workspace', $this->getWorkspaceId());
return $workspaceRecord['edit_notification_mode'];
break;
default:
$workspaceStage = t3lib_BEfunc::getRecord(self::TABLE_STAGE, $stageId);
if (is_array($workspaceStage) && isset($workspaceStage['notification_mode'])) {
return $workspaceStage['notification_mode'];
}
break;
}
}
}
if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/workspaces/Classes/Service/Stages.php'])) {
include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/workspaces/Classes/Service/Stages.php']);
}
Resources/Private/Language/locallang_db.xml (revision )
</meta>
<data type="array">
<languageKey index="default" type="array">
<label index="tabs.general">General</label>
<label index="tabs.notification_settings">Notification settings</label>
<label index="sys_filemounts.tabs.staging">Staging</label>
<label index="sys_workspace.custom_stages">Custom stages:</label>
<label index="sys_workspace.notification_mode">Edit stage: Recipient suggestion checkboxes</label>
<label index="sys_workspace.notification_mode.0">All are selected per default (can be changed)</label>
<label index="sys_workspace.notification_mode.1">Some are selected per default (defaults can not be unchecked)</label>
<label index="sys_workspace.notification_mode.2">All are selected per default (can not be changed)</label>
<label index="sys_workspace.edit_notification_defaults">Edit stage: default notification mail recipients</label>
<label index="sys_workspace.edit_allow_notificaton_settings">Allow notification settings during stage change back to edit stage</label>
<label index="sys_workspace.publish_notification_mode">Ready to publish stage: Recipient suggestion checkboxes</label>
<label index="sys_workspace.publish_notification_defaults">Ready to publish stage: default notification mail recipients</label>
<label index="sys_workspace.publish_allow_notificaton_settings">Allow notification settings during stage change to ready to publish</label>
<label index="sys_workspace_stage.notification_mode">Recipient suggestion checkboxes</label>
<label index="sys_workspace_stage.notification_defaults">Default notification mail recipients</label>
<label index="sys_workspace_stage.allow_notificaton_settings">Allow notification settings during stage change</label>
<label index="sys_workspace_stage.responsible_persons">Responsible persons:</label>
<label index="sys_workspace_stage.default_mailcomment">Default mail comment:</label>
<label index="sys_workspace_stage.parentid">UID of parent record:</label>
Classes/ExtDirect/ActionHandler.php (revision )
*
* @param array list of recipients
* @param string given user string of additional recipients
* @param integer stage id
* @return array
*/
public function getRecipientList(array $uidOfRecipients, $additionalRecipients) {
public function getRecipientList(array $uidOfRecipients, $additionalRecipients, $stageId) {
$finalRecipients = array();
$recipients = array();
......
}
}
// the notification mode can be configured in the workspace stage record
$notification_mode = $this->getStageService()->getNotificationMode($stageId);
if (intval($notification_mode) === Tx_Workspaces_Service_Stages::MODE_NOTIFY_ALL || intval($notification_mode) === Tx_Workspaces_Service_Stages::MODE_NOTIFY_ALL_STRICT) {
// get the default recipients from the stage configuration
// the default recipients needs to be added in some cases of the notification_mode
$default_recipients = $this->getStageService()->getResponsibleBeUser($stageId, true);
foreach ($default_recipients as $default_recipient_uid => $default_recipient_record) {
if (!in_array($default_recipient_record['email'],$recipients)) {
$recipients[] = $default_recipient_record['email'];
}
}
}
if ($additionalRecipients != '') {
$additionalRecipients = t3lib_div::trimExplode("\n", $additionalRecipients, TRUE);
} else {
......
$table = $parameters->affects->table;
$uid = $parameters->affects->uid;
$t3ver_oid = $parameters->affects->t3ver_oid;
$recipients = $this->getRecipientList($parameters->receipients, $parameters->additional);
$recipients = $this->getRecipientList($parameters->receipients, $parameters->additional, $setStageId);
if ($setStageId == Tx_Workspaces_Service_Stages::STAGE_PUBLISH_EXECUTE_ID) {
$cmdArray[$table][$t3ver_oid]['version']['action'] = 'swap';
......
$comments = $parameters->comments;
$table = $parameters->affects->table;
$uid = $parameters->affects->uid;
$recipients = $this->getRecipientList($parameters->receipients, $parameters->additional);
$recipients = $this->getRecipientList($parameters->receipients, $parameters->additional, $setStageId);
$cmdArray[$table][$uid]['version']['action'] = 'setStage';
$cmdArray[$table][$uid]['version']['stageId'] = $setStageId;
......
$setStageId = $parameters->affects->nextStage;
$comments = $parameters->comments;
$elements = $parameters->affects->elements;
$recipients = $this->getRecipientList($parameters->receipients, $parameters->additional);
$recipients = $this->getRecipientList($parameters->receipients, $parameters->additional, $setStageId);
foreach($elements as $key=>$element) {
if ($setStageId == Tx_Workspaces_Service_Stages::STAGE_PUBLISH_EXECUTE_ID) {
......
* @return array
*/
protected function getSentToStageWindow($nextStageId) {
$workspaceRec = t3lib_BEfunc::getRecord('sys_workspace', $this->getStageService()->getWorkspaceId());
$showNotificationFields = FALSE;
$stageTitle = $this->getStageService()->getStageTitle($nextStageId);
$result = array(
'title' => $GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:actionSendToStage'),
......
'bodyStyle' => 'margin-bottom: 7px; border: none;',
'html' => $GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:window.sendToNextStageWindow.itemsWillBeSentTo') . $stageTitle,
),
array(
)
);
switch ($nextStageId) {
case Tx_Workspaces_Service_Stages::STAGE_PUBLISH_EXECUTE_ID:
case Tx_Workspaces_Service_Stages::STAGE_PUBLISH_ID:
if (!empty($workspaceRec['publish_allow_notificaton_settings'])) {
$showNotificationFields = TRUE;
}
break;
case Tx_Workspaces_Service_Stages::STAGE_EDIT_ID:
if (!empty($workspaceRec['edit_allow_notificaton_settings'])) {
$showNotificationFields = TRUE;
}
break;
default:
$allow_notificaton_settings = $this->getStageService()->getPropertyOfCurrentWorkspaceStage($nextStageId, 'allow_notificaton_settings');
if (!empty($allow_notificaton_settings)) {
$showNotificationFields = TRUE;
}
break;
}
if ($showNotificationFields == TRUE) {
$result['items'][] = array(
'fieldLabel' => $GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:window.sendToNextStageWindow.sendMailTo'),
'xtype' => 'checkboxgroup',
'itemCls' => 'x-check-group-alt',
'columns' => 1,
'style' => 'max-height: 200px',
'autoScroll' => true,
'items' => array(
$this->getReceipientsOfStage($nextStageId)
)
'fieldLabel' => $GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:window.sendToNextStageWindow.sendMailTo'),
'xtype' => 'checkboxgroup',
'itemCls' => 'x-check-group-alt',
'columns' => 1,
'style' => 'max-height: 200px',
'autoScroll' => true,
'items' => array(
$this->getReceipientsOfStage($nextStageId)
)
),
array(
);
$result['items'][] = array(
'fieldLabel' => $GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:window.sendToNextStageWindow.additionalRecipients'),
'name' => 'additional',
'xtype' => 'textarea',
'width' => 250,
'fieldLabel' => $GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:window.sendToNextStageWindow.additionalRecipients'),
'name' => 'additional',
'xtype' => 'textarea',
'width' => 250,
),
array(
);
}
$result['items'][] = array(
'fieldLabel' => $GLOBALS['LANG']->sL('LLL:EXT:workspaces/Resources/Private/Language/locallang.xml:window.sendToNextStageWindow.comments'),
'name' => 'comments',
'xtype' => 'textarea',
'width' => 250,
'value' => $this->getDefaultCommentOfStage($nextStageId),
),
)
);
);
return $result;
}
......
$result = array();
$recipients = $this->getStageService()->getResponsibleBeUser($stage);
$default_recipients = $this->getStageService()->getResponsibleBeUser($stage, true);
foreach ($recipients as $id => $user) {
if (t3lib_div::validEmail($user['email'])) {
$checked = FALSE;
$disabled = FALSE;
$name = $user['realName'] ? $user['realName'] : $user['username'];
// the notification mode can be configured in the workspace stage record
$notification_mode = $this->getStageService()->getNotificationMode($stage);
if (intval($notification_mode) === Tx_Workspaces_Service_Stages::MODE_NOTIFY_SOMEONE) {
// all responsible users are checked per default, as in versions before
$checked = TRUE;
} elseif (intval($notification_mode) === Tx_Workspaces_Service_Stages::MODE_NOTIFY_ALL) {
// the default users are checked only
if (!empty($default_recipients[$id])) {
$checked = TRUE;
$disabled = TRUE;
} else {
$checked = FALSE;
}
} elseif (intval($notification_mode) === Tx_Workspaces_Service_Stages::MODE_NOTIFY_ALL_STRICT) {
// all responsible users are checked
$checked = TRUE;
$disabled = TRUE;
}
$result[] = array(
'boxLabel' => sprintf('%s (%s)', $name, $user['email']),
'name' => 'receipients-' . $id,
'checked' => TRUE,
'checked' => $checked,
'disabled' => $disabled,
);
}
}
tca.php (revision )
),
'default' => 0
),
'edit_notification_mode' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.edit_notification_mode',
'config' => array(
'type' => 'select',
'items' => array(
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.0', 0),
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.1', 1),
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.2', 2)
),
),
)
),
'edit_notification_defaults' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.edit_notification_defaults',
'displayCond' => 'FIELD:edit_notification_mode:IN:0,1',
'config' => array(
'type' => 'group',
'internal_type' => 'db',
'allowed' => 'be_users,be_groups',
'prepend_tname' => 1,
'size' => '3',
'maxitems' => '100',
'autoSizeMax' => 20,
'show_thumbs' => '1',
'wizards' => array(
'suggest' => array(
'type' => 'suggest',
)
)
)
),
'edit_allow_notificaton_settings' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.edit_allow_notificaton_settings',
'config' => array(
'type' => 'check',
'default' => 1,
)
),
'publish_notification_mode' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.publish_notification_mode',
'config' => array(
'type' => 'select',
'items' => array(
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.0', 0),
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.1', 1),
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.2', 2)
),
)
),
'publish_notification_defaults' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.publish_notification_defaults',
'displayCond' => 'FIELD:publish_notification_mode:IN:0,1',
'config' => array(
'type' => 'group',
'internal_type' => 'db',
'allowed' => 'be_users,be_groups',
'prepend_tname' => 1,
'size' => '3',
'maxitems' => '100',
'autoSizeMax' => 20,
'show_thumbs' => '1',
'wizards' => array(
'suggest' => array(
'type' => 'suggest',
)
)
)
),
'publish_allow_notificaton_settings' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.publish_allow_notificaton_settings',
'config' => array(
'type' => 'check',
'default' => 1,
)
),
),
'types' => array(
'0' => array('showitem' => 'title,description,
--div--;LLL:EXT:lang/locallang_tca.xml:sys_filemounts.tabs.users,adminusers,members,stagechg_notification,
--div--;LLL:EXT:lang/locallang_tca.xml:sys_filemounts.tabs.users,adminusers,members,
--div--;LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:tabs.notification_settings,stagechg_notification,edit_notification_mode,edit_notification_defaults,edit_allow_notificaton_settings,publish_notification_mode,publish_notification_defaults,publish_allow_notificaton_settings,
--div--;LLL:EXT:lang/locallang_tca.xml:sys_filemounts.tabs.mountpoints,db_mountpoints,file_mountpoints,
--div--;LLL:EXT:lang/locallang_tca.xml:sys_filemounts.tabs.publishing,publish_time,unpublish_time,
--div--;LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_filemounts.tabs.staging,custom_stages,
......
'type' => 'passthrough',
)
),
'notification_mode' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace_stage.notification_mode',
'config' => array(
'type' => 'select',
'items' => array(
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.0', 0),
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.1', 1),
array('LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace.notification_mode.2', 2)
),
),
)
),
'notification_defaults' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace_stage.notification_defaults',
'displayCond' => 'FIELD:notification_mode:IN:0,1',
'config' => array(
'type' => 'group',
'internal_type' => 'db',
'allowed' => 'be_users,be_groups',
'prepend_tname' => 1,
'size' => '3',
'maxitems' => '100',
'autoSizeMax' => 20,
'show_thumbs' => '1',
'wizards' => array(
'suggest' => array(
'type' => 'suggest',
)
)
)
),
'allow_notificaton_settings' => array(
'label' => 'LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:sys_workspace_stage.allow_notificaton_settings',
'config' => array(
'type' => 'check',
'default' => 1,
)
),
),
'types' => array(
'0' => array('showitem' => 'title,responsible_persons,default_mailcomment'
'0' => array('showitem' => '
--div--;LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:tabs.general,title,responsible_persons,
--div--;LLL:EXT:workspaces/Resources/Private/Language/locallang_db.xml:tabs.notification_settings,notification_mode,notification_defaults,allow_notificaton_settings,default_mailcomment'
)
)
);
Resources/Private/Language/locallang_csh_sysws_stage.xml (revision )
<label index="title.description">Enter the name of the workspace stage.</label>
<label index="responsible_persons.description">Define which BE users are responsible for this workspace stage. This selected BE users are possible recipients for the stage change emails.</label>
<label index="default_mailcomment.description">Here its possible to define a standard mail comment which will be inserted into the stage change mail. When no standard mail comment was defined here its possible to write a comment for the mail on every stage change.</label>
<label index="notification_mode.description">You can choose one of three settings for the recipient suggestion list on stage change. In the most configurations the default option is a good choice. For exact explanation about the single options please refer to the documentation.</label>
<label index="notification_defaults.description">Select these backend users or backend groups that should be selected per default to receive a notification mail. Select only users/groups that are also selected as responsible for this stage.</label>
<label index="allow_notificaton_settings.description">Disable this checkbox to hide the recipient and additional recipient fields from the stage change popup window. Notifications are sent in the background nevertheless but based on configuration in workspace stage setting.</label>
</languageKey>
</data>
</T3locallang>
ext_tables.php (revision )
),
'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY) . 'tca.php',
'versioningWS_alwaysAllowLiveEdit' => true,
'dividers2tabs' => true
)
);
// todo move icons to Core sprite or keep them here and remove the todo note ;)
ext_tables.sql (revision )
# Table structure for table 'sys_workspace'
#
CREATE TABLE sys_workspace (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) DEFAULT '0' NOT NULL,
deleted tinyint(1) DEFAULT '0' NOT NULL,
title varchar(30) DEFAULT '' NOT NULL,
description varchar(255) DEFAULT '' NOT NULL,
adminusers text,
members text,
reviewers text,
db_mountpoints varchar(255) DEFAULT '' NOT NULL,
file_mountpoints varchar(255) DEFAULT '' NOT NULL,
publish_time int(11) DEFAULT '0' NOT NULL,
unpublish_time int(11) DEFAULT '0' NOT NULL,
freeze tinyint(3) DEFAULT '0' NOT NULL,
live_edit tinyint(3) DEFAULT '0' NOT NULL,
vtypes tinyint(3) DEFAULT '0' NOT NULL,
disable_autocreate tinyint(1) DEFAULT '0' NOT NULL,
swap_modes tinyint(3) DEFAULT '0' NOT NULL,
publish_access tinyint(3) DEFAULT '0' NOT NULL,
custom_stages int(11) DEFAULT '0' NOT NULL,
stagechg_notification tinyint(3) DEFAULT '0' NOT NULL,
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) DEFAULT '0' NOT NULL,
deleted tinyint(1) DEFAULT '0' NOT NULL,
title varchar(30) DEFAULT '' NOT NULL,
description varchar(255) DEFAULT '' NOT NULL,
adminusers text,
members text,
reviewers text,
db_mountpoints varchar(255) DEFAULT '' NOT NULL,
file_mountpoints varchar(255) DEFAULT '' NOT NULL,
publish_time int(11) DEFAULT '0' NOT NULL,
unpublish_time int(11) DEFAULT '0' NOT NULL,
freeze tinyint(3) DEFAULT '0' NOT NULL,
live_edit tinyint(3) DEFAULT '0' NOT NULL,
vtypes tinyint(3) DEFAULT '0' NOT NULL,
disable_autocreate tinyint(1) DEFAULT '0' NOT NULL,
swap_modes tinyint(3) DEFAULT '0' NOT NULL,
publish_access tinyint(3) DEFAULT '0' NOT NULL,
custom_stages int(11) DEFAULT '0' NOT NULL,
stagechg_notification tinyint(3) DEFAULT '0' NOT NULL,
edit_notification_mode tinyint(3) DEFAULT '0' NOT NULL,
edit_notification_defaults varchar(255) DEFAULT '' NOT NULL,
edit_allow_notificaton_settings tinyint(3) DEFAULT '0' NOT NULL,
publish_notification_mode tinyint(3) DEFAULT '0' NOT NULL,
publish_notification_defaults varchar(255) DEFAULT '' NOT NULL,
publish_allow_notificaton_settings tinyint(3) DEFAULT '0' NOT NULL,
PRIMARY KEY (uid),
KEY parent (pid)
PRIMARY KEY (uid),
KEY parent (pid)
);
......
default_mailcomment text,
parentid int(11) DEFAULT '0' NOT NULL,
parenttable tinytext NOT NULL,
notification_mode tinyint(3) DEFAULT '0' NOT NULL,
notification_defaults varchar(255) DEFAULT '' NOT NULL,
allow_notificaton_settings tinyint(3) DEFAULT '0' NOT NULL,
PRIMARY KEY (uid),
KEY parent (pid)
......
# Table structure for table 'sys_workspace_cache'
#
CREATE TABLE sys_workspace_cache (
id int(11) unsigned NOT NULL auto_increment,
identifier varchar(32) DEFAULT '' NOT NULL,
content mediumblob NOT NULL,
crdate int(11) DEFAULT '0' NOT NULL,
lifetime int(11) DEFAULT '0' NOT NULL,
id int(11) unsigned NOT NULL auto_increment,
identifier varchar(32) DEFAULT '' NOT NULL,
content mediumblob NOT NULL,
crdate int(11) DEFAULT '0' NOT NULL,
lifetime int(11) DEFAULT '0' NOT NULL,
PRIMARY KEY (id),
KEY cache_id (identifier)
PRIMARY KEY (id),
KEY cache_id (identifier)
) ENGINE=InnoDB;
......
# Table structure for table 'sys_workspace_cache_tags'
#
CREATE TABLE sys_workspace_cache_tags (
id int(11) unsigned NOT NULL auto_increment,
identifier varchar(128) DEFAULT '' NOT NULL,
tag varchar(128) DEFAULT '' NOT NULL,
PRIMARY KEY (id),
id int(11) unsigned NOT NULL auto_increment,
identifier varchar(128) DEFAULT '' NOT NULL,
tag varchar(128) DEFAULT '' NOT NULL,
PRIMARY KEY (id),
KEY cache_id (identifier),
KEY cache_tag (tag)
KEY cache_id (identifier),
KEY cache_tag (tag)
) ENGINE=InnoDB;
    (1-1/1)