Working : Add a link on documents

This commit is contained in:
gmorel
2013-09-24 12:25:19 +02:00
parent 0c769a3398
commit 430e18e4e2
9 changed files with 67 additions and 52 deletions

View File

@@ -93,45 +93,48 @@ class Document extends BaseCachedFile implements EventSubscriberInterface
* *
* This method updates the cache_file_path and file_url attributes of the event * This method updates the cache_file_path and file_url attributes of the event
* *
* @param DocumentEvent $event * @param DocumentEvent $event Event
* @throws \InvalidArgumentException, DocumentException *
* @throws \Thelia\Exception\DocumentException
* @throws \InvalidArgumentException , DocumentException
*/ */
public function processDocument(DocumentEvent $event) public function processDocument(DocumentEvent $event)
{ {
$subdir = $event->getCacheSubdirectory(); $subdir = $event->getCacheSubdirectory();
$source_file = $event->getSourceFilepath(); $sourceFile = $event->getSourceFilepath();
if (null == $subdir || null == $source_file) { if (null == $subdir || null == $sourceFile) {
throw new \InvalidArgumentException("Cache sub-directory and source file path cannot be null"); throw new \InvalidArgumentException("Cache sub-directory and source file path cannot be null");
} }
$originalDocumentPathInCache = $this->getCacheFilePath($subdir, $source_file, true); $originalDocumentPathInCache = $this->getCacheFilePath($subdir, $sourceFile, true);
if (! file_exists($originalDocumentPathInCache)) { if (! file_exists($originalDocumentPathInCache)) {
if (! file_exists($source_file)) { if (! file_exists($sourceFile)) {
throw new DocumentException(sprintf("Source document file %s does not exists.", $source_file)); throw new DocumentException(sprintf("Source document file %s does not exists.", $sourceFile));
} }
$mode = ConfigQuery::read('original_document_delivery_mode', 'symlink'); $mode = ConfigQuery::read('original_document_delivery_mode', 'symlink');
if ($mode == 'symlink') { if ($mode == 'symlink') {
if (false == symlink($source_file, $originalDocumentPathInCache)) { if (false == symlink($sourceFile, $originalDocumentPathInCache)) {
throw new DocumentException(sprintf("Failed to create symbolic link for %s in %s document cache directory", basename($source_file), $subdir)); throw new DocumentException(sprintf("Failed to create symbolic link for %s in %s document cache directory", basename($sourceFile), $subdir));
} }
} else {// mode = 'copy' } else {
if (false == @copy($source_file, $originalDocumentPathInCache)) { // mode = 'copy'
throw new DocumentException(sprintf("Failed to copy %s in %s document cache directory", basename($source_file), $subdir)); if (false == @copy($sourceFile, $originalDocumentPathInCache)) {
throw new DocumentException(sprintf("Failed to copy %s in %s document cache directory", basename($sourceFile), $subdir));
} }
} }
} }
// Compute the document URL // Compute the document URL
$document_url = $this->getCacheFileURL($subdir, basename($originalDocumentPathInCache)); $documentUrl = $this->getCacheFileURL($subdir, basename($originalDocumentPathInCache));
// Update the event with file path and file URL // Update the event with file path and file URL
$event->setDocumentPath($originalDocumentPathInCache); $event->setDocumentPath($documentUrl);
$event->setDocumentUrl(URL::getInstance()->absoluteUrl($document_url, null, URL::PATH_TO_FILE)); $event->setDocumentUrl(URL::getInstance()->absoluteUrl($documentUrl, null, URL::PATH_TO_FILE));
} }
/** /**
@@ -173,7 +176,7 @@ class Document extends BaseCachedFile implements EventSubscriberInterface
); );
} }
$newUploadedFile = $fileManager->copyUploadedFile($event->getParentId(), $event->getDocumentType(), $event->getModelDocument(), $event->getUploadedFile()); $newUploadedFile = $fileManager->copyUploadedFile($event->getParentId(), $event->getDocumentType(), $event->getModelDocument(), $event->getUploadedFile(), FileManager::FILE_TYPE_DOCUMENTS);
$event->setUploadedFile($newUploadedFile); $event->setUploadedFile($newUploadedFile);
} }
@@ -206,10 +209,7 @@ class Document extends BaseCachedFile implements EventSubscriberInterface
$url = $fileManager->getUploadDir($event->getDocumentType(), FileManager::FILE_TYPE_DOCUMENTS) . '/' . $event->getOldModelDocument()->getFile(); $url = $fileManager->getUploadDir($event->getDocumentType(), FileManager::FILE_TYPE_DOCUMENTS) . '/' . $event->getOldModelDocument()->getFile();
unlink(str_replace('..', '', $url)); unlink(str_replace('..', '', $url));
$newUploadedFile = $fileManager->copyUploadedFile( $newUploadedFile = $fileManager->copyUploadedFile($event->getParentId(), $event->getDocumentType(), $event->getModelDocument(), $event->getUploadedFile(), FileManager::FILE_TYPE_DOCUMENTS);
$event->getModelDocument()->getParentId(),
$event->getDocumentType(),
$event->getModelDocument(), $event->getUploadedFile());
$event->setUploadedFile($newUploadedFile); $event->setUploadedFile($newUploadedFile);
} }

View File

@@ -291,7 +291,7 @@ class Image extends BaseCachedFile implements EventSubscriberInterface
); );
} }
$newUploadedFile = $fileManager->copyUploadedFile($event->getParentId(), $event->getImageType(), $event->getModelImage(), $event->getUploadedFile()); $newUploadedFile = $fileManager->copyUploadedFile($event->getParentId(), $event->getImageType(), $event->getModelImage(), $event->getUploadedFile(), FileManager::FILE_TYPE_IMAGES);
$event->setUploadedFile($newUploadedFile); $event->setUploadedFile($newUploadedFile);
} }
@@ -321,13 +321,10 @@ class Image extends BaseCachedFile implements EventSubscriberInterface
// Copy and save file // Copy and save file
if ($event->getUploadedFile()) { if ($event->getUploadedFile()) {
// Remove old picture file from file storage // Remove old picture file from file storage
$url = $fileManager->getUploadDir($event->getImageType()) . '/' . $event->getOldModelImage()->getFile(); $url = $fileManager->getUploadDir($event->getImageType(), FileManager::FILE_TYPE_IMAGES) . '/' . $event->getOldModelImage()->getFile();
unlink(str_replace('..', '', $url)); unlink(str_replace('..', '', $url));
$newUploadedFile = $fileManager->copyUploadedFile( $newUploadedFile = $fileManager->copyUploadedFile($event->getParentId(), $event->getImageType(), $event->getModelImage(), $event->getUploadedFile(), FileManager::FILE_TYPE_IMAGES);
$event->getModelImage()->getParentId(),
$event->getImageType(),
$event->getModelImage(), $event->getUploadedFile());
$event->setUploadedFile($newUploadedFile); $event->setUploadedFile($newUploadedFile);
} }

View File

@@ -60,25 +60,25 @@
<form name="thelia.admin.category.creation" class="Thelia\Form\CategoryCreationForm"/> <form name="thelia.admin.category.creation" class="Thelia\Form\CategoryCreationForm"/>
<form name="thelia.admin.category.modification" class="Thelia\Form\CategoryModificationForm"/> <form name="thelia.admin.category.modification" class="Thelia\Form\CategoryModificationForm"/>
<form name="thelia.admin.category.image.modification" class="Thelia\Form\CategoryImageModification"/> <form name="thelia.admin.category.image.modification" class="Thelia\Form\CategoryImageModification"/>
<form name="thelia.admin.category.image.modification" class="Thelia\Form\CategoryDocumentModification"/> <form name="thelia.admin.category.document.modification" class="Thelia\Form\CategoryDocumentModification"/>
<form name="thelia.admin.product.creation" class="Thelia\Form\ProductCreationForm"/> <form name="thelia.admin.product.creation" class="Thelia\Form\ProductCreationForm"/>
<form name="thelia.admin.product.modification" class="Thelia\Form\ProductModificationForm"/> <form name="thelia.admin.product.modification" class="Thelia\Form\ProductModificationForm"/>
<form name="thelia.admin.product.details.modification" class="Thelia\Form\ProductDetailsModificationForm"/> <form name="thelia.admin.product.details.modification" class="Thelia\Form\ProductDetailsModificationForm"/>
<form name="thelia.admin.product.image.modification" class="Thelia\Form\ProductImageModification"/> <form name="thelia.admin.product.image.modification" class="Thelia\Form\ProductImageModification"/>
<form name="thelia.admin.product.image.modification" class="Thelia\Form\ProductDocumentModification"/> <form name="thelia.admin.product.document.modification" class="Thelia\Form\ProductDocumentModification"/>
<form name="thelia.admin.product.deletion" class="Thelia\Form\ProductModificationForm"/> <form name="thelia.admin.product.deletion" class="Thelia\Form\ProductModificationForm"/>
<form name="thelia.admin.folder.creation" class="Thelia\Form\FolderCreationForm"/> <form name="thelia.admin.folder.creation" class="Thelia\Form\FolderCreationForm"/>
<form name="thelia.admin.folder.modification" class="Thelia\Form\FolderModificationForm"/> <form name="thelia.admin.folder.modification" class="Thelia\Form\FolderModificationForm"/>
<form name="thelia.admin.folder.image.modification" class="Thelia\Form\FolderImageModification"/> <form name="thelia.admin.folder.image.modification" class="Thelia\Form\FolderImageModification"/>
<form name="thelia.admin.folder.image.modification" class="Thelia\Form\FolderDocumentModification"/> <form name="thelia.admin.folder.document.modification" class="Thelia\Form\FolderDocumentModification"/>
<form name="thelia.admin.content.creation" class="Thelia\Form\ContentCreationForm"/> <form name="thelia.admin.content.creation" class="Thelia\Form\ContentCreationForm"/>
<form name="thelia.admin.content.modification" class="Thelia\Form\ContentModificationForm"/> <form name="thelia.admin.content.modification" class="Thelia\Form\ContentModificationForm"/>
<form name="thelia.admin.content.image.modification" class="Thelia\Form\ContentImageModification"/> <form name="thelia.admin.content.image.modification" class="Thelia\Form\ContentImageModification"/>
<form name="thelia.admin.content.image.modification" class="Thelia\Form\ContentDocumentModification"/> <form name="thelia.admin.content.document.modification" class="Thelia\Form\ContentDocumentModification"/>
<form name="thelia.cart.add" class="Thelia\Form\CartAdd"/> <form name="thelia.cart.add" class="Thelia\Form\CartAdd"/>

View File

@@ -56,16 +56,18 @@
</route> </route>
<route id="admin.image.update.view" path="/admin/image/type/{parentType}/{imageId}/update" methods="get"> <route id="admin.image.update.view" path="/admin/image/type/{parentType}/{imageId}/update" methods="get">
<default key="_controller">Thelia\Controller\Admin\FileController::viewImageAction</default> <default key="_controller">Thelia\Controller\Admin\FileController::viewImageAction</default>
<requirement key="customer_id">\d+</requirement> <requirement key="parentType">.*</requirement>
<requirement key="imageId">\d+</requirement>
</route> </route>
<route id="admin.image.update.process" path="/admin/image/type/{parentType}/{imageId}/update" methods="post"> <route id="admin.image.update.process" path="/admin/image/type/{parentType}/{imageId}/update" methods="post">
<default key="_controller">Thelia\Controller\Admin\FileController::updateImageAction</default> <default key="_controller">Thelia\Controller\Admin\FileController::updateImageAction</default>
<requirement key="customer_id">\d+</requirement> <requirement key="parentType">.*</requirement>
<requirement key="imageId">\d+</requirement>
</route> </route>
<route id="admin.image.delete" path="/admin/image/type/{parentType}/delete/{imageId}"> <route id="admin.image.delete" path="/admin/image/type/{parentType}/delete/{imageId}">
<default key="_controller">Thelia\Controller\Admin\FileController::deleteImageAction</default> <default key="_controller">Thelia\Controller\Admin\FileController::deleteImageAction</default>
<requirement key="parentType">.*</requirement> <requirement key="parentType">.*</requirement>
<requirement key="parentId">\d+</requirement> <requirement key="imageId">\d+</requirement>
</route> </route>
<route id="admin.document.save-ajax" path="/admin/document/type/{parentType}/{parentId}/save-ajax"> <route id="admin.document.save-ajax" path="/admin/document/type/{parentType}/{parentId}/save-ajax">
@@ -85,16 +87,18 @@
</route> </route>
<route id="admin.document.update.view" path="/admin/document/type/{parentType}/{documentId}/update" methods="get"> <route id="admin.document.update.view" path="/admin/document/type/{parentType}/{documentId}/update" methods="get">
<default key="_controller">Thelia\Controller\Admin\FileController::viewDocumentAction</default> <default key="_controller">Thelia\Controller\Admin\FileController::viewDocumentAction</default>
<requirement key="customer_id">\d+</requirement> <requirement key="parentType">.*</requirement>
<requirement key="documentId">\d+</requirement>
</route> </route>
<route id="admin.document.update.process" path="/admin/document/type/{parentType}/{documentId}/update" methods="post"> <route id="admin.document.update.process" path="/admin/document/type/{parentType}/{documentId}/update" methods="post">
<default key="_controller">Thelia\Controller\Admin\FileController::updateDocumentAction</default> <default key="_controller">Thelia\Controller\Admin\FileController::updateDocumentAction</default>
<requirement key="customer_id">\d+</requirement> <requirement key="parentType">.*</requirement>
<requirement key="documentId">\d+</requirement>
</route> </route>
<route id="admin.document.delete" path="/admin/document/type/{parentType}/delete/{documentId}"> <route id="admin.document.delete" path="/admin/document/type/{parentType}/delete/{documentId}">
<default key="_controller">Thelia\Controller\Admin\FileController::deleteDocumentAction</default> <default key="_controller">Thelia\Controller\Admin\FileController::deleteDocumentAction</default>
<requirement key="parentType">.*</requirement> <requirement key="parentType">.*</requirement>
<requirement key="parentId">\d+</requirement> <requirement key="documentId">\d+</requirement>
</route> </route>
<!-- Customer rule management --> <!-- Customer rule management -->

View File

@@ -69,7 +69,7 @@ class DocumentCreateOrUpdateEvent extends ActionEvent
*/ */
public function __construct($documentType, $parentId) public function __construct($documentType, $parentId)
{ {
$this->imageType = $documentType; $this->documentType = $documentType;
$this->parentId = $parentId; $this->parentId = $parentId;
} }
@@ -106,7 +106,7 @@ class DocumentCreateOrUpdateEvent extends ActionEvent
*/ */
public function setDocumentType($documentType) public function setDocumentType($documentType)
{ {
$this->imageType = $documentType; $this->documentType = $documentType;
return $this; return $this;
} }

