X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fcsvimporter.php;h=7d56bc803e794b59dc65fb721c2d2c1246110ca1;hb=88541046480799a8d92eba186f22e22c0c64efb0;hp=8ac5aeed78b482adfb67934fdc767a2ee20a634b;hpb=31874f6f71944a705bac1949d96e8934644130f7;p=platal.git diff --git a/classes/csvimporter.php b/classes/csvimporter.php index 8ac5aee..7d56bc8 100644 --- a/classes/csvimporter.php +++ b/classes/csvimporter.php @@ -1,8 +1,28 @@ table = $table; - $this->key = $key; + $this->key = explode(',', $key); $this->do_sql = $do_sql; } - private function processLine($line) + private function processLine(array $array) { - $array = split($this->separator, $line); if (is_null($this->index)) { - $this->index = $array; + $this->index = array_map('strtolower', $array); return true; } @@ -44,21 +64,26 @@ class CSVImporter return true; } + static public function getValue($line, $key, $action, $relation = null) + { + if (@array_key_exists($action, $line)) { + $value = $line[$action]; + } elseif (is_callable($action, false)) { + $value = call_user_func($action, $line, $key, $relation); + } else { + $value = $action; + } + if (is_null($value) || $value == 'NULL') { + $value = 'NULL'; + } + return $value; + } + private function makeAssoc($line, $relation) { $ops = array(); foreach ($relation as $key=>$ref) { - if (@array_key_exists($ref, $line)) { - $value = $line[$ref]; - } elseif (is_callable($ref, false)) { - $value = call_user_func($ref, $line, $key); - } else { - $value = $ref; - } - if (is_null($value) || $value == 'NULL') { - $value = 'NULL'; - } - $ops[$key] = $value; + $ops[$key] = $this->getValue($line, $key, $ref, $relation); } return $ops; } @@ -67,16 +92,8 @@ class CSVImporter { $ops = array(); foreach ($relation as $key=>$ref) { - if (@array_key_exists($ref, $line)) { - $value = $line[$ref]; - } elseif (is_callable($ref, false)) { - $value = call_user_func($ref, $line, $key); - } else { - $value = $ref; - } - if (is_null($value) || $value == 'NULL') { - $value = 'NULL'; - } else { + $value = $this->getValue($line, $key, $ref, $relation); + if (!is_null($value) && $value != 'NULL') { $value = "'" . addslashes($value) . "'"; } $ops[$key] = "$key = $value"; @@ -113,12 +130,16 @@ class CSVImporter public function setCSV($csv, $index = null, $separator = ';') { + require_once dirname(__FILE__) . '/varstream.php'; + VarStream::init(); + global $csv_source; $this->index = null; - $this->separator = $separator; - $csv = preg_split("/(\r\n|\r|\n)/", $csv); - foreach ($csv as $line) { - $this->processLine($line); + $csv_source = $csv; + $res = fopen('var://csv_source', 'r'); + + while (!feof($res)) { + $this->processLine(fgetcsv($res, 0, $separator)); } } @@ -139,11 +160,16 @@ class CSVImporter case CSV_REPLACE: $this->execute("REPLACE INTO {$this->table} SET $set"); break; - case CSV_UPDATE: - if (!$this->execute("INSERT INTO {$this->table} SET $set")) { + case CSV_UPDATE: case CSV_UPDATEONLY: + if ($action == CSV_UPDATEONLY || !$this->execute("INSERT INTO {$this->table} SET $set")) { $ops = $this->makeRequestArgs($line, $update_relation); $set = join(', ', $ops); - $this->execute("UPDATE {$this->table} SET $set WHERE {$ops[$this->key]}"); + $where = array(); + foreach ($this->key as $key) { + $where[] = $ops[$key]; + } + $where = join(' AND ', $where); + $this->execute("UPDATE {$this->table} SET $set WHERE $where"); } break; } @@ -155,11 +181,11 @@ class CSVImporter static $fields, $conds, $values, $thens, $elses; if (!isset($fields)) { - $fields = Env::v('csv_cond_field'); - $conds = Env::v('csv_cond'); - $values = Env::v('csv_cond_value'); - $thens = Env::v('csv_cond_then'); - $elses = Env::v('csv_cond_else'); + $fields = $_SESSION['csv_cond_field']; + $conds = $_SESSION['csv_cond']; + $values = $_SESSION['csv_cond_value']; + $thens = $_SESSION['csv_cond_then']; + $elses = $_SESSION['csv_cond_else']; } $field = $line[$fields[$key]]; $cond = $conds[$key]; @@ -188,26 +214,56 @@ class CSVImporter public function registerFunction($name, $desc, $callback) { - if (is_callable($callback)) { + if (is_callable($callback, false, $ref)) { $this->user_functions['func_' . $name] = array('desc' => $desc, 'callback' => $callback); return true; } return false; } + public function describe($name, $desc) + { + $this->field_desc[$name] = $desc; + } + + public function forceValue($name, $value) + { + $this->field_value[$name] = $value; + } + + private function cleanSession($fields) + { + foreach ($fields as $field) { + unset($_SESSION[$field]); + } + } + /** Handle insertion form - * @param $page PlatalPage to process + * @param $page PlPage to process * @param $url URI of the page * @param $field Editable fields */ public function apply(&$page, $url, $fields = null) { - if (is_null($fields)) { + $sesfields = array('csv_value', 'csv_user_value', 'csv_cond_field', + 'csv_update', 'csv_action', 'csv_cond_field', + 'csv_cond', 'csv_cond_value', 'csv_cond_then', + 'csv_cond_else', 'csv', 'csv_separator', 'csv_url'); + if ($url != @$_SESSION['csv_url']) { + $this->cleanSession($sesfields); + $_SESSION['csv_url'] = $url; + } + + if (is_null($fields) || empty($fields)) { $fields = $this->getFieldList(); } if (is_null($fields)) { return false; } + foreach ($this->field_value as $key=>$value) { + $search = array_search($key, $fields); + unset($fields[$search]); + } $current = Env::v('csv_page'); if (empty($current)) { @@ -217,24 +273,44 @@ class CSVImporter if (empty($next)) { $next = $current; } - $csv = Env::v('csv'); + $csv = @$_SESSION['csv']; if ($current == 'source' && Env::has('csv_valid')) { $csv = Env::v('csv_source'); + $_SESSION['csv'] = $csv; $next = 'values'; } if ($csv) { - $this->setCSV($csv); + if (Env::has('csv_separator')) { + $sep = Env::v('csv_separator'); + if (empty($sep)) { + $sep = ';'; + } + $_SESSION['csv_separator'] = $sep; + } + $this->setCSV($csv, null, $_SESSION['csv_separator']); } if ($current == 'values' && Env::has('csv_valid')) { $next = 'valid'; - } + } if (empty($csv)) { $next = 'source'; } + if (Env::has('csv_action')) { + $_SESSION['csv_action'] = Env::v('csv_action'); + } if ($next == 'valid') { - $insert = Env::v('csv_value'); - $values = Env::v('csv_user_value'); - $update = Env::v('csv_update'); + if ($current != 'valid') { + $cpyfields = array('csv_value', 'csv_user_value', 'csv_cond_field', + 'csv_update', 'csv_action', 'csv_cond_field', + 'csv_cond', 'csv_cond_value', 'csv_cond_then', + 'csv_cond_else'); + foreach ($cpyfields as $field) { + $_SESSION[$field] = Env::v($field); + } + } + $insert = $_SESSION['csv_value']; + $values = $_SESSION['csv_user_value']; + $update = $_SESSION['csv_update']; foreach ($insert as $key=>$value) { if (empty($value)) { $insert[$key] = null; @@ -249,9 +325,15 @@ class CSVImporter $update[$key] = $insert[$key]; } } + foreach ($this->field_value as $key=>$value) { + $insert[$key] = $value; + $fields[] = $key; + } if ($current == 'valid' && Env::has('csv_valid')) { - $this->run(Env::v('csv_action'), $insert, $update); + S::assert_xsrf_token(); + $this->run($_SESSION['csv_action'], $insert, $update); $page->assign('csv_done', true); + $this->cleanSession($sesfields); } else { $preview = array(); foreach ($this->data as $line) { @@ -261,12 +343,13 @@ class CSVImporter } } $page->assign('csv_index', $this->index); - $page->assign('csv_funtions', $this->user_functions); + $page->assign('csv_functions', $this->user_functions); + $page->assign('csv_field_desc', $this->field_desc); $page->assign('csv_page', $next); $page->assign('csv_path', $url); - $page->assign('csv_fields', $fields); - $page->assign('csv', $csv); + $page->assign('csv_fields', $fields); } } +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: ?>