From 74ceb8dc8ca0e9bcf03ae4c000487af4c1ff48e9 Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Thu, 15 Mar 2018 00:14:38 +0100 Subject: [PATCH] * [FIX] Fixed custom fields behavior. --- .../web/Controllers/CustomFieldController.php | 15 +- .../Helpers/Account/AccountHelper.php | 2 +- .../Controllers/Helpers/ItemsGridHelper.php | 6 +- .../web/Controllers/Traits/ItemTrait.php | 26 +-- .../views/common/aux-customfields.inc | 11 +- .../views/itemshow/customfield.inc | 13 +- .../CustomField/CustomFieldDefRepository.php | 90 +--------- .../CustomField/CustomFieldRepository.php | 162 ++++++++++++------ .../CustomField/CustomFieldTypeRepository.php | 78 ++++----- .../CustomField/CustomFieldDefService.php | 51 +++++- .../Services/CustomField/CustomFieldItem.php | 45 +++++ .../CustomField/CustomFieldService.php | 56 ++++-- .../CustomField/CustomFieldTypeService.php | 70 ++++++++ 13 files changed, 389 insertions(+), 236 deletions(-) create mode 100644 lib/SP/Services/CustomField/CustomFieldItem.php create mode 100644 lib/SP/Services/CustomField/CustomFieldTypeService.php diff --git a/app/modules/web/Controllers/CustomFieldController.php b/app/modules/web/Controllers/CustomFieldController.php index dcc1fb78..f54323ff 100644 --- a/app/modules/web/Controllers/CustomFieldController.php +++ b/app/modules/web/Controllers/CustomFieldController.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -37,9 +37,9 @@ use SP\Modules\Web\Controllers\Traits\ItemTrait; use SP\Modules\Web\Controllers\Traits\JsonTrait; use SP\Modules\Web\Forms\CustomFieldDefForm; use SP\Mvc\Controller\CrudControllerInterface; -use SP\Repositories\CustomField\CustomFieldDefRepository; -use SP\Repositories\CustomField\CustomFieldTypeRepository; +use SP\Mvc\View\Components\SelectItemAdapter; use SP\Services\CustomField\CustomFieldDefService; +use SP\Services\CustomField\CustomFieldTypeService; /** * Class CustomFieldController @@ -128,12 +128,9 @@ class CustomFieldController extends ControllerBase implements CrudControllerInte $customField = $customFieldId ? $this->customFieldService->getById($customFieldId) : new CustomFieldDefinitionData(); - // FIXME - $customFieldTypeService = $this->dic->get(CustomFieldTypeRepository::class); - $this->view->assign('field', $customField); - $this->view->assign('types', $customFieldTypeService->getAll()); - $this->view->assign('modules', CustomFieldDefRepository::getFieldModules()); + $this->view->assign('types', SelectItemAdapter::factory(CustomFieldTypeService::getItemsBasic())->getItemsFromModelSelected([$customField->getTypeId()])); + $this->view->assign('modules', SelectItemAdapter::factory(CustomFieldDefService::getFieldModules())->getItemsFromArraySelected([$customField->getModuleId()])); $this->view->assign('sk', $this->session->generateSecurityKey()); $this->view->assign('nextAction', Acl::getActionRoute(ActionsInterface::ITEMS_MANAGE)); diff --git a/app/modules/web/Controllers/Helpers/Account/AccountHelper.php b/app/modules/web/Controllers/Helpers/Account/AccountHelper.php index e338ff70..dafaff26 100644 --- a/app/modules/web/Controllers/Helpers/Account/AccountHelper.php +++ b/app/modules/web/Controllers/Helpers/Account/AccountHelper.php @@ -224,7 +224,7 @@ class AccountHelper extends HelperBase $this->view->assign('accountIsHistory', false); - $this->view->assign('customFields', $this->getCustomFieldsForItem(ActionsInterface::ACCOUNT, $this->accountId)); + $this->view->assign('customFields', $this->getCustomFieldsForItem(ActionsInterface::ACCOUNT, $this->accountId, $this->context)); $this->view->assign('categories', SelectItemAdapter::factory($this->dic->get(CategoryService::class)->getAllBasic())->getItemsFromModel()); $this->view->assign('clients', SelectItemAdapter::factory($this->dic->get(ClientService::class)->getAllForUser())->getItemsFromModel()); diff --git a/app/modules/web/Controllers/Helpers/ItemsGridHelper.php b/app/modules/web/Controllers/Helpers/ItemsGridHelper.php index 760bbd36..6961c9b8 100644 --- a/app/modules/web/Controllers/Helpers/ItemsGridHelper.php +++ b/app/modules/web/Controllers/Helpers/ItemsGridHelper.php @@ -40,7 +40,7 @@ use SP\Html\DataGrid\DataGridHeader; use SP\Html\DataGrid\DataGridInterface; use SP\Html\DataGrid\DataGridPager; use SP\Html\DataGrid\DataGridTab; -use SP\Repositories\CustomField\CustomFieldDefRepository; +use SP\Services\CustomField\CustomFieldDefService; use SP\Util\DateUtil; /** @@ -261,7 +261,7 @@ class ItemsGridHelper extends HelperBase $GridData->setDataRowSourceId('id'); $GridData->addDataRowSource('name'); $GridData->addDataRowSource('moduleId', false, function ($value) { - return CustomFieldDefRepository::getFieldModuleById($value); + return CustomFieldDefService::getFieldModuleById($value); }); $GridData->addDataRowSource('typeName'); $GridData->setData($data); @@ -308,7 +308,7 @@ class ItemsGridHelper extends HelperBase $GridActionEdit->setTitle(__('Editar Campo')); $GridActionEdit->setIcon($this->icons->getIconEdit()); $GridActionEdit->setOnClickFunction('appMgmt/show'); - $GridActionEdit->addData('action-route', Acl::getActionRoute(ActionsInterface::CUSTOMFIELD_VIEW)); + $GridActionEdit->addData('action-route', Acl::getActionRoute(ActionsInterface::CUSTOMFIELD_EDIT)); $Grid->setDataActions($GridActionEdit); diff --git a/app/modules/web/Controllers/Traits/ItemTrait.php b/app/modules/web/Controllers/Traits/ItemTrait.php index 84222e5d..3ca62f0e 100644 --- a/app/modules/web/Controllers/Traits/ItemTrait.php +++ b/app/modules/web/Controllers/Traits/ItemTrait.php @@ -26,10 +26,12 @@ namespace SP\Modules\Web\Controllers\Traits; use Defuse\Crypto\Exception\CryptoException; use SP\Bootstrap; +use SP\Core\Context\SessionContext; use SP\Core\Exceptions\SPException; use SP\DataModel\CustomFieldData; use SP\DataModel\ItemSearchData; use SP\Http\Request; +use SP\Services\CustomField\CustomFieldItem; use SP\Services\CustomField\CustomFieldService; /** @@ -42,32 +44,21 @@ trait ItemTrait /** * Obtener la lista de campos personalizados y sus valores * - * @param $moduleId - * @param $itemId + * @param int $moduleId + * @param int $itemId + * @param SessionContext $sessionContext * @return array * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ - protected function getCustomFieldsForItem($moduleId, $itemId) + protected function getCustomFieldsForItem($moduleId, $itemId, SessionContext $sessionContext) { $customFieldService = Bootstrap::getContainer()->get(CustomFieldService::class); $customFields = []; - $customFieldBase = new \stdClass(); - $customFieldBase->required = false; - $customFieldBase->showInList = false; - $customFieldBase->help = ''; - $customFieldBase->definitionId = 0; - $customFieldBase->definitionName = ''; - $customFieldBase->typeId = 0; - $customFieldBase->typeName = ''; - $customFieldBase->moduleId = 0; - $customFieldBase->formId = ''; - $customFieldBase->value = ''; - foreach ($customFieldService->getForModuleById($moduleId, $itemId) as $item) { try { - $customField = clone $customFieldBase; + $customField = new CustomFieldItem(); $customField->required = (bool)$item->required; $customField->showInList = (bool)$item->showInList; $customField->help = $item->help; @@ -75,9 +66,10 @@ trait ItemTrait $customField->definitionName = $item->definitionName; $customField->typeId = (int)$item->typeId; $customField->typeName = $item->typeName; + $customField->typeText = $item->typeText; $customField->moduleId = (int)$item->moduleId; $customField->formId = CustomFieldService::getFormIdForName($item->definitionName); - $customField->value = $item->data !== null ? CustomFieldService::decryptData($item->data, $this->session) : ''; + $customField->value = $item->data !== null ? CustomFieldService::decryptData($item->data, $item->key, $sessionContext) : null; $customFields[] = $customField; } catch (CryptoException $e) { diff --git a/app/modules/web/themes/material-blue/views/common/aux-customfields.inc b/app/modules/web/themes/material-blue/views/common/aux-customfields.inc index cca3fdaf..348f3cb4 100644 --- a/app/modules/web/themes/material-blue/views/common/aux-customfields.inc +++ b/app/modules/web/themes/material-blue/views/common/aux-customfields.inc @@ -2,12 +2,15 @@ use SP\Mgmt\CustomFields\CustomFieldTypes; -/** @var $icons \SP\Core\UI\ThemeIcons */ +/** + * @var \SP\Core\UI\ThemeIcons $icons + * @var \SP\Services\CustomField\CustomFieldItem[] $customFields + */ foreach ($customFields as $index => $field):?> - typeName; ?> + definitionName; ?> help): ?>
@@ -15,7 +18,7 @@ foreach ($customFields as $index => $field):?>
-