View File

@@ -93,7 +93,7 @@ class FileManagerTest extends \PHPUnit_Framework_TestCase {
$newUploadedFiles = array(); $newUploadedFiles = array();
$actual = $fileManager->copyUploadedFile(24, FileManager::TYPE_PRODUCT, $stubProductImage, $stubUploadedFile, $newUploadedFiles); $actual = $fileManager->copyUploadedFile(24, FileManager::TYPE_PRODUCT, $stubProductImage, $stubUploadedFile, $newUploadedFiles, FileManager::FILE_TYPE_IMAGES);
$this->assertCount(1, $actual); $this->assertCount(1, $actual);
} }
@@ -175,7 +175,7 @@ class FileManagerTest extends \PHPUnit_Framework_TestCase {
$newUploadedFiles = array(); $newUploadedFiles = array();
$actual = $fileManager->copyUploadedFile(24, FileManager::TYPE_PRODUCT, $stubProductImage, $stubUploadedFile, $newUploadedFiles); $actual = $fileManager->copyUploadedFile(24, FileManager::TYPE_PRODUCT, $stubProductImage, $stubUploadedFile, $newUploadedFiles, FileManager::FILE_TYPE_DOCUMENTS);
} }

View File

@@ -103,18 +103,19 @@ class FileManager
* Copy UploadedFile into the server storage directory * Copy UploadedFile into the server storage directory
* *
* @param int $parentId Parent id * @param int $parentId Parent id
* @param string $fileType Image type * @param string $parentType Image type
* @param FolderImage|ContentImage|CategoryImage|ProductImage|FolderDocument|ContentDocument|CategoryDocument|ProductDocument $model Model saved * @param FolderImage|ContentImage|CategoryImage|ProductImage|FolderDocument|ContentDocument|CategoryDocument|ProductDocument $model Model saved
* @param UploadedFile $uploadedFile Ready to be uploaded file * @param UploadedFile $uploadedFile Ready to be uploaded file
* @param string $fileType File type ex FileManager::FILE_TYPE_IMAGES
* *
* @throws \Thelia\Exception\ImageException * @throws \Thelia\Exception\ImageException
* @return UploadedFile * @return UploadedFile
*/ */
public function copyUploadedFile($parentId, $fileType, $model, $uploadedFile) public function copyUploadedFile($parentId, $parentType, $model, $uploadedFile, $fileType)
{ {
$newUploadedFile = null; $newUploadedFile = null;
if ($uploadedFile !== null) { if ($uploadedFile !== null) {
$directory = $this->getUploadDir($fileType, FileManager::FILE_TYPE_IMAGES); $directory = $this->getUploadDir($parentType, $fileType);
$fileName = $this->renameFile($model->getId(), $uploadedFile); $fileName = $this->renameFile($model->getId(), $uploadedFile);
$this->adminLogAppend( $this->adminLogAppend(
@@ -125,7 +126,7 @@ class FileManager
'%fileName%' => $uploadedFile->getClientOriginalName(), '%fileName%' => $uploadedFile->getClientOriginalName(),
'%directory%' => $directory . '/' . $fileName, '%directory%' => $directory . '/' . $fileName,
'%parentId%' => $parentId, '%parentId%' => $parentId,
'%parentType%' => $fileType '%parentType%' => $parentType
), ),
'image' 'image'
) )
@@ -137,8 +138,8 @@ class FileManager
if (!$model->save()) { if (!$model->save()) {
throw new ImageException( throw new ImageException(
sprintf( sprintf(
'*s %s (%s) failed to be saved (image file)', '%s %s (%s) failed to be saved (image file)',
ucfirst($fileType), ucfirst($parentType),
$model->getFile(), $model->getFile(),
$fileType $fileType
) )
@@ -629,11 +630,17 @@ class FileManager
public function renameFile($modelId, $uploadedFile) public function renameFile($modelId, $uploadedFile)
{ {
$extension = $uploadedFile->getClientOriginalExtension(); $extension = $uploadedFile->getClientOriginalExtension();
if (!empty($extension)) {
$extension = '.' . strtolower($extension);
}
$fileName = $this->sanitizeFileName( $fileName = $this->sanitizeFileName(
str_replace('.' . $extension, '', $uploadedFile->getClientOriginalName()) . "-" . $modelId . "." . strtolower( str_replace(
$extension $extension,
) '',
$uploadedFile->getClientOriginalName()
) . '-' . $modelId . $extension
); );
return $fileName; return $fileName;
} }

View File

@@ -5,7 +5,7 @@
{block name="check-permissions"}admin.document.edit{/block} {block name="check-permissions"}admin.document.edit{/block}
{block name="main-content"} {block name="main-content"}
<div class="documents edit-image"> <div class="documents edit-document">
<div id="wrapper" class="container"> <div id="wrapper" class="container">
@@ -48,6 +48,13 @@
<div class="row"> <div class="row">
<div class="col-md-6">
<div class="form-group">
<label class="control-label">{intl l="File"} : </label>
<p><a href="{$DOCUMENT_PATH}" title="{$TITLE}" target="_blank">{$TITLE}</a>
</div>
</div>
<div class="col-md-6"> <div class="col-md-6">
{form_field form=$form field='file'} {form_field form=$form field='file'}
<div class="form-group {if $error}has-error{/if}"> <div class="form-group {if $error}has-error{/if}">

View File

@@ -13,7 +13,7 @@ Parameters:
{loop type="document" name="document" source="{$documentType}" order="manual-reverse" source_id="{$parentId}"} {loop type="document" name="document" source="{$documentType}" order="manual-reverse" source_id="{$parentId}"}
<tr> <tr>
<td> <td>
<a href="{$DOCUMENT_URL}" title="{$TITLE}" class="">{$TITLE}</a> <a href="{$DOCUMENT_PATH}" title="{$TITLE}" class="" target="_blank">{$TITLE}</a>
</td> </td>
<td> <td>
<div class="btn-group"> <div class="btn-group">
@@ -28,4 +28,4 @@ Parameters:
</tr> </tr>
{/loop} {/loop}
</table> </table>
{/ifloop} {/ifloop}