public function getJSClassParams() { if (!isset($this->_JSClassParams)) { $title = X2Model::getModelTitle(get_class($this->model), true); $targetClass = $this->targetClass; $behavior = $this->model->asa('X2ModelConversionBehavior'); $conversionFailed = $behavior->conversionFailed && $behavior->errorModel !== null && get_class($behavior->errorModel) === $this->targetClass; $this->_JSClassParams = array_merge(parent::getJSClassParams(), array('buttonSelector' => $this->buttonSelector, 'translations' => array('conversionError' => Yii::t('app', '{model} conversion failed.', array('{model}' => $title)), 'conversionWarning' => Yii::t('app', '{model} Conversion Warning', array('{model}' => $title)), 'convertAnyway' => Yii::t('app', 'Convert Anyway'), 'Cancel' => Yii::t('app', 'Cancel')), 'targetClass' => $this->targetClass, 'modelId' => $this->model->id, 'conversionFailed' => $conversionFailed, 'conversionIncompatibilityWarnings' => $this->model->getConversionIncompatibilityWarnings($this->targetClass), 'errorSummary' => $conversionFailed ? "<div class='form'>" . CHtml::errorSummary($this->model->asa('X2ModelConversionBehavior')->errorModel, Yii::t('app', '{model} conversion failed.', array('{model}' => $title))) . "</div>" : '')); } return $this->_JSClassParams; }
/** * Echo out a series of inputs for a role editor page. * * This method is called via AJAX from the "Edit Role" portion of the "Manage Roles" * page. Upon selection of a role in the dropdown on that page, this method * finds all relevant information about the role and echoes it back as a form * to allow for editing of the role. */ public function actionGetRole() { $output = ""; $roleInput = FilterUtil::filterArrayInput($_POST, 'Roles'); if (!empty($roleInput)) { $roleName = isset($roleInput['name']) ? filter_var($roleInput['name'], FILTER_SANITIZE_STRING) : ''; $role = Roles::model()->findByAttributes(array('name' => $roleName)); if (isset($role)) { $usernames = Yii::app()->db->createCommand()->select('a.username')->from('x2_users a')->join('x2_role_to_user b', 'a.id=b.userId')->where('b.roleId=:roleId AND b.type="user"', array(':roleId' => $role->id))->queryColumn(); $groupIds = Yii::app()->db->createCommand()->select('a.id')->from('x2_groups a')->join('x2_role_to_user b', 'a.id=b.userId')->where('b.roleId=:roleId AND b.type="group"', array(':roleId' => $role->id))->queryColumn(); $selected = array_merge($usernames, $groupIds); $allUsers = X2Model::getAssignmentOptions(false, true, false); unset($allUsers['admin']); $sliderId = 'editTimeoutSlider'; $textfieldId = 'editTimeout'; if (isset($_GET['mode']) && in_array($_GET['mode'], array('edit', 'exception'))) { // Handle whether this was called from editRole or roleException, they // need different IDs to work on the same page. $sliderId .= "-" . $_GET['mode']; $textfieldId .= "-" . $_GET['mode']; } $timeoutSet = $role->timeout !== null; $output .= "\n <div class='row' id='set-session-timeout-row'>\n <input id='set-session-timeout' type='checkbox' class='left' " . ($timeoutSet ? 'checked="checked"' : '') . ">\n <label>" . Yii::t('admin', 'Enable Session Timeout') . "</label>\n </div>\n "; $output .= "<div id='timeout-row' class='row' " . ($timeoutSet ? '' : "style='display: none;'") . ">"; $output .= Yii::t('admin', 'Set role session expiration time (in minutes).'); $output .= "<br />"; $output .= $this->widget('zii.widgets.jui.CJuiSlider', array('value' => $role->timeout / 60, 'options' => array('min' => 5, 'max' => 1440, 'step' => 5, 'change' => "js:function(event,ui) {\n \$('#" . $textfieldId . "').val(ui.value);\n \$('#save-button').addClass('highlight');\n }", 'slide' => "js:function(event,ui) {\n \$('#" . $textfieldId . "').val(ui.value);\n }"), 'htmlOptions' => array('style' => 'width:340px;margin:10px 9px;', 'id' => $sliderId)), true); $output .= CHtml::activeTextField($role, 'timeout', array('id' => $textfieldId, 'disabled' => $role->timeout !== null ? '' : 'disabled')); $output .= "</div>"; Yii::app()->clientScript->registerScript('timeoutScript', "\n \$('#set-session-timeout').change (function () {\n if (\$(this).is (':checked')) {\n \$('#timeout-row').slideDown ();\n \$('#" . $textfieldId . "').removeAttr ('disabled');\n } else {\n \$('#timeout-row').slideUp ();\n \$('#" . $textfieldId . "').attr ('disabled', 'disabled');\n }\n });\n \$('#" . $textfieldId . "').val( \$('#" . $sliderId . "').slider('value') );\n ", CClientScript::POS_READY); $output .= "<script>"; $output .= Yii::app()->clientScript->echoScripts(true); $output .= "</script>"; $output .= "<div id='users'><label>Users</label>"; $output .= CHtml::dropDownList('users[]', $selected, $allUsers, array('class' => 'multiselect', 'multiple' => 'multiple', 'size' => 8)); $output .= "</div>"; $fields = Fields::getFieldsOfModelsWithFieldLevelPermissions(); $fieldIds = array_flip(array_map(function ($field) { return $field->id; }, $fields)); $viewSelected = array(); $editSelected = array(); $fieldUnselected = array(); $fieldPerms = RoleToPermission::model()->findAllByAttributes(array('roleId' => $role->id)); foreach ($fieldPerms as $perm) { if (!isset($fieldIds[$perm->fieldId])) { continue; } if ($perm->permission == 2) { $viewSelected[] = $perm->fieldId; $editSelected[] = $perm->fieldId; } else { if ($perm->permission == 1) { $viewSelected[] = $perm->fieldId; } } } foreach ($fields as $field) { $fieldUnselected[$field->id] = X2Model::getModelTitle($field->modelName) . " - " . $field->attributeLabel; } assert(count($fieldUnselected) === count(array_unique(array_keys($fieldUnselected)))); $output .= "<br /><label>View Permissions</label>"; $output .= CHtml::dropDownList('viewPermissions[]', $viewSelected, $fieldUnselected, array('class' => 'multiselect', 'multiple' => 'multiple', 'size' => 8, 'id' => 'edit-role-field-view-permissions')); $output .= "<br /><label>Edit Permissions</label>"; $output .= CHtml::dropDownList('editPermissions[]', $editSelected, $fieldUnselected, array('class' => 'multiselect', 'multiple' => 'multiple', 'size' => 8, 'id' => 'edit-role-field-edit-permissions')); } } echo $output; }
* You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley, * California 95067, USA. or at email address contact@x2engine.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * X2Engine" logo. If the display of the logo is not reasonably feasible for * technical reasons, the Appropriate Legal Notices must display the words * "Powered by X2Engine". *****************************************************************************************/ ?> <div class="page-title"><h2><?php echo Yii::t('admin', 'Import {model} from Template', array('{model}' => empty($model) ? "" : X2Model::getModelTitle($model))); ?> </h2></div> <div class="form"> <?php if (!empty($errors)) { echo "<span class='error' style='font-weight:bold'>" . Yii::t('admin', $errors) . "</span>"; unset($_SESSION['errors']); } ?> <?php if (!empty($model)) { ?> <div id="info-box" style="width:600px;">
public function getRelatedModelName() { if (!isset($this->_relatedModelType)) { if (!isset($this->relatedModel)) { return $this->_relatedModelType = null; } $title = Yii::app()->db->createCommand()->select("title")->from("x2_modules")->where("name = :name AND custom = 1")->bindValues(array(":name" => get_class($this->relatedModel)))->queryScalar(); if ($title) { $this->_relatedModelType = $title; } else { $this->_relatedModelType = X2Model::getModelTitle(get_class($this->relatedModel)); } } return $this->_relatedModelType; }
} ?> </div> <div id="prep-status-box"> </div> <br /> <div id="status-box"> </div> <div id="failures-box"> <div id="continue-box" style="display:none;"> <br /> <?php echo CHtml::link(Yii::t('admin', 'Import more {records}', array('{records}' => X2Model::getModelTitle($model))), 'importModels?model=' . $model, array('class' => 'x2-button')); echo CHtml::link(Yii::t('admin', 'Import to another module'), 'importModels', array('class' => 'x2-button')); echo CHtml::link(Yii::t('admin', 'Rollback Import'), array('rollbackImport', 'importId' => $_SESSION['importId']), array('class' => 'x2-button', 'id' => 'revert-btn', 'style' => 'display:none;')); ?> </div> <script> $(function() { // Hide the import map box if a mapping was uploaded if (<?php echo $preselectedMap ? 'true' : 'false'; ?> ) $('#super-import-map-box').hide(); }); var attributeLabels = <?php
/** * Returns all possible models, either as a regular array or associative * (key and value are the same) * @param boolean $assoc * @return array */ public static function getModelTypes($assoc = false) { $modelTypes = Yii::app()->db->createCommand()->selectDistinct('modelName')->from('x2_fields')->where('modelName!="Calendar"')->order('modelName ASC')->queryColumn(); if ($assoc === true) { return array_combine($modelTypes, array_map(function ($term) { return Yii::t('app', X2Model::getModelTitle($term)); }, $modelTypes)); } $modelTypes = array_map(function ($term) { return Yii::t('app', $term); }, $modelTypes); return $modelTypes; }
/** * Echo out a series of inputs for a role editor page. * * This method is called via AJAX from the "Edit Role" portion of the "Manage Roles" * page. Upon selection of a role in the dropdown on that page, this method * finds all relevant information about the role and echoes it back as a form * to allow for editing of the role. */ public function actionGetRole() { if (isset($_POST['Roles'])) { $id = $_POST['Roles']['name']; $role = Roles::model()->findByAttributes(array('name' => $id)); if (!$role) { echo ""; exit; } $id = $role->id; $roles = RoleToUser::model()->findAllByAttributes(array('roleId' => $id)); $users = array(); foreach ($roles as $link) { if ($link->type == 'user') { $user = User::model()->findByPk($link->userId); if (isset($user)) { $users[] = $user->username; } } else { $group = Groups::model()->findByPk($link->userId); if (isset($group)) { $users[] = $group->id; } } /* end x2temp */ } $allUsers = User::model()->findAll('status="1"'); $selected = array(); $unselected = array(); foreach ($users as $user) { $selected[] = $user; } foreach ($allUsers as $user) { $unselected[CHtml::encode($user->username)] = CHtml::encode($user->firstName . " " . $user->lastName); } /* x2temp */ $groups = Groups::model()->findAll(); foreach ($groups as $group) { $unselected[$group->id] = CHtml::encode($group->name); } /* end x2temp */ unset($unselected['admin']); $sliderId = 'editTimeoutSlider'; $textfieldId = 'editTimeout'; if (isset($_GET['mode']) && in_array($_GET['mode'], array('edit', 'exception'))) { // Handle whether this was called from editRole or roleException, they // need different IDs to work on the same page. $sliderId .= "-" . $_GET['mode']; $textfieldId .= "-" . $_GET['mode']; } $timeoutSet = $role->timeout !== null; echo "\n <div class='row' id='set-session-timeout-row'>\n <input id='set-session-timeout' type='checkbox' class='left' " . ($timeoutSet ? 'checked="checked"' : '') . ">\n <label>" . Yii::t('admin', 'Enable Session Timeout') . "</label>\n </div>\n "; echo "<div id='timeout-row' class='row' " . ($timeoutSet ? '' : "style='display: none;'") . ">"; echo Yii::t('admin', 'Set role session expiration time (in minutes).'); echo "<br />"; $this->widget('zii.widgets.jui.CJuiSlider', array('value' => $role->timeout / 60, 'options' => array('min' => 5, 'max' => 1440, 'step' => 5, 'change' => "js:function(event,ui) {\n \$('#" . $textfieldId . "').val(ui.value);\n \$('#save-button').addClass('highlight');\n }", 'slide' => "js:function(event,ui) {\n \$('#" . $textfieldId . "').val(ui.value);\n }"), 'htmlOptions' => array('style' => 'width:340px;margin:10px 9px;', 'id' => $sliderId))); echo CHtml::activeTextField($role, 'timeout', array('id' => $textfieldId, 'disabled' => $role->timeout !== null ? '' : 'disabled')); echo "</div>"; Yii::app()->clientScript->registerScript('timeoutScript', "\n \$('#set-session-timeout').change (function () {\n if (\$(this).is (':checked')) {\n \$('#timeout-row').slideDown ();\n \$('#" . $textfieldId . "').removeAttr ('disabled');\n } else {\n \$('#timeout-row').slideUp ();\n \$('#" . $textfieldId . "').attr ('disabled', 'disabled');\n }\n });\n \$('#" . $textfieldId . "').val( \$('#" . $sliderId . "').slider('value') );\n ", CClientScript::POS_READY); echo "<script>"; Yii::app()->clientScript->echoScripts(); echo "</script>"; echo "<div id='users'><label>Users</label>"; echo CHtml::dropDownList('users[]', $selected, $unselected, array('class' => 'multiselect', 'multiple' => 'multiple', 'size' => 8)); echo "</div>"; $fields = Fields::model()->findAllBySql("SELECT * FROM x2_fields ORDER BY modelName ASC"); $viewSelected = array(); $editSelected = array(); $fieldUnselected = array(); $fieldPerms = RoleToPermission::model()->findAllByAttributes(array('roleId' => $role->id)); foreach ($fieldPerms as $perm) { if ($perm->permission == 2) { $viewSelected[] = $perm->fieldId; $editSelected[] = $perm->fieldId; } else { if ($perm->permission == 1) { $viewSelected[] = $perm->fieldId; } } } foreach ($fields as $field) { $fieldUnselected[$field->id] = X2Model::getModelTitle($field->modelName) . " - " . $field->attributeLabel; } echo "<br /><label>View Permissions</label>"; echo CHtml::dropDownList('viewPermissions[]', $viewSelected, $fieldUnselected, array('class' => 'multiselect', 'multiple' => 'multiple', 'size' => 8)); echo "<br /><label>Edit Permissions</label>"; echo CHtml::dropDownList('editPermissions[]', $editSelected, $fieldUnselected, array('class' => 'multiselect', 'multiple' => 'multiple', 'size' => 8)); } }
//Yii::app()->clientScript->registerCssFile(Yii::app()->getBaseUrl().'/js/multiselect/css/ui.multiselect.css','screen, projection'); //Yii::app()->clientScript->registerCss('multiselectCss'," //.multiselect { // width: 460px; // height: 200px; //} //#switcher { // margin-top: 20px; //} //",'screen, projection'); Yii::app()->clientScript->registerScript('renderMultiSelect', "\n\$(document).ready(function() {\n\t \$('.multiselect').multiselect();\n});\n", CClientScript::POS_HEAD); $selected = array(); $unselected = array(); $fields = Fields::model()->findAllBySql("SELECT * FROM x2_fields ORDER BY modelName ASC"); foreach ($fields as $field) { $unselected[$field->id] = X2Model::getModelTitle($field->modelName) . " - " . $field->attributeLabel; } $users = User::getNames(); unset($users['']); unset($users['Anyone']); unset($users['admin']); $users = array_map(array('CHtml', 'encode'), $users); /* x2temp */ $groups = Groups::model()->findAll(); foreach ($groups as $group) { $users[$group->id] = CHtml::encode($group->name); } /* end x2temp */ ?> <div class="page-title rounded-top"><h2><?php echo Yii::t('admin', 'Add Role');
public function run() { $this->registerPackages(); $this->instantiateJSClass(); $this->render('application.components.views._x2ModelConversionWidget', array('modelTitle' => lcfirst(X2Model::getModelTitle(get_class($this->model), true)), 'targetModelTitle' => lcfirst(X2Model::getModelTitle($this->targetClass, true)))); }
/** * Renders error summary containing compatibility warnings * @return string */ public function errorSummary($targetModelClass, $convertMultiple = false) { $sourceModelClass = get_class($this->owner); $sourceModelTitle = X2Model::getModelTitle($sourceModelClass, true); $targetModelTitle = X2Model::getModelTitle($targetModelClass, true); $sourceModelTitlePlural = X2Model::getModelTitle($sourceModelClass, false); $targetModelTitlePlural = X2Model::getModelTitle($targetModelClass, false); $html = '<p>'; $html .= CHtml::encode(!$convertMultiple ? Yii::t('app', 'Converting this {model} to {article} {targetModel} could result in data from your {model} being lost. ' . 'The following field incompatibilities have been detected: ', array('{model}' => $sourceModelTitle, '{targetModel}' => $targetModelTitle, '{article}' => preg_match('/^[aeiouAEIOU]/', $targetModelTitle) ? 'an' : 'a')) : Yii::t('app', 'Converting these {model} to {targetModel} could result in data from your {model} being lost. ' . 'The following field incompatibilities have been detected: ', array('{model}' => $sourceModelTitlePlural, '{targetModel}' => $targetModelTitlePlural))); $html .= "\n </p>\n <ul class='errorSummary'>\n "; foreach ($this->owner->getConversionIncompatibilityWarnings($targetModelClass) as $message) { $html .= '<li>' . CHtml::encode($message) . '</li>'; } $html .= "\n </ul>\n <p>\n "; $html .= CHtml::encode(Yii::t('app', 'To resolve these incompatibilities, make sure that every ' . '{model} field has a corresponding {targetModel} field of the same name and type.', array('{model}' => $sourceModelTitlePlural, '{targetModel}' => $targetModelTitlePlural))); $html .= '</p>'; return $html; }
/** * @return <array of strings> Incompatibility warnings to be presented to the user before * they convert this model to the target model. */ public function getConversionIncompatibilityWarnings($targetClass) { $warnings = array(); $targetModel = $targetClass::model(); $attributeNames = $this->mapFields($this->owner->attributeNames(), $targetClass); $leadsAttrs = array_diff($attributeNames, $targetClass::model()->attributeNames()); $fieldMap = $this->getFieldMap($targetClass, true); // look for fields which aren't in the target model foreach ($leadsAttrs as $name) { $name = isset($fieldMap[$name]) ? $fieldMap[$name] : $name; // if field isn't set, there's no risk of data loss if (!isset($this->owner->{$name})) { continue; } $warnings[] = Yii::t('app', 'A field {fieldName} is in Leads but not in {targetModel}.', array('{fieldName}' => $name, '{targetModel}' => X2Model::getModelTitle($targetClass))); } // look for type mismatches $sharedAttrs = array_intersect($attributeNames, $targetModel->attributeNames()); foreach ($sharedAttrs as $name) { $originalName = $name; $name = isset($fieldMap[$name]) ? $fieldMap[$name] : $name; $leadField = $this->owner->getField($name); $targetModelField = $targetModel->getField($name); if (!$leadField instanceof Fields || !$targetModelField instanceof Fields) { continue; } if ($leadField->type !== $targetModelField->type) { if (isset($fieldMap[$originalName])) { $warnings[] = Yii::t('app', 'The {model} field {fieldName} maps to the {targetModel} field ' . '{targetField} but the fields have different types.', array('{fieldName}' => $originalName, '{fieldName}' => $name, '{model}' => X2Model::getModelTitle(get_class($this->owner)), '{targetModel}' => X2Model::getModelTitle($targetClass))); } else { $warnings[] = Yii::t('app', 'A field {fieldName} is in both {model} and {targetModel} but the fields have different types.', array('{fieldName}' => $name, '{model}' => X2Model::getModelTitle(get_class($this->owner)), '{targetModel}' => X2Model::getModelTitle($targetClass))); } } } return $warnings; }