Ha érdekel, írtam CakePHP-ban egy dinamikus admin programot adatbázishoz, ennek egyik részében .csv kezelés is van, ami így néz ki:
PHP kód:
// feltölti a termékeket csv file-ból
private function manageCsv ($csv) {
$this->loadModel('Product');
// megengedett fejlécek
$heads = array(
'itemno' => array('cikkszám'),
'name' => array('Megnevezés'),
'description' => array('internet megnevezés'),
'longdesc' => array('Bőveb leírás'),
'price' => array('nettó listaár'),
'gross' => array('Bruttó listaár')
);
// ha meg tudjuk nyitni a file-t
$row = -1;
if (($handle = fopen($csv, "r")) !== false) {
if (isset($this->data['Product']['category_id'])) {
$category_id = $this->data['Product']['category_id'];
}
else {
$this->Session->setFlash('Hiányzik a kategória, kérem próbálja meg újra.', 'default', array('class' => 'hibauzenet'));
$this->redirect('/_admin/');
}
unset($this->data);
while (($data = fgetcsv($handle, 1000, ";")) !== false) {
foreach($data as $key => $val) {
$data[$key] = mb_convert_encoding(trim($val), 'UTF-8', 'ISO-8859-2');
}
// az első sornál eltesszük a fejlécet
if ($row == -1) {
foreach ($data as $key => $val) {
foreach($heads as $num => $head) {
if (in_array($val, $head)) {
$places[$num] = trim($key);
}
}
}
}
else {
foreach ($data as $key => $val) {
foreach($places as $db => $place) {
if ($key == $place) {
if (!empty($val)) {
if ($db == 'price' || $db == 'stored' || $db == 'reserved') {
$val = str_replace(',', '', $val);
}
$this->data[$row]['Product'][$db] = $val;
}
if ($db == 'itemno') {
$prod_id = $this->Product->find('first', array('conditions' => array('Product.itemno' => $val), 'recursive' => 0, 'fields' => array('Product.id', 'Product.sef_url', 'Product.menu_title', 'Product.page_title', 'Product.active')));
if($prod_id) {
$this->data[$row]['Product']['id'] = $prod_id['Product']['id'];
$this->data[$row]['Product']['menu_title'] = $prod_id['Product']['menu_title'];
$this->data[$row]['Product']['page_title'] = $prod_id['Product']['page_title'];
$this->data[$row]['Product']['active'] = $prod_id['Product']['active'];
}
}
}
}
}
$this->data[$row]['Product']['category_id'] = $category_id;
$this->data[$row]['Product']['sef_url'] = $this->getStringAsURL($this->data[$row]['Product']['name'])."-".$this->data[$row]['Product']['itemno'];
if (!isset($this->data[$row]['Product']['menu_title'])) {
$this->data[$row]['Product']['menu_title'] = $this->data[$row]['Product']['name'];
}
if (!isset($this->data[$row]['Product']['page_title'])) {
$this->data[$row]['Product']['page_title'] = $this->data[$row]['Product']['name'];
}
if (!isset($this->data[$row]['Product']['active'])) {
$this->data[$row]['Product']['active'] = 1;
}
}
$row++;
}
foreach($this->data as $key => $val) {
$this->Product->create();
if ($this->Product->save($val)) {
;
}
else {
$this->Session->setFlash("Hiba a $key. termék rögzítésekor. (".$val['Product']['name']."), kérjük ellenőrizze a feltöltött adatokat.", 'default', array('class' => 'hibauzenet'));
$this->redirect('/_admin/');
}
}
// takarítás
fclose($handle);
unlink($csv);
$this->Session->setFlash('.csv állomány feltöltése sikeres', 'default', array('class' => 'uzenet'));
$this->redirect('/_admin/');
}
else {
$this->Session->setFlash('Érvénytelen .csv fájl, kérjük próbálja meg újra.', 'default', array('class' => 'hibauzenet'));
$this->redirect('/_admin/');
}
}
A heads-ba kell beletenni, hogy milyen heading-ek lehetnek a .csv-ben és azok milyen mezőbe kerüljenek az adatábzisban, illetve van egy kódolás figyelő is.
Nálam a termékek kategóriákhoz tartoznak, azért van category_id. Ha nem cake-t használsz, akkor a logikát szerintem ki tudod belőle következtetni. A heads-ba megadhatsz a mezőnév után többféle hadinget is, amit keres, a .csv-dben pedig nem számít az oszlopok sorrendje.
A getStringAsUrl() függvény, sef-esíti az url-t, valahogy így néz ki:
PHP kód:
protected function getStringAsURL($string) {
$unPretty = array('/Í/','/ú/','/Ú/','/í/','/Ó/','/ó/','/ő/','/Ő/','/É/','/é/','/á/', '/ö/', '/ü/', '/Á/', '/Ö/', '/Ü/', '/Ű/', '/\s?-\s?/', '/\s?_\s?/', '/\s?\/\s?/', '/\s?\\\s?/', '/\s/', '/"/', '/\'/');
$pretty = array('I','u','u','i','o','o','o','O','E','e','a', 'o', 'u', 'A', 'O', 'U', 'u', '-', '-', '-', '-', '-', '', '');
$semi_pretty = low(preg_replace($unPretty, $pretty, $string));
$semi_pretty = str_replace('.', '_', $semi_pretty);
$semi_pretty = str_replace('(', '_', $semi_pretty);
$semi_pretty = str_replace(')', '_', $semi_pretty);
$semi_pretty = str_replace('+', '_', $semi_pretty);
$semi_pretty = str_replace(',', '-', $semi_pretty);
$semi_pretty = str_replace(' ', '-', $semi_pretty);
$pretty_str = str_replace(':', '-', $semi_pretty);
return $pretty_str;
}
Könyvjelzők