/** * Given an import data's table name, create a basic mapping data array that has the correct starting * elements set as null. This will ensure the mapping data array is always structured correctly. Each key * will be a column name from the table. Throws an exception if the table is missing rows. * @param string $tableName * @return array $mappingData */ public static function makeMappingDataByTableName($tableName) { assert('is_string($tableName)'); $firstRowData = ImportDatabaseUtil::getFirstRowByTableName($tableName); if (count($firstRowData) == 1 || count($firstRowData) == 0) { throw new NoRowsInTableException(); } //Handle scenario where every column is null. Similiar to scenario below it with no data in file but //making a row anyways. $allValuesAreNull = true; foreach ($firstRowData as $columnName => $value) { if ($value != null && $columnName != 'id') { $allValuesAreNull = false; break; } } if ($allValuesAreNull) { throw new NoRowsInTableException(); } //handles scenario where there is no data in the file, but because there are a few bytes, //it creates a single row. if (count($firstRowData) == 2) { foreach ($firstRowData as $columnName => $value) { if (!in_array($columnName, ImportDatabaseUtil::getReservedColumnNames()) && $value == null) { if (ImportDatabaseUtil::getCount($tableName) == 1) { throw new NoRowsInTableException(); } } } } $mappingData = array(); foreach ($firstRowData as $columnName => $notUsed) { if (!in_array($columnName, ImportDatabaseUtil::getReservedColumnNames())) { $mappingData[$columnName] = array('type' => 'importColumn', 'attributeIndexOrDerivedType' => null, 'mappingRulesData' => null); } } return $mappingData; }
/** * Get the meta data and merge with standard CGridView column elements * to create a column array that fits the CGridView columns API * @return array */ protected function getCGridViewColumns() { $columns = array(); if ($this->rowsAreExpandable()) { $firstColumn = array('class' => 'ImportDrillDownColumn', 'id' => $this->gridId . $this->gridIdSuffix . '-rowDrillDown', 'expandableContentType' => static::getExpandableContentType(), 'htmlOptions' => array('class' => 'hasDrillDownLink')); array_push($columns, $firstColumn); } array_push($columns, $this->resolveSecondColumn()); $headerRow = ZurmoRedBean::$writer->getFirstRowByTableName($this->dataProvider->getTableName()); foreach ($headerRow as $columnName => $label) { if (!in_array($columnName, ImportDatabaseUtil::getReservedColumnNames()) && $this->mappingData[$columnName]['type'] == 'importColumn' && $this->mappingData[$columnName]['attributeIndexOrDerivedType'] != null) { if (!$this->dataProvider->hasHeaderRow()) { $label = static::resolveColumnCountByName($columnName); } $params = array(); $columnAdapter = new BeanStringListViewColumnAdapter($columnName, $this, $params); $column = $columnAdapter->renderGridViewData(); $column['header'] = static::resolveHeaderColumnContent($columnName, $label); $this->columnLabelsByName[$columnName] = $column['header']; if (!isset($column['class'])) { $this->resolveColumnData($column, $columnName); } array_push($columns, $column); } } return $columns; }
public function actionSampleRow($id) { $import = Import::getById((int) $_GET['id']); $importWizardForm = ImportWizardUtil::makeFormByImport($import); $dataProvider = $this->makeDataProviderForSampleRow($import, (bool) $importWizardForm->firstRowIsHeaderRow); $data = $dataProvider->getData(); $renderedContentData = array(); $pagerUrl = Yii::app()->createUrl('import/default/sampleRow', array('id' => $import->id)); $headerContent = ImportDataProviderPagerUtil::renderPagerAndHeaderTextContent($dataProvider, $pagerUrl); $renderedContentData[MappingFormLayoutUtil::getSampleColumnHeaderId()] = $headerContent; foreach ($data as $sampleColumnData) { foreach ($sampleColumnData as $columnName => $value) { if (!in_array($columnName, ImportDatabaseUtil::getReservedColumnNames())) { $renderedContentData[MappingFormLayoutUtil::resolveSampleColumnIdByColumnName($columnName)] = MappingFormLayoutUtil::renderChoppedStringContent($value); } } } echo CJSON::encode($renderedContentData); Yii::app()->end(0, false); }