static function ImportEmployee() { // Делаем запись в таблицу отчетов импорта $logreport = new Logreport(); $logreport->logreport_date = date('Y-m-d'); $logreport->save(); self::$logreport_id = $logreport->logreport_id; // Идем по файлам импорта из 1С (сотрудники.txt - Сотрудники) foreach (['сотрудники.txt'] as $filename) { self::$filename = mb_convert_encoding('imp/' . $filename, 'Windows-1251', 'UTF-8'); if (file_exists(self::$filename)) { ini_set('max_execution_time', 1000); // 1000 seconds ini_set('memory_limit', 1073741824); // 1Gbyte Max Memory // Определяем показатели импорта self::$logreport_errors = 0; // Не загружено записей из-за ошибок self::$logreport_additions = 0; // Записей добавлено self::$logreport_amount = 0; // Всего записей $i = 0; $handle = @fopen(self::$filename, "r"); if ($handle) { while (($subject = fgets($handle, 4096)) !== false) { $i++; $pattern = '/^(.+?)\\|(Поликлиника №\\s?[1,2,3] )?(.+?)\\|(.+?)\\|/ui'; preg_match($pattern, $subject, $matches); if ($matches[0] !== NULL) { $pattern = '/(^Поликлиника №)\\s?([1,2,3])\\s?$/ui'; $matches[2] = preg_replace($pattern, 'Взрослая $1$2', mb_strtolower($matches[2], 'UTF-8')); if ($matches[3] === 'Поликлиника профилактических осмотров') { $matches[2] = $matches[3]; } $pattern = '/^(.+) БУ "Нижневартовская городская поликлиника"$/ui'; $matches[3] = preg_replace($pattern, '$1', $matches[3]); $employee_fio = $matches[1]; $location = self::AssignLocationForEmployeeImport($matches[3], $matches[2]); $id_dolzh = self::AssignDolzh($matches[4]); // На случай если Здание у сотрудника не определено $buildsql = $location->id_build === null ? 'id_build IS NULL' : 'id_build = :id_build'; // Находим сотрудника в базе, если не находим создаем новую запись $Employee = Employee::model()->Find('employee_fio LIKE :employee_fio and id_dolzh = :id_dolzh and id_podraz = :id_podraz and ' . $buildsql, array_merge([':employee_fio' => $employee_fio, ':id_dolzh' => $id_dolzh, ':id_podraz' => $location->id_podraz], $location->id_build === null ? [] : [':id_build' => $location->id_build])); if ($Employee === null) { $Employee = new Employee(); $Employee->attributes = ['employee_fio' => $employee_fio, 'id_dolzh' => $id_dolzh, 'id_podraz' => $location->id_podraz, 'id_build' => $location->id_build]; $Employeelog = new Employeelog(); $Employeelog->id_logreport = self::$logreport_id; $Employeelog->employeelog_type = 1; $Employeelog->employeelog_filename = mb_convert_encoding(self::$filename, 'UTF-8', 'Windows-1251'); $Employeelog->employeelog_rownum = $i; $Employeelog->employeelog_message = 'Запись добавлена.'; $Employee->scenario = 'import1c'; if ($Employee->validate()) { self::$logreport_additions++; $Employee->save(false); } else { $Employeelog->employeelog_type = 3; $Employeelog->employeelog_message = 'Ошибка при добавлении записи: '; foreach ($Employee->getErrors() as $fields) { $Employeelog->employeelog_message .= implode(' ', $fields) . ' '; } self::$logreport_errors++; } $Employeelog->employee_fio = $Employee->employee_fio; $Employeelog->dolzh_name = Dolzh::model()->findbyPk($Employee->id_dolzh)->dolzh_name; $Employeelog->podraz_name = Podraz::model()->findbyPk($Employee->id_podraz)->podraz_name; if ($Employee->id_build !== null) { $Employeelog->build_name = Build::model()->findbyPk($Employee->id_build)->build_name; } $Employeelog->save(false); } } elseif (trim($subject) !== '') { $Employeelog = new Employeelog(); $Employeelog->id_logreport = self::$logreport_id; $Employeelog->employeelog_type = 3; $Employeelog->employeelog_filename = mb_convert_encoding(self::$filename, 'UTF-8', 'Windows-1251'); $Employeelog->employeelog_rownum = $i; $Employeelog->employeelog_message = 'Ошибка при добавлении записи: Не пройдено регулярное выражение /^(.+?)\\|(Поликлиника №\\s?[1,2,3] )?(.+?)\\|(.+?)\\|/ui'; $Employeelog->save(false); self::$logreport_errors++; } } fclose($handle); } $logreport->logreport_additions += self::$logreport_additions; $logreport->logreport_errors += self::$logreport_errors; $logreport->logreport_amount = $i; $logreport->save(); } } echo '<BR>Подразделения:<BR>'; ARData::Data(Podraz::model(), Podraz::model()->Test())->PrintData(); echo '<BR>Должности:<BR>'; ARData::Data(Dolzh::model(), Dolzh::model()->Test())->PrintData(); echo '<BR>Сотрудники:<BR>'; ARData::Data(Employee::model(), Employee::model()->Test())->PrintData(); echo '<BR>Лог:<BR>'; ARData::Data(Employeelog::model(), Employeelog::model()->Test())->PrintData(); }
static function Data_GetDataObject($model, $criteria, $rows, $page, $sidx, $sord) { /* Расчет параметров JQgrid */ $limit = isset($rows) ? $rows : 1; $start = $limit * $page - $limit; // do not put $limit*($page - 1) /* limit */ $criteria->offset = $start; $criteria->limit = $limit; /* sort */ if (isset($sidx) && $sidx !== '' && isset($sord) && $sord !== '') { $criteria->order = $sidx . ' ' . $sord; } // < Поиск $search = (string) filter_input(INPUT_POST, '_search'); // $recobj - объект с данными выборки класса ARData if ($search === 'true') { $fields = ARData::Data($model, $criteria)->GetDataObjectFields(); foreach ($fields->fields as $attr) { Proc::CompareCriteria($attr->fieldname, (string) filter_input(INPUT_POST, $attr->fieldname), $criteria); } } // Поиск < $recobj = ARData::Data($model, $criteria)->GetDataObject(); if (isset($criteria->limit)) { $criteria->limit = -1; } if (isset($criteria->offset)) { $criteria->offset = -1; } $totalrec = $model->count($criteria); $total_pages = ceil($totalrec / $limit) > 0 ? ceil($totalrec / $limit) : 1; /* $response - объект данных для JQGrid */ $response = new stdClass(); $response->page = $page; $response->records = $totalrec; $response->total = $total_pages; /* Перебираем записи выборки */ foreach ($recobj->values as $i => $row) { $response->rows[$i]['id'] = $row[$recobj->fields[0]->fieldname]; // Заполняем объект данными foreach ($row as $k => $value) { $response->rows[$i]['cell'][] = $value; } } return $response; }
public function actionTest1() { $ARData = ARData::Data(Impemployee::model(), Impemployee::model()->GetImpemployeeCriteria())->GetDataObjectFields(); $result = $ARData->fields; echo "<br>-----------------------------------------------------<br>"; var_dump($result); }
public function actionGrid2Excel() { $model = (string) filter_input(INPUT_GET, 'model'); // $_GET['model'] - Имя модели, которая выгружается $commandmethod = (string) filter_input(INPUT_GET, 'commandmethod'); // $_GET['commandmethod'] - Имя команды (cDBCommand с запросом), который выгружается $collist = (string) filter_input(INPUT_GET, 'collist'); // $_GET['collist'] - Объект Имя атрибута: Строка поиска фильтра if ($model === '' && $commandmethod === '') { throw new CHttpException(500, 'Proc/Grid2Excel(): не передан параметр model или commandmethod'); } if ($collist === '') { throw new CHttpException(500, 'Proc/Grid2Excel(): не передан параметр collist'); } if ($model !== '' && !method_exists($model, 'GetPermissions')) { throw new CHttpException(500, 'Не существует метод "GetPermissions" модели "' . $model . '"'); } if ($model !== '' && !$model::model()->GetPermissions('view')) { throw new CHttpException(500, 'Нет доступа для чтения модели "' . $model . '"'); } ini_set('max_execution_time', 1000); // 1000 seconds ini_set('memory_limit', 1073741824); // 1Gbyte Max Memory /* Загружаем PHPExcel */ $objPHPExcel = new PHPExcel(); $collist = json_decode($collist); /* Сотрировка атрибутов */ $sidx = (string) filter_input(INPUT_GET, 'sidx'); $sord = (string) filter_input(INPUT_GET, 'sord') !== '' ? (string) filter_input(INPUT_GET, 'sord') : 'ASC'; $c = 0; // Для количества колонок if ($model !== '') { $methodcriteria = (string) filter_input(INPUT_GET, 'criteriamethod'); // class_exists($model, false) - дает false, непонятно почему /* if (!class_exists($model, false) || !(method_exists($model, 'model') && $model::model() instanceof CActiveRecord)) throw new CHttpException(500, $model . ' не является классом CActiveRecord'); */ if ($methodcriteria !== '' && !method_exists($model, $methodcriteria)) { throw new CHttpException(500, 'Метод ' . $methodcriteria . ' отсутствует в модели ' . $model); } $criteria = $methodcriteria === '' ? new CDbCriteria() : $model::model()->{$methodcriteria}(); // Берем критерий из модели if (!$criteria instanceof CDbCriteria) { throw new CHttpException(500, $methodcriteria . ' модели ' . $model . ' не возвращает класс CDbCriteria'); } $model = $model::model(); if ($sidx !== '') { $criteria->order = $sidx . ' ' . $sord; } /* Применяем критерии поиска */ $criteria->select = []; foreach ($collist as $attr => $val) { if ($val->value !== '') { Proc::CompareCriteria($attr, $val->value, $criteria); } $criteria->select[] = $attr; } /* Границы таблицы */ $ramka = array('borders' => array('bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN))); /* Жирный шрифт для шапки таблицы */ $font = array('font' => array('bold' => true), 'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER)); $rows = ARData::Data($model, $criteria)->GetDataObject(); if (count((array) $rows) > 0) { foreach ($rows->values as $i => $row) { foreach ($rows->fields as $col => $attr) { if ($i == 0) { // заполняем шапку таблицы $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $i + 1, $attr->label); $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 1)->applyFromArray($ramka); $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 1)->applyFromArray($font); } $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $i + 2, $rows->values[$i][$attr->fieldname]); $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 2)->applyFromArray($ramka); } } } $c = count($rows->fields); } else { $command = DBCommands::$commandmethod(); $command->order($sidx . ' ' . $sord); /* Применяем критерии поиска */ foreach ($collist as $attr => $val) { if ($val->value !== '') { Proc::CompareCommand($attr, $val->value, $command); } } $item = $command->select; if ($item !== '*') { $cols_arr = strchr($item, ', ') === false ? [str_replace('`', '', $item)] : explode(', ', str_replace('`', '', $command->Select)); array_walk($cols_arr, function (&$item, &$key) { $key = strrchr($item, ' ') === false ? $item : substr(strrchr($item, ' '), 1); $item = $item; }); } /* Функция, проверяет, есть ли атрибут в объекте $collist */ $CheckInArray = function ($attr, $key) use($collist) { return property_exists($collist, $key); }; /* Фильтруем список атрибутов критерия, и отсеиваем, если атрибута нет в $collist */ $cols_arr = array_filter($cols_arr, function ($attr) use($collist) { $key = strrchr($attr, ' ') === false ? $attr : substr(strrchr($attr, ' '), 1); return property_exists($collist, $key); }); $command->select($cols_arr); $recs = $command->queryAll(); $r = 2; // Ряд в Excel, с которого заполняются данные, $r = 1 - ряд для названий атрибутов foreach ($recs as $i => $row) { $c = 0; Proc::ApplyDataValuesbyCommand($row, $collist, $objPHPExcel, $r, $c, $command, $i); $r++; } } /* Авторазмер колонок Excel */ foreach (range(0, $c) as $col) { $objPHPExcel->getActiveSheet()->getColumnDimensionByColumn($col)->setAutoSize(true); } /* присваиваем имя файла от имени модели */ $FileName = $model !== '' && method_exists($model, 'GetLabel') ? $model->GetLabel() : 'Выгрузка'; // Устанавливаем имя листа $objPHPExcel->getActiveSheet()->setTitle($FileName); // Выбираем первый лист $objPHPExcel->setActiveSheetIndex(0); /* Формируем файл Excel */ $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $FileName = DIRECTORY_SEPARATOR === '/' ? $FileName : mb_convert_encoding($FileName, 'Windows-1251', 'UTF-8'); /* Proc::SaveFileIfExists() - Функция выводит подходящее имя файла, которое еще не существует. mb_convert_encoding() - Изменяем кодировку на кодировку Windows */ $fileroot = Proc::SaveFileIfExists('files/' . $FileName . '.xlsx'); /* Сохраняем файл в папку "files" */ $objWriter->save('files/' . $fileroot); /* Возвращаем имя файла Excel */ if (DIRECTORY_SEPARATOR === '/') { echo $fileroot; } else { echo mb_convert_encoding($fileroot, 'UTF-8', 'Windows-1251'); } }