Skip to content

Commit

Permalink
Merge pull request #3 from DreamSpawn/import-activity
Browse files Browse the repository at this point in the history
Import activity
  • Loading branch information
DreamSpawn committed Nov 24, 2019
2 parents 2ccd7f7 + baa3740 commit e7270e2
Show file tree
Hide file tree
Showing 6 changed files with 216 additions and 57 deletions.
144 changes: 101 additions & 43 deletions include/controllers/activity_controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -215,60 +215,109 @@ public function opretAktivitet()

$this->page->model = $this->model;
}

/**
* Imports activities from a submitted spreadsheet
*
* Handle import and export of activity data
*
* @access public
* @return void
*/
public function importActivities()
{
public function importExportActivities(){
$session = $this->dic->get('Session');

// if it's not a post request, don't do anything
if (!$this->page->request->isPost()){
return;
}
$post = $this->page->request->post;

// Did the user submit a file

if (isset($post->importactivities)) {
$file = isset($_FILES['activities']) ? $_FILES['activities'] : null;
if($file == null || $file['error'] == 4) {
$this->errorMessage('Ingen Excel fil valgt.');
return;
}
$this->uploadActivities();
$session->activity_data = $this->model->activity_data;
}

// Parse the file depending on file type or give an error if type isn't known
list($name, $type) = explode(".", $file['name']);
switch ($type) {
case "xlsx":
if ( !$data = SimpleXLSX::parse($file['tmp_name'])->rows() ) {
$this->errorMessage(SimpleXLSX::parseError());
}
break;
case "xls":
if ( !$data = SimpleXLS::parse($file['tmp_name'])->rows() ) {
$this->errorMessage(SimpleXLS::parseError());
}
break;
default:
$this->errorMessage('Fil er ikke korrekt type');
return false;
}
if ((isset($post->import_add) || isset($post->import_replace)) && isset($session->activity_data)) {
$this->saveActivities($session->activity_data, isset($post->import_replace));
$session->delete('activity_data');
}

unset($data[0]); // remove column names from data
$session->activity_data = $this->model->parseActivityData($data);
$this->successMessage('Aktiviteter blev uploadet, men er IKKE gemt');
if (isset($post->exportactivities)){
$this->exportActivities();
}

if ((isset($post->import_add) || isset($post->import_replace)) && isset($session->activity_data)) {
if (isset($session->activity_data)) {
$this->page->activity_data = $session->activity_data;
$this->page->activity_header = $this->model->getActivityHeader();
}

}

/**
* Imports activities from a submitted spreadsheet
*
* @access private
* @return void
*/
private function uploadActivities()
{
// Did the user submit a file
$file = isset($_FILES['activities']) ? $_FILES['activities'] : null;
if($file == null || $file['error'] == 4) {
$this->errorMessage('Ingen Excel fil valgt.');
return;
}

// Parse the file depending on file type or give an error if type isn't known
list($name, $type) = explode(".", $file['name']);
switch ($type) {
case "xlsx":
if ( !$data = SimpleXLSX::parse($file['tmp_name'])->rows() ) {
$this->errorMessage(SimpleXLSX::parseError());
}
break;
case "xls":
if ( !$data = SimpleXLS::parse($file['tmp_name'])->rows() ) {
$this->errorMessage(SimpleXLS::parseError());
}
break;
case "csv":
$data = self::parseCSV($file['tmp_name']);
break;
default:
$this->errorMessage('Fil er ikke korrekt type');
return false;
}

unset($data[0]); // remove column names from data
$this->model->activity_data = $this->model->parseActivityData($data);
$this->successMessage('Aktiviteter blev uploadet, men er IKKE gemt');
}

private static function parseCSV($file){
$csv = file_get_contents($file);
// $lb = "\n";
// $delim = ";";
$lines = explode(";\n", $csv);
foreach ($lines as $line) {
preg_match_all("/\"([^\"]*)\"/",$line,$matches);
if (count($matches[1]) > 0) {
$data[] = $matches[1];
}
}
return $data;
}

/**
* Save uploaded data in the database
*
* @access private
* @return void
*/
private function saveActivities($data, $replace = false) {
try {
if ($this->model->importActivities($session->activity_data, isset($post->import_replace))) {
if ($this->model->saveActivities($data, $replace)) {
$this->successMessage('Aktiviteter blev importeret.');
$this->log("Aktiviter blev importeret", 'Aktivitet', $this->model->getLoggedInUser());
$session->delete('activity_data');
} else {
$this->errorMessage('Kunne ikke importere aktiviteter.');
}
Expand All @@ -281,14 +330,23 @@ public function importActivities()
} catch (Exception $e) {
$this->errorMessage('Kunne ikke importere aktiviteter.');
}
}

private function exportActivities(){
$activities = $this->model->loadActivities();
header('Content-Type: text/csv;charset=utf-8');
header('Content-Disposition: attachment;filename="aktiviteter.csv"');
header('Cache-Control: max-age=0');
//echo "this; is; a; test; header;\n";

foreach($activities as $activity) {
foreach($activity as $cell) {
echo "\"$cell\";";
}
echo "\n";
}

if (isset($session->activity_data)) {
$this->page->activity_data = $session->activity_data;
$this->page->activity_header = $this->model->getActivityHeader();
}

}
exit;
}

/**
* creates a scheduling for an activity
Expand Down
2 changes: 1 addition & 1 deletion include/framework/layout.php
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ protected function generateMenu() {
<li><a href='{$this->url('vis_alle_aktiviteter')}'>Alle aktiviteter</a></li>
<li><a href='{$this->url('activities_graphed')}'>Grafisk oversigt</a></li>
<li><a href='{$this->url('opret_aktivitet')}'>Opret aktivitet</a></li>
<li><a href='{$this->url('import_activities')}'>Importer aktiviter</a></li>
<li><a href='{$this->url('import_activities')}'>Importer/eksporter aktiviter</a></li>
<li><a href='{$this->url('show_vote_stats')}'>Afstemnings-statistik</a></li>
<li><a href='{$this->url('priority_signup_statistics')}'>Tilmeldings-statistik</a></li>
<li><hr/></li>
Expand Down
2 changes: 1 addition & 1 deletion include/framework/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ public function __construct(Config $config)
$this->routes['edit_aktivitet'] = array('url' => 'aktivitet/edit/:id:', 'controller' => 'Activity', 'method' => 'editAktivitet');
$this->routes['edit_afvikling'] = array('url' => 'aktivitet/editafvikling/:id:', 'controller' => 'Activity', 'method' => 'editAfvikling');
$this->routes['opret_aktivitet'] = array('url' => 'aktivitet/opret/', 'controller' => 'Activity', 'method' => 'opretAktivitet');
$this->routes['import_activities'] = array('url' => 'aktivitet/importer/', 'controller' => 'Activity', 'method' => 'importActivities');
$this->routes['import_activities'] = array('url' => 'aktivitet/importer_eksporter/', 'controller' => 'Activity', 'method' => 'importExportActivities');
$this->routes['opret_afvikling'] = array('url' => 'aktivitet/opretafvikling/:aktivitet_id:', 'controller' => 'Activity', 'method' => 'opretAfvikling');
$this->routes['slet_aktivitet'] = array('url' => 'aktivitet/slet/:id:', 'controller' => 'Activity', 'method' => 'sletAktivitet');
$this->routes['slet_afvikling'] = array('url' => 'aktivitet/sletafvikling/:id:', 'controller' => 'Activity', 'method' => 'sletAfvikling');
Expand Down
82 changes: 74 additions & 8 deletions include/models/activity_model.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ public function getActivityHeader(){
$fields = $activity->getColumns();
$fields[] = 'age_min';
$fields[] = 'age_max';
unset($fields[0]); // remove id from header
return $fields;
}

Expand All @@ -190,18 +189,18 @@ public static function parseActivityData($data){
}

public static function parseActivityRow($row){
for($i = 0; $i < 24; $i++){
for($i = 0; $i <= 26; $i++){
$row[$i] = isset($row[$i]) ? $row[$i] : "";
}

$result_row = [];
//$result_row['id'] = '';
$result_row['id'] = $row[26];
$result_row['navn'] = $row[1];
$result_row['kan_tilmeldes'] = 'ja';
$result_row['kan_tilmeldes'] = preg_match("/nej/", strtolower($row[24])) == 1 ? 'nej' : 'ja';;
$result_row['note'] = $row[22];
$result_row['foromtale'] = $row[17];
preg_match("/\d+/", $row[12], $matches);
$result_row['varighed_per_afvikling'] = $matches[0];
$result_row['varighed_per_afvikling'] = isset($matches[0]) ? $matches[0] : 0;
preg_match("/\d+/", $row[6], $matches);
$result_row['min_deltagere_per_hold'] = isset($matches[0]) ? $matches[0] : 0;
preg_match("/\d+/", $row[7], $matches);
Expand All @@ -211,7 +210,7 @@ public static function parseActivityRow($row){
preg_match("/\d+/", $row[9], $matches);
$result_row['pris'] = isset($matches[0]) ? $matches[0] : 0;
$result_row['lokale_eksklusiv'] = preg_match("/nej/", strtolower($row[19])) == 1 ? 'nej' : 'ja';
$result_row['wp_link'] = 0;
$result_row['wp_link'] = $row[25];
$result_row['teaser_dk'] = $row[13];
$result_row['teaser_en'] = $row[14];
$result_row['title_en'] = $row[2];;
Expand Down Expand Up @@ -285,7 +284,7 @@ private static function parseDateTime($dateTime){
return "$date $time";
}

public function importActivities($data, $replace = false) {
public function saveActivities($data, $replace = false) {
if($replace === true) {
// Check if we have any afviklinger before trying to replace activities
if ($this->createEntity('Afviklinger')->findAll()
Expand Down Expand Up @@ -325,7 +324,74 @@ public function importActivities($data, $replace = false) {
}

return $errors == 0;
}
}

/**
* Load all activities from database
* for use with export function
*/
public function loadActivities()
{
$activity = $this->createEntity('Aktiviteter');
//$columns = $activity->getColumns();
$activities = $activity->findAll();
$columns = [
'updated', //0
'navn', //1
'title_en', //2
'author', //3
'type', //4
'sprog', //5
'min_deltagere_per_hold', //6
'max_deltagere_per_hold', //7
'spilledere_per_hold', //8
'pris', //9
'age_min', //10
'age_max', //11
'varighed_per_afvikling', //12
'teaser_dk', //13
'teaser_en', //14
'onetime', //15 inverse of replayable
'max_signups', //16
'foromtale', //17
'description_en', //18
'lokale_eksklusiv', //19
'tids_eksklusiv', //20
'hidden', //21
'note', //22
'karmatype', //23
'kan_tilmældes', //24
'wp_link', //25
'id', //26
];

$list[] = $columns;
foreach ($activities as $activity) {
$fields = [];
foreach ($columns as $column){
switch($column) {
case 'age_min':
$age = $activity->getMinAge();
$fields[] = $age == false ? '' : $age;
break;
case 'age_max':
$age = $activity->getMaxAge();
$fields[] = $age == false ? '' : $age;
break;
case 'onetime':
$fields[] = $activity->replayable == 'nej' ? 'ja' : 'nej';
break;
default:
$fields[] = str_replace("\"","''",$activity->$column);
}
}
$list[] = $fields;
}

//usort($activities[$type], function($a, $b) {return strcmp($a->navn, $b->navn);});
return $list;
}


/**
* creates a scheduling for an activity with data from POST
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,31 @@
<?=$this->getMessagesHtml()?>
<div class='middleboxes'>
<fieldset>
<legend>Eksporter Aktiviteter</legend>
<div class="outer-container">
<form action="" method="post" name="frmExcelExport" id="frmExcelExport" enctype="multipart/form-data">
<div>
<label>Vælg Filtype</label>
<select name="filetype" id="activities_filetype">
<option value ="csv">Comma Seperated Values (.csv)</option>
</select>
<button type="submit" id="exportactivities" name="exportactivities" class="btn-submit">Eksportér</button>
</div>
</form>
</div>
</fieldset>
</div>
<div class='middleboxes'>
<fieldset>
<legend>Importer Aktiviteter</legend>
<div class="outer-container">
<p>Bemærk det er vigtigt at kolonner står i den rigtige rækkefølge.</p>
<p>Bemærk det er vigtigt at kolonner står i den rigtige rækkefølge.
<br>En csv-fil skal være af samme format som det der bliver eksporteret</p>
<p>Man vil kunne se resultatet af importen inden man vælger at lægge det i databasen</p>
<form action="" method="post" name="frmExcelImport" id="frmExcelImport" enctype="multipart/form-data">
<div>
<label>Vælg Excel Fil</label>
<input type="file" name="activities" id="activities_file" accept=".xls,.xlsx">
<input type="file" name="activities" id="activities_file" accept=".xls,.xlsx,application/vnd.ms-excel,.csv,text/csv">
<button type="submit" id="importactivities" name="importactivities" class="btn-submit">Importér</button>
</div>
</form>
Expand Down Expand Up @@ -37,8 +54,10 @@
if($key == "updated") {
$cell = preg_replace("/ /","&nbsp;",$cell);
$cell = preg_replace("/-/","&#8209;",$cell);
} ?>
<td><?=$cell?></td>
}
$class = strlen($cell) > 100 ? 'class="long-text"' : '';
?>
<td><div <?=$class?>><?=$cell?></div></td>
<?php } ?>
</tr>
<?php } ?>
Expand Down
16 changes: 16 additions & 0 deletions public/css/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -2326,3 +2326,19 @@ table.accounting tbody {
vertical-align: top;
border: #000 1px solid;
}

.importTable td div {
max-height: 8em;
overflow: hidden;
margin: 0;
}

.importTable td div.long-text {
width: 30em;
overflow: auto;
}

form#frmExcelExport select {
margin-bottom: 0px;
width: auto;
}

0 comments on commit e7270e2

Please sign in to comment.