Add export order for CSV

modifié:         core/lib/Thelia/Config/Resources/export.xml
	modifié:         core/lib/Thelia/Controller/Admin/ExportController.php
	modifié:         core/lib/Thelia/Core/FileFormat/Formatting/AbstractFormatter.php
	modifié:         core/lib/Thelia/Core/FileFormat/Formatting/Formatter/CSVFormatter.php
	modifié:         core/lib/Thelia/ImportExport/Export/ExportHandler.php
	modifié:         core/lib/Thelia/ImportExport/Export/Type/ProductSEOExport.php
This commit is contained in:
Benjamin Perche
2014-07-23 14:37:29 +02:00
parent f4f3a54e9c
commit 77db0d7408
6 changed files with 146 additions and 12 deletions

View File

@@ -37,5 +37,21 @@
<description>Export the prices of the products excluding taxes</description> <description>Export the prices of the products excluding taxes</description>
</export_descriptive> </export_descriptive>
</export> </export>
<export id="thelia.export.product_seo" class="Thelia\ImportExport\Export\Type\ProductSEOExport" category_id="thelia.export.products">
<export_descriptive locale="en_US">
<title>Product SEO information</title>
<description>
Export the SEO information ( rewritten url, meta description and keywords, page title ) of your products
</description>
</export_descriptive>
<export_descriptive locale="fr_FR">
<title>Informations SEO des produits</title>
<description>
Exportez les informations SEO de vos produits
( url réécrites, meta description et mots clés, titre ) de vos produits
</description>
</export_descriptive>
</export>
</exports> </exports>
</config> </config>

View File

@@ -180,7 +180,10 @@ class ExportController extends BaseAdminController
if ($archiveBuilder === null) { if ($archiveBuilder === null) {
$this->dispatch(TheliaEvents::EXPORT_BEFORE_ENCODE, $event); $this->dispatch(TheliaEvents::EXPORT_BEFORE_ENCODE, $event);
$formattedContent = $formatter->encode($data); $formattedContent = $formatter
->setOrder($handler->getOrder())
->encode($data)
;
$this->dispatch(TheliaEvents::EXPORT_AFTER_ENCODE, $event->setContent($formattedContent)); $this->dispatch(TheliaEvents::EXPORT_AFTER_ENCODE, $event->setContent($formattedContent));
@@ -197,7 +200,10 @@ class ExportController extends BaseAdminController
$event->setArchiveBuilder($archiveBuilder); $event->setArchiveBuilder($archiveBuilder);
$this->dispatch(TheliaEvents::EXPORT_BEFORE_ENCODE, $event); $this->dispatch(TheliaEvents::EXPORT_BEFORE_ENCODE, $event);
$formattedContent = $formatter->encode($data); $formattedContent = $formatter
->setOrder($handler->getOrder())
->encode($data)
;
$this->dispatch(TheliaEvents::EXPORT_AFTER_ENCODE, $event->setContent($formattedContent)); $this->dispatch(TheliaEvents::EXPORT_AFTER_ENCODE, $event->setContent($formattedContent));

View File

@@ -30,10 +30,41 @@ abstract class AbstractFormatter implements FormatInterface, FormatterInterface
/** @var \Thelia\Log\Tlog */ /** @var \Thelia\Log\Tlog */
protected $logger; protected $logger;
/** @var array */
protected $order;
public function __construct() public function __construct()
{ {
$this->translator = Translator::getInstance(); $this->translator = Translator::getInstance();
$this->logger = Tlog::getInstance(); $this->logger = Tlog::getInstance();
} }
public function getOrder()
{
return $this->order;
}
public function setOrder(array $order)
{
$this->order = $order;
return $this;
}
public function checkOrders(array $values)
{
foreach($this->order as $order) {
if (!array_key_exists($order, $values)) {
throw new \ErrorException(
$this->translator->trans(
"The column %column that you want to sort doesn't exist",
[
"%column" => $order
]
)
);
}
}
}
} }

View File

