예제 #1
0
 /**
  * Обработчик действия: Экспорт каталога.
  */
 function Export()
 {
     @set_time_limit(0);
     mk_dir("files/" . DOMAIN . "/tmp");
     clearDir("files/" . DOMAIN . "/tmp");
     require_once "Structures/DataGrid.php";
     require_once "Structures/DataGrid/DataSource/Array.php";
     require_once "Structures/DataGrid/Renderer/CSV.php";
     $categories = array();
     $fields = array();
     $all = array();
     A::$DB->query("SELECT * FROM " . SECTION . "_cols ORDER BY sort");
     $i = 0;
     while ($row = A::$DB->fetchRow()) {
         if ($row['type'] == 'select' || $row['type'] == 'mselect') {
             if ($row['idvar'] = A::$DB->getOne("SELECT property FROM " . DOMAIN . "_fields WHERE item='" . SECTION . "' AND field=?", $row['field'])) {
                 $row['vars'] = loadList($row['idvar']);
                 foreach ($row['vars'] as $j => $name) {
                     if (is_array($name) && isset($name['name'])) {
                         $row['vars'][$j] = $name['name'];
                     }
                 }
             }
         }
         $row['id'] = $i++;
         $all[$row['field']] = $row;
         if (preg_match("/^category([0-9]{1})\$/i", $row['field'], $matches)) {
             $row['level'] = $matches[1];
             $categories[$row['field']] = $row;
         } else {
             $fields[$row['field']] = $row;
         }
     }
     A::$DB->free();
     $renderer = new Structures_DataGrid_Renderer_CSV();
     $renderer->setOptions(array('delimiter' => ';', 'enclosure' => '"', 'saveToFile' => true, 'useQuotes' => true, 'filename' => "files/" . DOMAIN . "/tmp/" . DOMAIN . "_" . getName(SECTION) . ".csv"));
     $renderer->init();
     $datasource = new Structures_DataGrid_DataSource_Array();
     $datagrid = new Structures_DataGrid();
     $datagrid->bindDataSource($datasource);
     $datagrid->attachRenderer(&$renderer);
     $i = 0;
     $header = array();
     foreach ($all as $field => $frow) {
         $header[$i++] = array('field' => $field, 'label' => mb_convert_encoding($frow['caption'], "Windows-1251", "UTF-8"));
     }
     $renderer->buildHeader($header);
     $cats = array();
     $this->getCategories($cats);
     $i = 0;
     foreach ($cats as $id => $category) {
         A::$DB->query("SELECT * FROM " . SECTION . "_catalog WHERE idcat={$id} ORDER BY name");
         while ($row = A::$DB->fetchRow()) {
             $crow = array();
             for ($j = 0; $j < count($all); $j++) {
                 $crow[$j] = "";
             }
             foreach ($categories as $field => $frow) {
                 if (isset($category['parents'][$frow['level']])) {
                     $crow[$frow['id']] = mb_convert_encoding($category['parents'][$frow['level']], "Windows-1251", "UTF-8");
                 }
             }
             foreach ($fields as $field => $frow) {
                 switch ($frow['type']) {
                     default:
                         $crow[$frow['id']] = isset($row[$field]) ? mb_convert_encoding($row[$field], "Windows-1251", "UTF-8") : '';
                         break;
                     case 'select':
                         $crow[$frow['id']] = !empty($frow['vars'][$row[$field]]) ? mb_convert_encoding($frow['vars'][$row[$field]], "Windows-1251", "UTF-8") : "";
                         break;
                     case 'mselect':
                         $row[$field] = explode(',', $row[$field]);
                         foreach ($row[$field] as $j => $value) {
                             $row[$field][$j] = !empty($frow['vars'][(int) $value]) ? mb_convert_encoding($frow['vars'][(int) $value], "Windows-1251", "UTF-8") : "";
                         }
                         $crow[$frow['id']] = implode(', ', $row[$field]);
                         break;
                     case 'float':
                         $crow[$frow['id']] = round($row[$field], 2);
                         break;
                     case 'image':
                         if (preg_match("/^idimg([0-9]+)\$/i", $field, $mathes)) {
                             $sort = $mathes[1];
                             $images = A::$DB->getCol("SELECT path FROM " . DOMAIN . "_images WHERE idsec=" . SECTION_ID . " AND iditem=" . $row['id'] . " ORDER BY sort");
                             $crow[$frow['id']] = isset($images[$sort]) ? basename($images[$sort]) : "";
                         }
                         break;
                     case 'file':
                         if (preg_match("/^idfile([0-9]+)\$/i", $field, $mathes)) {
                             $sort = $mathes[1];
                             $files = A::$DB->getCol("SELECT path FROM " . DOMAIN . "_files WHERE idsec=" . SECTION_ID . " AND iditem=" . $row['id'] . " ORDER BY sort");
                             $crow[$frow['id']] = isset($files[$sort]) ? basename($files[$sort]) : "";
                         }
                         break;
                 }
             }
             if (isset($fields['mprice']) && isset($fields['price'])) {
                 $mprices = !empty($row['mprices']) ? unserialize($row['mprices']) : array();
                 foreach ($mprices as $mp) {
                     $crow[$fields['mprice']['id']] = mb_convert_encoding($mp['name'], "Windows-1251", "UTF-8");
                     $crow[$fields['price']['id']] = (double) $mp['price'];
                     $renderer->buildRow($i++, $crow);
                 }
                 if (empty($mprices)) {
                     $renderer->buildRow($i++, $crow);
                 }
             } else {
                 $renderer->buildRow($i++, $crow);
             }
         }
         A::$DB->free();
     }
     $renderer->render();
     $renderer->finalize();
     if (filesize($file = "files/" . DOMAIN . "/tmp/" . DOMAIN . "_" . getName(SECTION) . '.csv') > 1024 * 2000) {
         return outArchive("files/" . DOMAIN . "/tmp/" . DOMAIN . "_" . getName(SECTION) . ".tar.gz", $file);
     } else {
         require_once 'HTTP/Download.php';
         $params = array('file' => $file, 'contenttype' => 'text/csv', 'contentdisposition' => array(HTTP_DOWNLOAD_ATTACHMENT, basename($file)));
         HTTP_Download::staticSend($params, false);
     }
 }
