diff --git a/Phraseanet-production-client/config/config.js b/Phraseanet-production-client/config/config.js index 96f9c18bf7..daa91829f2 100644 --- a/Phraseanet-production-client/config/config.js +++ b/Phraseanet-production-client/config/config.js @@ -13,5 +13,5 @@ module.exports = { setupDir: _root + 'tests/setup/node.js', karmaConf: _root + 'config/karma.conf.js', // change this version when you change JS file for lazy loading - assetFileVersion: 80 + assetFileVersion: 81 }; diff --git a/Phraseanet-production-client/dist/authenticate.js b/Phraseanet-production-client/dist/authenticate.js index c30192da2b..4abde9170d 100644 --- a/Phraseanet-production-client/dist/authenticate.js +++ b/Phraseanet-production-client/dist/authenticate.js @@ -96,7 +96,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=80"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=81"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { diff --git a/Phraseanet-production-client/dist/authenticate.min.js b/Phraseanet-production-client/dist/authenticate.min.js index a1b9b21e4f..7a89c65e58 100644 --- a/Phraseanet-production-client/dist/authenticate.min.js +++ b/Phraseanet-production-client/dist/authenticate.min.js @@ -96,7 +96,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=80"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=81"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { diff --git a/Phraseanet-production-client/dist/commons.js b/Phraseanet-production-client/dist/commons.js index 5cc540c8f4..fe13200191 100644 --- a/Phraseanet-production-client/dist/commons.js +++ b/Phraseanet-production-client/dist/commons.js @@ -91,7 +91,7 @@ /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=80"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=81"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { diff --git a/Phraseanet-production-client/dist/commons.min.js b/Phraseanet-production-client/dist/commons.min.js index b2c7022e44..1282ae1d5a 100644 --- a/Phraseanet-production-client/dist/commons.min.js +++ b/Phraseanet-production-client/dist/commons.min.js @@ -91,7 +91,7 @@ /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=80"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=81"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { diff --git a/Phraseanet-production-client/dist/production.js b/Phraseanet-production-client/dist/production.js index e59db15740..c458161622 100644 --- a/Phraseanet-production-client/dist/production.js +++ b/Phraseanet-production-client/dist/production.js @@ -4006,11 +4006,13 @@ var workzoneFacets = function workzoneFacets(services) { if (textLimit > 0 && textWithoutColorCode.length > textLimit) { textWithoutColorCode = textWithoutColorCode.substring(0, textLimit) + '…'; } + textWithoutColorCode = (0, _jquery2.default)('
').text(textWithoutColorCode).html(); // escape html return '' + ' ' + textWithoutColorCode; } else { if (textLimit > 0 && string.length > textLimit) { string = string.substring(0, textLimit) + '…'; } + string = (0, _jquery2.default)('
').text(string).html(); // escape html return string; } } diff --git a/Phraseanet-production-client/dist/production.min.js b/Phraseanet-production-client/dist/production.min.js index e59db15740..c458161622 100644 --- a/Phraseanet-production-client/dist/production.min.js +++ b/Phraseanet-production-client/dist/production.min.js @@ -4006,11 +4006,13 @@ var workzoneFacets = function workzoneFacets(services) { if (textLimit > 0 && textWithoutColorCode.length > textLimit) { textWithoutColorCode = textWithoutColorCode.substring(0, textLimit) + '…'; } + textWithoutColorCode = (0, _jquery2.default)('
').text(textWithoutColorCode).html(); // escape html return '' + ' ' + textWithoutColorCode; } else { if (textLimit > 0 && string.length > textLimit) { string = string.substring(0, textLimit) + '…'; } + string = (0, _jquery2.default)('
').text(string).html(); // escape html return string; } } diff --git a/Phraseanet-production-client/src/components/ui/workzone/facets/index.js b/Phraseanet-production-client/src/components/ui/workzone/facets/index.js index 39504ecc75..2c7d177f30 100644 --- a/Phraseanet-production-client/src/components/ui/workzone/facets/index.js +++ b/Phraseanet-production-client/src/components/ui/workzone/facets/index.js @@ -195,11 +195,12 @@ const workzoneFacets = services => { return source; } - function _formatColorText(string, textLimit = 0) { + function _formatColorText(string) { + var textLimit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + //get color code from text if exist var regexp = /^(.*)\[#([0-9a-fA-F]{6})].*$/; - var match = string.match(regexp); if (match && match[2] != null) { var colorCode = '#' + match[2]; @@ -208,11 +209,13 @@ const workzoneFacets = services => { if (textLimit > 0 && textWithoutColorCode.length > textLimit) { textWithoutColorCode = textWithoutColorCode.substring(0, textLimit) + '…'; } + textWithoutColorCode = $('
').text(textWithoutColorCode).html(); // escape html return '' + ' ' + textWithoutColorCode; } else { if (textLimit > 0 && string.length > textLimit) { string = string.substring(0, textLimit) + '…'; } + string = $('
').text(string).html(); // escape html return string; } } diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php index b16964435b..4b2737e01d 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php @@ -97,6 +97,7 @@ use GuzzleHttp\Client as Guzzle; use League\Fractal\Resource\Item; use media_subdef; use Neutron\TemporaryFilesystem\TemporaryFilesystemInterface; +use record_adapter; use Symfony\Component\Form\Form; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\Request; @@ -1056,7 +1057,7 @@ class V1Controller extends Controller $ret = ['entity' => null]; - if ($output instanceof \record_adapter) { + if ($output instanceof record_adapter) { $ret['entity'] = '0'; $ret['url'] = '/records/' . $output->getDataboxId() . '/' . $output->getRecordId() . '/'; $this->dispatch(PhraseaEvents::RECORD_UPLOAD, new RecordEdit($output)); @@ -1133,7 +1134,7 @@ class V1Controller extends Controller return Result::create($request, $ret)->createResponse(); } - private function listEmbeddableMedia(Request $request, \record_adapter $record, \media_subdef $media) + private function listEmbeddableMedia(Request $request, record_adapter $record, \media_subdef $media) { if (!$media->is_physically_present()) { return null; @@ -1653,10 +1654,10 @@ class V1Controller extends Controller * Retrieve detailed information about one record * * @param Request $request - * @param \record_adapter $record + * @param record_adapter $record * @return array */ - private function listRecord(Request $request, \record_adapter $record) + private function listRecord(Request $request, record_adapter $record) { $technicalInformation = []; foreach ($record->get_technical_infos()->getValues() as $name => $value) { @@ -1667,7 +1668,7 @@ class V1Controller extends Controller 'databox_id' => $record->getDataboxId(), 'record_id' => $record->getRecordId(), 'mime_type' => $record->getMimeType(), - 'title' => $record->get_title(), + 'title' => $record->get_title(['encode'=> record_adapter::ENCODE_NONE]), 'original_name' => $record->get_original_name(), 'updated_on' => $record->getUpdated()->format(DATE_ATOM), 'created_on' => $record->getCreated()->format(DATE_ATOM), @@ -1696,11 +1697,11 @@ class V1Controller extends Controller * Retrieve detailed information about one story * * @param Request $request - * @param \record_adapter $story + * @param record_adapter $story * @return array * @throws \Exception */ - private function listStory(Request $request, \record_adapter $story) + private function listStory(Request $request, record_adapter $story) { if (!$story->isStory()) { return Result::createError($request, 404, 'Story not found')->createResponse(); @@ -1796,10 +1797,10 @@ class V1Controller extends Controller /** * List all fields of given record * - * @param \record_adapter $record + * @param record_adapter $record * @return array */ - private function listRecordMetadata(\record_adapter $record) + private function listRecordMetadata(record_adapter $record) { $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); @@ -1862,10 +1863,10 @@ class V1Controller extends Controller /** * Retrieve detailed information about one status * - * @param \record_adapter $record + * @param record_adapter $record * @return array */ - private function listRecordStatus(\record_adapter $record) + private function listRecordStatus(record_adapter $record) { $ret = []; foreach ($record->getStatusStructure() as $bit => $status) { @@ -1896,7 +1897,7 @@ class V1Controller extends Controller }, (array) $record->get_container_baskets($this->app['orm.em'], $this->getAuthenticatedUser())); - $stories = array_map(function (\record_adapter $story) use ($request) { + $stories = array_map(function (record_adapter $story) use ($request) { return $this->listStory($request, $story); }, array_values($record->get_grouping_parents()->get_elements())); @@ -2551,7 +2552,7 @@ class V1Controller extends Controller $stories[] = $this->createStory($data); } - $result = Result::create($request, array('stories' => array_map(function(\record_adapter $story) { + $result = Result::create($request, array('stories' => array_map(function(record_adapter $story) { return sprintf('/stories/%s/%s/', $story->getDataboxId(), $story->getRecordId()); }, $stories))); @@ -2560,7 +2561,7 @@ class V1Controller extends Controller /** * @param object $data - * @return \record_adapter + * @return record_adapter * @throws \Exception */ protected function createStory($data) @@ -2571,7 +2572,7 @@ class V1Controller extends Controller $this->app->abort(403, sprintf('You can not create a story on this collection %s', $collection->get_base_id())); } - $story = \record_adapter::createStory($this->app, $collection); + $story = record_adapter::createStory($this->app, $collection); if (isset($data->{'title'})) { $story->set_original_name((string) $data->{'title'}); @@ -2633,7 +2634,7 @@ class V1Controller extends Controller private function addOrDelStoryRecordsFromRequest(Request $request, $databox_id, $story_id, $action) { $data = $this->decodeJsonBody($request, 'story_records.json'); - $story = new \record_adapter($this->app, $databox_id, $story_id); + $story = new record_adapter($this->app, $databox_id, $story_id); $previousDescriptions = $story->getRecordDescriptionAsArray(); $records = $this->addOrDelStoryRecordsFromData($story, $data->story_records, $action); @@ -2644,7 +2645,7 @@ class V1Controller extends Controller return $result->createResponse(); } - private function addOrDelStoryRecordsFromData(\record_adapter $story, array $recordsData, $action) + private function addOrDelStoryRecordsFromData(record_adapter $story, array $recordsData, $action) { $records = array(); $cover_set = false; @@ -2670,7 +2671,7 @@ class V1Controller extends Controller return $records; } - private function addOrDelStoryRecord(\record_adapter $story, $data, $action) + private function addOrDelStoryRecord(record_adapter $story, $data, $action) { $databox_id = $data->{'databox_id'}; $record_id = $data->{'record_id'}; @@ -2685,7 +2686,7 @@ class V1Controller extends Controller } try { - $record = new \record_adapter($this->app, $databox_id, $record_id); + $record = new record_adapter($this->app, $databox_id, $record_id); } catch (\Exception_Record_AdapterNotFound $e) { $record = null; $this->app->abort(404, sprintf('Record identified by databox_is %s and record_id %s could not be found', $databox_id, $record_id)); @@ -2715,7 +2716,7 @@ class V1Controller extends Controller { $data = $this->decodeJsonBody($request, 'story_cover.json'); - $story = new \record_adapter($this->app, $databox_id, $story_id); + $story = new record_adapter($this->app, $databox_id, $story_id); $coverSource = []; @@ -2733,7 +2734,7 @@ class V1Controller extends Controller return Result::create($request, array($record_key))->createResponse(); } - protected function setStoryCover(\record_adapter $story, $fromChildRecordId, $can_fail=false, $coverSources = []) + protected function setStoryCover(record_adapter $story, $fromChildRecordId, $can_fail=false, $coverSources = []) { $coverSources = array_merge(['thumbnail_cover_source' => 'thumbnail', 'preview_cover_source' => 'preview'], $coverSources); @@ -3339,10 +3340,10 @@ class V1Controller extends Controller /** * @param Request $request - * @param \record_adapter $record + * @param record_adapter $record * @return array */ - private function listRecordEmbeddableMedias(Request $request, \record_adapter $record) + private function listRecordEmbeddableMedias(Request $request, record_adapter $record) { $subdefs = []; @@ -3356,10 +3357,10 @@ class V1Controller extends Controller } /** - * @param \record_adapter $record + * @param record_adapter $record * @return array */ - private function listRecordCaption(\record_adapter $record) + private function listRecordCaption(record_adapter $record) { $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); @@ -3395,7 +3396,7 @@ class V1Controller extends Controller } /** - * @param RecordCollection|\record_adapter[] $references + * @param RecordCollection|record_adapter[] $references * @return RecordView[] */ private function buildRecordViews($references) diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php index 8413a56a1c..1a4849fc22 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php @@ -152,7 +152,7 @@ class V3ResultHelpers 'databox_id' => $record->getDataboxId(), 'record_id' => $record->getRecordId(), 'mime_type' => $record->getMimeType(), - 'title' => $record->get_title(), + 'title' => $record->get_title(['encode'=> record_adapter::ENCODE_NONE]), 'original_name' => $record->get_original_name(), 'updated_on' => $record->getUpdated()->format(DATE_ATOM), 'created_on' => $record->getCreated()->format(DATE_ATOM), diff --git a/lib/Alchemy/Phrasea/Controller/LightboxController.php b/lib/Alchemy/Phrasea/Controller/LightboxController.php index 804e67ffbb..f17c036ab7 100644 --- a/lib/Alchemy/Phrasea/Controller/LightboxController.php +++ b/lib/Alchemy/Phrasea/Controller/LightboxController.php @@ -22,6 +22,7 @@ use Alchemy\Phrasea\Model\Manipulator\TokenManipulator; use Alchemy\Phrasea\Model\Repositories\BasketElementRepository; use Alchemy\Phrasea\Model\Repositories\BasketRepository; use Alchemy\Phrasea\Model\Repositories\TokenRepository; +use record_adapter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -107,7 +108,7 @@ class LightboxController extends Controller if ($this->app['browser']->isMobile()) { return $this->renderResponse('lightbox/basket_element.html.twig', [ 'basket_element' => $basketElement, - 'module_name' => $basketElement->getRecord($this->app)->get_title(), + 'module_name' => $basketElement->getRecord($this->app)->get_title(['encode'=> record_adapter::ENCODE_NONE]), 'nextId' => $nextId, 'prevId' => $prevId ]); @@ -116,7 +117,7 @@ class LightboxController extends Controller $ret = []; $ret['number'] = $basketElement->getRecord($this->app)->getNumber(); - $ret['title'] = $basketElement->getRecord($this->app)->get_title(); + $ret['title'] = $basketElement->getRecord($this->app)->get_title(['encode'=> record_adapter::ENCODE_NONE]); $ret['preview'] = $this->render( 'common/preview.html.twig', @@ -157,13 +158,13 @@ class LightboxController extends Controller if ($browser->isMobile()) { return $this->renderResponse('lightbox/feed_element.html.twig', [ 'feed_element' => $item, - 'module_name' => $record->get_title() + 'module_name' => $record->get_title(['encode'=> record_adapter::ENCODE_NONE]) ]); } $ret = []; $ret['number'] = $record->getNumber(); - $ret['title'] = $record->get_title(); + $ret['title'] = $record->get_title(['encode'=> record_adapter::ENCODE_NONE]); $ret['preview'] = $this->render('common/preview.html.twig', [ 'record' => $record, 'not_wrapped' => true, diff --git a/lib/Alchemy/Phrasea/Controller/PermalinkController.php b/lib/Alchemy/Phrasea/Controller/PermalinkController.php index 5f150c8a4a..d3bf6e6e8b 100644 --- a/lib/Alchemy/Phrasea/Controller/PermalinkController.php +++ b/lib/Alchemy/Phrasea/Controller/PermalinkController.php @@ -11,7 +11,6 @@ namespace Alchemy\Phrasea\Controller; use Alchemy\Embed\Media\Media; -use Alchemy\Embed\Media\MediaInformation; use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Application\Helper\ApplicationBoxAware; use Alchemy\Phrasea\Authentication\ACLProvider; @@ -20,6 +19,7 @@ use Alchemy\Phrasea\Core\Event\ExportEvent; use Alchemy\Phrasea\Core\PhraseaEvents; use Alchemy\Phrasea\Model\Repositories\BasketElementRepository; use Alchemy\Phrasea\Model\Serializer\CaptionSerializer; +use record_adapter; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -90,7 +90,7 @@ class PermalinkController extends AbstractDelivery 'sbas_id' => $sbas_id, 'record_id' => $record_id, 'subdef' => $subdefName, - 'label' => str_replace('/', '_', $record->get_title()), + 'label' => str_replace('/', '_', $record->get_title(['encode'=> record_adapter::ENCODE_FOR_URI])), 'token' => $token, ] ); @@ -171,14 +171,14 @@ class PermalinkController extends AbstractDelivery /** * @param Request $request - * @param \record_adapter $record + * @param record_adapter $record * @param string $subdef * @param bool $watermark * @param bool $stamp * @param string $token * @return Response */ - private function deliverContentWithCaptionLink(Request $request, \record_adapter $record, $subdef, $watermark, $stamp, $token) + private function deliverContentWithCaptionLink(Request $request, record_adapter $record, $subdef, $watermark, $stamp, $token) { $response = $this->deliverContent($request, $record, $subdef, $watermark, $stamp); @@ -201,7 +201,7 @@ class PermalinkController extends AbstractDelivery * @param string $token * @param int $record_id * @param string $subdef - * @return \record_adapter + * @return record_adapter */ private function retrieveRecord(\databox $databox, $token, $record_id, $subdef) { diff --git a/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php b/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php index 63c469d0fa..edd01bba04 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php @@ -14,6 +14,7 @@ use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Controller\RecordsRequest; use Alchemy\Phrasea\Helper\Record as RecordHelper; use Alchemy\Phrasea\Out\Module\PDFRecords; +use record_adapter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; @@ -43,7 +44,7 @@ class PrinterController extends Controller $r = RecordsRequest::fromRequest($this->app, $request, false); if ($r->isSingleStory()) { - $pdfTitle = $r->singleStory()->get_title(); + $pdfTitle = $r->singleStory()->get_title(['encode'=> record_adapter::ENCODE_NONE]); $storyId = $r->singleStory()->getId(); } diff --git a/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php b/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php index dd2489073f..3c4e09ad75 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php @@ -23,7 +23,9 @@ use Alchemy\Phrasea\Model\Repositories\BasketElementRepository; use Alchemy\Phrasea\Model\Repositories\StoryWZRepository; use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; use Alchemy\Phrasea\Twig\PhraseanetExtension; +use record_adapter; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -31,12 +33,14 @@ class RecordController extends Controller { use EntityManagerAware; use SearchEngineAware; + /** * Get record detailed view * * @param Request $request * - * @return \Symfony\Component\HttpFoundation\JsonResponse + * @return JsonResponse + * @throws \Exception */ public function getRecord(Request $request) { @@ -92,14 +96,7 @@ class RecordController extends Controller } $recordCaptions["technicalInfo"] = $record->getPositionFromTechnicalInfos(); - // escape record title before rendering - $recordTitle = explode("", $record->get_title()); - if (count($recordTitle) >1) { - $recordTitle[1] = htmlspecialchars($recordTitle[1]); - $recordTitle = implode("", $recordTitle); - } else { - $recordTitle = htmlspecialchars($record->get_title()); - } + $recordTitle = $this->render('prod/preview/title.html.twig', ['record' => $record]); $containerType = null; @@ -207,7 +204,7 @@ class RecordController extends Controller public function getRecordById($sbasId, $recordId) { - $record = new \record_adapter($this->app, $sbasId, $recordId); + $record = new record_adapter($this->app, $sbasId, $recordId); return $this->app->json([ "html_preview" => $this->render('common/preview.html.twig', [ 'record' => $record @@ -244,7 +241,7 @@ class RecordController extends Controller $manager = $this->getEntityManager(); - /** @var \record_adapter $record */ + /** @var record_adapter $record */ foreach ($records as $record) { try { $basketElements = $basketElementsRepository->findElementsByRecord($record); @@ -378,7 +375,7 @@ class RecordController extends Controller $trashCollectionsBySbasId = []; foreach ($records as $record) { - /** @var \record_adapter $record */ + /** @var record_adapter $record */ $sbasId = $record->getDatabox()->get_sbas_id(); if (!array_key_exists($sbasId, $trashCollectionsBySbasId)) { $trashCollectionsBySbasId[$sbasId] = $record->getDatabox()->getTrashCollection(); @@ -407,7 +404,7 @@ class RecordController extends Controller * * @param Request $request * - * @return \Symfony\Component\HttpFoundation\JsonResponse + * @return JsonResponse * @throws \Alchemy\Phrasea\Cache\Exception */ public function renewUrl(Request $request) diff --git a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php index 585b6f5df2..fa48ca253e 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php @@ -28,6 +28,7 @@ use Alchemy\Phrasea\WorkerManager\Event\WorkerEvents; use DataURI\Parser; use MediaAlchemyst\Alchemyst; use MediaVorus\MediaVorus; +use record_adapter; use Symfony\Component\HttpFoundation\Request; class ToolsController extends Controller @@ -46,7 +47,7 @@ class ToolsController extends Controller $recordAccessibleSubdefs = array(); $listsubdef= null; if (count($records) == 1) { - /** @var \record_adapter $record */ + /** @var record_adapter $record */ $record = $records->first(); /**Array list of subdefs**/ @@ -94,7 +95,7 @@ class ToolsController extends Controller $availableSubdefName = []; $countSubdefTodo = []; - /** @var \record_adapter $rec */ + /** @var record_adapter $rec */ foreach ($records as $rec) { $databoxSubdefs = $rec->getDatabox()->get_subdef_structure()->getSubdefGroup($rec->getType()); if ($databoxSubdefs !== null) { @@ -218,7 +219,7 @@ class ToolsController extends Controller throw new RuntimeException('Error while renaming file'); } - $record = new \record_adapter($this->app, $request->get('sbas_id'), $request->get('record_id')); + $record = new record_adapter($this->app, $request->get('sbas_id'), $request->get('record_id')); $media = $this->app->getMediaFromUri($tempoFile); @@ -278,7 +279,7 @@ class ToolsController extends Controller throw new RuntimeException('Error while renaming file'); } - $record = new \record_adapter($this->app, $request->get('sbas_id'), $request->get('record_id')); + $record = new record_adapter($this->app, $request->get('sbas_id'), $request->get('record_id')); $media = $this->app->getMediaFromUri($tempoFile); @@ -306,9 +307,9 @@ class ToolsController extends Controller $template = 'prod/actions/Tools/confirm.html.twig'; try { - $record = new \record_adapter($this->app, $request->request->get('sbas_id'), $request->request->get('record_id')); + $record = new record_adapter($this->app, $request->request->get('sbas_id'), $request->request->get('record_id')); $var = [ - 'video_title' => $record->get_title(), + 'video_title' => $record->get_title(['encode'=> record_adapter::ENCODE_NONE]), 'image' => $request->request->get('image', ''), ]; $return = [ @@ -328,7 +329,7 @@ class ToolsController extends Controller public function applyThumbnailExtractionAction(Request $request) { try { - $record = new \record_adapter($this->app, $request->request->get('sbas_id'), $request->request->get('record_id')); + $record = new record_adapter($this->app, $request->request->get('sbas_id'), $request->request->get('record_id')); $subDef = $request->request->get('sub_def'); @@ -359,7 +360,7 @@ class ToolsController extends Controller public function editRecordSharing(Request $request, $base_id, $record_id) { - $record = new \record_adapter($this->app, \phrasea::sbasFromBas($this->app, $base_id), $record_id); + $record = new record_adapter($this->app, \phrasea::sbasFromBas($this->app, $base_id), $record_id); $subdefName = (string)$request->request->get('name'); $state = $request->request->get('state') == 'true' ? true : false; @@ -422,12 +423,12 @@ class ToolsController extends Controller } /** - * @param \record_adapter $record + * @param record_adapter $record * @param string $subDefName * @param string $subDefDataUri * @throws \DataURI\Exception\InvalidDataException */ - private function substituteMedia(\record_adapter $record, $subDefName, $subDefDataUri) + private function substituteMedia(record_adapter $record, $subDefName, $subDefDataUri) { $dataUri = Parser::parse($subDefDataUri); @@ -456,7 +457,7 @@ class ToolsController extends Controller */ public function saveMetasAction(Request $request) { - $record = new \record_adapter($this->app, + $record = new record_adapter($this->app, (int)$request->request->get("databox_id"), (int)$request->request->get("record_id")); @@ -482,7 +483,7 @@ class ToolsController extends Controller public function autoSubtitleAction(Request $request) { - $record = new \record_adapter($this->app, + $record = new record_adapter($this->app, (int)$request->request->get("databox_id"), (int)$request->request->get("record_id") ); @@ -522,7 +523,7 @@ class ToolsController extends Controller $videoTextTrackFields = []; if (count($records) == 1) { - /** @var \record_adapter $record */ + /** @var record_adapter $record */ $record = $records->first(); $databox = $record->getDatabox(); @@ -568,7 +569,7 @@ class ToolsController extends Controller ]); } - private function isPhysicallyPresent(\record_adapter $record, $subdefName) + private function isPhysicallyPresent(record_adapter $record, $subdefName) { try { return $record->get_subdef($subdefName)->is_physically_present(); diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php index 72c718ba5f..43c84d9957 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php @@ -12,9 +12,9 @@ namespace Alchemy\Phrasea\ControllerProvider\Prod; use Alchemy\Phrasea\Application as PhraseaApplication; -use Alchemy\Phrasea\Core\LazyLocator; use Alchemy\Phrasea\Controller\Prod\RecordController; use Alchemy\Phrasea\ControllerProvider\ControllerProviderTrait; +use Alchemy\Phrasea\Core\LazyLocator; use Silex\Application; use Silex\ControllerProviderInterface; use Silex\ServiceProviderInterface; @@ -45,21 +45,26 @@ class Record implements ControllerProviderInterface, ServiceProviderInterface { $controllers = $this->createAuthenticatedCollection($app); + /** @uses RecordController::getRecord() */ $controllers->match('/', 'controller.prod.records:getRecord') ->bind('record_details') ->method('GET|POST'); + /** @uses RecordController::getRecordById() */ $controllers->get('/record/{sbasId}/{recordId}/', 'controller.prod.records:getRecordById') ->bind('record_single') ->assert('sbasId', '\d+') ->assert('recordId', '\d+'); + /** @uses RecordController::doDeleteRecords() */ $controllers->post('/delete/', 'controller.prod.records:doDeleteRecords') ->bind('record_delete'); + /** @uses RecordController::whatCanIDelete() */ $controllers->post('/delete/what/', 'controller.prod.records:whatCanIDelete') ->bind('record_what_can_i_delete'); + /** @uses RecordController::renewUrl() */ $controllers->post('/renew-url/', 'controller.prod.records:renewUrl') ->bind('record_renew_url'); diff --git a/lib/Alchemy/Phrasea/Feed/Formatter/CoolirisFormatter.php b/lib/Alchemy/Phrasea/Feed/Formatter/CoolirisFormatter.php index a7f81addf9..28a95ca29c 100644 --- a/lib/Alchemy/Phrasea/Feed/Formatter/CoolirisFormatter.php +++ b/lib/Alchemy/Phrasea/Feed/Formatter/CoolirisFormatter.php @@ -14,13 +14,14 @@ namespace Alchemy\Phrasea\Feed\Formatter; use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Feed\FeedInterface; use Alchemy\Phrasea\Feed\Link\FeedLink; +use Alchemy\Phrasea\Feed\Link\LinkGeneratorCollection; use Alchemy\Phrasea\Feed\RSS\Image as FeedRSSImage; use Alchemy\Phrasea\Model\Entities\FeedEntry; use Alchemy\Phrasea\Model\Entities\FeedItem; -use Alchemy\Phrasea\Feed\Link\LinkGeneratorCollection; use Alchemy\Phrasea\Model\Entities\User; use Alchemy\Phrasea\Utilities\NullableDateTime; use DateTime; +use record_adapter; use Symfony\Component\HttpFoundation\Response; class CoolirisFormatter extends FeedFormatterAbstract implements FeedFormatterInterface @@ -208,7 +209,7 @@ class CoolirisFormatter extends FeedFormatterAbstract implements FeedFormatterIn if (null !== $title_field) { $str_title = $title_field->get_serialized_values(' '); } else { - $str_title = $content->getRecord($app)->get_title(); + $str_title = $content->getRecord($app)->get_title(['encode'=> record_adapter::ENCODE_FOR_HTML]); } //attach tile node to item node diff --git a/lib/Alchemy/Phrasea/Model/Repositories/StoryWZRepository.php b/lib/Alchemy/Phrasea/Model/Repositories/StoryWZRepository.php index d973d9ccdf..80b2f623ef 100644 --- a/lib/Alchemy/Phrasea/Model/Repositories/StoryWZRepository.php +++ b/lib/Alchemy/Phrasea/Model/Repositories/StoryWZRepository.php @@ -15,6 +15,7 @@ use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Model\Entities\StoryWZ; use Alchemy\Phrasea\Model\Entities\User; use Doctrine\ORM\EntityRepository; +use record_adapter; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -79,7 +80,7 @@ class StoryWZRepository extends EntityRepository if ($story) { try { - $story->getRecord($app)->get_title(); + $story->getRecord($app)->get_title(['encode'=> record_adapter::ENCODE_NONE]); } catch (NotFoundHttpException $e) { $this->getEntityManager()->remove($story); throw new NotFoundHttpException('Story not found'); @@ -95,7 +96,7 @@ class StoryWZRepository extends EntityRepository return $story; } - public function findUserStory(Application $app, User $user, \record_adapter $Story) + public function findUserStory(Application $app, User $user, record_adapter $Story) { $story = $this->findOneBy([ 'user' => $user->getId(), @@ -118,10 +119,10 @@ class StoryWZRepository extends EntityRepository /** * @param Application $app - * @param \record_adapter $Story + * @param record_adapter $Story * @return StoryWZ[] */ - public function findByRecord(Application $app, \record_adapter $Story) + public function findByRecord(Application $app, record_adapter $Story) { $dql = 'SELECT s FROM Phraseanet:StoryWZ s WHERE s.sbas_id = :sbas_id diff --git a/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php b/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php index 8c63c947dd..66fa637acc 100644 --- a/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php +++ b/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php @@ -10,9 +10,11 @@ namespace Alchemy\Phrasea\Model\Serializer; +use record_adapter; + class ESRecordSerializer extends AbstractSerializer { - public function serialize(\record_adapter $record) + public function serialize(record_adapter $record) { $caption = $business = $status = []; @@ -61,7 +63,7 @@ class ESRecordSerializer extends AbstractSerializer 'collection_id' => $record->getCollectionId(), 'base_id' => $record->getBaseId(), 'mime_type' => $record->getMimeType(), - 'title' => $record->get_title(), + 'title' => $record->get_title(['encode'=> record_adapter::ENCODE_NONE]), 'original_name' => $record->get_original_name(), 'updated_on' => $record->getUpdated()->format(DATE_ATOM), 'created_on' => $record->getCreated()->format(DATE_ATOM), diff --git a/lib/Alchemy/Phrasea/Out/Module/PDFCgu.php b/lib/Alchemy/Phrasea/Out/Module/PDFCgu.php index fab56239b6..5edcf0204a 100644 --- a/lib/Alchemy/Phrasea/Out/Module/PDFCgu.php +++ b/lib/Alchemy/Phrasea/Out/Module/PDFCgu.php @@ -4,7 +4,8 @@ namespace Alchemy\Phrasea\Out\Module; use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Out\Tool\PhraseaPDF; -use \IntlDateFormatter as DateFormatter; +use IntlDateFormatter as DateFormatter; +use record_adapter; class PDFCgu extends PDF { @@ -102,8 +103,8 @@ class PDFCgu extends PDF $ndoc = 0; foreach ($this->recordIds as $recordId) { - /* @var \record_adapter $rec */ - $rec = new \record_adapter($this->app, $this->databoxId, $recordId); + /* @var record_adapter $rec */ + $rec = new record_adapter($this->app, $this->databoxId, $recordId); $subdef = $rec->get_subdef('thumbnail'); $fimg = $subdef->getRealPath(); @@ -131,7 +132,7 @@ class PDFCgu extends PDF if ($this->pdf->GetY() > $this->pdf->getPageHeight() - (6 + $finalHeight + 20)) $this->pdf->AddPage(); - $title = "record : " . $rec->get_title(); + $title = "record : " . $rec->get_title(['encode'=> record_adapter::ENCODE_NONE]); $y = $this->pdf->GetY(); diff --git a/lib/Alchemy/Phrasea/Out/Module/PDFRecords.php b/lib/Alchemy/Phrasea/Out/Module/PDFRecords.php index 58c44bf6ab..05a5f384ba 100644 --- a/lib/Alchemy/Phrasea/Out/Module/PDFRecords.php +++ b/lib/Alchemy/Phrasea/Out/Module/PDFRecords.php @@ -12,11 +12,12 @@ namespace Alchemy\Phrasea\Out\Module; use Alchemy\Phrasea\Application; -use Alchemy\Phrasea\Media\MediaSubDefinitionUrlGenerator; -use Alchemy\Phrasea\Out\Tool\PhraseaPDF; use Alchemy\Phrasea\Helper\Record\Printer; +use Alchemy\Phrasea\Media\MediaSubDefinitionUrlGenerator; use Alchemy\Phrasea\Model\Entities\ValidationParticipant; -use \IntlDateFormatter as DateFormatter; +use Alchemy\Phrasea\Out\Tool\PhraseaPDF; +use IntlDateFormatter as DateFormatter; +use record_adapter; class PDFRecords extends PDF { @@ -200,7 +201,7 @@ class PDFRecords extends PDF $irow = $ipage = 0; $icol = -1; foreach ($this->records as $rec) { - /* @var \record_adapter $rec */ + /* @var record_adapter $rec */ if (++$icol >= $NDiapoW) { $icol = 0; if (++$irow >= $NDiapoH) { @@ -284,7 +285,7 @@ class PDFRecords extends PDF ); } - $downloadLink = $rec->get_title(); + $downloadLink = $rec->get_title(['encode'=> record_adapter::ENCODE_FOR_URI]); if ($this->canDownload && !empty($this->downloadSubdef) && $rec->has_subdef($this->downloadSubdef) @@ -295,7 +296,7 @@ class PDFRecords extends PDF $sd = $rec->get_subdef($this->downloadSubdef); if ($sd->is_physically_present()) { $url = $this->getDownloadUrl($sd); - $downloadLink = sprintf('%s', $url, $rec->get_title()); + $downloadLink = sprintf('%s', $url, $rec->get_title(['encode'=> record_adapter::ENCODE_FOR_HTML])); } } @@ -337,7 +338,7 @@ class PDFRecords extends PDF $this->pdf->SetLeftMargin($lmargin + 55); $ndoc = 0; - /* @var \record_adapter $rec */ + /* @var record_adapter $rec */ foreach ($this->records as $rec) { $subdef = null; @@ -393,7 +394,7 @@ class PDFRecords extends PDF if ($this->pdf->GetY() > $this->pdf->getPageHeight() - (6 + $finalHeight + 20)) $this->pdf->AddPage(); - $title = "record : " . $rec->get_title(); + $title = "record : " . $rec->get_title(['encode'=> record_adapter::ENCODE_NONE]); $y = $this->pdf->GetY(); @@ -495,9 +496,9 @@ class PDFRecords extends PDF $lmargin = $oldMargins['left']; $rmargin = $oldMargins['right']; - /* @var \record_adapter $rec */ + /* @var record_adapter $rec */ foreach ($this->records as $rec) { - $title = "record : " . $rec->get_title(); + $title = "record : " . $rec->get_title(['encode'=> record_adapter::ENCODE_NONE]); $y = $this->pdf->GetY(); if($this->pdf->getPageHeight() - $y < 30){ // height of the footer is 15 @@ -640,7 +641,7 @@ class PDFRecords extends PDF } foreach ($this->records as $krec => $rec) { - /* @var \record_adapter $rec */ + /* @var record_adapter $rec */ $this->pdf->AddPage(); @@ -763,7 +764,7 @@ class PDFRecords extends PDF $subdef = null; if ($rec->has_subdef($this->previewName)) { - /* @var \record_adapter $rec */ + /* @var record_adapter $rec */ $subdef = $rec->get_subdef($this->previewName); } @@ -938,7 +939,7 @@ class PDFRecords extends PDF return; } - private function showRecordInfoBloc(\record_adapter $rec) + private function showRecordInfoBloc(record_adapter $rec) { $r = $g = $b = 0; if (!empty($this->fieldTitleColor)) { @@ -949,7 +950,7 @@ class PDFRecords extends PDF $this->pdf->Write(5, $this->app->trans("print_feedback:: record title: ") . " "); $this->pdf->SetTextColor(0); $this->pdf->SetFont(PhraseaPDF::FONT, '', $this->descriptionFontSize); - $this->pdf->Write(5, $rec->get_title()); + $this->pdf->Write(5, $rec->get_title(['encode'=> record_adapter::ENCODE_NONE])); $this->pdf->Write(6, "\n"); if (!empty($this->fieldTitleColor)) { @@ -1096,7 +1097,7 @@ class PDFRecords extends PDF $infos = pathinfo($subdef->getRealPath()); if ($this->printer->getTitleAsDownloadName()) { - $filename = mb_strtolower(mb_substr($subdef->get_record()->get_title(['removeExtension' => true]), 0, self::$maxFilenameLength), 'UTF-8'); + $filename = mb_strtolower(mb_substr($subdef->get_record()->get_title(['removeExtension' => true, 'encode'=> record_adapter::ENCODE_FOR_URI]), 0, self::$maxFilenameLength), 'UTF-8'); } else { $originalName = $subdef->get_record()->get_original_name(true); $originalName = empty($originalName) ? $subdef->get_record()->getId() : $originalName; diff --git a/lib/Alchemy/Phrasea/Search/RecordTransformer.php b/lib/Alchemy/Phrasea/Search/RecordTransformer.php index d0130cdb4a..7dd6cd5a5e 100644 --- a/lib/Alchemy/Phrasea/Search/RecordTransformer.php +++ b/lib/Alchemy/Phrasea/Search/RecordTransformer.php @@ -11,6 +11,7 @@ namespace Alchemy\Phrasea\Search; use League\Fractal\TransformerAbstract; +use record_adapter; class RecordTransformer extends TransformerAbstract { @@ -55,7 +56,7 @@ class RecordTransformer extends TransformerAbstract 'databox_id' => $record->getDataboxId(), 'record_id' => $record->getRecordId(), 'mime_type' => $record->getMimeType(), - 'title' => $record->get_title(), + 'title' => $record->get_title(['encode'=> record_adapter::ENCODE_NONE]), 'original_name' => $record->get_original_name(), 'updated_on' => $record->getUpdated()->format(DATE_ATOM), 'created_on' => $record->getCreated()->format(DATE_ATOM), diff --git a/lib/Alchemy/Phrasea/Twig/PhraseanetExtension.php b/lib/Alchemy/Phrasea/Twig/PhraseanetExtension.php index 0afadb4322..88b9ac9690 100644 --- a/lib/Alchemy/Phrasea/Twig/PhraseanetExtension.php +++ b/lib/Alchemy/Phrasea/Twig/PhraseanetExtension.php @@ -60,7 +60,7 @@ class PhraseanetExtension extends \Twig_Extension { return [ // change this version when you change JS file to force the navigation to reload js file - 'assetFileVersion' => 80 + 'assetFileVersion' => 81 ]; } diff --git a/lib/classes/Bridge/Api/Youtube.php b/lib/classes/Bridge/Api/Youtube.php index fd298b6daf..7b56730aaf 100644 --- a/lib/classes/Bridge/Api/Youtube.php +++ b/lib/classes/Bridge/Api/Youtube.php @@ -645,7 +645,7 @@ class Bridge_Api_Youtube extends Bridge_Api_Abstract implements Bridge_Api_Inter $filesource = new Zend_Gdata_App_MediaFileSource($record->get_hd_file()->getRealPath()); $filesource->setContentType($record->get_hd_file()->get_mime()); - $filesource->setSlug($record->get_title()); + $filesource->setSlug($record->get_title(['encode'=> record_adapter::ENCODE_FOR_URI])); $video_entry->setMediaSource($filesource); $video_entry->setVideoTitle($options['title']); diff --git a/lib/classes/eventsmanager/notify/bridgeuploadfail.php b/lib/classes/eventsmanager/notify/bridgeuploadfail.php index 61154d2df1..c8f700af93 100644 --- a/lib/classes/eventsmanager/notify/bridgeuploadfail.php +++ b/lib/classes/eventsmanager/notify/bridgeuploadfail.php @@ -44,7 +44,7 @@ class eventsmanager_notify_bridgeuploadfail extends eventsmanager_notifyAbstract $ret = [ 'text' => $this->app->trans("L'upload concernant le record %title% sur le compte %bridge_name% a echoue pour les raisons suivantes : %reason%", [ - '%title%' => $record->get_title(), + '%title%' => $record->get_title(['encode'=> record_adapter::ENCODE_FOR_HTML]), '%bridge_name%' => $account->get_api()->get_connector()->get_name(), '%reason%' => $reason ]) diff --git a/lib/classes/media/Permalink/Adapter.php b/lib/classes/media/Permalink/Adapter.php index 6d73a0dcbe..b71be93c94 100644 --- a/lib/classes/media/Permalink/Adapter.php +++ b/lib/classes/media/Permalink/Adapter.php @@ -10,15 +10,13 @@ */ use Alchemy\Phrasea\Application; -use Alchemy\Phrasea\Exception\RuntimeException; use Alchemy\Phrasea\Model\Manipulator\TokenManipulator; use Alchemy\Phrasea\Utilities\NullableDateTime; use Assert\Assertion; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\DBALException; use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use Guzzle\Http\Url; -use \RandomLib\Generator; +use RandomLib\Generator; class media_Permalink_Adapter implements cache_cacheableInterface { @@ -396,7 +394,7 @@ class media_Permalink_Adapter implements cache_cacheableInterface // build a multi-rows insert $inserts = ''; // constant part values - $insk = ", 1, NOW(), NOW(), " . $connection->quote(self::cleanLabel($unicode, $record->get_title(['removeExtension' => true]))); + $insk = ", 1, NOW(), NOW(), " . $connection->quote(self::cleanLabel($unicode, $record->get_title(['removeExtension' => true, 'encode'=> record_adapter::ENCODE_FOR_URI]))); // multiple rows foreach($subdef_ids as $subdef_id) { // fake subdefs (icons substitution) for thumb/prev are hardcoded. @@ -487,7 +485,7 @@ class media_Permalink_Adapter implements cache_cacheableInterface 'token' => $generator->generateString(64, TokenManipulator::LETTERS_AND_NUMBERS), 'label' => self::cleanLabel( $unicode, - $records[$media_subdef->get_record_id()]->get_title(['removeExtension' => true]) + $records[$media_subdef->get_record_id()]->get_title(['removeExtension' => true, 'encode'=> record_adapter::ENCODE_FOR_URI]) ), ]; } diff --git a/lib/classes/module/report/nav.php b/lib/classes/module/report/nav.php index 09ad769ff9..1a1c2d7b1f 100644 --- a/lib/classes/module/report/nav.php +++ b/lib/classes/module/report/nav.php @@ -519,7 +519,7 @@ class module_report_nav extends module_report , 'record_id' => $record->getRecordId() , 'date' => $this->app['date-formatter']->getPrettyString($document->get_creation_date()) , 'type' => $document->get_mime() - , 'titre' => $record->get_title() + , 'titre' => $record->get_title(['encode'=> record_adapter::ENCODE_FOR_HTML]) , 'taille' => $document->get_size() ]; diff --git a/lib/classes/record/adapter.php b/lib/classes/record/adapter.php index ea6605df6f..69d07273f2 100644 --- a/lib/classes/record/adapter.php +++ b/lib/classes/record/adapter.php @@ -32,10 +32,10 @@ use Alchemy\Phrasea\Media\TechnicalData; use Alchemy\Phrasea\Media\TechnicalDataSet; use Alchemy\Phrasea\Metadata\Tag\TfBasename; use Alchemy\Phrasea\Metadata\Tag\TfFilename; -use Alchemy\Phrasea\Model\Repositories\FeedItemRepository; use Alchemy\Phrasea\Model\Entities\OrderElement; use Alchemy\Phrasea\Model\Entities\User; use Alchemy\Phrasea\Model\RecordInterface; +use Alchemy\Phrasea\Model\Repositories\FeedItemRepository; use Alchemy\Phrasea\Model\Serializer\CaptionSerializer; use Alchemy\Phrasea\Record\RecordReference; use Alchemy\Phrasea\Twig\PhraseanetExtension; @@ -63,6 +63,10 @@ class record_adapter implements RecordInterface, cache_cacheableInterface const CACHE_SUBDEFS = 'subdefs'; const CACHE_GROUPING = 'grouping'; + const ENCODE_NONE = 'encode_none'; + const ENCODE_FOR_HTML = 'encode_for_html'; + const ENCODE_FOR_URI = 'encode_for_uri'; + /** * @param Application $app * @return FilesystemService @@ -974,7 +978,7 @@ class record_adapter implements RecordInterface, cache_cacheableInterface public function getTitle($locale = null, Array $options = []) { $removeExtension = !!igorw\get_in($options, ['removeExtension'], false); - + $encode = igorw\get_in($options, ['encode'], self::ENCODE_NONE); $cache = !$removeExtension; if ($cache) { @@ -1002,7 +1006,16 @@ class record_adapter implements RecordInterface, cache_cacheableInterface $titles = []; foreach ($retrieved_fields as $value) { foreach ($value['values'] as $v) { - $titles[] = $v['value']; + $v = $v['value']; + switch ($encode) { + case self::ENCODE_FOR_HTML: + $v = htmlentities($v); + break; + case self::ENCODE_FOR_URI: + $v = urlencode($v); + break; + } + $titles[] = $v; } } $title = trim(implode(' - ', $titles)); @@ -1010,6 +1023,14 @@ class record_adapter implements RecordInterface, cache_cacheableInterface if (trim($title) === '') { $title = trim($this->get_original_name($removeExtension)); + switch ($encode) { + case self::ENCODE_FOR_HTML: + $title = htmlentities($title); + break; + case self::ENCODE_FOR_URI: + $title = urlencode($title); + break; + } } $title = $title != "" ? $title : $this->app->trans('reponses::document sans titre'); diff --git a/lib/classes/record/preview.php b/lib/classes/record/preview.php index 1b30d07412..18874b5143 100644 --- a/lib/classes/record/preview.php +++ b/lib/classes/record/preview.php @@ -119,7 +119,7 @@ class record_preview extends record_adapter $this->container = new record_adapter($app, $sbas_id, $record_id); $this->original_item = $this->container; - $this->name = $this->container->get_title(); + $this->name = $this->container->get_title(['encode'=> record_adapter::ENCODE_NONE]); if ($pos == 0) { $number = 0; } else { @@ -253,51 +253,66 @@ class record_preview extends record_adapter return $this->original_item; } - /** - * - * @return String - */ - public function get_title(Array $options = []) + public function getEnv() { - if ($this->title) { - return $this->title; - } - - $this->title = ''; - - switch ($this->env) { - - case "RESULT": - $this->title = ''; - $this->title .= $this->app->trans('Resultat %number% / %total%', ['%number%' => '' . $this->formatNumber($this->getNumber() + 1) . '', '%total%' => $this->formatNumber($this->total)]); - $this->title .= ' : ' . parent::get_title($options); - break; - case "BASK": - $this->title = ''; - $this->title .= $this->name . ' (' . $this->formatNumber($this->getNumber()) . ' / ' . $this->formatNumber($this->total) . ') : ' . parent::get_title($options); - - break; - case "REG": - $this->title = ''; - $this->title .= $this->name; - - if ($this->getNumber() != 0) { - $this->title .= sprintf( - ' (%s) : %s',$this->formatNumber($this->getNumber()) . ' / ' . $this->formatNumber($this->total), parent::get_title($options) - ); - } else { - $this->title .= ''; - } - - break; - default: - $this->title .= parent::get_title($options); - break; - } - - return $this->title; + return $this->env; } + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + + // PHRAS-3800 : html is now done in twig, so getting parent::get_title is fine + // --> no more overload +// /** +// * +// * @return String +// */ +// public function old_get_title(Array $options = []) +// { +// if ($this->title) { +// return $this->title; +// } +// +// $this->title = ''; +// +// switch ($this->env) { +// +// case "RESULT": +// $this->title = ''; +// $this->title .= $this->app->trans('Resultat %number% / %total%', ['%number%' => '' . $this->formatNumber($this->getNumber() + 1) . '', '%total%' => $this->formatNumber($this->total)]); +// $this->title .= ' : ' . parent::get_title($options); +// break; +// case "BASK": +// $this->title = ''; +// $this->title .= $this->name . ' (' . $this->formatNumber($this->getNumber()) . ' / ' . $this->formatNumber($this->total) . ') : ' . parent::get_title($options); +// +// break; +// case "REG": +// $this->title = ''; +// $this->title .= $this->name; +// +// if ($this->getNumber() != 0) { +// $this->title .= sprintf( +// ' (%s) : %s',$this->formatNumber($this->getNumber()) . ' / ' . $this->formatNumber($this->total), parent::get_title($options) +// ); +// } else { +// $this->title .= ''; +// } +// +// break; +// default: +// $this->title .= parent::get_title($options); +// break; +// } +// +// return $this->title; +// } + /** * @return mixed content */ @@ -788,7 +803,7 @@ class record_preview extends record_adapter return $this->download_popularity; } - private function formatNumber($number) + public function formatNumber($number) { return number_format($number, 0, null, ' '); } diff --git a/lib/classes/set/export.php b/lib/classes/set/export.php index 53dca0a69e..5e72a977b6 100644 --- a/lib/classes/set/export.php +++ b/lib/classes/set/export.php @@ -138,7 +138,7 @@ class set_export extends set_abstract $app, $child_basrec->getDataboxId(), $record_id, - $record->get_title(['removeExtension' => true]) . '_' . $n, + $record->get_title(['removeExtension' => true, 'encode'=> record_adapter::ENCODE_NONE]) . '_' . $n, $remain_hd[$base_id] ); $this->add_element($current_element); @@ -467,7 +467,7 @@ class set_export extends set_abstract // if ($rename_title) { // use the title (may be a concat of fields) - $export_name = strip_tags($download_element->get_title(['removeExtension' => true])); + $export_name = strip_tags($download_element->get_title(['removeExtension' => true, 'encode'=> record_adapter::ENCODE_FOR_URI])); // if the "title" ends up with a "filename-like" field, remove extension if (strtolower(substr($export_name, -strlen($extension)-1)) === '.'.strtolower($extension)) { $export_name = substr($export_name, 0, strlen($export_name)-1-strlen($extension)); diff --git a/templates/web/prod/preview/title.html.twig b/templates/web/prod/preview/title.html.twig new file mode 100644 index 0000000000..6fc72e853f --- /dev/null +++ b/templates/web/prod/preview/title.html.twig @@ -0,0 +1,29 @@ +{# @var \record_preview record #} +{% if record.env == "RESULT" %} + + {% trans with { + '%number%' : '' ~ record.formatNumber(record.getNumber() + 1) ~ '', + '%total%' : record.formatNumber(record.total) + } %} + Resultat %number% / %total% + {% endtrans %} + + {{ record.get_title() }} +{% elseif record.env == "BASK" %} + + {{ record.name }} + ({{ record.formatNumber(record.getNumber()) }} / {{ record.formatNumber(record.total) }}) + + {{ record.get_title() }} +{% elseif record.env == "REG" %} + + {{ record.name }} + {% if record.getNumber() != 0 %} + ({{ record.formatNumber(record.getNumber()) }} / {{ record.formatNumber(record.total) }}) + {{ record.get_title() }} + {% else %} + + {% endif %} +{% else %} + {{ record.get_title() }} +{% endif %}