Merge pull request #568 from lovenunu/fix-archiving

Fix archiving
This commit is contained in:
Manuel Raynaud
2014-08-05 15:57:51 +02:00
14 changed files with 197 additions and 110 deletions

View File

@@ -11,7 +11,6 @@
/*************************************************************************************/
namespace Thelia\Action;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Event\Cache\CacheEvent;

View File

@@ -11,7 +11,6 @@
/*************************************************************************************/
namespace Thelia\Action;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Event\Cache\CacheEvent;

View File

@@ -137,7 +137,7 @@
<service id="session.listener" class="Thelia\Core\EventListener\SessionListener">
<tag name="kernel.event_subscriber"/>
</service>
<!-- Archive builders -->
<service id="thelia.manager.archive_builder_manager" class="Thelia\Core\FileFormat\Archive\ArchiveBuilderManager">

View File

@@ -26,7 +26,6 @@ use Thelia\Files\FileModelInterface;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\Lang;
use Thelia\Tools\MimeTypeTools;
use Thelia\Tools\Rest\ResponseRest;
use Thelia\Tools\URL;
@@ -61,7 +60,7 @@ class FileController extends BaseAdminController
* @param string $parentType Parent Type owning files being saved (product, category, content, etc.)
* @param string $objectType Object type, e.g. image or document
* @param array $validMimeTypes an array of valid mime types. If empty, any mime type is allowed.
* @param array $extBlackList an array of blacklisted extensions.
* @param array $extBlackList an array of blacklisted extensions.
* @return Response
*/
public function saveFileAjaxAction(

View File

@@ -503,4 +503,9 @@ class TarArchiveBuilder extends AbstractArchiveBuilder
{
return $this->compression;
}
public function isAvailable()
{
return false === (bool) ini_get("phar.readonly") && class_exists("\\PharData");
}
}

View File

@@ -44,4 +44,9 @@ class TarBz2ArchiveBuilder extends TarArchiveBuilder
return $this;
}
public function isAvailable()
{
return parent::isAvailable() && extension_loaded("bz2");
}
}

View File

@@ -45,4 +45,8 @@ class TarGzArchiveBuilder extends TarArchiveBuilder
return $this;
}
public function isAvailable()
{
return parent::isAvailable() && extension_loaded("zlib");
}
}

View File

@@ -610,4 +610,14 @@ class ZipArchiveBuilder extends AbstractArchiveBuilder
{
return $this->zip;
}
/**
* @return bool
*
* Returns conditions for archive builder to be available ( loaded libraries )
*/
public function isAvailable()
{
return class_exists('\\ZipArchive');
}
}

View File

@@ -112,4 +112,10 @@ interface ArchiveBuilderInterface
*/
public function hasDirectory($directory);
/**
* @return bool
*
* Returns conditions for archive builder to be available ( loaded libraries )
*/
public function isAvailable();
}

View File