@@ -77,10 +77,18 @@ class CSVFormatter extends AbstractFormatter
{ {
$string = ""; $string = "";
/**
* Get the first row and delimiters lengths
*/
$firstRow = $data->getRow(); $firstRow = $data->getRow();
$delimiterLength = strlen($this->delimiter); $delimiterLength = strlen($this->delimiter);
$lineReturnLength = strlen($this->lineReturn); $lineReturnLength = strlen($this->lineReturn);
/**
* check if $this->order doesn't have non-existing rows
*/
$this->checkOrders($firstRow);
if (false !== $firstRow) { if (false !== $firstRow) {
$rawKeys = array_keys($firstRow); $rawKeys = array_keys($firstRow);
$keys = []; $keys = [];
@@ -93,20 +101,43 @@ class CSVFormatter extends AbstractFormatter
array_unshift($values, $keys); array_unshift($values, $keys);
while (null !== $row = array_shift($values)) { while (null !== $row = array_shift($values)) {
foreach ($keys as $key) { /**
if (!is_scalar($row[$key])) { * First put the sorted ones
$row[$key] = serialize($row[$key]); */
} foreach ($this->order as $order) {
$string .= $this->formatField($row[$order]);
unset($row[$order]);
}
$string .= $this->stringDelimiter . addslashes($row[$key]) . $this->stringDelimiter . $this->delimiter; /**
* Then place the fields,
* order by name
*/
ksort($row);
foreach ($keys as $key) {
$string .= $this->formatField($row[$key]);
} }
$string = substr($string,0, -$delimiterLength) . $this->lineReturn; $string = substr($string,0, -$delimiterLength) . $this->lineReturn;
} }
} else {
$lineReturnLength = 0;
} }
return substr($string,0, -$lineReturnLength); return substr($string, 0, -$lineReturnLength);
}
protected function formatField($value)
{
if($value === null) {
$value = "";
} else if (!is_scalar($value)) {
$value = serialize($value);
}
return $this->stringDelimiter . addslashes($value) . $this->stringDelimiter . $this->delimiter;
} }
/** /**

View File

@@ -11,8 +11,6 @@
/*************************************************************************************/ /*************************************************************************************/
namespace Thelia\ImportExport\Export; namespace Thelia\ImportExport\Export;
use Propel\Runtime\ActiveQuery\Criteria;
use Propel\Runtime\ActiveQuery\Join;
use Propel\Runtime\ActiveQuery\ModelCriteria; use Propel\Runtime\ActiveQuery\ModelCriteria;
use Thelia\Model\Lang; use Thelia\Model\Lang;
use Thelia\ImportExport\AbstractHandler; use Thelia\ImportExport\AbstractHandler;
@@ -26,6 +24,9 @@ abstract class ExportHandler extends AbstractHandler
{ {
protected $locale; protected $locale;
/** @var array */
protected $order;
public function addI18nCondition( public function addI18nCondition(
ModelCriteria $query, ModelCriteria $query,
$i18nTableName, $i18nTableName,
@@ -80,6 +81,42 @@ abstract class ExportHandler extends AbstractHandler
return $return; return $return;
} }
/**
* @return array
*
* You may override this method to return an array, containing
* the order that you want to have for your columns.
* The order appliance depends on the formatter
*/
protected function getDefaultOrder()
{
return array();
}
/**
* @return array
*
* Use this method to access the order.
*
*/
public function getOrder()
{
$order = $this->getDefaultOrder();
if (empty($order)) {
$order = $this->order;
}
return $order;
}
public function setOrder(array $order)
{
$this->order = $order;
return $this;
}
/** /**
* @param \Thelia\Model\Lang $lang * @param \Thelia\Model\Lang $lang
* @return \Thelia\Core\FileFormat\Formatting\FormatterData * @return \Thelia\Core\FileFormat\Formatting\FormatterData

View File

@@ -116,11 +116,24 @@ class ProductSEOExport extends ExportHandler
]) ])
; ;
$a = $query->toString();
$data = new FormatterData($aliases); $data = new FormatterData($aliases);
return $data->loadModelCriteria($query); return $data->loadModelCriteria($query);
} }
protected function getDefaultOrder()
{
return [
"ref",
"product_title",
"visible",
"url",
"content_title",
"meta_description",
"meta_keywords",
];
}
} }