From 3a15cf8f28e470ea272ec81075b8b16c3baed83c Mon Sep 17 00:00:00 2001 From: Stefan Scheungrab Date: Thu, 23 Jul 2015 11:45:07 +0200 Subject: [PATCH] Modifier: initial hook and preperation for generic modifier --- application/forms/ImportRowModifierForm.php | 53 +++++++ .../Director/Objects/ImportRowModifier.php | 135 ++++++++++++++++++ .../Objects/ImportRowModifierSettings.php | 135 ++++++++++++++++++ .../PropertyModifierLowercase.php | 15 ++ .../Web/Hook/PropertyModifierHook.php | 80 +++++++++++ 5 files changed, 418 insertions(+) create mode 100644 application/forms/ImportRowModifierForm.php create mode 100644 library/Director/Objects/ImportRowModifier.php create mode 100644 library/Director/Objects/ImportRowModifierSettings.php create mode 100644 library/Director/PropertyModifier/PropertyModifierLowercase.php create mode 100644 library/Director/Web/Hook/PropertyModifierHook.php diff --git a/application/forms/ImportRowModifierForm.php b/application/forms/ImportRowModifierForm.php new file mode 100644 index 00000000..e69a1b2f --- /dev/null +++ b/application/forms/ImportRowModifierForm.php @@ -0,0 +1,53 @@ +addElement('text', 'source_name', array( + 'label' => $this->translate('Source name'), + 'required' => true, + )); + + $this->addElement('text', 'source_field', array( + 'label' => $this->translate('Source field'), + 'description' => $this->translate('This must be a column from the source'), + 'required' => true, + )); + + $this->addElement('text', 'destination_field', array( + 'label' => $this->translate('Destination field'), + 'description' => $this->translate('The value of the source will be transformed to the given attribute'), + 'required' => true, + )); + + $this->addElement('text', 'priority', array( + 'label' => $this->translate('Priority'), + 'description' => $this->translate('This allows to prioritize the import of a field, synced from different sources for the same object'), + 'required' => true, + )); + + $this->addElement('text', 'filter', array( + 'label' => $this->translate('Filter Expression'), + 'description' => $this->translate('This allows to filter for specific parts within the given source field'), + 'required' => true, + )); + + $this->addElement('select', 'merge', array( + 'label' => $this->translate('Source Type'), + 'required' => true, + 'multiOptions' => array( + 'null' => '- please choose -', + 'merge' => 'merge', + 'override' => 'override' + ) + )); + + } + +} diff --git a/library/Director/Objects/ImportRowModifier.php b/library/Director/Objects/ImportRowModifier.php new file mode 100644 index 00000000..e20da5b8 --- /dev/null +++ b/library/Director/Objects/ImportRowModifier.php @@ -0,0 +1,135 @@ + null, + 'property_id' => null, + 'provider_class' => null + ); + + /* + protected $properties = array(); + + public function set($key, $value) + { + if ($this->hasProperty($key)) { + return parent::set($key, $value); + } + + if (! array_key_exists($key, $this->propterties) || $value !== $this->propterties[$key]) { + $this->hasBeenModified = true; + } + $this->properties[$key] = $value; + return $this; + } + + public function get($key) + { + if ($this->hasProperty($key)) { + return parent::get($key); + } + + if (array_key_exists($key, $this->properties)) { + return $this->properties[$key]; + } + + return parent::get($key); + } + + public function getProperties() + { + return $this->properties; + } + + protected function onStore() + { + $old = $this->fetchSettingsFromDb(); + $oldKeys = array_keys($old); + $newKeys = array_keys($this->properties); + $add = array(); + $mod = array(); + $del = array(); + + foreach ($this->properties as $key => $val) { + if (array_key_exists($key, $old)) { + if ($old[$key] !== $this->properties[$key]) { + $mod[$key] = $this->properties[$key]; + } + } else { + $add[$key] = $this->properties[$key]; + } + } + + foreach (array_diff(array_keys($old), array_keys($this->settings)) as $key) { + $del[$key] = $key; + } + + $modifier = $db->fetchRow( + $db->select()->from( + 'sync_modifier', + array('id') + )->where('property_id = ?', $property_id) + ) + + $where = sprintf('modifier_id = %d AND param_key = ?', $modifier->id); + $db = $this->getDb(); + foreach ($mod as $key => $val) { + $db->update( + 'sync_modifier_param', + array('param_value' => $val), + $db->quoteInto($where, $key) + ); + } + + foreach ($add as $key => $val) { + $db->insert( + 'sync_modifier', + array( + 'property_id' => $this->id, + ' + ) + $db->insert( + 'sync_modifier_param', + array( + 'source_id' => $this->id, + 'setting_name' => $key, + 'setting_value' => $val + ) + ); + } + + foreach ($del as $key) { + $db->update( + 'import_source_setting', + $db->quoteInto($where, $key) + ); + } + } + + protected function fetchSettingsFromDb() + { + $db = $this->getDb(); + return $db->fetchPairs( + $db->select() + ->from('sync_modifier_param', array('param_name', 'param_value')) + ->where('modifier_id = ?', $this->id) + ); + + } + + protected function onLoadFromDb() + { + $this->settings = $this->fetchSettingsFromDb(); + } */ +} diff --git a/library/Director/Objects/ImportRowModifierSettings.php b/library/Director/Objects/ImportRowModifierSettings.php new file mode 100644 index 00000000..a41dcf43 --- /dev/null +++ b/library/Director/Objects/ImportRowModifierSettings.php @@ -0,0 +1,135 @@ + null, + 'setting_name' => null, + 'setting_value' => null, + ); + + /* + protected $properties = array(); + + public function set($key, $value) + { + if ($this->hasProperty($key)) { + return parent::set($key, $value); + } + + if (! array_key_exists($key, $this->propterties) || $value !== $this->propterties[$key]) { + $this->hasBeenModified = true; + } + $this->properties[$key] = $value; + return $this; + } + + public function get($key) + { + if ($this->hasProperty($key)) { + return parent::get($key); + } + + if (array_key_exists($key, $this->properties)) { + return $this->properties[$key]; + } + + return parent::get($key); + } + + public function getProperties() + { + return $this->properties; + } + + protected function onStore() + { + $old = $this->fetchSettingsFromDb(); + $oldKeys = array_keys($old); + $newKeys = array_keys($this->properties); + $add = array(); + $mod = array(); + $del = array(); + + foreach ($this->properties as $key => $val) { + if (array_key_exists($key, $old)) { + if ($old[$key] !== $this->properties[$key]) { + $mod[$key] = $this->properties[$key]; + } + } else { + $add[$key] = $this->properties[$key]; + } + } + + foreach (array_diff(array_keys($old), array_keys($this->settings)) as $key) { + $del[$key] = $key; + } + + $modifier = $db->fetchRow( + $db->select()->from( + 'sync_modifier', + array('id') + )->where('property_id = ?', $property_id) + ) + + $where = sprintf('modifier_id = %d AND param_key = ?', $modifier->id); + $db = $this->getDb(); + foreach ($mod as $key => $val) { + $db->update( + 'sync_modifier_param', + array('param_value' => $val), + $db->quoteInto($where, $key) + ); + } + + foreach ($add as $key => $val) { + $db->insert( + 'sync_modifier', + array( + 'property_id' => $this->id, + ' + ) + $db->insert( + 'sync_modifier_param', + array( + 'source_id' => $this->id, + 'setting_name' => $key, + 'setting_value' => $val + ) + ); + } + + foreach ($del as $key) { + $db->update( + 'import_source_setting', + $db->quoteInto($where, $key) + ); + } + } + + protected function fetchSettingsFromDb() + { + $db = $this->getDb(); + return $db->fetchPairs( + $db->select() + ->from('sync_modifier_param', array('param_name', 'param_value')) + ->where('modifier_id = ?', $this->id) + ); + + } + + protected function onLoadFromDb() + { + $this->settings = $this->fetchSettingsFromDb(); + } */ +} diff --git a/library/Director/PropertyModifier/PropertyModifierLowercase.php b/library/Director/PropertyModifier/PropertyModifierLowercase.php new file mode 100644 index 00000000..fe09287e --- /dev/null +++ b/library/Director/PropertyModifier/PropertyModifierLowercase.php @@ -0,0 +1,15 @@ +getDbAdapter(); + $modifier = $db->fetchRow( + $db->select()->from( + 'import_row_modifier', + array('id', 'provider_class') + )->where('property_id = ?', $property_id) + ); + + $settings = $db->fetchPairs( + $db->select()->from( + 'import_row_modifier_settings', + array('setting_name', 'setting_value') + )->where('modifier_id = ?', $modifier->id) + ); + + $obj = new $modifier->provider_class; + $obj->setSettings($settings); + + return $obj; + } + + public function setSettings($settings) + { + $this->settings = $settings; + return $this; + } + + /** + * Returns an array containing importable objects + * + * @return array + */ + abstract public function fetchData(); + + /** + * Returns a list of all available columns + * + * @return array + */ + abstract public function listColumns(); + + /** + * Override this method if you want to extend the settings form + * + * @param QuickForm $form QuickForm that should be extended + * @return QuickForm + */ + public static function addPropertiesFormFields(QuickForm $form) + { + return $form; + } +}