@@ -35,7 +35,7 @@ class ArchiveBuilderManager
*/
public function add(AbstractArchiveBuilder $archiveBuilder)
{
if (null !== $archiveBuilder) {
if ($archiveBuilder->isAvailable()) {
$archiveBuilder->setEnvironment($this->environment);
$this->archiveBuilders[$archiveBuilder->getName()] = $archiveBuilder;

View File

@@ -39,7 +39,34 @@ class ArchiveBuilderManagerTest extends \PHPUnit_Framework_TestCase
public function testAddArchiveBuilder()
{
/** @var AbstractArchiveBuilder $instance */
$instance = $this->getMock("Thelia\\Core\\FileFormat\\Archive\\AbstractArchiveBuilder");
$instance = $this->getMock(
"Thelia\\Core\\FileFormat\\Archive\\AbstractArchiveBuilder",
[
"isAvailable",
"getName",
"getExtension",
"getMimeType",
"addFile",
"addFileFromString",
"getFileContent",
"deleteFile",
"addDirectory",
"buildArchiveResponse",
"loadArchive",
"hasFile",
"hasDirectory",
]
);
$instance->expects($this->any())
->method("isAvailable")
->willReturn(true)
;
$instance->expects($this->any())
->method("getName")
->willReturn("foo")
;
$this->manager->add($instance);
@@ -53,7 +80,34 @@ class ArchiveBuilderManagerTest extends \PHPUnit_Framework_TestCase
public function testDeleteArchiveBuilder()
{
/** @var AbstractArchiveBuilder $instance */
$instance = $this->getMock("Thelia\\Core\\FileFormat\\Archive\\AbstractArchiveBuilder");
$instance = $this->getMock(
"Thelia\\Core\\FileFormat\\Archive\\AbstractArchiveBuilder",
[
"isAvailable",
"getName",
"getExtension",
"getMimeType",
"addFile",
"addFileFromString",
"getFileContent",
"deleteFile",
"addDirectory",
"buildArchiveResponse",
"loadArchive",
"hasFile",
"hasDirectory",
]
);
$instance->expects($this->any())
->method("isAvailable")
->willReturn(true)
;
$instance->expects($this->any())
->method("getName")
->willReturn("foo")
;
$this->manager->add($instance);

View File

@@ -74,7 +74,9 @@ class ProductPricesExportTest extends \PHPUnit_Framework_TestCase
$attributes = [];
foreach ($attributeCombinations as $attributeCombination) {
$attributes[] = $attributeCombination->getAttributeAv()->getTitle();
if (!in_array($attributeCombination->getAttributeAv()->getTitle(), $attributes)) {
$attributes[] = $attributeCombination->getAttributeAv()->getTitle();
}
}
$rowAttributes = explode(",", $row["attributes"]);

View File

@@ -51,59 +51,61 @@
</select>
{/form_field}
</div>
<div class="col-md-1"></div>
<div class="col-md-4">
{form_field form=$form field="do_compress"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small" id="export-compression-switch">
<input type="checkbox" name="{$name}" id="{$label_attr.for}"/>
{ifloop rel="export-archive-builder"}
<div class="col-md-1"></div>
<div class="col-md-4">
{form_field form=$form field="do_compress"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small" id="export-compression-switch">
<input type="checkbox" name="{$name}" id="{$label_attr.for}"/>
</div>
{/form_field}
</div>
{/form_field}
</div>
</div>
<div class="row export-compression-selection-row">
<div class="col-md-4">
{form_field form=$form field="archive_builder"}
<label for="{$label_attr.for}">
{$label}
</label>
<select name="{$name}" id="{$label_attr.for}">
{loop name="export-archive-builder" type="archive-builder"}
<option value="{$NAME}" {if $value == $NAME}selected{/if}>
{$NAME} (.{$EXTENSION})
</option>
{/loop}
</select>
{/form_field}
</div>
{if $HAS_IMAGES}
<div class="col-md-4">
{form_field form=$form field="images"}
<label for="{$label_attr.for}">
{$label}
</label>
<div class="row export-compression-selection-row">
<div class="col-md-4">
{form_field form=$form field="archive_builder"}
<label for="{$label_attr.for}">
{$label}
</label>
<select name="{$name}" id="{$label_attr.for}">
{loop name="export-archive-builder" type="archive-builder"}
<option value="{$NAME}" {if $value == $NAME}selected{/if}>
{$NAME} (.{$EXTENSION})
</option>
{/loop}
</select>
{/form_field}
</div>
{if $HAS_IMAGES}
<div class="col-md-4">
{form_field form=$form field="images"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
{if $HAS_DOCUMENTS}
<div class="col-md-4">
{form_field form=$form field="documents"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
{if $HAS_DOCUMENTS}
<div class="col-md-4">
{form_field form=$form field="documents"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
{/ifloop}
</div>
{/ifloop}
{elseloop rel="export-formatters"}

View File

@@ -86,64 +86,66 @@
</select>
{/form_field}
</div>
<div class="col-md-4">
{form_field form=$form field="do_compress"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small" id="export-compression-switch">
<input type="checkbox" name="{$name}" id="{$label_attr.for}"/>
</div>
{/form_field}
</div>
</div>
<div class="row export-compression-selection-row">
<div class="col-md-4">
{form_field form=$form field="archive_builder"}
<div class="form-group {if $error}has-error{/if}">
{ifloop rel="export-archive-builder"}
<div class="col-md-4">
{form_field form=$form field="do_compress"}
<label for="{$label_attr.for}">
{$label}
</label>
<select name="{$name}" id="{$label_attr.for}">
{loop name="export-archive-builder" type="archive-builder"}
<option value="{$NAME}" {if $value == $NAME}selected{/if}>
{$NAME} (.{$EXTENSION})
</option>
{/loop}
</select>
{if $error}
<div class="error-field">{$message}</div>
{/if}
</div>
{/form_field}
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small" id="export-compression-switch">
<input type="checkbox" name="{$name}" id="{$label_attr.for}"/>
</div>
{/form_field}
</div>
</div>
{if $HAS_IMAGES}
<div class="col-md-4">
{form_field form=$form field="images"}
<label for="{$label_attr.for}">
{$label}
</label>
<div class="row export-compression-selection-row">
<div class="col-md-4">
{form_field form=$form field="archive_builder"}
<div class="form-group {if $error}has-error{/if}">
<label for="{$label_attr.for}">
{$label}
</label>
<select name="{$name}" id="{$label_attr.for}">
{loop name="export-archive-builder" type="archive-builder"}
<option value="{$NAME}" {if $value == $NAME}selected{/if}>
{$NAME} (.{$EXTENSION})
</option>
{/loop}
</select>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
{if $HAS_DOCUMENTS}
<div class="col-md-4">
{form_field form=$form field="documents"}
<label for="{$label_attr.for}">
{$label}
</label>
{if $error}
<div class="error-field">{$message}</div>
{/if}
</div>
{/form_field}
</div>
{if $HAS_IMAGES}
<div class="col-md-4">
{form_field form=$form field="images"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
{if $HAS_DOCUMENTS}
<div class="col-md-4">
{form_field form=$form field="documents"}
<label for="{$label_attr.for}">
{$label}
</label>
<div data-off-label="&lt;i class='glyphicon glyphicon-remove-circle'&gt;&lt;/i&gt;" data-on-label="&lt;i class='glyphicon glyphicon-ok-circle'&gt;&lt;/i&gt;" data-on="success" class="make-switch switch-small">
<input type="checkbox" name="{$name}" id="{$label_attr.for}" />
</div>
{/form_field}
</div>
{/if}
{/ifloop}
</div>
{/ifloop}
{elseloop rel="export-formatters"}