private function getValues() { $values = array(); if (array_key_exists('source', $this->params)) { $source = $this->params['source']; if (CUtils::strLeft($source, ".") == "class") { $class = CUtils::strRight($source, "."); if (array_key_exists('properties', $this->params)) { $object = new $class(array("properties" => $this->params['properties'])); } else { $object = new $class(); } $sourceParams = $this->params['params']; // для совместимости их надо положить в запрос foreach ($sourceParams as $key => $value) { $_POST[$key] = $value; } $values = $object->actionGetViewData(); } else { $taxonomy = CTaxonomyManager::getTaxonomy($this->params['source']); $values = $taxonomy->getTermsList(); } } elseif (array_key_exists('values', $this->params)) { $values = $this->params['values']; } return $values; }
/** * @return bool */ public function isTextField() { if ($this->type == "text") { return true; } elseif (CUtils::strLeft($this->type, "(") == "varchar") { return true; } return false; }
private static function getConditionField(array $params = array()) { $result = ""; if ($params["relationPower"] == RELATION_HAS_ONE) { if ($params["storageField"] != "") { $condition = $params["storageField"]; $result = CUtils::strLeft($condition, "="); $result = str_replace(" ", "", $result); } } return $result; }
/** * Обновление модели на основе данных, пришедших из json-контроллера * * @param $jsonString * @return array */ public function updateWithJsonString($jsonString) { // данные модели $modelData = json_decode($jsonString, true); // убираем служебную инфу if (array_key_exists("_translation", $modelData)) { unset($modelData["_translation"]); } // попробуем сохранить данные, которые находятся в отношениях // многие-ко-многим foreach ($this->relations() as $field => $properties) { if ($properties["relationPower"] == RELATION_MANY_TO_MANY) { if (array_key_exists($field, $modelData)) { $data = $modelData[$field]; // уберем их из модели unset($modelData[$field]); // уберем уже имеющиеся данные из связанной таблицы /** * @var CActiveRecord $ar */ if (array_key_exists("id", $modelData)) { foreach (CActiveRecordProvider::getWithCondition($properties["joinTable"], trim(CUtils::strLeft($properties["leftCondition"], "=")) . "=" . $modelData["id"])->getItems() as $ar) { $ar->remove(); } } // добавим туда новые данные foreach ($data as $value) { $ar = new CActiveRecord(array($properties["rightKey"] => $value["id"], trim(CUtils::strLeft($properties["leftCondition"], "=")) => $modelData["id"], "id" => null)); $ar->setTable($properties["joinTable"]); $ar->insert(); } } } elseif ($properties["relationPower"] == RELATION_HAS_MANY) { if (array_key_exists($field, $modelData)) { $data = $modelData[$field]; // уберем данные из модели unset($modelData[$field]); // если в свойствах отношения указан целевой класс, то // будем обновлять автоматом if (array_key_exists("targetClass", $properties)) { // получим список записей, которые уже есть $targetClass = $properties["targetClass"]; /** * @var CActiveModel $targetObj */ $targetObj = new $targetClass(); $docsToRemove = array(); // его может не быть, если запись новая if (array_key_exists("id", $modelData)) { $items = CActiveRecordProvider::getWithCondition($targetObj->getTable(), trim(CUtils::strLeft($properties["storageCondition"], "=")) . "=" . $modelData["id"]); /** * @var CActiveRecord $item */ foreach ($items->getItems() as $item) { $docsToRemove[] = $item->getId(); } } /** * @var string $item */ foreach ($data as $item) { // полученные данные обратно в json, чтобы // можно было все сделать одинаково рекурсивно $childJsonData = json_encode($item); // создадим экземпляр целевого класса /** * @var CActiveModel $targetObj */ $targetObj = new $targetClass(); $targetObj->updateWithJsonString($childJsonData); $targetObj->save(); // уберем из списка добавленную запись if (in_array($targetObj->getId(), $docsToRemove)) { unset($docsToRemove[array_search($targetObj->getId(), $docsToRemove)]); } } // удалим элементы из списка на удаление - мы // их удалили и вместе с другими данными с клиента // они не пришли if (count($docsToRemove) > 0) { CActiveRecordProvider::removeWithCondition($targetObj->getTable(), "id in (" . implode(", ", $docsToRemove) . ")"); } } } } } // данные обратно в модель foreach ($modelData as $key => $value) { $this->{$key} = $value; } return $modelData; }
public static function activeLookup($name, CModel $model, $catalog = "", $isMultiple = false, $properties = array(), $allowCreation = false) { /** * Безумно полезная штука для работы со связанными * моделями. Если в названии поля есть скобки, то производится * разбор вида подмодель[ее поле] */ $submodelName = ""; if (strpos($name, "[") !== false) { $submodelName = substr($name, 0, strpos($name, "[")); $name = CUtils::strRight($name, "["); $name = CUtils::strLeft($name, "]"); $model = $model->{$submodelName}; } $field = $model::getClassName(); if ($submodelName !== "") { $field .= "[" . $submodelName . "]"; } $field .= "[" . $name . "]"; $fieldRequired = false; $validators = CCoreObjectsManager::getFieldValidators($model); if (array_key_exists($name, $validators)) { $fieldRequired = true; } $inline = ""; $class = self::getFielsizeClass(); $inline .= ' class="' . $class . '"'; $data = $model->{$name}; ?> <div class="catalogLookup" asu-catalog="<?php echo $catalog; ?> " asu-multiple="<?php echo $isMultiple ? "true" : "false"; ?> " asu-value-name="<?php echo $field; ?> " asu-creation="<?php echo $allowCreation ? "true" : "false"; ?> "> <?php if (is_object($data)) { ?> <?php $index = 0; ?> <?php foreach ($data->getItems() as $val) { $index++; ?> <input type="hidden" name="<?php echo $field; ?> [<?php echo $index; ?> ]" value="<?php echo $val->getId(); ?> " asu-type="value"> <?php } ?> <?php } else { ?> <input type="hidden" name="<?php echo $field; ?> " value="<?php echo $data; ?> " asu-type="value"> <?php } ?> <?php foreach ($properties as $key => $value) { ?> <input type="hidden" value="<?php echo $value; ?> " asu-type="property" asu-property-key="<?php echo $key; ?> "> <?php } ?> <table <?php echo $inline; ?> id="<?php echo $name; ?> " style="margin-left: 0px; "> <tr> <td width="100%"> <input type="text" value="" asu-name="lookup" placeholder="Введите текст для поиска" style="width: 95%; "> </td> <td style="width: 16px; "> <i class="icon-search" /> </td> </tr> <tr> <td width="100%"> <div class="btn-group btn-group-vertical" asu-type="placeholder" style="width: 100%; "> </div> </td> <td style="width: 16px; "> <i class="icon-remove" /> </td> </tr> </table> </div> <?php if (!self::$_catalogLookupInit) { self::$_catalogLookupInit = true; ?> <script> jQuery(document).ready(function(){ jQuery(".catalogLookup").catalogLookup(); }); </script> <?php } if ($fieldRequired) { self::requiredStar(); } }
/** * @param $catalog * @return ISearchCatalogInterface * @throws Exception */ private function searchObjectsFactory($catalog, $properties = array()) { if ($catalog == "staff") { return new CSearchCatalogStaff(array("properties" => $properties)); } elseif ($catalog == "student") { return new CSearchCatalogStudent(array("properties" => $properties)); } elseif ($catalog == "studentgroup") { return new CSearchCatalogStudentGroup(array("properties" => $properties)); } elseif ($catalog == "sab_commissions") { return new CSearchCatalogSABCommission(array()); } elseif (CUtils::strLeft($catalog, ".") == "class") { $class = CUtils::strRight($catalog, "."); return new $class(array("properties" => $properties)); } elseif (!is_null(CTaxonomyManager::getTaxonomy($catalog))) { return new CSearchCatalogTaxonomy(array("taxonomy" => $catalog, "properties" => $properties)); } elseif (!is_null(CTaxonomyManager::getLegacyTaxonomy($catalog))) { return new CSearchCatalogTaxonomyLegacy(array("taxonomy" => $catalog, "properties" => $properties)); } else { throw new Exception("Не могу найти каталог для поиска " . $catalog); } }
public function actionPrint() { /** * Получаем обратно параметры контекста из запроса. * Мы получаем: * 1. Класс менеджера * 2. Метод менеджера для получения нужного объекта * 3. Идентификатор объекта * 4. Идентификатор печатной формы */ $managerClass = CRequest::getString("manager"); $managerMethod = CRequest::getString("method"); $objectId = CRequest::getInt("id"); $formId = CRequest::getInt("template"); /** * Получаем объект через менеджер */ $object = $managerClass::$managerMethod($objectId); $form = CPrintManager::getForm($formId); /** * Берем объект анализатора в зависимости от формата шаблона */ $writer = null; if ($form->form_format == "docx") { $writer = new PHPWord(); } elseif ($form->form_format = "odt") { $writer = new CPHPOdt(); } /** * Проверка на отладку. Если в шаблоне включена отладка, то * вместо вывода пользователю показываем всякую полезную для разработчика * информацию */ $this->_isDebug = $form->debug == "1"; /** * Загружаем шаблон */ $wordTemplate = $writer->loadTemplate(PRINT_TEMPLATES_DIR . $form->template_file); /** * Попробуем получить все описатели из документа, чтобы не думать об их порядке в БД */ $fieldsFromTemplate = $wordTemplate->getFields(); /** * Если включена отладка, то показываем все описатели */ if ($this->_isDebug) { var_dump(array_keys($fieldsFromTemplate)); /** * Это место для экспериментов и написания отладочного кода */ $value = array(); $this->debugTable($value); } /** * Еще один вариант. Надеюсь, этот заработает нормально */ foreach ($fieldsFromTemplate as $fieldName => $descriptors) { /** * Если поле из шаблона есть в наборе полей, * то вычисляем его. Перед вычислением проверяем, * есть ли привязанные к нему дочерние описатели. Если дочерние * описатели есть, то не вычисляем, так как вычислением дочерних * будет заниматься родительский */ if (!is_null($form->formset->getFieldByName($fieldName))) { $field = $form->formset->getFieldByName($fieldName); if (is_null($field->parent)) { foreach ($descriptors as $node) { $xml = $this->processNode($node, $field, $object, $form); } } } elseif (mb_strpos($fieldName, ".class") !== false) { /** * Это новый описатель, параметры которого хранятся в отдельном классе */ $classFieldName = CUtils::strLeft($fieldName, ".class"); /** * @var $classField IPrintClassField */ $classField = new $classFieldName(); if (!is_a($classField, "IPrintClassField")) { throw new Exception("Класс " . $classField . " не реализует интерфейс IPrintClassField"); } /** * Дабы не ломать уже имеющуюся структуру работать будем через * класс-адаптер */ $adapter = new CPrintClassFieldToFieldAdapter($classField, $object); foreach ($descriptors as $node) { $xml = $this->processNode($node, $adapter, $object, $form); } } } $wordTemplate->setDocXML($xml); /** * Теперь стили, они отдельно обрабатываются */ $fieldsFromTemplate = $wordTemplate->getStyleFields(); if ($this->_isDebug) { var_dump(array_keys($fieldsFromTemplate)); } $xml = ""; foreach ($fieldsFromTemplate as $fieldName => $descriptors) { /** * Если поле из шаблона есть в наборе полей, * то вычисляем его. Перед вычислением проверяем, * есть ли привязанные к нему дочерние описатели. Если дочерние * описатели есть, то не вычисляем, так как вычислением дочерних * будет заниматься родительский */ if (!is_null($form->formset->getFieldByName($fieldName))) { $field = $form->formset->getFieldByName($fieldName); if (is_null($field->parent)) { foreach ($descriptors as $node) { $xml = $this->processNode($node, $field, $object, $form); } } } } if (count($fieldsFromTemplate) == 0) { $xml = $wordTemplate->getStyleXML(); } $wordTemplate->setStyleXML($xml); /** * При отладке не выгружаем обратно документ */ if ($this->_isDebug) { exit; } /** * Сохраняем документ */ $filename = date("dmY_Hns") . "_" . $form->template_file; $i = 0; while (file_exists(PRINT_DOCUMENTS_DIR . $filename)) { $filename = date("dmY_Hns") . "_" . $i . "_" . $form->template_file; $i++; } $wordTemplate->save(PRINT_DOCUMENTS_DIR . $filename); /** * Отдаем документ пользователю * Не отдаем, если у нас тут групповая печать */ if (CRequest::getInt("noredirect") == "1") { echo json_encode(array("filename" => PRINT_DOCUMENTS_DIR . $filename, "url" => PRINT_DOCUMENTS_DIR . $filename)); } else { $this->redirect(PRINT_DOCUMENTS_URL . $filename); } }
/** * Mime-type файла по указанному пути * * @param $filename * @return mixed */ public static function getMimetype($filename) { $filetype = ""; if (class_exists("finfo")) { $finfo = new finfo(FILEINFO_MIME); $filetype = $finfo->file($filename); $filetype = CUtils::strLeft($filetype, ";"); $filetype = str_replace("/", "-", $filetype); } elseif (function_exists("mime_content_type")) { $filetype = mime_content_type($filename); $filetype = str_replace("/", "-", $filetype); } else { $mime_types = array('txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'docx' => 'application/msword', 'xlsx' => 'application/vnd.ms-excel', 'pptx' => 'application/vnd.ms-powerpoint', 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet'); $ext = strtolower(array_pop(explode('.', $filename))); if (array_key_exists($ext, $mime_types)) { $filetype = $mime_types[$ext]; $filetype = str_replace("/", "-", $filetype); } else { $filetype = "unknown"; } } return $filetype; }