예제 #2
0
파일: DataGrid.php 프로젝트: demental/m
 function &prepare(&$do, $frontend = true, $pager = true)
 {
     $unitFormatters = array();
     if (is_array($do->fb_fieldLabels)) {
         foreach ($do->fb_fieldLabels as $k => &$v) {
             if (is_array($v)) {
                 if (key_exists('unit', $v)) {
                     $unitFormatters[$k] = $v['unit'];
                 }
                 $v = $v[0];
             }
         }
     }
     if ($frontend && $pager) {
         $perPage = $this->getControllerOption('recordsPerPage', $do->tableName());
         $perPage = $perPage === true ? 10 : $perPage;
     } else {
         $perPage = null;
     }
     $pk = MyFB::_getPrimaryKey($do);
     $AllFields = array_keys($do->table());
     $links = $do->links();
     $links = is_array($links) ? $links : array();
     $LinkFields = array_keys($links);
     $noLinkFields = array_diff($AllFields, $LinkFields);
     $fields = $this->getControllerOption('fields', $do->tableName());
     if (!is_array($fields)) {
         $fields = array_diff($AllFields, array($pk));
     }
     $usedFields = array_merge($noLinkFields, array_intersect($fields, $LinkFields));
     while ($offset = array_search($pk, $usedFields)) {
         unset($usedFields[$offset]);
     }
     if ($o = $do->getPlugin('ownership')) {
         Log::info('table filtrée par owner');
         if ($o->userIsInAdminMode()) {
             Log::info('ajout du champ owner');
             $fields = array_merge(array($do->ownerShipField), $fields);
             $usedFields = array_merge(array($do->ownerShipField), $usedFields);
             $do->fb_fieldLabels[$do->ownerShipField] = 'Gérant';
         }
     }
     $do->fb_fieldsToRender = $usedFields;
     $fb =& MyFB::create($do);
     $do->selectAdd();
     if (!in_array($pk, $usedFields)) {
         $do->selectAdd($pk . ',' . implode(',', $usedFields));
     } else {
         $do->selectAdd(implode(',', $usedFields));
     }
     $fb->populateOptions();
     $specialElements = $fb->_getSpecialElementNames();
     $dg = new Structures_DataGrid($perPage);
     $dts = new Structures_DataGrid_DataSource_MyDataObj();
     $dts->bind($do, array('generate_columns' => false, 'fields' => $usedFields));
     $dg->bindDataSource($dts);
     if ($frontend) {
         if ($this->getControllerOption('edit', $do->tableName()) || $this->getControllerOption('view', $do->tableName())) {
             $dg->addColumn(new Structures_DataGrid_Column(null, null, null, array('width' => '50px'), null, array('M_Office_ShowTable', 'getEditLink'), array('database' => $do->database(), 'table' => $do->tableName(), 'pk' => $pk)));
         }
         if ($this->_controller->hasActions) {
             $dg->addColumn(new Structures_DataGrid_Column('', null, null, array('width' => '20px'), null, array('M_Office_ShowTable', 'getSelectedEntry'), array('pk' => $pk)));
         }
         $formatters = $this->getControllerOption('formatters', $do->tableName());
     }
     if (!is_array($formatters)) {
         $formatters = array();
     }
     if (isset($do->fb_linkOrderFields) && is_array($do->fb_linkOrderFields)) {
         $dg->setDefaultSort($do->fb_linkOrderFields);
     }
     $eltTypes = $do->table();
     $dateRenderer = $this->getControllerOption('dateRenderer');
     foreach ($fields as $field) {
         if (!isset($specialElements[$field])) {
             if (key_exists($field, $unitFormatters)) {
                 $dg->addColumn(new Structures_DataGrid_Column($fb->getFieldLabel($field), $field, in_array($field, $AllFields) ? $field : null, null, null, key_exists($field, $formatters) ? $formatters[$field]['callback'] : array('M_Office_ShowTable', 'getFieldWithUnit'), key_exists($field, $formatters) ? $formatters[$field]['args'] : array('field' => $field, 'unit' => $unitFormatters[$field])));
             } elseif ($eltTypes[$field] & DB_DATAOBJECT_DATE && !empty($dateRenderer) && $dateRenderer !== true) {
                 $dg->addColumn(new Structures_DataGrid_Column($fb->getFieldLabel($field), $field, in_array($field, $AllFields) ? $field : null, null, null, key_exists($field, $formatters) ? $formatters[$field]['callback'] : $dateRenderer, key_exists($field, $formatters) ? $formatters[$field]['args'] : array('field' => $field)));
             } else {
                 $dg->addColumn(new Structures_DataGrid_Column($fb->getFieldLabel($field), $field, in_array($field, $AllFields) ? $field : null, null, null, key_exists($field, $formatters) ? $formatters[$field]['callback'] : null, key_exists($field, $formatters) ? $formatters[$field]['args'] : null));
             }
         }
     }
     if (isset($_REQUEST['orderBy'])) {
         $dg->sortRecordSet($_REQUEST['orderBy'], $_REQUEST['direction']);
     }
     $renderer =& new Structures_DataGrid_Renderer_HTMLTable();
     $renderer->setTableAttribute('width', '100%');
     $renderer->setTableAttribute('cellspacing', '0');
     $renderer->setTableAttribute('cellpadding', '0');
     $renderer->setTableAttribute('class', 'datagrid');
     $renderer->setTableOddRowAttributes(array('class' => 'oddRow'));
     $renderer->setTableEvenRowAttributes(array('class' => 'evenRow'));
     $renderer->sortIconASC = '&uarr;';
     $renderer->sortIconDESC = '&darr;';
     $renderer->setOption('selfPath', ROOT_ADMIN_URL . ROOT_ADMIN_SCRIPT);
     $dg->attachRenderer($renderer);
     $this->_view =& $dg;
 }