formId; ?>

+

help; ?>

@@ -33,7 +36,7 @@ foreach ($customFields as $index => $field):?> maxlength="500" value="value !== '') ? '***' : htmlspecialchars($field->value, ENT_QUOTES); ?>" required ? 'required' : ''; ?> > + for="formId; ?>">definitionName; ?> typeId === CustomFieldTypes::TYPE_TEXTAREA): ?>
diff --git a/app/modules/web/themes/material-blue/views/itemshow/customfield.inc b/app/modules/web/themes/material-blue/views/itemshow/customfield.inc index 1645a6ae..5bb3eb50 100644 --- a/app/modules/web/themes/material-blue/views/itemshow/customfield.inc +++ b/app/modules/web/themes/material-blue/views/itemshow/customfield.inc @@ -34,10 +34,10 @@
@@ -48,9 +48,10 @@
@@ -85,8 +86,8 @@
diff --git a/lib/SP/Repositories/CustomField/CustomFieldDefRepository.php b/lib/SP/Repositories/CustomField/CustomFieldDefRepository.php index 7b909ec1..6a3f4f60 100644 --- a/lib/SP/Repositories/CustomField/CustomFieldDefRepository.php +++ b/lib/SP/Repositories/CustomField/CustomFieldDefRepository.php @@ -24,7 +24,6 @@ namespace SP\Repositories\CustomField; -use SP\Core\Acl\ActionsInterface; use SP\Core\Exceptions\SPException; use SP\DataModel\CustomFieldDefinitionData; use SP\DataModel\ItemSearchData; @@ -43,36 +42,6 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter { use RepositoryItemTrait; - /** - * @param $id - * @return mixed - */ - public static function getFieldModuleById($id) - { - $modules = self::getFieldModules(); - - return isset($modules[$id]) ? $modules[$id] : $id; - } - - /** - * Devuelve los módulos disponibles para los campos personalizados - * - * @return array - */ - public static function getFieldModules() - { - $modules = [ - ActionsInterface::ACCOUNT => __('Cuentas'), - ActionsInterface::CATEGORY => __('Categorías'), - ActionsInterface::CLIENT => __('Clientes'), - ActionsInterface::USER => __('Usuarios'), - ActionsInterface::GROUP => __('Grupos') - - ]; - - return $modules; - } - /** * Creates an item * @@ -84,7 +53,7 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter public function create($itemData) { $query = /** @lang SQL */ - 'INSERT INTO CustomFieldDefinition SET name = ?, moduleId = ?, required = ?, help = ?, showInList = ?, typeId = ?'; + 'INSERT INTO CustomFieldDefinition SET `name` = ?, moduleId = ?, required = ?, `help` = ?, showInList = ?, typeId = ?'; $queryData = new QueryData(); $queryData->setQuery($query); @@ -113,7 +82,7 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter { $query = /** @lang SQL */ 'UPDATE CustomFieldDefinition - SET name = ?, moduleId = ?, required = ?, help = ?, showInList = ?, typeId = ? + SET `name` = ?, moduleId = ?, required = ?, `help` = ?, showInList = ?, typeId = ? WHERE id = ? LIMIT 1'; $queryData = new QueryData(); @@ -139,14 +108,14 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter public function getById($id) { $query = /** @lang SQL */ - 'SELECT id, name, moduleId, required, help, showInList, typeId + 'SELECT id, `name`, moduleId, required, `help`, showInList, typeId FROM CustomFieldDefinition WHERE id = ? LIMIT 1'; $queryData = new QueryData(); - $queryData->setMapClassName(CustomFieldDefinitionData::class); $queryData->setQuery($query); $queryData->addParam($id); + $queryData->setMapClassName(CustomFieldDefinitionData::class); return DbWrapper::getResults($queryData, $this->db); } @@ -159,13 +128,13 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter public function getAll() { $query = /** @lang SQL */ - 'SELECT id, name, moduleId, required, help, showInList + 'SELECT id, `name`, moduleId, required, `help`, showInList FROM CustomFieldDefinition ORDER BY moduleId'; $queryData = new QueryData(); - $queryData->setMapClassName(CustomFieldDefinitionData::class); $queryData->setQuery($query); + $queryData->setMapClassName(CustomFieldDefinitionData::class); return DbWrapper::getResultsArray($queryData, $this->db); } @@ -179,14 +148,14 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter public function getByIdBatch(array $ids) { $query = /** @lang SQL */ - 'SELECT id, name, moduleId, required, help, showInList, typeId + 'SELECT id, `name`, moduleId, required, `help`, showInList, typeId FROM CustomFieldDefinition WHERE id IN (' . $this->getParamsFromArray($ids) . ')'; $queryData = new QueryData(); - $queryData->setMapClassName(CustomFieldDefinitionData::class); $queryData->setQuery($query); $queryData->setParams($ids); + $queryData->setMapClassName(CustomFieldDefinitionData::class); return DbWrapper::getResults($queryData, $this->db); } @@ -202,10 +171,6 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter */ public function deleteByIdBatch(array $ids) { - if ($this->deleteItemsDataForDefinitionBatch($ids) === false) { - throw new SPException(__u('Error al eliminar los campos personalizados'), SPException::ERROR); - } - $query = /** @lang SQL */ 'DELETE FROM CustomFieldDefinition WHERE id IN (' . $this->getParamsFromArray($ids) . ')'; @@ -219,25 +184,6 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter return $this->db->getNumRows(); } - /** - * Eliminar los datos de los elementos de una definición - * - * @param array $ids - * @return bool - * @throws \SP\Core\Exceptions\ConstraintException - * @throws \SP\Core\Exceptions\QueryException - */ - protected function deleteItemsDataForDefinitionBatch(array $ids) - { - $queryData = new QueryData(); - $queryData->setQuery('DELETE FROM CustomFieldData WHERE id IN (' . $this->getParamsFromArray($ids) . ')'); - $queryData->setParams($ids); - - DbWrapper::getQuery($queryData, $this->db); - - return $this->db->getNumRows(); - } - /** * Deletes an item * @@ -249,10 +195,6 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter */ public function delete($id) { - if ($this->deleteItemsDataForDefinition($id) === false) { - throw new SPException(__u('Error al eliminar el campo personalizado'), SPException::ERROR); - } - $queryData = new QueryData(); $queryData->setQuery('DELETE FROM CustomFieldDefinition WHERE id = ? LIMIT 1'); $queryData->addParam($id); @@ -261,22 +203,6 @@ class CustomFieldDefRepository extends Repository implements RepositoryItemInter return DbWrapper::getQuery($queryData, $this->db); } - /** - * Eliminar los datos de los elementos de una definición - * - * @param $id - * @return bool - * @throws \SP\Core\Exceptions\SPException - */ - protected function deleteItemsDataForDefinition($id) - { - $queryData = new QueryData(); - $queryData->setQuery('DELETE FROM CustomFieldData WHERE id = ?'); - $queryData->addParam($id); - - return DbWrapper::getQuery($queryData, $this->db); - } - /** * Checks whether the item is in use or not * diff --git a/lib/SP/Repositories/CustomField/CustomFieldRepository.php b/lib/SP/Repositories/CustomField/CustomFieldRepository.php index e9057312..0cc54a65 100644 --- a/lib/SP/Repositories/CustomField/CustomFieldRepository.php +++ b/lib/SP/Repositories/CustomField/CustomFieldRepository.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -60,15 +60,15 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac AND itemId = ? AND definitionId = ?'; - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($itemData->getData()); - $Data->addParam($itemData->getKey()); - $Data->addParam($itemData->getModuleId()); - $Data->addParam($itemData->getId()); - $Data->addParam($itemData->getDefinitionId()); + $queryData = new QueryData(); + $queryData->setQuery($query); + $queryData->addParam($itemData->getData()); + $queryData->addParam($itemData->getKey()); + $queryData->addParam($itemData->getModuleId()); + $queryData->addParam($itemData->getId()); + $queryData->addParam($itemData->getDefinitionId()); - return DbWrapper::getQuery($Data, $this->db); + return DbWrapper::getQuery($queryData, $this->db); } /** @@ -88,15 +88,15 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac AND itemId = ? AND definitionId = ?'; - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($itemData->getModuleId()); - $Data->addParam($itemData->getId()); - $Data->addParam($itemData->getDefinitionId()); + $queryData = new QueryData(); + $queryData->setQuery($query); + $queryData->addParam($itemData->getModuleId()); + $queryData->addParam($itemData->getId()); + $queryData->addParam($itemData->getDefinitionId()); - DbWrapper::getQuery($Data, $this->db); + DbWrapper::getQuery($queryData, $this->db); - return $Data->getQueryNumRows() >= 1; + return $queryData->getQueryNumRows() >= 1; } /** @@ -123,15 +123,17 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac $query = /** @lang SQL */ 'INSERT INTO CustomFieldData SET itemId = ?, moduleId = ?, definitionId = ?, `data` = ?, `key` = ?'; - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($itemData->getId()); - $Data->addParam($itemData->getModuleId()); - $Data->addParam($itemData->getDefinitionId()); - $Data->addParam($itemData->getData()); - $Data->addParam($itemData->getKey()); + $queryData = new QueryData(); + $queryData->setQuery($query); + $queryData->addParam($itemData->getId()); + $queryData->addParam($itemData->getModuleId()); + $queryData->addParam($itemData->getDefinitionId()); + $queryData->addParam($itemData->getData()); + $queryData->addParam($itemData->getKey()); - return DbWrapper::getQuery($Data, $this->db); + DbWrapper::getQuery($queryData, $this->db); + + return $this->db->getLastId(); } /** @@ -140,7 +142,8 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac * @param int $id * @param int $moduleId * @return bool - * @throws \SP\Core\Exceptions\SPException + * @throws QueryException + * @throws \SP\Core\Exceptions\ConstraintException */ public function deleteCustomFieldData($id, $moduleId) { @@ -149,12 +152,79 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac WHERE itemId = ? AND moduleId = ?'; - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($id); - $Data->addParam($moduleId); + $queryData = new QueryData(); + $queryData->setQuery($query); + $queryData->addParam($id); + $queryData->addParam($moduleId); - DbWrapper::getQuery($Data, $this->db); + DbWrapper::getQuery($queryData, $this->db); + + return $this->db->getNumRows(); + } + + /** + * Eliminar los datos de los campos personalizados del módulo + * + * @param int $id + * @param int $moduleId + * @param int $definitionId + * @return bool + * @throws QueryException + * @throws \SP\Core\Exceptions\ConstraintException + */ + public function deleteCustomFieldDataForDefinition($id, $moduleId, $definitionId) + { + $query = /** @lang SQL */ + 'DELETE FROM CustomFieldData + WHERE itemId = ? + AND moduleId = ? + AND definitionId = ?'; + + $queryData = new QueryData(); + $queryData->setQuery($query); + $queryData->addParam($id); + $queryData->addParam($moduleId); + $queryData->addParam($definitionId); + + DbWrapper::getQuery($queryData, $this->db); + + return $this->db->getNumRows(); + } + + /** + * Eliminar los datos de los campos personalizados del módulo + * + * @param int $definitionId + * @return int + * @throws QueryException + * @throws \SP\Core\Exceptions\ConstraintException + */ + public function deleteCustomFieldDefinitionData($definitionId) + { + $queryData = new QueryData(); + $queryData->setQuery('DELETE FROM CustomFieldData WHERE definitionId = ?'); + $queryData->addParam($definitionId); + + DbWrapper::getQuery($queryData, $this->db); + + return $this->db->getNumRows(); + } + + /** + * Eliminar los datos de los elementos de una definición + * + * @param array $definitionIds + * @return int + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function deleteCustomFieldDefinitionDataBatch(array $definitionIds) + { + $queryData = new QueryData(); + $queryData->setQuery('DELETE FROM CustomFieldData WHERE definitionId IN (' . $this->getParamsFromArray($definitionIds) . ')'); + $queryData->setParams($definitionIds); + + DbWrapper::getQuery($queryData, $this->db); return $this->db->getNumRows(); } @@ -175,12 +245,12 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac WHERE itemId IN (' . $this->getParamsFromArray($ids) . ') AND moduleId = ?'; - $Data = new QueryData(); - $Data->setQuery($query); - $Data->setParams($ids); - $Data->addParam($moduleId); + $queryData = new QueryData(); + $queryData->setQuery($query); + $queryData->setParams($ids); + $queryData->addParam($moduleId); - DbWrapper::getQuery($Data, $this->db); + DbWrapper::getQuery($queryData, $this->db); return $this->db->getNumRows(); } @@ -203,12 +273,9 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac */ public function getAll() { - $query = /** @lang SQL */ - 'SELECT * FROM CustomFieldData'; - $queryData = new QueryData(); + $queryData->setQuery('SELECT * FROM CustomFieldData'); $queryData->setMapClassName(CustomFieldData::class); - $queryData->setQuery($query); return DbWrapper::getResultsArray($queryData, $this->db); } @@ -279,18 +346,17 @@ class CustomFieldRepository extends Repository implements RepositoryItemInterfac CFT.name AS typeName, CFT.text AS typeText FROM CustomFieldDefinition CFD - LEFT JOIN CustomFieldData CFD2 ON CFD2.definitionId = CFD.id + LEFT JOIN CustomFieldData CFD2 ON CFD2.definitionId = CFD.id AND CFD2.itemId = ? INNER JOIN CustomFieldType CFT ON CFT.id = CFD.typeId WHERE CFD.moduleId = ? - AND (CFD2.itemId = ? OR CFD2.definitionId IS NULL) - ORDER BY CFD.id'; + ORDER BY CFT.text'; - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($moduleId); - $Data->addParam($itemId); + $queryData = new QueryData(); + $queryData->setQuery($query); + $queryData->addParam($itemId); + $queryData->addParam($moduleId); - return DbWrapper::getResultsArray($Data, $this->db); + return DbWrapper::getResultsArray($queryData, $this->db); } /** diff --git a/lib/SP/Repositories/CustomField/CustomFieldTypeRepository.php b/lib/SP/Repositories/CustomField/CustomFieldTypeRepository.php index 93523d4b..80d26bb8 100644 --- a/lib/SP/Repositories/CustomField/CustomFieldTypeRepository.php +++ b/lib/SP/Repositories/CustomField/CustomFieldTypeRepository.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -24,7 +24,6 @@ namespace SP\Repositories\CustomField; - use SP\Core\Exceptions\SPException; use SP\DataModel\CustomFieldTypeData; use SP\DataModel\ItemSearchData; @@ -54,16 +53,13 @@ class CustomFieldTypeRepository extends Repository implements RepositoryItemInte */ public function create($itemData) { - $query = /** @lang SQL */ - 'INSERT INTO CustomFieldType SET name = ?, text = ?'; + $queryData = new QueryData(); + $queryData->setQuery('INSERT INTO CustomFieldType SET name = ?, text = ?'); + $queryData->addParam($itemData->getName()); + $queryData->addParam($itemData->getText()); + $queryData->setOnErrorMessage(__u('Error al crear el tipo de campo')); - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($itemData->getName()); - $Data->addParam($itemData->getText()); - $Data->setOnErrorMessage(__u('Error al crear el tipo de campo')); - - DbWrapper::getQuery($Data, $this->db); + DbWrapper::getQuery($queryData, $this->db); return $this->db->getLastId(); } @@ -90,17 +86,16 @@ class CustomFieldTypeRepository extends Repository implements RepositoryItemInte */ public function update($itemData) { - $query = /** @lang SQL */ - 'UPDATE CustomFieldType SET name = ?, text = ? WHERE id = ? LIMIT 1'; + $queryData = new QueryData(); + $queryData->setQuery('UPDATE CustomFieldType SET name = ?, text = ? WHERE id = ? LIMIT 1'); + $queryData->addParam($itemData->getName()); + $queryData->addParam($itemData->getText()); + $queryData->addParam($itemData->getId()); + $queryData->setOnErrorMessage(__u('Error al actualizar el tipo de campo')); - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($itemData->getName()); - $Data->addParam($itemData->getText()); - $Data->addParam($itemData->getId()); - $Data->setOnErrorMessage(__u('Error al actualizar el tipo de campo')); + DbWrapper::getQuery($queryData, $this->db); - return DbWrapper::getQuery($Data, $this->db); + return $this->db->getNumRows(); } /** @@ -118,36 +113,30 @@ class CustomFieldTypeRepository extends Repository implements RepositoryItemInte * Returns the item for given id * * @param int $id - * @return mixed + * @return CustomFieldTypeData */ public function getById($id) { - $query = /** @lang SQL */ - 'SELECT id, name, text FROM CustomFieldType WHERE id = ? LIMIT 1'; + $queryData = new QueryData(); + $queryData->setQuery('SELECT id, name, text FROM CustomFieldType WHERE id = ? LIMIT 1'); + $queryData->addParam($id); + $queryData->setMapClassName(CustomFieldTypeData::class); - $Data = new QueryData(); - $Data->setMapClassName(CustomFieldTypeData::class); - $Data->setQuery($query); - $Data->addParam($id); - - return DbWrapper::getResults($Data, $this->db); + return DbWrapper::getResults($queryData, $this->db); } /** * Returns all the items * - * @return array + * @return CustomFieldTypeData[] */ public function getAll() { - $query = /** @lang SQL */ - 'SELECT id, name, text FROM CustomFieldType'; + $queryData = new QueryData(); + $queryData->setQuery('SELECT id, `name`, `text` FROM CustomFieldType'); + $queryData->setMapClassName(CustomFieldTypeData::class); - $Data = new QueryData(); - $Data->setMapClassName(CustomFieldTypeData::class); - $Data->setQuery($query); - - return DbWrapper::getResultsArray($Data, $this->db); + return DbWrapper::getResultsArray($queryData, $this->db); } /** @@ -186,15 +175,12 @@ class CustomFieldTypeRepository extends Repository implements RepositoryItemInte */ public function delete($id) { - $query = /** @lang SQL */ - 'DELETE FROM CustomFieldType WHERE id = ? LIMIT 1'; + $queryData = new QueryData(); + $queryData->setQuery('DELETE FROM CustomFieldType WHERE id = ? LIMIT 1'); + $queryData->addParam($id); + $queryData->setOnErrorMessage(__u('Error al eliminar el tipo de campo')); - $Data = new QueryData(); - $Data->setQuery($query); - $Data->addParam($id); - $Data->setOnErrorMessage(__u('Error al eliminar el tipo de campo')); - - return DbWrapper::getQuery($Data, $this->db); + return DbWrapper::getQuery($queryData, $this->db); } /** diff --git a/lib/SP/Services/CustomField/CustomFieldDefService.php b/lib/SP/Services/CustomField/CustomFieldDefService.php index 593f1278..dfeb4375 100644 --- a/lib/SP/Services/CustomField/CustomFieldDefService.php +++ b/lib/SP/Services/CustomField/CustomFieldDefService.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -24,6 +24,7 @@ namespace SP\Services\CustomField; +use SP\Core\Acl\ActionsInterface; use SP\DataModel\ItemSearchData; use SP\Repositories\CustomField\CustomFieldDefRepository; use SP\Services\Service; @@ -45,12 +46,33 @@ class CustomFieldDefService extends Service protected $customFieldDefRepository; /** - * @throws \Psr\Container\ContainerExceptionInterface - * @throws \Psr\Container\NotFoundExceptionInterface + * @param $id + * @return mixed */ - protected function initialize() + public static function getFieldModuleById($id) { - $this->customFieldDefRepository = $this->dic->get(CustomFieldDefRepository::class); + $modules = self::getFieldModules(); + + return isset($modules[$id]) ? $modules[$id] : $id; + } + + /** + * Devuelve los módulos disponibles para los campos personalizados + * + * @return array + */ + public static function getFieldModules() + { + $modules = [ + ActionsInterface::ACCOUNT => __('Cuentas'), + ActionsInterface::CATEGORY => __('Categorías'), + ActionsInterface::CLIENT => __('Clientes'), + ActionsInterface::USER => __('Usuarios'), + ActionsInterface::GROUP => __('Grupos') + + ]; + + return $modules; } /** @@ -81,7 +103,8 @@ class CustomFieldDefService extends Service */ public function delete($id) { - if ($this->customFieldDefRepository->delete($id) === 0) { + if ($this->dic->get(CustomFieldService::class)->deleteCustomFieldDefinitionData($id) === 0 + || $this->customFieldDefRepository->delete($id) === 0) { throw new ServiceException(__u('Campo no encontrado'), ServiceException::INFO); } @@ -100,7 +123,10 @@ class CustomFieldDefService extends Service */ public function deleteByIdBatch(array $ids) { - if (($count = $this->customFieldDefRepository->deleteByIdBatch($ids)) !== count($ids)){ + $numIds = count($ids); + + if ($this->dic->get(CustomFieldService::class)->deleteCustomFieldDefinitionDataBatch($ids) !== $numIds + || ($count = $this->customFieldDefRepository->deleteByIdBatch($ids)) !== $numIds) { throw new ServiceException(__u('Error al eliminar los campos'), ServiceException::WARNING); } @@ -138,4 +164,13 @@ class CustomFieldDefService extends Service { return $this->customFieldDefRepository->getAll(); } + + /** + * @throws \Psr\Container\ContainerExceptionInterface + * @throws \Psr\Container\NotFoundExceptionInterface + */ + protected function initialize() + { + $this->customFieldDefRepository = $this->dic->get(CustomFieldDefRepository::class); + } } \ No newline at end of file diff --git a/lib/SP/Services/CustomField/CustomFieldItem.php b/lib/SP/Services/CustomField/CustomFieldItem.php new file mode 100644 index 00000000..e7852119 --- /dev/null +++ b/lib/SP/Services/CustomField/CustomFieldItem.php @@ -0,0 +1,45 @@ +. + */ + +namespace SP\Services\CustomField; + +/** + * Class CustomFieldItem + * + * @package SP\Services\CustomField + */ +class CustomFieldItem +{ + public $required = false; + public $showInList = false; + public $help; + public $definitionId = 0; + public $definitionName; + public $typeId = 0; + public $typeName; + public $typeText; + public $moduleId = 0; + public $formId; + public $value; +} \ No newline at end of file diff --git a/lib/SP/Services/CustomField/CustomFieldService.php b/lib/SP/Services/CustomField/CustomFieldService.php index 69e0e477..fb7f2047 100644 --- a/lib/SP/Services/CustomField/CustomFieldService.php +++ b/lib/SP/Services/CustomField/CustomFieldService.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -61,17 +61,18 @@ class CustomFieldService extends Service /** * Desencriptar y formatear los datos del campo * - * @param CustomFieldData $CustomFieldData - * @param SessionContext $sessionContext + * @param string $data + * @param string $key + * @param SessionContext $sessionContext * @return string * @throws CryptoException */ - public static function decryptData(CustomFieldData $CustomFieldData, SessionContext $sessionContext) + public static function decryptData($data, $key, SessionContext $sessionContext) { - if ($CustomFieldData->getData() !== '') { - $securedKey = Crypt::unlockSecuredKey($CustomFieldData->getKey(), CryptSession::getSessionKey($sessionContext)); + if ($data !== '') { + $securedKey = Crypt::unlockSecuredKey($key, CryptSession::getSessionKey($sessionContext)); - return self::formatValue(Crypt::decrypt($CustomFieldData->getData(), $securedKey)); + return self::formatValue(Crypt::decrypt($data, $securedKey)); } return ''; @@ -120,7 +121,7 @@ class CustomFieldService extends Service // Deletes item's custom field data if value is left blank if ($exists && $customFieldData->getData() === '') { - return $this->deleteCustomFieldData($customFieldData->getId(), $customFieldData->getModuleId()); + return $this->deleteCustomFieldData($customFieldData->getId(), $customFieldData->getModuleId(), $customFieldData->getDefinitionId()); } // Create item's custom field data if value is set @@ -138,12 +139,17 @@ class CustomFieldService extends Service * * @param int $id * @param int $moduleId + * @param int $definitionId * @return bool - * @throws \SP\Core\Exceptions\SPException + * @throws SPException */ - public function deleteCustomFieldData($id, $moduleId) + public function deleteCustomFieldData($id, $moduleId, $definitionId = null) { - return $this->customFieldRepository->deleteCustomFieldData($id, $moduleId); + if ($definitionId === null) { + return $this->customFieldRepository->deleteCustomFieldData($id, $moduleId); + } else { + return $this->customFieldRepository->deleteCustomFieldDataForDefinition($id, $moduleId, $definitionId); + } } /** @@ -186,6 +192,19 @@ class CustomFieldService extends Service $customFieldData->setKey($securedKey); } + /** + * Eliminar los datos de los campos personalizados del módulo + * + * @param int $definitionId + * @return int + * @throws QueryException + * @throws \SP\Core\Exceptions\ConstraintException + */ + public function deleteCustomFieldDefinitionData($definitionId) + { + return $this->customFieldRepository->deleteCustomFieldDefinitionData($definitionId); + } + /** * Eliminar los datos de los campos personalizados del módulo * @@ -200,6 +219,19 @@ class CustomFieldService extends Service return $this->customFieldRepository->deleteCustomFieldDataBatch($ids, $moduleId); } + /** + * Eliminar los datos de los elementos de una definición + * + * @param array $definitionIds + * @return int + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function deleteCustomFieldDefinitionDataBatch(array $definitionIds) + { + return $this->customFieldRepository->deleteCustomFieldDefinitionDataBatch($definitionIds); + } + /** * Updates an item * diff --git a/lib/SP/Services/CustomField/CustomFieldTypeService.php b/lib/SP/Services/CustomField/CustomFieldTypeService.php new file mode 100644 index 00000000..6107f3cb --- /dev/null +++ b/lib/SP/Services/CustomField/CustomFieldTypeService.php @@ -0,0 +1,70 @@ +. + */ + +namespace SP\Services\CustomField; + +use SP\DataModel\CustomFieldTypeData; +use SP\Repositories\CustomField\CustomFieldTypeRepository; +use SP\Services\Service; +use SP\Services\ServiceItemTrait; + +/** + * Class CustomFieldTypeService + * + * @package SP\Services\CustomField + */ +class CustomFieldTypeService extends Service +{ + use ServiceItemTrait; + + /** + * @var CustomFieldTypeRepository + */ + protected $customFieldTypeRepository; + + /** + * Returns all the items + * + * @return CustomFieldTypeData[] + */ + public function getAll() + { + return $this->customFieldTypeRepository->getAll(); + } + + protected function initialize() + { + $this->customFieldTypeRepository = $this->dic->get(CustomFieldTypeRepository::class); + } + + /** + * Get all items from the service's repository + * + * @return CustomFieldTypeData[] + */ + public function getAllBasic() + { + return $this->getAll(); + } +} \ No newline at end of file