read())) { $field_dir = $d->path . '/' . $entry; if (is_dir($field_dir) && file_exists($field_dir . '/field.php')) { require_once ($field_dir . '/field.php'); } } $d->Close(); } /** * Проверка папок /fields/ в модулях, на наличие полей */ if (is_dir(BASE_DIR . '/modules/')) { $d = dir(BASE_DIR . '/modules'); while (false !== ($entry = $d->read())) { $module_dir = $d->path . '/' . $entry; if (is_dir($module_dir) && file_exists($module_dir . '/field.php')) require_once($module_dir . '/field.php'); } $d->Close(); } /** * Поле по умолчанию * * @param $field_value * @param $action * @param int $field_id * @param string $tpl * @param int $tpl_empty * @param null $maxlength * @param array $document_fields * @param int $rubric_id * @param null $default * * @return string */ function get_field_default ($field_value, $action, $field_id=0, $tpl='', $tpl_empty=0, &$maxlength=null, $document_fields=array(), $rubric_id=0, $default=null, $_tpl=null) { switch ($action) { case 'edit': return ''; case 'doc': case 'req': if (! $tpl_empty) { $field_param = explode('|', $field_value); $field_value = preg_replace_callback( '/\[tag:parametr:(\d+)\]/i', function($data) use($field_param) { return $field_param[(int)$data[1]]; }, $tpl ); } return $field_value; default: return $field_value; } } /** * Возвращаем тип поля * * @param string $type * * @return mixed */ function get_field_type ($type = '') { static $fields; if (is_array($fields)) return $fields; $arr = get_defined_functions(); $fields = array(); $field = array(); foreach ($arr['user'] as $v) { if (trim(substr($v, 0, strlen('get_field_'))) == 'get_field_') { $d = ''; $name = @$v('', 'name', '', '', 0, $d); $id = substr($v, strlen('get_field_')); if ($name != false && is_string($name)) $fields[] = array('id' => $id, 'name' => $name); if (! empty($type) && $id == $type) $field = array('id' => $id, 'name' => $name); } else continue; } $fields = msort($fields, array('name')); return (! empty($type)) ? $field : $fields; } /** * Возвращаем алиас по номеру поля * * @param $id * @return string */ function get_field_alias ($id) { global $AVE_DB; static $alias_field_id = array(); if (isset($alias_field_id[$id])) return $alias_field_id[$id]; $alias_field_id[$id] = $AVE_DB->Query("SELECT rubric_field_alias FROM " . PREFIX . "_rubric_fields WHERE Id=" . intval($id))->GetCell(); return $alias_field_id[$id]; } /** * Возвращаем номер поля по рубрике и алиасу * * @param $rubric_id * @param $alias * * @return string */ function get_field_num ($rubric_id, $alias) { global $AVE_DB; static $alias_field_id = array(); if (isset($alias_field_id[$rubric_id][$alias])) return $alias_field_id[$rubric_id][$alias]; $sql = " SELECT Id FROM " . PREFIX . "_rubric_fields WHERE (rubric_field_alias = '" . addslashes($alias) . "' OR Id = '" . intval($alias) . "') AND rubric_id = " . intval($rubric_id) ; $alias_field_id[$rubric_id][$alias] = $AVE_DB->Query($sql)->GetCell(); return $alias_field_id[$rubric_id][$alias]; } /** * Возвращаем значение по умолчанию, для поля * * @param $id * * @return string */ function get_field_default_value ($id) { global $AVE_DB; static $alias_field_id = array(); if (isset($alias_field_id[$id])) return $alias_field_id[$id]; $sql = " SELECT rubric_field_default FROM " . PREFIX . "_rubric_fields WHERE Id = ".intval($id) ; $alias_field_id[$id] = $AVE_DB->Query($sql)->GetCell(); return $alias_field_id[$id]; } /** * Возвращаем шаблон tpl или пусто * * @param string $dir папка шаблона * @param int $field_id идентификатор поля * @param string $type тип поля * @param int $_tpl номер шаблона * * @return string */ function get_field_tpl($dir = '', $field_id = 0, $type = 'admin', $_tpl = null) { if (! $type) return false; $alias_field_id = get_field_alias($field_id); // Если существет файл с ID поля и ID шаблона if (file_exists($dir.'field-'.$type.'-'.$field_id.'-'.$_tpl.'.tpl')) $tpl = $dir.'field-'.$type.'-'.$field_id.'-'.$_tpl.'.tpl'; // Если существет файл с аласом поля и ID шаблона else if (file_exists($dir.'field-'.$type.'-'.$alias_field_id.'-'.$_tpl.'.tpl')) $tpl = $dir.'field-'.$type.'-'.$alias_field_id.'-'.$_tpl.'.tpl'; // Если существет файл с ID поля else if (file_exists($dir.'field-'.$type.'-'.$field_id.'.tpl')) $tpl = $dir.'field-'.$type.'-'.$field_id.'.tpl'; // Если существет файл с алиасом поля else if (file_exists($dir.'field-'.$type.'-'.$alias_field_id.'.tpl')) $tpl = $dir.'field-'.$type.'-'.$alias_field_id.'.tpl'; // Если существет файл c типом поля else if (file_exists($dir.'field-'.$type.'.tpl')) $tpl = $dir.'field-'.$type.'.tpl'; // Если существет файл c ID поля else if (file_exists($dir.'field-'.$field_id.'.tpl')) $tpl = $dir.'field-'.$field_id.'.tpl'; // Иначе else $tpl = $dir.'field.tpl'; return $tpl; } /** * Формирование поля документа в соответствии с шаблоном отображения * * @param int $field_id идентификатор поля * @param int $document_id * * @param null $_tpl * * @return string */ function document_get_field ($field_id, $document_id = null, $_tpl = null, $maxlength = null) { global $AVE_Core; if (! $_tpl && is_array($field_id)) $_tpl = $field_id[2]; if (is_array($field_id)) $field_id = $field_id[1]; $document_fields = get_document_fields(empty($document_id) ? $AVE_Core->curentdoc->Id : intval($document_id)); if (! is_array($document_fields[$field_id])) $field_id = intval($document_fields[$field_id]); if (empty($document_fields[$field_id])) return ''; $field_value = trim($document_fields[$field_id]['field_value']); $tpl_field_empty = $document_fields[$field_id]['tpl_field_empty']; // if ($field_value == '' && $tpl_field_empty) return ''; $field_type = $document_fields[$field_id]['rubric_field_type']; $rubric_field_template = trim($document_fields[$field_id]['rubric_field_template']); $rubric_field_default = $document_fields[$field_id]['rubric_field_default']; // $field_value = parse_hide($field_value); // $field_value = ($length != '') ? truncate_text($field_value, $length, '…', true) : $field_value; $func = 'get_field_' . $field_type; if (! is_callable($func)) $func = 'get_field_default'; $field_value = $func($field_value, 'doc', $field_id, $rubric_field_template, $tpl_field_empty, $maxlength, $document_fields, RUB_ID, $rubric_field_default, $_tpl); return $field_value; } /** * Функция получения содержимого поля для обработки в шаблоне рубрики * * @param int $field_id идентификатор поля, для [tag:fld:12] $field_id = 12 * @param int $length необязательный параметр, * количество возвращаемых символов содержимого поля. * если данный параметр указать со знаком минус * содержимое поля будет очищено от HTML-тегов. * @return string */ function document_get_field_value ($field_id, $length = 0) { if (! is_numeric($field_id)) return ''; $document_fields = get_document_fields(get_current_document_id()); $field_value = trim($document_fields[$field_id]['field_value']); if ($field_value != '') { $field_value = strip_tags($field_value); // "

" if (is_numeric($length) && $length != 0) { if ($length < 0) { $field_value = strip_tags($field_value); $field_value = preg_replace('/ +/', ' ', $field_value); $field_value = trim($field_value); $length = abs($length); } $field_value = truncate_text($field_value, $length, '…'); } } return $field_value; } /** * Возвращаем истинное значение поля для документа * * @param int $document_id id документа * @param string $field id поля или его алиас * * @return string */ function get_document_field ($document_id, $field) { $document_fields = get_document_fields($document_id); if (! is_array($document_fields[$field])) $field = intval($document_fields[$field]); if (empty($document_fields[$field])) return false; $field_value = $document_fields[$field]['field_value']; return $field_value; } /** * Функция возвращает массив со значениями полей * * @param $document_id * @param array $values если надо вернуть документ с произвольными значениями - используется для ревизий документов * @internal param int $id id документа * @return mixed */ function get_document_fields ($document_id, $values = null) { global $AVE_DB, $AVE_Core; //$request_documents if (defined('USE_STATIC_FIELDS') && USE_STATIC_FIELDS) static $document_fields = []; else $document_fields = []; if (! is_numeric($document_id)) return false; if (! isset($document_fields[$document_id])) { $document_fields[$document_id] = false; $where = "WHERE doc_field.document_id = '" . $document_id . "'"; $query = " SELECT doc.document_author_id, doc_field.Id, doc_field.document_id, doc_field.rubric_field_id, doc_field.field_value, text_field.field_value as field_value_more, rub_field.rubric_field_alias, rub_field.rubric_field_type, rub_field.rubric_field_default, rub_field.rubric_field_title, rub_field.rubric_field_template, rub_field.rubric_field_template_request FROM " . PREFIX . "_document_fields AS doc_field JOIN " . PREFIX . "_rubric_fields AS rub_field ON doc_field.rubric_field_id = rub_field.Id LEFT JOIN " . PREFIX . "_document_fields_text AS text_field ON (doc_field.rubric_field_id = text_field.rubric_field_id AND doc_field.document_id = text_field.document_id) JOIN " . PREFIX . "_documents AS doc ON doc.Id = doc_field.document_id " . $where . " # DOC FIELDS = $document_id "; $cache_id = (int)$AVE_Core->curentdoc->Id; $cache_id = 'documents/' . (floor($cache_id / 1000)) . '/' . $cache_id; $cache_file = md5($query) . '.fields'; $cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > '' ? trim($cache_id) . '/' : substr($cache_file, 0, 2) . '/' . substr($cache_file, 2, 2) . '/' . substr($cache_file, 4, 2) . '/'); // Наличие файла if (file_exists($cache_dir . $cache_file)) { // Получаем время создания файла $file_time = filemtime($cache_dir . $cache_file); // Получаем время для проверки $cache_time = $AVE_Core->curentdoc->rubric_changed_fields; // Сравниваем временные метки if (! $cache_time || $cache_time > $file_time) unlink ($cache_dir . $cache_file); } // Безусловный кеш $sql = $AVE_DB->Query($query, -1, 'fld_' . $document_id, true, '.fields'); // Вдруг памяти мало!!!! if (memory_panic() && (count($document_fields) > 3)) $document_fields = []; while ($row = $sql->FetchAssocArray()) { $row['tpl_req_empty'] = (trim($row['rubric_field_template_request']) == ''); $row['tpl_field_empty'] = (trim($row['rubric_field_template']) == ''); $row['field_value'] = (string)$row['field_value'] . (string)$row['field_value_more']; if ($values) $row['field_value'] = (isset($values[$row['rubric_field_id']]) ? $values[$row['rubric_field_id']] : $row['field_value']); if ($row['field_value'] === '') { $row['rubric_field_template_request'] = preg_replace('/\[tag:if_notempty](.*?)\[\/tag:if_notempty]/si', '', $row['rubric_field_template_request']); $row['rubric_field_template_request'] = trim(str_replace(['[tag:if_empty]','[/tag:if_empty]'], '', $row['rubric_field_template_request'])); $row['rubric_field_template'] = preg_replace('/\[tag:if_notempty](.*?)\[\/tag:if_notempty]/si', '', $row['rubric_field_template']); $row['rubric_field_template'] = trim(str_replace(['[tag:if_empty]','[/tag:if_empty]'], '', $row['rubric_field_template'])); } else { $row['rubric_field_template_request'] = preg_replace('/\[tag:if_empty](.*?)\[\/tag:if_empty]/si', '', $row['rubric_field_template_request']); $row['rubric_field_template_request'] = trim(str_replace(['[tag:if_notempty]','[/tag:if_notempty]'], '', $row['rubric_field_template_request'])); $row['rubric_field_template'] = preg_replace('/\[tag:if_empty](.*?)\[\/tag:if_empty]/si', '', $row['rubric_field_template']); $row['rubric_field_template'] = trim(str_replace(['[tag:if_notempty]','[/tag:if_notempty]'], '', $row['rubric_field_template'])); } $document_fields[$row['document_id']][$row['rubric_field_id']] = $row; $document_fields[$row['document_id']][$row['rubric_field_alias']] = $row['rubric_field_id']; } } return $document_fields[$document_id]; } /** * Возвращает содержимое поля документа по номеру * * @param int $field_id ([tag:fld:X]) - номер поля * @param int $doc_id * @param int $parametr ([tag:parametr:X]) - часть поля * * @return string */ function get_field ($field_id, $doc_id = null, $parametr = null) { global $req_item_id; //-- Если не передан $doc_id, то проверяем реквест if (! $doc_id && $req_item_id) $doc_id = $req_item_id; //-- Или берём для текущего дока elseif (! $doc_id && $_REQUEST['id'] > 0) $doc_id = $_REQUEST['id']; //-- Возвращаем FALSE, если не число elseif (! is_numeric($doc_id)) return false; //-- Забираем из базы массив полей $field = get_document_field ($doc_id, $field_id); //-- Возвращаем нужную часть поля if ($parametr !== null) { $field = explode("|", $field); $field = array_values(array_diff($field, array(''))); $field = $field[$parametr]; } return $field; } /** * Возвращает содержимое поля документа по номеру * * @param int $field_id ([tag:fld:X]) - номер поля * @param int $doc_id * @param int $parametr ([tag:parametr:X]) - часть поля * * @return mixed */ function get_true_field ($field_id, $doc_id = null, $parametr = null) { global $req_item_id, $AVE_DB; //-- Если не передан $doc_id, то проверяем реквест if (! $doc_id && $req_item_id) $doc_id = $req_item_id; //-- Или берём для текущего дока elseif (! $doc_id && $_REQUEST['id'] > 0) $doc_id = $_REQUEST['id']; //-- Возвращаем FALSE, если не число elseif (! is_numeric($doc_id)) return false; //-- Забираем поле из базы $sql = " SELECT doc_field.field_value, text_field.field_value AS field_value_more FROM " . PREFIX . "_document_fields AS doc_field LEFT JOIN " . PREFIX . "_document_fields_text AS text_field ON (doc_field.rubric_field_id = text_field.rubric_field_id AND doc_field.document_id = text_field.document_id) WHERE doc_field.document_id = '" . $doc_id . "' AND doc_field.rubric_field_id = '" . $field_id . "' "; $query = $AVE_DB->Query($sql)->FetchRow(); $field = (string)$query->field_value . (string)$query->field_value_more; unset ($sql, $query); //-- Возвращаем нужную часть поля if ($parametr !== null) { $field = explode("|", $field); $field = array_values(array_diff($field, array(''))); $field = $field[$parametr]; } return $field; } /** * Возвращает элемент сериализованного поля по номеру и ключу * * @param int $field_id ([tag:fld:X]) - номер поля * @param int $item_id - номер элемента * @param int $doc_id ([tag:docid]) - id документа * @param int $parametr ([tag:parametr:X]) - номер параметра элемента * @return string */ function get_element ($field_id, $item_id = 0, $parametr = null, $doc_id = null) { global $req_item_id; //-- Если не передан $doc_id, то проверяем реквест if (! $doc_id && $req_item_id) $doc_id = $req_item_id; //-- Или берём для текущего дока elseif (! $doc_id && $_REQUEST['id'] > 0) $doc_id = $_REQUEST['id']; //-- Возвращаем FALSE, если не число elseif (! is_numeric($doc_id)) return false; //-- Забираем из базы поле $field = get_field($field_id, $doc_id); $field = unserialize($field); // возвращаем нужную часть поля if ($parametr !== null) { $field = $field[$item_id]; $field = explode("|", $field); $field = $field[$parametr]; } else { $field = $field[$item_id]; $field = explode("|", $field); $field = $field[0]; } return $field; } /** * Возвращает сериализованны(й|е) элемент(ы) поля * * @param int $field_id ([tag:fld:X]) - номер поля * @param int $item_id - номер элемента * @param int $doc_id ([tag:docid]) - id документа * @return mixed */ function get_serialize ($field_id, $item_id = null, $doc_id = null) { global $req_item_id; //-- Если не передан $doc_id, то проверяем реквест if (! $doc_id && $req_item_id) $doc_id = $req_item_id; //-- Или берём для текущего дока elseif (! $doc_id && $_REQUEST['id'] > 0) $doc_id = $_REQUEST['id']; //-- Возвращаем FALSE, если не число elseif (! is_numeric($doc_id)) return false; //-- Забираем поле $field = get_field($field_id, $doc_id); $field = unserialize($field); $field_data = array(); //-- Если получили массив из данных, собираем новый if (! empty($field)) foreach ($field AS $k => $v) $field_data[$k] = explode('|', $v); //-- Иначе возвращаем FALSE else return false; unset($field); //-- Если пришло $item_id if (is_numeric($item_id)) return $field_data[$item_id]; else return $field_data; } /** * Возвращает элемент сериализованного поля по номеру и ключу, через тег [tag:fld:XXX][XXX][XXX] * * @return string */ function get_field_element () { $param = func_get_args(); // Field ID $param_1 = isset($param[0]) ? $param[0] : null; // Item ID $param_2 = isset($param[1]) ? $param[1] : null; // Param ID $param_3 = isset($param[2]) ? $param[2] : null; // Document ID $param_4 = isset($param[3]) ? $param[3] : null; $return = get_element($param_1, $param_2, $param_3, $param_4); return $return; } /** * Возвращает наименование поля документа по номеру * * @param int $field_id ([tag:fld:X]) - номер поля * @param int $doc_id * * @return string */ function get_field_name ($field_id, $doc_id = null) { global $req_item_id; //-- Если не передан $doc_id, то проверяем реквест if (! $doc_id && $req_item_id) $doc_id = $req_item_id; //-- Или берём для текущего дока elseif (! $doc_id && $_REQUEST['id'] > 0) $doc_id = $_REQUEST['id']; //-- Возвращаем FALSE, если не число elseif (! is_numeric($doc_id)) return false; $document_fields = get_document_fields($doc_id); if (empty($document_fields[$field_id])) return false; $field_name = $document_fields[$field_id]['rubric_field_title']; return $field_name; } /** * Возвращает поле документа по номеру * * @param int $field_id ([tag:fld:X]) - номер поля * @param int $doc_id * @param int $parametr знчение * * @return mixed */ function get_full_field ($field_id, $doc_id = null, $parametr = null) { global $req_item_id, $AVE_DB; //-- Если не передан $doc_id, то проверяем реквест if (! $doc_id && $req_item_id) $doc_id = $req_item_id; //-- Или берём для текущего дока elseif (! $doc_id && $_REQUEST['id'] > 0) $doc_id = $_REQUEST['id']; //-- Возвращаем FALSE, если не число elseif (! is_numeric($doc_id)) return false; //-- Забираем поле из базы $sql = " SELECT doc.document_author_id, doc_field.document_id, doc_field.rubric_field_id, doc_field.field_value, doc_field.field_number_value, text_field.field_value AS field_value_more, rub_field.rubric_field_alias, rub_field.rubric_field_type, rub_field.rubric_field_default, rub_field.rubric_field_title, rub_field.rubric_field_template, rub_field.rubric_field_template_request FROM " . PREFIX . "_document_fields AS doc_field JOIN " . PREFIX . "_rubric_fields AS rub_field ON doc_field.rubric_field_id = rub_field.Id LEFT JOIN " . PREFIX . "_document_fields_text AS text_field ON (doc_field.rubric_field_id = text_field.rubric_field_id AND doc_field.document_id = text_field.document_id) JOIN " . PREFIX . "_documents AS doc ON doc.Id = doc_field.document_id WHERE doc_field.document_id = '" . $doc_id . "' AND doc_field.rubric_field_id = '" . $field_id . "' "; $field = $AVE_DB->Query($sql)->FetchRow(); $field->field_value = (string)$field->field_value . (string)$field->field_value_more; unset ($sql); //-- Возвращаем нужную часть if ($parametr !== null) return $field[$parametr]; return $field; } ?>