diff --git a/app/Config/Schema/schema.xml b/app/Config/Schema/schema.xml index efcc424bf..e38b9cab4 100644 --- a/app/Config/Schema/schema.xml +++ b/app/Config/Schema/schema.xml @@ -2696,7 +2696,37 @@ - + + + + + + + + + REFERENCES cm_cos(id) + + + + + + + + + REFERENCES cm_normalizers(id) + + + + + + + co_id + + + co_normalizer_id + +
+ @@ -3093,7 +3123,6 @@ - diff --git a/app/Controller/AppController.php b/app/Controller/AppController.php index e55d9ca3b..fb29743a5 100644 --- a/app/Controller/AppController.php +++ b/app/Controller/AppController.php @@ -1176,6 +1176,9 @@ function menuAuth() { // Manage CO Links? $p['menu']['conavigationlinks'] = $roles['cmadmin'] || $roles['coadmin']; + // Manage Normalizers? + $p['menu']['conormalizers'] = $roles['cmadmin'] || $roles['coadmin']; + // Manage CO Permissions? $p['menu']['copipelines'] = $roles['cmadmin'] || $roles['coadmin']; diff --git a/app/Controller/CoNormalizersController.php b/app/Controller/CoNormalizersController.php new file mode 100644 index 000000000..28681e82a --- /dev/null +++ b/app/Controller/CoNormalizersController.php @@ -0,0 +1,204 @@ + 25, + 'order' => array( + 'CoNormalizer.description' => 'asc' + ) + ); + + // This controller needs a CO to be set + public $requires_co = true; + + /** + * Callback before other controller methods are invoked or views are rendered. + * + * @since COmanage Registry v4.3.0 + * @throws InvalidArgumentException + */ + + function beforeFilter() { + parent::beforeFilter(); + + // Pull the set of validators + $plugins = $this->loadAvailablePlugins('normalizer'); + + $this->set('vv_plugins', $plugins); + + // And track which are instantiated + $iPlugins = array(); + + foreach(array_keys($plugins) as $p) { + // Walk the list of plugins to see which ones are instantiated, + // then create the association. This will pull associated data for the views. + + if($this->$p->cmPluginInstantiate) { + $this->CoNormalizer->bindModel(array('hasOne' => array($p)), false); + $iPlugins[$p] = true; + } else { + $iPlugins[$p] = false; + } + } + + $this->set('vv_inst_plugins', $iPlugins); + } + + /** + * Perform any dependency checks required prior to a delete operation. + * - postcondition: Session flash message updated (HTML) or HTTP status returned (REST) + * + * @since COmanage Registry v4.3.0 + * @param Array Current data + * @return boolean true if dependency checks succeed, false otherwise. + */ + + function checkDeleteDependencies($curdata) { + // Based on OrgIdentitySourcesController::checkDeleteDependencies, + // which in turn is basically the same logic as CoProvisioningTargetsController.php + + // Annoyingly, the read() call in standardController resets the associations made + // by the bindModel() call in beforeFilter(), above. Beyond that, deep down in + // Cake's Model, a find() is called as part of the delete() which also resets the associations. + // So we have to manually delete any dependencies. + + // Use the previously obtained list of plugins as a guide + + foreach(array_keys($this->viewVars['vv_inst_plugins']) as $plugin) { + if($this->viewVars['vv_inst_plugins'][$plugin]) { + // Plugin is instantiated + $model = $plugin; + + if(!empty($curdata[$model]['id'])) { + // (CO-1988)Remove the plugin object from the instance and enforce the creation of a new one + if(!empty(ClassRegistry::getObject($model))) { + ClassRegistry::removeObject($model); + } + $this->loadModel($plugin . "." . $model); + $this->$model->delete($curdata[$model]['id']); + } + } + } + + return true; + } + + /** + * Authorization for this Controller, called by Auth component + * - precondition: Session.Auth holds data used for authz decisions + * - postcondition: $permissions set with calculated permissions + * + * @since COmanage Registry v4.3.0 + * @return Array Permissions + */ + + function isAuthorized() { + $roles = $this->Role->calculateCMRoles(); + + // Construct the permission set for this user, which will also be passed to the view. + $p = array(); + + // Determine what operations this user can perform + + // Add a new Normalizer? + $p['add'] = ($roles['cmadmin'] || $roles['coadmin']); + + // Delete an existing Normalizer? + $p['delete'] = ($roles['cmadmin'] || $roles['coadmin']); + + // Edit an existing Normalizer? + $p['edit'] = ($roles['cmadmin'] || $roles['coadmin']); + + // View all existing Normalizers? + $p['index'] = ($roles['cmadmin'] || $roles['coadmin']); + + // View an existing Normalizer? + $p['view'] = ($roles['cmadmin'] || $roles['coadmin']); + + // Reorder an existing Normalizer? + $p['reorder'] = ($roles['cmadmin'] || $roles['coadmin']); + $p['order'] = ($roles['cmadmin'] || $roles['coadmin']); + + $this->set('permissions', $p); + return $p[$this->action]; + } + + /** + * For Models that accept a CO ID, find the provided CO ID. + * - precondition: A coid must be provided in $this->request (params or data) + * + * @since COmanage Registry v4.3.0 + * @return Integer The CO ID if found, or -1 if not + */ + + public function parseCOID($data = NULL) { + if($this->action == 'order' + || $this->action == 'reorder') { + if(isset($this->request->params['named']['co'])) { + return $this->request->params['named']['co']; + } + } + + return parent::parseCOID(); + } + + /** + * Perform a redirect back to the controller's default view. + * - postcondition: Redirect generated + * + * @since COmanage Registry v4.3.0 + */ + + function performRedirect() { + if($this->action == 'add' + && !empty($this->CoNormalizer->data['CoNormalizer']['plugin']) + && $this->viewVars['vv_inst_plugins'][ $this->CoNormalizer->data['CoNormalizer']['plugin'] ]) { + // Redirect to the appropriate plugin to set up whatever it wants, + // if it is instantiated + + $pluginName = $this->CoNormalizer->data['CoNormalizer']['plugin']; + $modelName = $pluginName; + + $target = array(); + $target['plugin'] = Inflector::underscore($pluginName); + $target['controller'] = Inflector::tableize($modelName); + $target['action'] = 'edit'; + $target[] = $this->CoNormalizer->data[$pluginName]['id']; + + $this->redirect($target); + } else { + parent::performRedirect(); + } + } +} diff --git a/app/Controller/SNOController.php b/app/Controller/SNOController.php new file mode 100644 index 000000000..0424a177f --- /dev/null +++ b/app/Controller/SNOController.php @@ -0,0 +1,74 @@ +modelClass; + $modelpl = Inflector::tableize($req); + + // Find the ID of our parent + $noid = -1; + + if(!empty($this->params->named['noid'])) { + $noid = filter_var($this->params->named['noid'],FILTER_SANITIZE_SPECIAL_CHARS); + } elseif(!empty($this->viewVars[$modelpl][0][$req])) { + $noid = $this->viewVars[$modelpl][0][$req]['co_normalizer_id']; + } + + $this->set('vv_noid', $noid); + } + + /** + * Perform a redirect back to the controller's default view. + * - postcondition: Redirect generated + * + * @since COmanage Registry v4.3.0 + */ + + public function performRedirect() { + $target = array(); + $target['plugin'] = null; + $target['controller'] = "co_normalizers"; + $target['action'] = 'index'; + $target['co'] = $this->cur_co['Co']['id']; + + $this->redirect($target); + } +} diff --git a/app/Lib/lang.php b/app/Lib/lang.php index b78ad2dc3..10f603d7f 100644 --- a/app/Lib/lang.php +++ b/app/Lib/lang.php @@ -160,6 +160,8 @@ 'ct.cos.pl' => 'COs', 'ct.cous.1' => 'COU', 'ct.cous.pl' => 'COUs', + 'ct.co_normalizers.1' => 'Normalizer', + 'ct.co_normalizers.pl' => 'Normalizers', 'ct.data_filters.1' => 'Data Filter', 'ct.data_filters.pl' => 'Data Filters', 'ct.dictionaries.1' => 'Dictionary', @@ -1757,7 +1759,6 @@ 'fd.not.res.subject' => 'Resolution Email Subject', 'fd.not.for' => 'Notifications for %1$s (%2$s, %3$s)', 'fd.not.last' => 'Last Notification', - 'fd.nr.enable' => 'Enable Normalizations', 'fd.null' => 'Null', 'fd.o' => 'Organization', 'fd.ois.eppn.suffix' => 'EPPN Suffix', @@ -2059,6 +2060,7 @@ 'in.idval.plugins' => 'There are no Identifier Validator plugins currently installed.', 'in.inv.exp.resent' => 'The confirmation link you clicked expired. A new link has been sent to your email address.', 'in.login.last' => 'Your last login as %1$s was at %2$s from %3$s', + 'in.norm.plugins' => 'There are no Normalizer plugins currently installed.', 'in.co_email_lists.none' => 'No email lists', 'in.co_group.email_lists' => 'Group Email Lists', 'in.co_group.ids.none' => 'No group identifiers', @@ -2297,6 +2299,7 @@ // XXX replace these? 'op.order.attr' => 'Reorder Attributes', 'op.order.link' => 'Reorder Links', + 'op.order.normalizers' => 'Reorder Normalizers', 'op.orgid.add.ois' => 'Add New Org Identity From Source', 'op.orgid.edit.ois' => 'This Organizational Identity was created from an Organizational Identity Source (%1$s) and therefore cannot be edited.', 'op.orgid.petition.ois' => 'Add New Org Identity From Source and Link To Petition', diff --git a/app/Model/Behavior/NormalizationBehavior.php b/app/Model/Behavior/NormalizationBehavior.php index aa81affde..e85eba48a 100644 --- a/app/Model/Behavior/NormalizationBehavior.php +++ b/app/Model/Behavior/NormalizationBehavior.php @@ -80,37 +80,23 @@ public function normalize(Model $model, $data, $coId = false) { return $data; } } - - if($coId) { - // Try to find the CoSetting model - - $CoSetting = null; - - if(isset($model->CoPerson->Co->CoSetting)) { - $CoSetting = $model->CoPerson->Co->CoSetting; - } elseif(isset($model->CoPersonRole->CoPerson->Co->CoSetting)) { - $CoSetting = $model->CoPersonRole->CoPerson->Co->CoSetting; - } elseif(isset($model->Co->CoSetting)) { - $CoSetting = $model->Co->CoSetting; - } - - // Check to see if normalizations are enabled - if(!$CoSetting - || !$CoSetting->normalizationsEnabled($coId)) { - // Not enabled, just return - return $data; - } - } else { - // We currently don't support normalizations on OrgIdentity data - + + if(empty($coId) || $coId < 0) { return $data; } - - // Load any plugins and figure out which (if any) have foreign keys to belongTo this model - - foreach(App::objects('plugin') as $p) { - $pluginModel = ClassRegistry::init($p . "." . $p); - + + // Load any configured plugins and figure out which (if any) have foreign keys to belongTo this model + $args = array(); + $args['conditions']['CoNormalizer.co_id'] = $coId; + $args['conditions']['CoNormalizer.status'] = SuspendableStatusEnum::Active; + $args['order'][] = 'CoNormalizer.ordr'; + $args['contain'] = false; + $CoNormalizer = ClassRegistry::init("CoNormalizer"); + $normalizer_plugins = $CoNormalizer->find('all', $args); + + foreach($normalizer_plugins as $p) { + $pluginModel = ClassRegistry::init($p["CoNormalizer"]["plugin"] . "." . $p["CoNormalizer"]["plugin"]); + if($pluginModel->isPlugin('normalizer')) { try { $data = $pluginModel->normalize($data); diff --git a/app/Model/Co.php b/app/Model/Co.php index b293fa08a..5e9f1e7ce 100644 --- a/app/Model/Co.php +++ b/app/Model/Co.php @@ -62,6 +62,7 @@ class Co extends AppModel { "CoLocalization" => array('dependent' => true), "CoMessageTemplate" => array('dependent' => true), "CoNavigationLink" => array('dependent' => true), + "CoNormalizer" => array('dependent' => true), // A CO can have zero or more CO people "CoPerson" => array('dependent' => true), // A CO can have zero or more petitions diff --git a/app/Model/CoNormalizer.php b/app/Model/CoNormalizer.php new file mode 100644 index 000000000..120632bdb --- /dev/null +++ b/app/Model/CoNormalizer.php @@ -0,0 +1,144 @@ + array('priority' => 5)); + + // Association rules from this model to other models + public $belongsTo = array( + 'Co', + ); + + // Default display field for cake generated views + public $displayField = "description"; + + // Validation rules for table elements + public $validate = array( + 'co_id' => array( + 'rule' => 'numeric', + 'required' => true, + 'message' => 'A CO ID must be provided' + ), + 'description' => array( + 'rule' => array('validateInput'), + 'required' => true, + 'allowEmpty' => false + ), + 'plugin' => array( + 'rule' => 'notBlank', + 'required' => true, + 'allowEmpty' => false + ), + 'status' => array( + 'rule' => array('inList', array(SuspendableStatusEnum::Active, + SuspendableStatusEnum::Suspended)), + 'required' => true, + 'allowEmpty' => false + ), + 'ordr' => array( + 'rule' => 'numeric', + 'required' => false, + 'allowEmpty' => true + ) + ); + + + /** + * Actions to take before a save operation is executed. + * + * @since COmanage Registry v4.3.0 + */ + + public function beforeSave($options = array()) { + // Start a transaction -- we'll commit in afterSave. + + if(empty($this->data['CoNormalizer']['ordr'])) { + // Find the current high value and add one + $n = 1; + + $args = array(); + $args['fields'][] = "MAX(CoNormalizer.ordr) as m"; + $args['conditions']['CoNormalizer.co_normalizer_id'] = $this->data['CoNormalizer']['co_normalizer_id']; + $args['order'][] = "m"; + + $o = $this->find('first', $args); + + if(!empty($o[0]['m'])) { + $n = $o[0]['m'] + 1; + } + + $this->data['CoNormalizer']['ordr'] = $n; + } + + return true; + } + + /** + * Callback after model save. + * + * @since COmanage Registry v4.3.0 + * @param Boolean $created True if new model is saved (ie: add) + * @param Array $options Options, as based to model::save() + * @return Boolean True on success + */ + + public function afterSave($created, $options = Array()) { + if($created) { + // Create an instance of the plugin source, if it is flagged + // as instantiable. + + $pluginName = $this->data['CoNormalizer']['plugin']; + $modelName = $pluginName; + $pluginModelName = $pluginName . "." . $modelName; + + $pmodel = ClassRegistry::init($pluginModelName); + + // See if this plugin requires instantiation + if($pmodel->cmPluginInstantiate) { + $validator = array(); + $validator[$modelName]['normalizer_id'] = $this->id; + + // Note that we have to disable validation because we want to create an empty row. + if(!$pmodel->save($validator, false)) { + return false; + } + } + } + + return true; + } +} + diff --git a/app/Model/CoSetting.php b/app/Model/CoSetting.php index 7f8a9fba3..a63cb913b 100644 --- a/app/Model/CoSetting.php +++ b/app/Model/CoSetting.php @@ -79,11 +79,6 @@ class CoSetting extends AppModel { 'required' => false, 'allowEmpty' => true ), - 'enable_normalization' => array( - 'rule' => 'boolean', - 'required' => false, - 'allowEmpty' => true - ), 'enable_nsf_demo' => array( 'rule' => 'boolean', 'required' => false, @@ -200,7 +195,6 @@ class CoSetting extends AppModel { 'disable_expiration' => false, 'disable_ois_sync' => false, 'group_create_admin_only' => false, - 'enable_normalization' => true, 'enable_nsf_demo' => false, 'group_validity_sync_window' => DEF_GROUP_SYNC_WINDOW, 'invitation_validity' => DEF_INV_VALIDITY, @@ -520,19 +514,7 @@ protected function lookupValue($coId, $field) { return $this->defaultSettings[$field]; } } - - /** - * Determine if Normalizations are enabled for the specified CO. - * - * @since COmanage Registry v0.9.2 - * @param integer $coId CO ID - * @return boolean True if enabled, false otherwise - */ - - public function normalizationsEnabled($coId) { - return (boolean)$this->lookupValue($coId, 'enable_normalization'); - } - + /** * Determine if NSF Demographics are enabled for the specified CO. * diff --git a/app/View/CoDashboards/configuration.ctp b/app/View/CoDashboards/configuration.ctp index 5b1228224..c2a8aff95 100644 --- a/app/View/CoDashboards/configuration.ctp +++ b/app/View/CoDashboards/configuration.ctp @@ -139,6 +139,12 @@ 'controller' => 'co_navigation_links', 'action' => 'index' ), + _txt('ct.normalizers.pl') => array( + 'icon' => 'navigation', + 'permissionKey' => 'normalizers', + 'controller' => 'normalizers', + 'action' => 'index' + ), _txt('ct.org_identity_sources.pl') => array( 'icon' => 'sync', 'permissionKey' => 'orgidsources', diff --git a/app/View/CoNormalizers/add.ctp b/app/View/CoNormalizers/add.ctp new file mode 120000 index 000000000..aa2bf37c5 --- /dev/null +++ b/app/View/CoNormalizers/add.ctp @@ -0,0 +1 @@ +../Standard/add.ctp \ No newline at end of file diff --git a/app/View/CoNormalizers/edit.ctp b/app/View/CoNormalizers/edit.ctp new file mode 120000 index 000000000..c29e17a6d --- /dev/null +++ b/app/View/CoNormalizers/edit.ctp @@ -0,0 +1 @@ +../Standard/edit.ctp \ No newline at end of file diff --git a/app/View/CoNormalizers/fields.inc b/app/View/CoNormalizers/fields.inc new file mode 100644 index 000000000..99344f6e6 --- /dev/null +++ b/app/View/CoNormalizers/fields.inc @@ -0,0 +1,175 @@ + +action == "add" && $permissions['add']) || ($this->action == "edit" && $permissions['edit'])) + $e = true; + + // We shouldn't get here if we don't have at least read permission, but check just in case + + if(!$e && !$permissions['view']) + return false; + + // Add breadcrumbs + print $this->element("coCrumb"); + $args = array(); + $args['plugin'] = null; + $args['controller'] = 'co_normalizers'; + $args['action'] = 'index'; + $args['co'] = $cur_co['Co']['id']; + $this->Html->addCrumb(_txt('ct.co_normalizers.pl'), $args); + $crumbTxt = _txt('op.' . $this->action . '-a', array(_txt('ct.co_normalizers.1'))); + $this->Html->addCrumb($crumbTxt); + + print $this->Form->hidden('co_id', array('default' => $cur_co['Co']['id'])) . "\n"; + + $l = 1; +?> +
    +
  • +
    + + * +
    +
    + Form->input('description', array('size' => '60', 'class' => 'focusFirst')) + : filter_var($co_normalizers[0]['CoNormalizer']['description'],FILTER_SANITIZE_SPECIAL_CHARS)); ?> +
    +
  • +
  • +
    +
    + action == 'add' ? $this->Form->label('plugin', _txt('fd.plugin')) : _txt('fd.plugin')); ?>*
    +
    +
    +
    +
    + action) { + case 'add': + $attrs = array(); + // Since this is add, value should always be null... + $attrs['value'] = (isset($co_normalizers[0]['CoNormalizer']['plugin']) + ? $co_normalizers[0]['CoNormalizer']['plugin'] + : null); + $attrs['empty'] = false; + + print $this->Form->select('plugin', + $vv_plugins, + $attrs); + + if($this->Form->isFieldError('plugin')) { + print $this->Form->error('plugin'); + } + break; + case 'edit': + print filter_var($co_normalizers[0]['CoNormalizer']['plugin'],FILTER_SANITIZE_SPECIAL_CHARS); + // Send the value as hidden since it can't be changed (but is required by the model) + print $this->Form->hidden('plugin', array('default' => filter_var($co_normalizers[0]['CoNormalizer']['plugin'],FILTER_SANITIZE_SPECIAL_CHARS))) . "\n"; + + // Create a direct link to configuration if this plugin is instantiated + $plugin = filter_var($co_normalizers[0]['CoNormalizer']['plugin'],FILTER_SANITIZE_SPECIAL_CHARS); + $pl = Inflector::underscore($plugin); + $plm = Inflector::tableize($plugin); + + if($vv_inst_plugins[$plugin]) { + print $this->Html->link(_txt('op.config'), + array( + 'plugin' => $pl, + 'controller' => $plm, + 'action' => 'edit', + $co_normalizers[0][$plugin]['id'], + 'ivid' => $co_normalizers[0]['CoNormalizer']['id'] + ), + array('class' => 'editbutton')) . "\n"; + } + break; + default: + if(!empty($co_normalizers[0]['CoNormalizer']['plugin'])) { + print $vv_plugins[ $co_normalizers[0]['CoNormalizer']['plugin'] ]; + } + break; + } + ?> +
    +
  • +
  • +
    + * +
    +
    + Form->select('status', + $cm_texts[ $cm_lang ]['en.status.susp'], + $attrs); + + if($this->Form->isFieldError('status')) { + print $this->Form->error('status'); + } + } else { + if(!empty($co_normalizers[0]['CoNormalizer']['status'])) { + print _txt('en.status', null, $co_normalizers[0]['CoNormalizer']['status']); + } + } + ?> +
    +
  • +
  • +
    +
    + Form->label('ordr', _txt('fd.order')) : _txt('fd.order')); ?> +
    +
    +
    +
    + Form->input('ordr') + : filter_var($co_normalizers[0]['CoNormalizer']['ordr'],FILTER_SANITIZE_SPECIAL_CHARS)); ?> +
    +
  • + +
  • +
    +
    + Form->submit($submit_label); ?> +
    +
  • + +
