Craft\Formerly_ExportController::actionCsv PHP Method

actionCsv() public method

public actionCsv ( )
    public function actionCsv()
    {
        $formId = craft()->request->getPost('form');
        $form = craft()->formerly_forms->getFormById($formId);
        $formQuestions = $form->getQuestions();
        $fieldTypes = craft()->fields->getAllFieldTypes();
        set_time_limit('1000');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . ($form->handle . '_submissions.csv'));
        header('Content-Transfer-Encoding: binary');
        $stream = fopen('php://output', 'w');
        $criteria = craft()->elements->getCriteria('Formerly_Submission');
        $criteria->formId = $formId;
        $query = craft()->elements->buildElementsQuery($criteria, $contentTable, $fieldColumns);
        $query->limit(500000);
        $query->order('dateCreated desc');
        if (isset($_POST['fromDate']) && !empty($_POST['fromDate']['date']) && isset($_POST['toDate']) && !empty($_POST['toDate']['date'])) {
            $fromDate = craft()->request->getPost('fromDate');
            $fromDate = DateTime::createFromString($fromDate, craft()->timezone);
            $toDate = craft()->request->getPost('toDate');
            $toDate = DateTime::createFromString($toDate, craft()->timezone);
            $query->andWhere(DbHelper::parseDateParam('elements.dateCreated', '>= ' . $fromDate->format(DateTime::MYSQL_DATETIME), $query->params));
            $query->andWhere(DbHelper::parseDateParam('elements.dateCreated', '<= ' . $toDate->format(DateTime::MYSQL_DATETIME), $query->params));
        } elseif (isset($_POST['fromDate']) && !empty($_POST['fromDate']['date'])) {
            $fromDate = craft()->request->getPost('fromDate');
            $fromDate = DateTime::createFromString($fromDate, craft()->timezone);
            $query->andWhere(DbHelper::parseDateParam('elements.dateCreated', '>= ' . $fromDate->format(DateTime::MYSQL_DATETIME), $query->params));
        } else {
            if (isset($_POST['toDate']) && !empty($_POST['toDate']['date'])) {
                $toDate = craft()->request->getPost('toDate');
                $toDate = DateTime::createFromString($toDate, craft()->timezone);
                $query->andWhere(DbHelper::parseDateParam('elements.dateCreated', '<= ' . $toDate->format(DateTime::MYSQL_DATETIME), $query->params));
            }
        }
        // Write column names first.
        $first = true;
        $queryResult = $query->query();
        $elementType = $criteria->getElementType();
        while (false !== ($result = $queryResult->read())) {
            if ($this->enableHooks) {
                // Make a copy to pass to the onPopulateElement event
                $originalResult = array_merge($result);
            }
            // Separate the content values from the main element attributes
            $content = array('id' => isset($result['contentId']) ? $result['contentId'] : null, 'elementId' => $result['id'], 'locale' => $criteria->locale, 'title' => isset($result['title']) ? $result['title'] : null);
            unset($result['title']);
            if ($fieldColumns) {
                foreach ($fieldColumns as $column) {
                    // Account for results where multiple fields have the same handle, but from
                    // different columns e.g. two Matrix block types that each have a field with the
                    // same handle
                    $colName = $column['column'];
                    $fieldHandle = $column['handle'];
                    if (!isset($content[$fieldHandle]) || empty($content[$fieldHandle]) && !empty($result[$colName])) {
                        $content[$fieldHandle] = $result[$colName];
                    }
                    unset($result[$colName]);
                }
            }
            $result['locale'] = $criteria->locale;
            if ($this->enableHooks) {
                $submission = $elementType->populateElementModel($result);
                // Was an element returned?
                if (!$submission || !$submission instanceof BaseElementModel) {
                    continue;
                }
                $submission->setContent($content);
                // Fire an 'onPopulateElement' event
                craft()->elements->onPopulateElement(new Event($this, array('element' => $submission, 'result' => $originalResult)));
            } else {
                $result['dateCreated'] = DateTime::createFromFormat(DateTime::MYSQL_DATETIME, $result['dateCreated']);
                $submission = (object) array_merge($content, $result);
            }
            $row = array('Id' => $submission->id, 'Time' => $submission->dateCreated->format('d/m/Y H:i:s'));
            foreach ($formQuestions as $question) {
                if ($question->type == Formerly_QuestionType::RawHTML) {
                    continue;
                }
                $columnName = str_replace(array($form->handle . '_', Formerly_QuestionType::CustomListHandle, Formerly_QuestionType::RawHTMLHandle, Formerly_QuestionType::CustomHandle), '', $question->handle);
                $columnName = ucwords($columnName);
                $value = $submission->{$question->handle};
                if (!$this->enableHooks && isset($fieldTypes[$question->type])) {
                    $fieldType = clone $fieldTypes[$question->type];
                    $fieldType->setSettings(array('options' => $question->options));
                    if ($value && is_string($value) && mb_strpos('{[', $value[0]) !== false) {
                        // Presumably this is JSON.
                        $value = JsonHelper::decode($value);
                    }
                    $value = $fieldType->prepValue($value);
                }
                if ($value instanceof MultiOptionsFieldData) {
                    $summary = array();
                    if ($question->type == Formerly_QuestionType::CustomList) {
                        for ($j = 0; $j < count($value); ++$j) {
                            $v = $value[$j];
                            if ($v->selected) {
                                $summary[] = $v->value;
                            }
                        }
                    } else {
                        foreach ($value->getOptions() as $option) {
                            if ($option->selected) {
                                $summary[] = $option->value;
                            }
                        }
                    }
                    $row[$columnName] = implode($summary, ', ');
                } elseif ($question->type == Formerly_QuestionType::MultilineText) {
                    $row[$columnName] = str_replace('<br />', "\n", $value);
                } else {
                    $row[$columnName] = $value;
                }
            }
            if ($first) {
                fputcsv($stream, array_keys($row));
                $first = false;
            }
            fputcsv($stream, $row);
        }
        fclose($stream);
    }
Formerly_ExportController