private function _exportSubmission(AmForms_ExportModel $export, $submission, $returnData = false)
{
// Row data
$data = array();
$columnCounter = 0;
// Multiple rows data
$hasMoreRows = false;
$moreRowsData = array();
if ($returnData) {
$fields = array();
$fieldLayout = $submission->getFieldLayout();
foreach ($fieldLayout->getFields() as $fieldLayoutField) {
$field = $fieldLayoutField->getField();
$fields[$field->handle] = $field;
}
} else {
$fields = $this->_exportFields[$export->id];
}
foreach ($fields as $fieldHandle => $field) {
switch ($field->type) {
case 'Assets':
$fieldExportData = array();
foreach ($submission->{$fieldHandle}->find() as $fieldData) {
$fieldExportData[] = $fieldData->getUrl();
}
$data[] = implode(', ', $fieldExportData);
break;
case 'Entries':
$fieldExportData = array();
foreach ($submission->{$fieldHandle}->find() as $fieldData) {
$fieldExportData[] = $fieldData->getContent()->title;
}
$data[] = implode(', ', $fieldExportData);
break;
case 'Checkboxes':
case 'MultiSelect':
if (isset($submission->{$fieldHandle}) && count($submission->{$fieldHandle})) {
$fieldExportData = array();
foreach ($submission->{$fieldHandle} as $fieldData) {
$fieldExportData[] = $fieldData->value;
}
$data[] = implode(', ', $fieldExportData);
} else {
$data[] = '';
}
break;
case 'Lightswitch':
$data[] = $submission->{$fieldHandle} ? Craft::t('Yes') : Craft::t('No');
break;
case 'Matrix':
$blockCounter = 0;
$matrixBlocks = $submission->{$fieldHandle}->find();
if (!$matrixBlocks) {
// No matrix data, so we have to add empty cells!
for ($i = 1; $i <= $this->_exportSpaceCounter[$export->id][$fieldHandle]; $i++) {
$data[] = '';
}
} else {
foreach ($matrixBlocks as $matrixBlock) {
$matrixBlockType = $matrixBlock->getType();
$blockData = $this->_exportSubmission($export, $matrixBlock, true);
// Column counter
$startFrom = $this->_exportColumns[$export->id][$fieldHandle . ':' . $matrixBlockType->handle];
// Multiple blocks?
if (count($matrixBlocks) > 1 && $blockCounter > 0 && !$this->_ignoreMatrixMultipleRows) {
$hasMoreRows = true;
$moreRowsData[$startFrom][] = $blockData;
} else {
if (!$this->_ignoreMatrixMultipleRows) {
// Empty cells till we've reached the block type
for ($i = 0; $i < $startFrom - $columnCounter; $i++) {
$data[] = '';
}
}
// We just have one block or we are adding the first block
$spaceCounter = 0;
foreach ($blockData as $blockValue) {
$data[] = $blockValue;
$spaceCounter++;
}
if (!$this->_ignoreMatrixMultipleRows) {
// Empty cells till we've reached the next field, if necessary
if ($startFrom == $columnCounter) {
for ($i = 0; $i < $this->_exportSpaceCounter[$export->id][$fieldHandle] - $spaceCounter; $i++) {
$data[] = '';
}
}
}
}
$blockCounter++;
}
}
break;
case 'Table':
if (isset($submission->{$fieldHandle}) && count($submission->{$fieldHandle})) {
$fieldExportData = array();
foreach ($submission->{$fieldHandle} as $fieldData) {
foreach ($fieldData as $columnKey => $columnValue) {
if (substr($columnKey, 0, 3) == 'col' && $columnValue) {
$fieldExportData[] = $columnValue;
}
}
}
$data[] = implode(', ', $fieldExportData);
} else {
$data[] = '';
}
break;
default:
$data[] = str_replace(array("\n", "\r", "\r\n", "\n\r"), ' ', $submission->{$fieldHandle});
break;
}
$columnCounter++;
}
// Either return the data or add to CSV
if ($returnData) {
return $data;
}
fputcsv($this->_exportFiles[$export->startRightAway ? 'manual' : $export->id], $data, $this->_delimiter);
// Add more rows?
if ($hasMoreRows) {
foreach ($moreRowsData as $columnCounter => $rows) {
foreach ($rows as $row) {
// This row's data
$data = array();
// Empty cells till we've reached the data
for ($i = 0; $i < $columnCounter; $i++) {
$data[] = '';
}
// Add row data
foreach ($row as $rowData) {
$data[] = $rowData;
}
// Add row to CSV
fputcsv($this->_exportFiles[$export->startRightAway ? 'manual' : $export->id], $data, $this->_delimiter);
}
}
}
}