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;
 }
예제 #2
0
 /**
  * @return bool
  */
 public function isTextField()
 {
     if ($this->type == "text") {
         return true;
     } elseif (CUtils::strLeft($this->type, "(") == "varchar") {
         return true;
     }
     return false;
 }
예제 #3
0
 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;
 }
예제 #4
0
 /**
  * Обновление модели на основе данных, пришедших из 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;
 }
예제 #5
0
    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);
     }
 }
예제 #8
0
 /**
  * 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;
 }