set json api functions parameter names
[tine20] / tine20 / Tinebase / Export.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Export
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Philipp Schüle <p.schuele@metaways.de>
10  * 
11  * @todo        when more formats switched to Tinebase_Export_Abstract, change creation of object (new $exportClass($_additionalOptions))
12  * @todo        add registry of export classes ?
13  */
14
15 /**
16  * Export Factory Class
17  *
18  * @package     Tinebase
19  * @subpackage  Export
20  */
21 class Tinebase_Export
22 {
23     /**
24      * get export object for given filter and format
25      * 
26      * @param Tinebase_Model_Filter_FilterGroup $_filter
27      * @param string|array $_options format (as string) or export definition id (array)
28      * @param Tinebase_Controller_Record_Interface $_controller (optional)
29      * @param array $_additionalOptions (optional)
30      * @return Tinebase_Export_Abstract
31      * @throws Tinebase_Exception_NotFound
32      */
33     public static function factory($_filter, $_options, $_controller = NULL, $_additionalOptions = array()) 
34     {
35         if (! is_array($_options)) {
36             $_options = array(
37                 'format' => $_options
38             );
39         }
40         
41         // always merge options? this needs to be refactored!
42         $_additionalOptions = array_merge($_additionalOptions, $_options);
43         
44         if ((isset($_options['definitionId']) || array_key_exists('definitionId', $_options))) {
45             $definition = Tinebase_ImportExportDefinition::getInstance()->get($_options['definitionId']);
46             $exportClass = $definition->plugin;
47             
48         } else if ((isset($_options['format']) || array_key_exists('format', $_options)) && ! empty($_options['format'])) {
49             $appName = $_filter->getApplicationName();
50             $model = $_filter->getModelName();
51             
52             $exportClass = $appName . '_Export_' . ucfirst(strtolower($_options['format']));
53             
54             // start output buffering to catch errors, append them to log and exception
55             ob_start();
56             
57             if (! class_exists($exportClass)) {
58                 
59                 $ob = (ob_get_length() > 0) ? ob_get_clean() : '';
60                 
61                 // check for model specific export class
62                 list($a, $b, $modelPart) = explode('_', $model);
63                 $exportClass2 = $exportClass . '_' . $modelPart;
64                 
65                 if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) {
66                     Tinebase_Core::getLogger()->log(__METHOD__ . '::' . __LINE__ . ' Could not find class ' . $exportClass . ' trying ' . $exportClass2 . '. Output Buffer: ' . PHP_EOL . $ob, Zend_Log::NOTICE);
67                 }
68                 
69                 if (! class_exists($exportClass2)) {
70                     
71                     $ob = (ob_get_length() > 0) ? ob_get_clean() : NULL;
72                     
73                     ob_end_flush();
74                     
75                     throw new Tinebase_Exception_NotFound('No ' . $_options['format'] . ' export class found for ' . $appName . ' / ' . $model . '. ClassName: ' . $exportClass2 . ($ob ? 'Output: ' . $ob : ''));
76                 } else {
77                     $exportClass = $exportClass2;
78                 }
79             }
80             
81             ob_end_flush();
82         } else {
83             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
84                 . ' Export options: ' . print_r($_options, TRUE));
85             throw new Tinebase_Exception_InvalidArgument('Export definition ID or format required in options');
86         }
87         
88         if (preg_match('/pdf/i', $exportClass)) {
89             // legacy
90             $result = new $exportClass($_additionalOptions);
91         } else {
92             $result = new $exportClass($_filter, $_controller, $_additionalOptions);
93         }
94         
95         return $result;
96     }
97 }