diff --git a/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php index 1bbfc20c4b..c30fe916c0 100644 --- a/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php @@ -146,9 +146,17 @@ class RepositoriesServiceProvider implements ServiceProviderInterface $app['repo.databoxes'] = $app->share(function (PhraseaApplication $app) { $factory = new DataboxFactory($app); $appbox = $app->getApplicationBox(); - $repository = new DbalDataboxRepository($appbox->get_connection(), $factory); - return new CachingDataboxRepositoryDecorator($repository, $app['cache'], $appbox->get_cache_key($appbox::CACHE_LIST_BASES), $factory); + $repository = new CachingDataboxRepositoryDecorator( + new DbalDataboxRepository($appbox->get_connection(), $factory), + $app['cache'], + $appbox->get_cache_key($appbox::CACHE_LIST_BASES), + $factory + ); + + $factory->setDataboxRepository($repository); + + return $repository; }); $app['repo.fields.factory'] = $app->protect(function (\databox $databox) use ($app) { diff --git a/lib/Alchemy/Phrasea/Databox/CachingDataboxRepositoryDecorator.php b/lib/Alchemy/Phrasea/Databox/CachingDataboxRepositoryDecorator.php index 6f94cedb22..ee302fa76d 100644 --- a/lib/Alchemy/Phrasea/Databox/CachingDataboxRepositoryDecorator.php +++ b/lib/Alchemy/Phrasea/Databox/CachingDataboxRepositoryDecorator.php @@ -56,6 +56,13 @@ final class CachingDataboxRepositoryDecorator implements DataboxRepository return $databoxes; } + public function save(\databox $databox) + { + $this->cache->delete($this->cacheKey); + + $this->repository->save($databox); + } + /** * @param \databox[] $databoxes */ diff --git a/lib/Alchemy/Phrasea/Databox/DataboxFactory.php b/lib/Alchemy/Phrasea/Databox/DataboxFactory.php index 15b38281c6..522dd989f7 100644 --- a/lib/Alchemy/Phrasea/Databox/DataboxFactory.php +++ b/lib/Alchemy/Phrasea/Databox/DataboxFactory.php @@ -17,20 +17,33 @@ class DataboxFactory /** @var Application */ private $app; + /** @var DataboxRepository */ + private $databoxRepository; + + /** + * @param Application $app + */ public function __construct(Application $app) { $this->app = $app; } /** - * @param int $id + * @param DataboxRepository $databoxRepository + */ + public function setDataboxRepository(DataboxRepository $databoxRepository) + { + $this->databoxRepository = $databoxRepository; + } + + /** + * @param int $id * @param array $raw - * @throws NotFoundHttpException when Databox could not be retrieved from Persistence layer - * @return \databox + * @return \databox when Databox could not be retrieved from Persistence layer */ public function create($id, array $raw) { - return new \databox($this->app, $id, $raw); + return new \databox($this->app, $id, $this->databoxRepository, $raw); } /** @@ -43,7 +56,7 @@ class DataboxFactory $databoxes = []; foreach ($rows as $id => $raw) { - $databoxes[$id] = new \databox($this->app, $id, $raw); + $databoxes[$id] = new \databox($this->app, $id, $this->databoxRepository, $raw); } return $databoxes; diff --git a/lib/Alchemy/Phrasea/Databox/DataboxRepository.php b/lib/Alchemy/Phrasea/Databox/DataboxRepository.php index 73a4ccbb5d..9740e65698 100644 --- a/lib/Alchemy/Phrasea/Databox/DataboxRepository.php +++ b/lib/Alchemy/Phrasea/Databox/DataboxRepository.php @@ -21,4 +21,9 @@ interface DataboxRepository * @return \databox[] */ public function findAll(); + + /** + * @param \databox $databox + */ + public function save(\databox $databox); } diff --git a/lib/Alchemy/Phrasea/Databox/DbalDataboxRepository.php b/lib/Alchemy/Phrasea/Databox/DbalDataboxRepository.php index 45efe87112..0346009471 100644 --- a/lib/Alchemy/Phrasea/Databox/DbalDataboxRepository.php +++ b/lib/Alchemy/Phrasea/Databox/DbalDataboxRepository.php @@ -47,6 +47,11 @@ final class DbalDataboxRepository implements DataboxRepository return $this->factory->createMany($this->fetchRows()); } + public function save(\databox $databox) + { + return true; + } + /** * @param int $id * @return false|array diff --git a/lib/classes/databox.php b/lib/classes/databox.php index 34d0273367..a06c09c4e1 100644 --- a/lib/classes/databox.php +++ b/lib/classes/databox.php @@ -15,6 +15,7 @@ use Alchemy\Phrasea\Core\Connection\ConnectionSettings; use Alchemy\Phrasea\Core\PhraseaTokens; use Alchemy\Phrasea\Core\Thumbnail\ThumbnailedElement; use Alchemy\Phrasea\Core\Version\DataboxVersionRepository; +use Alchemy\Phrasea\Databox\DataboxRepository; use Alchemy\Phrasea\Databox\Record\RecordRepository; use Alchemy\Phrasea\Exception\InvalidArgumentException; use Alchemy\Phrasea\Model\Entities\User; @@ -74,23 +75,30 @@ class databox extends base implements ThumbnailedElement /** @var databox_subdefsStructure */ protected $subdef_struct; + /** @var DataboxRepository */ + private $databoxRepository; /** @var RecordRepository */ private $recordRepository; /** @var string[] */ private $labels = []; + /** @var int */ private $ord; + /** @var string */ private $viewname; + /** * @param Application $app - * @param int $sbas_id - * @param array $row + * @param int $sbas_id + * @param DataboxRepository $databoxRepository + * @param array $row */ - public function __construct(Application $app, $sbas_id, array $row) + public function __construct(Application $app, $sbas_id, DataboxRepository $databoxRepository, array $row) { assert(is_int($sbas_id)); assert($sbas_id > 0); + $this->databoxRepository = $databoxRepository; $this->id = $sbas_id; $connectionConfigs = phrasea::sbas_params($app); @@ -146,6 +154,7 @@ class databox extends base implements ThumbnailedElement cache_databox::update($this->app, $this->id, 'structure'); $this->viewname = $viewname; + $this->databoxRepository->save($this); return $this; } @@ -192,14 +201,10 @@ class databox extends base implements ThumbnailedElement */ public function get_collection_unique_ids() { - static $collectionsIds; + $collectionsIds = []; - if ($collectionsIds === null) { - $collectionsIds = []; - - foreach ($this->get_collections() as $collection) { - $collectionsIds[] = $collection->get_base_id(); - } + foreach ($this->get_collections() as $collection) { + $collectionsIds[] = $collection->get_base_id(); } return $collectionsIds; @@ -243,6 +248,8 @@ class databox extends base implements ThumbnailedElement $this->labels[$code] = $label; + $this->databoxRepository->save($this); + phrasea::reset_sbasDatas($this->app['phraseanet.appbox']); return $this; @@ -841,6 +848,8 @@ class databox extends base implements ThumbnailedElement cache_databox::update($this->app, $this->id, 'structure'); + $this->databoxRepository->save($this); + $this->app['dispatcher']->dispatch( DataboxEvents::STRUCTURE_CHANGED, new StructureChangedEvent( @@ -871,6 +880,8 @@ class databox extends base implements ThumbnailedElement $stmt->execute($params); $stmt->closeCursor(); + $this->databoxRepository->save($this); + return $this; } protected $thesaurus; @@ -888,6 +899,8 @@ class databox extends base implements ThumbnailedElement $stmt->closeCursor(); $this->delete_data_from_cache(databox::CACHE_THESAURUS); + $this->databoxRepository->save($this); + $this->app['dispatcher']->dispatch( DataboxEvents::THESAURUS_CHANGED, new ThesaurusChangedEvent( diff --git a/tests/Alchemy/Tests/Phrasea/Controller/Admin/DataboxTest.php b/tests/Alchemy/Tests/Phrasea/Controller/Admin/DataboxTest.php index e136521eed..61dabd3af2 100644 --- a/tests/Alchemy/Tests/Phrasea/Controller/Admin/DataboxTest.php +++ b/tests/Alchemy/Tests/Phrasea/Controller/Admin/DataboxTest.php @@ -645,6 +645,8 @@ class DataboxTest extends \PhraseanetAuthenticatedWebTestCase $data = json_decode(self::$DI['client']->getResponse()->getContent(), true); $this->assertTrue($data['success']); + $base = $this->getApplication()->findDataboxById($base->get_sbas_id()); + $this->assertEquals('frenchy label', $base->get_label('fr', false)); $this->assertEquals('', $base->get_label('en', false)); $this->assertEquals('Jaja label', $base->get_label('de', false));