+element("changelog"); diff --git a/app/View/CoNormalizers/index.ctp b/app/View/CoNormalizers/index.ctp new file mode 100644 index 000000000..1d68d64c9 --- /dev/null +++ b/app/View/CoNormalizers/index.ctp @@ -0,0 +1,178 @@ +element("coCrumb"); + $this->Html->addCrumb(_txt('ct.co_normalizers.pl')); + + // Add page title + $params = array(); + $params['title'] = $title_for_layout; + + // Add top links + $params['topLinks'] = array(); + + if(!empty($vv_plugins) && $permissions['add']) { + $params['topLinks'][] = $this->Html->link( + _txt('op.add-a', array(_txt('ct.co_normalizers.1'))), + array( + 'controller' => 'co_normalizers', + 'action' => 'add', + 'co' => $cur_co['Co']['id'] + ), + array('class' => 'addbutton') + ); + } + +if($permissions['order']) { + // Reorder button + $params['topLinks'][] = $this->Html->link( + _txt('op.order.normalizers'), + array( + 'controller' => 'co_normalizers', + 'action' => 'order', + 'co' => $cur_co['Co']['id'], + 'direction' => 'asc', + 'sort' => 'ordr' + ), + array('class' => 'movebutton') + ); +} + + print $this->element("pageTitleAndButtons", $params); +?> + +
+ info + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Paginator->sort('description', _txt('fd.desc')); ?>Paginator->sort('plugin', _txt('fd.plugin')); ?>Paginator->sort('order', _txt('fd.order')); ?>Paginator->sort('status', _txt('fd.status')); ?>
+ Html->link($c['CoNormalizer']['description'], + array('controller' => 'normalizers', + 'action' => ($permissions['edit'] ? 'edit' : ($permissions['view'] ? 'view' : '')), + $c['CoNormalizer']['id'])); + ?> + + + + + + + + Html->link(_txt('op.edit'), + array( + 'controller' => 'co_normalizers', + 'action' => 'edit', + $c['CoNormalizer']['id'] + ), + array('class' => 'editbutton')) . PHP_EOL; + + // Create a direct link to configuration if this plugin is instantiated + $plugin = filter_var($c['CoNormalizer']['plugin'],FILTER_SANITIZE_SPECIAL_CHARS); + $pl = Inflector::underscore($plugin); + $plm = Inflector::tableize($plugin); + + if($vv_inst_plugins[$plugin]) { + print $this->Html->link(_txt('op.config'), + array( + 'plugin' => $pl, + 'controller' => $plm, + 'action' => 'edit', + $c[$plugin]['id'], + 'ivid' => $c['CoNormalizer']['id'] + ), + array('class' => 'editbutton')) . PHP_EOL; + } + } + + if($permissions['delete']) { + print ''; + } + ?> + +
+ + + element("pagination"); ?> +element("coCrumb"); + $args = array(); + $args['plugin'] = null; + $args['controller'] = 'co_normalizers'; + $args['action'] = 'index'; + $args['co'] = $cur_co['Co']['id']; + $this->Html->addCrumb(_txt('ct.co_normalizers.pl'), $args); + $crumbTxt = _txt('op.reorder-a', array(_txt('ct.co_normalizers.pl'))); + $this->Html->addCrumb($crumbTxt); + + // Add page title + $params = array(); + $params['title'] = $title_for_layout; + + // Add top links + $params['topLinks'] = array(); + + print $this->element("pageTitleAndButtons", $params); +?> + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ +element("pagination"); ?> + +Html->link(_txt('op.done'), + $args, + array('class' => 'checkbutton right')); +?> + +
+

+
diff --git a/app/View/CoNormalizers/view.ctp b/app/View/CoNormalizers/view.ctp new file mode 120000 index 000000000..31c28c376 --- /dev/null +++ b/app/View/CoNormalizers/view.ctp @@ -0,0 +1 @@ +../Standard/view.ctp \ No newline at end of file diff --git a/app/View/CoSettings/fields.inc b/app/View/CoSettings/fields.inc index 96fc4ef65..5d227b137 100644 --- a/app/View/CoSettings/fields.inc +++ b/app/View/CoSettings/fields.inc @@ -132,19 +132,6 @@ : filter_var($co_settings[0]['CoSetting']['group_validity_sync_window'],FILTER_SANITIZE_SPECIAL_CHARS)); ?> -
  • -
    -
    -
    -
    - Form->input('enable_normalization') - : (isset($co_settings[0]['CoSetting']['enable_normalization']) - && $co_settings[0]['CoSetting']['enable_normalization'] - ? _txt('fd.yes') : _txt('fd.no'))); - print ' ' . $this->Form->label('enable_normalization',_txt('fd.nr.enable')); - ?> -