first commit
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
/**
|
||||
* SOTESHOP/stImportExportPlugin
|
||||
*
|
||||
* Ten plik należy do aplikacji stImportExportPlugin opartej na licencji (Open License SOTE) Otwarta Licencja SOTE.
|
||||
* Nie zmieniaj tego pliku, jeśli chcesz korzystać z automatycznych aktualizacji oprogramowania.
|
||||
* Jeśli chcesz wprowadzać swoje modyfikacje do programu, zapoznaj się z dokumentacją, jak zmieniać
|
||||
* oprogramowanie bez zmiany kodu bazowego http://www.sote.pl/modifications
|
||||
*
|
||||
* @package stImportExportPlugin
|
||||
* @subpackage libs
|
||||
* @copyright SOTE (www.sote.pl)
|
||||
* @license http://www.sote.pl/license/open (Open License SOTE) Otwarta Licencja SOTE
|
||||
* @version $Id: stExporterXml2003.class.php 13384 2011-06-02 11:30:57Z piotr $
|
||||
* @author Piotr Halas <piotr.halas@sote.pl>
|
||||
*/
|
||||
|
||||
/**
|
||||
* Klasa eksportera do formtu Microsoft Office 2003 xml
|
||||
*
|
||||
* @package stImportExportPlugin
|
||||
* @subpackage libs
|
||||
*/
|
||||
class stExporterXml2003 extends stPropelExporter {
|
||||
|
||||
/**
|
||||
* Nagłówek pliku xml
|
||||
* @var string
|
||||
*/
|
||||
var $header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><?mso-application progid=\"Excel.Sheet\"?>
|
||||
<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:x2=\"http://schemas.microsoft.com/office/excel/2003/xml\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:html=\"http://www.w3.org/TR/REC-html40\" xmlns:c=\"urn:schemas-microsoft-com:office:component:spreadsheet\">
|
||||
<OfficeDocumentSettings xmlns=\"urn:schemas-microsoft-com:office:office\"></OfficeDocumentSettings>
|
||||
<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\"></ExcelWorkbook>
|
||||
<Styles></Styles>
|
||||
<ss:Worksheet ss:Name=\"%s\">
|
||||
<Table>";
|
||||
|
||||
/**
|
||||
* Stopka pliku xml
|
||||
* @var string
|
||||
*/
|
||||
var $footer = "</Table><x:WorksheetOptions /></ss:Worksheet></Workbook>";
|
||||
|
||||
/**
|
||||
* Unikatowa nazwa exportera
|
||||
* @var string
|
||||
*/
|
||||
var $converter = 'xml2003';
|
||||
|
||||
/**
|
||||
* Rozszerzenie pliku eksportu
|
||||
* @var string
|
||||
*/
|
||||
var $output_file_extension = 'xml';
|
||||
|
||||
/**
|
||||
* Zwraca nagłowek pliku z nazwą modelu jako nazwa arkusza
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getHeader() {
|
||||
return sprintf($this->header,$this->model);
|
||||
}
|
||||
|
||||
/**
|
||||
* Zwraca zawartosc jednego wiersza eksportu do pliku
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getConvertedData($data = array()) {
|
||||
$text = '';
|
||||
if (is_array($data)) {
|
||||
foreach ($data as $object) {
|
||||
$row = "<Row>";
|
||||
$writable = true;
|
||||
|
||||
foreach ($object as $key=>$value) {
|
||||
$tmp = str_replace("\n"," ",htmlspecialchars(html_entity_decode($value,null,'utf-8'),ENT_QUOTES,'utf-8'));
|
||||
if (strlen($tmp)>32000)
|
||||
{
|
||||
$this->logger->add($object[$this->config['primary_key']],sfContext::getInstance()->getI18n()->__('Ciąg znaków w polu %field% jest za długi, pomijam rekord',array('%field%'=>$key)));
|
||||
$writable = false;
|
||||
break;
|
||||
}
|
||||
$row .= "<Cell><Data ss:Type=\"".$this->getFieldType($key)."\">".$tmp."</Data></Cell>";
|
||||
}
|
||||
|
||||
if ($writable) {
|
||||
$text .= $row."</Row>";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Zwraca zawartosc naglowka tabeli eksportu
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getHeaderRow() {
|
||||
$header = "<Row>";
|
||||
foreach ($this->config['fields'] as $field=>$func_name) {
|
||||
$header .= "<Cell><Data ss:Type=\"String\">".$this->getUserName($field)."</Data></Cell>";
|
||||
}
|
||||
$header .= "</Row>";
|
||||
return $header;
|
||||
}
|
||||
|
||||
public function sampleFile($data = array()) {
|
||||
return $this->getHeader().$this->getHeaderRow().$this->footer;
|
||||
}
|
||||
|
||||
protected function getFieldType($field = '') {
|
||||
if (isset($this->config['fields'][$field]['type'])) {
|
||||
switch($this->config['fields'][$field]['type']) {
|
||||
case "string": return "String"; break;
|
||||
case "integer": return "Number"; break;
|
||||
case "double": return "Number"; break;
|
||||
default: return "String"; break;
|
||||
}
|
||||
}
|
||||
return "String";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
/**
|
||||
* SOTESHOP/stImportExportPlugin
|
||||
*
|
||||
* Ten plik należy do aplikacji stImportExportPlugin opartej na licencji (Open License SOTE) Otwarta Licencja SOTE.
|
||||
* Nie zmieniaj tego pliku, jeśli chcesz korzystać z automatycznych aktualizacji oprogramowania.
|
||||
* Jeśli chcesz wprowadzać swoje modyfikacje do programu, zapoznaj się z dokumentacją, jak zmieniać
|
||||
* oprogramowanie bez zmiany kodu bazowego http://www.sote.pl/modifications
|
||||
*
|
||||
* @package stImportExportPlugin
|
||||
* @subpackage libs
|
||||
* @copyright SOTE (www.sote.pl)
|
||||
* @license http://www.sote.pl/license/open (Open License SOTE) Otwarta Licencja SOTE
|
||||
* @version $Id: stImportExport2xml2003Listener.class.php 13384 2011-06-02 11:30:57Z piotr $
|
||||
* @author Piotr Halas <piotr.halas@sote.pl>
|
||||
*/
|
||||
|
||||
/**
|
||||
* Klasa sluchacza stImportExport2xml2003
|
||||
*
|
||||
* @package stImportExportPlugin
|
||||
* @subpackage libs
|
||||
*/
|
||||
class stImportExport2xml2003Listener {
|
||||
|
||||
/**
|
||||
* Funkcja dodaje do kazdego generowanego modulu informacje o dostepnych imporerach i eksporterach
|
||||
*
|
||||
* @param sfEvent $event
|
||||
*/
|
||||
public static function generate(sfEvent $event)
|
||||
{
|
||||
if (is_file(sfConfig::get('sf_root_dir').'/packages/appImportExportOffice2003Plugin/package.yml'))
|
||||
{
|
||||
$event->getSubject()->attachAdminGeneratorFile('stImportExportPlugin', 'stImportExport2xml2003.yml');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,338 @@
|
||||
<?php
|
||||
/**
|
||||
* SOTESHOP/stImportExportPlugin
|
||||
*
|
||||
* Ten plik należy do aplikacji stImportExportPlugin opartej na licencji (Open License SOTE) Otwarta Licencja SOTE.
|
||||
* Nie zmieniaj tego pliku, jeśli chcesz korzystać z automatycznych aktualizacji oprogramowania.
|
||||
* Jeśli chcesz wprowadzać swoje modyfikacje do programu, zapoznaj się z dokumentacją, jak zmieniać
|
||||
* oprogramowanie bez zmiany kodu bazowego http://www.sote.pl/modifications
|
||||
*
|
||||
* @package stImportExportPlugin
|
||||
* @subpackage libs
|
||||
* @copyright SOTE (www.sote.pl)
|
||||
* @license http://www.sote.pl/license/open (Open License SOTE) Otwarta Licencja SOTE
|
||||
* @version $Id: stImporterXml2003.class.php 13384 2011-06-02 11:30:57Z piotr $
|
||||
* @author Piotr Halas <piotr.halas@sote.pl>
|
||||
*/
|
||||
|
||||
/**
|
||||
* Klasa Importera danych z formatu Microsoft Office 2003 xml
|
||||
*
|
||||
* @package stImportExportPlugin
|
||||
* @subpackage libs
|
||||
* @property XMLReader $fh
|
||||
*/
|
||||
class stImporterXml2003 extends stPropelImporter
|
||||
{
|
||||
/**
|
||||
* Nagłówek pliku xml
|
||||
* @var string
|
||||
*/
|
||||
var $header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><?mso-application progid=\"Excel.Sheet\"?>
|
||||
<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:x2=\"http://schemas.microsoft.com/office/excel/2003/xml\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:html=\"http://www.w3.org/TR/REC-html40\" xmlns:c=\"urn:schemas-microsoft-com:office:component:spreadsheet\">
|
||||
<OfficeDocumentSettings xmlns=\"urn:schemas-microsoft-com:office:office\"></OfficeDocumentSettings>
|
||||
<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\"></ExcelWorkbook>
|
||||
<Styles></Styles>
|
||||
<ss:Worksheet ss:Name=\"%s\">
|
||||
<Table>";
|
||||
|
||||
/**
|
||||
* Stopka pliku xml
|
||||
* @var string
|
||||
*/
|
||||
var $footer = "</Table><x:WorksheetOptions /></ss:Worksheet></Workbook>";
|
||||
|
||||
/**
|
||||
* Unikatowa nazwa Importera
|
||||
* @var string
|
||||
*/
|
||||
var $converter = 'xml2003';
|
||||
|
||||
/**
|
||||
* Rozszerzenie pliku eksportu
|
||||
* @var string
|
||||
*/
|
||||
var $input_file_extension = 'xml';
|
||||
|
||||
/**
|
||||
* Zwraca liczbę rekordów w pliku
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getDataCount() {
|
||||
// otwiera plik i doczytaj jego naglowek;
|
||||
$this->loadFile();
|
||||
$this->readHeader();
|
||||
|
||||
$count = 0;
|
||||
|
||||
//odczytuje wszystkie rekordy bez czytania danych
|
||||
while ($this->_readRow()) {
|
||||
$count++;
|
||||
}
|
||||
|
||||
//zwraca liczbe rekordow
|
||||
return ($count)?$count-1:0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Główna pętla importu przeładowana na potrzeby importu z xml2003
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function doProcess($offset = 0) {
|
||||
// otwierza plik w wczytuje naglowki
|
||||
$this->loadFile();
|
||||
$this->readHeader();
|
||||
$this->readHeaderRow();
|
||||
|
||||
// pomija wczesniej odczytane dane
|
||||
$this->skipToData($offset);
|
||||
|
||||
// wczytuje dane i dodaje je do bazy danych
|
||||
// zwraca liczbe odczytanych rekordow
|
||||
$readed = $this->readData();
|
||||
|
||||
//zamyka plik
|
||||
$this->closeFile();
|
||||
|
||||
//zwraca nowe polozenie danych
|
||||
return $offset + $readed;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Wczytuje plik z danymi w przypadku braku pliku wyrzuc wyjactek
|
||||
* @throws IMPORT_NO_FILE
|
||||
*/
|
||||
protected function loadFile() {
|
||||
|
||||
//sprawdza czy plik istnieje i mozna z niego czytac
|
||||
//jezeli nie to wstaw wyjatek braku pliku
|
||||
if (!is_readable($this->getFilePath())) {
|
||||
throw new Exception(IMPORT_NO_FILE);
|
||||
}
|
||||
|
||||
// jezeli plik jest do odczytu to zostanie zalodowany
|
||||
$this->fh = new XMLReader();
|
||||
$this->fh->open($this->getFilePath());
|
||||
}
|
||||
|
||||
/**
|
||||
* Zwraca informacje czy plik posiada poprawny naglowek
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function readHeader() {
|
||||
while ($this->fh->read()) {
|
||||
// sprawdza czy w pliku xml jest Worksheet
|
||||
if ($this->fh->depth == 1 && $this->fh->nodeType == XMLReader::ELEMENT && ($this->fh->name == 'ss:Worksheet' || $this->fh->name == 'Worksheet')) {
|
||||
// sprawdza czy w pliku jest akrusz z poprawna nazwa modelu
|
||||
if ($this->fh->getAttribute('ss:Name')==$this->model){
|
||||
while ($this->fh->read() && !($this->fh->nodeType == XMLReader::END_ELEMENT && ($this->fh->name == 'ss:Worksheet' || $this->fh->name == 'Worksheet'))) {
|
||||
// sprawdza czy w pliku jest tabela
|
||||
if ($this->fh->depth == 2 && $this->fh->nodeType == XMLReader::ELEMENT && $this->fh->name == 'Table') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Odczytuje rekord danych
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function readRow() {
|
||||
|
||||
// tablica z danymi
|
||||
$data = array();
|
||||
|
||||
// index aktualnej komorki
|
||||
$index = 0;
|
||||
|
||||
// szuka kolejnego wiersza w pliku
|
||||
if ($this->fh->depth == 3 && $this->fh->nodeType == XMLReader::ELEMENT && $this->fh->name == 'Row') {
|
||||
|
||||
foreach ($this->header_order as $key=>$name) {
|
||||
$data[$name] = '';
|
||||
}
|
||||
// przeksztalca dane z xmlReader na SimpleXml
|
||||
$cell = $this->ExpandNode($this->fh);
|
||||
|
||||
// dla kazdej komorki w wierszu
|
||||
foreach ($cell->Cell as $name) {
|
||||
|
||||
// pobiera atrybuty komorki
|
||||
$attrs = $name->attributes();
|
||||
|
||||
// sprawdza czy dane sa po kolei, jezeli nie ustawia nowy index danych
|
||||
if (isset($attrs['Index'])) {$index = (integer)$attrs['Index']-1;}
|
||||
|
||||
// jezeli komorka zawiera dane zapamietuje je w zmiennej data
|
||||
if (isset($name->Data)) {
|
||||
if (isset($this->header_order[$index])) {
|
||||
if (strcmp(iconv("UTF-8", "UTF-8//IGNORE", (string)$name->Data),(string)$name->Data)!=0)
|
||||
{
|
||||
$this->logger->add($data[array_search($this->config['primary_key'],$this->header_order)],
|
||||
sfContext::getInstance()->getI18n()->__('Niepoprawne kodowanie dla pola %field%', array('%field%'=>$name)));
|
||||
} else {
|
||||
$data[$this->header_order[$index]] = (string)$name->Data;
|
||||
}
|
||||
}
|
||||
}
|
||||
//zwieksza index o jeden
|
||||
$index++;
|
||||
}
|
||||
// zapisuje pobrane dane do bazy
|
||||
$this->processData($data);
|
||||
// zmienia polozenie na kolejny element w pliku
|
||||
while ($this->fh->read() && !($this->fh->depth == 3 && $this->fh->nodeType == XMLReader::ELEMENT && $this->fh->name == 'Row'));
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Odczytuje wiersz naglowka z tabeli
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function readHeaderRow() {
|
||||
|
||||
// index aktualnej komorki
|
||||
$index = 0;
|
||||
|
||||
// odczytaj az do konca wpisu tabeli
|
||||
while ($this->fh->read() && !($this->fh->nodeType == XMLReader::END_ELEMENT && $this->fh->name == 'Table')) {
|
||||
|
||||
// jezeli zostanie znaleziony wiersz zamien go na nagolowek
|
||||
if ($this->fh->depth == 3 && $this->fh->nodeType == XMLReader::ELEMENT && $this->fh->name == 'Row') {
|
||||
|
||||
// przeksztalca dane z xmlReader na SimpleXml
|
||||
$cell = $this->ExpandNode($this->fh);
|
||||
|
||||
// dla kazdej komroki w wierszu
|
||||
foreach ($cell->Cell as $name) {
|
||||
|
||||
// pobiera atrybuty
|
||||
$attrs = $name->attributes();
|
||||
|
||||
// sprawdza czy dane sa po kolei, jezeli nie ustawia nowy index danych
|
||||
if (isset($attrs['Index'])) {$index = (integer)$attrs['Index'];}
|
||||
if (isset($name->Data)) {
|
||||
$this->header_order[$index] = (string)$name->Data;
|
||||
}
|
||||
//zwieksza index o jeden
|
||||
$index++;
|
||||
}
|
||||
// zmienia polozenie na kolejny element w pliku
|
||||
// $this->fh->next();
|
||||
$this->header_order = $this->removeUserName($this->header_order);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Przeskakuje dane ktore zostaly odczytane w poprzednich krokach importu
|
||||
* @var ingeter $offset
|
||||
*/
|
||||
protected function skipToData($offset = 0) {
|
||||
|
||||
// wyzeruj liczbe pominietych elementow
|
||||
$skiped = 0;
|
||||
|
||||
// wykonuje czytanie wiersza az zostanie pominietych offset wierszy lub
|
||||
// w pliu nie bedzie wiecej wierszy
|
||||
while ($skiped<=$offset && $this->_readRow()) {
|
||||
$skiped++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Odczytuje wiersz bez przetwarzania danych
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function _readRow() {
|
||||
// odczytaj az do konca wpisu tabeli
|
||||
while ($this->fh->read() && !($this->fh->nodeType == XMLReader::END_ELEMENT && $this->fh->name == 'Table')) {
|
||||
// jezeli zostanie znaleziony wiersz zamien
|
||||
if ($this->fh->depth == 3 && $this->fh->nodeType == XMLReader::ELEMENT && $this->fh->name == 'Row') {
|
||||
|
||||
// przejdz do nastepnego
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Zamienia dane z XmlReader na SimpleXml
|
||||
*
|
||||
* @param XMLReader $reader
|
||||
* @return object
|
||||
*/
|
||||
function ExpandNode(XMLReader $reader) {
|
||||
$node = $reader->expand();
|
||||
$dom = new DomDocument('1.0','utf-8');
|
||||
$n = $dom->importNode($node,true);
|
||||
$dom->appendChild($n);
|
||||
return simplexml_import_dom($n);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sprawdza poprawnosc plik
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function validateFile(array &$errors = null) {
|
||||
return $this->getDataCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* Zwraca zawartosc naglowka tabeli eksportu
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getHeaderRow() {
|
||||
$header = "<Row>";
|
||||
foreach ($this->config['fields'] as $field=>$func_name) {
|
||||
$header .= "<Cell><Data ss:Type=\"String\">".$field."</Data></Cell>";
|
||||
}
|
||||
$header .= "</Row>";
|
||||
return $header;
|
||||
}
|
||||
|
||||
/**
|
||||
* Zwraca nagłowek pliku z nazwą modelu jako nazwa arkusza
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getHeader() {
|
||||
return sprintf($this->header,$this->model);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generuje plik z przykładowymi danymi
|
||||
* @param array $data
|
||||
* @return string
|
||||
*/
|
||||
public function sampleFile($data = array()) {
|
||||
return $this->getHeader().$this->getHeaderRow().$this->footer;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user