/** * Gets the full path of the file. * * @param IExportPolicy $policy * @param CDbCriteriaBuilder $builder * @return string */ public function getFileName(IExportPolicy $policy, CDbCriteriaBuilder $builder) { $fullpath = $this->basePath; foreach ($policy->getExportPathHierarchy($builder) as $dirname) { $fullpath .= DIRECTORY_SEPARATOR . $dirname; if (!is_dir($fullpath)) { if (!@mkdir($fullpath)) { throw new CException(Yii::t('export.CFileWriter', 'The given path "{path}" is not writable.', array('{path}' => $fullpath))); } } } $fullpath .= DIRECTORY_SEPARATOR . $policy->getExportedFilename($builder) . '.' . $policy->getFormat()->getFileExtension(); return $fullpath; }
/** * {@inheritDoc} * @see IExporter::exportPolicyToFile() */ public function exportPolicyToFile(IExportPolicy $policy, IFileWriter $filewriter) { /* @var $criteria CDbCriteriaBuilder */ foreach ($policy->getIterator() as $builder) { $record = $policy->getModel(); $event = new ValidateExportEvent($this, array('policy' => $policy, 'builder' => $builder)); $this->raiseEvent('onValidateExport', $event); // if the file does not exists, we still force the export if (!$event->validate && $filewriter->hasFileOn($policy, $builder)) { continue; } $event = new BeforeEraseFileEvent($this, array('policy' => $policy, 'builder' => $builder)); $this->raiseEvent('onBeforeEraseFile', $event); if ($event->validate) { $success = $filewriter->eraseFileOn($policy, $builder); $event = new AfterEraseFileEvent($this, array('policy' => $policy, 'builder' => $builder, 'success' => $success)); $this->raiseEvent('onAfterEraseFile', $event); } $event = new BeforeLockFileEvent($this, array('policy' => $policy, 'builder' => $builder)); $this->raiseEvent('onBeforeLockFile', $event); if ($event->validate) { $success = $filewriter->lockFileOn($policy, $builder); $event = new AfterLockFileEvent($this, array('policy' => $policy, 'builder' => $builder, 'success' => $success)); $this->raiseEvent('onAfterLockFile', $event); } $i = 0; $attributes = array(); $iterator = new COrderedIterator($record, $builder->getCriteria()); foreach ($iterator as $record) { $attributes[] = $record->attributes; $i++; if ($i >= $this->_number_of_records_per_page) { $sql = $policy->getFormat()->format($record, $attributes); $event = new BeforeWriteFileEvent($this, array('policy' => $policy, 'builder' => $builder, 'data' => $sql)); $this->raiseEvent('onBeforeWriteFile', $event); if ($event->validate) { $success = $filewriter->appendToFileOn($policy, $builder, $sql); $event = new AfterWriteFileEvent($this, array('policy' => $policy, 'builder' => $builder, 'data' => $sql, 'success' => $success)); $this->raiseEvent('onAfterWriteFile', $event); } $i = 0; $attributes = array(); } } if (!empty($attributes)) { $sql = $policy->getFormat()->format($record, $attributes); $event = new BeforeWriteFileEvent($this, array('policy' => $policy, 'builder' => $builder, 'data' => $sql)); $this->raiseEvent('onBeforeWriteFile', $event); if ($event->validate) { $success = $filewriter->appendToFileOn($policy, $builder, $sql); $event = new AfterWriteFileEvent($this, array('policy' => $policy, 'builder' => $builder, 'data' => $sql, 'success' => $success)); $this->raiseEvent('onAfterWriteFile', $event); } } $event = new BeforeUnlockFileEvent($this, array('policy' => $policy, 'builder' => $builder)); $this->raiseEvent('onBeforeUnlockFile', $event); if ($event->validate) { $success = $filewriter->unlockFileOn($policy, $builder); $event = new AfterUnlockFileEvent($this, array('policy' => $policy, 'builder' => $builder, 'success' => $success)); $this->raiseEvent('onAfterUnlockFile', $event); } } }
/** * Gets the cached key that for given record. * * @param IExportPolicy $policy * @param CDbCriteriaBuilder $builder * @return string */ public function buildKey(IExportPolicy $policy, CDbCriteriaBuilder $builder) { return self::CACHED_EXPORT_KEY . '_' . $policy->getUniqueKey($builder); }