Перейти к содержимому


Как устроены поля типа связь внутри?


Сообщений в теме: 17

#1 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 08 Июль 2013 - 13:41

интересуют поля type_value и default_value. Что содержать, как их разбирать, как формируются?

Прикрепленные изображения

  • Прикрепленное изображение: Выбрать  f5_fields   Adminer.png


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 08 Июль 2013 - 15:15

50 - таблица связи, 531 - поле связи

"default_value" - "значение по умолчанию" (привет, КО, как говорится). Оно существует для полей любого типа, связь ничем не отличается.

#3 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 08 Июль 2013 - 15:20

зачем остальные 0|0|0?

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 08 Июль 2013 - 15:31

Фильтр (id); Флаг вывода имен доп. полей; Флаг вывода в одну строку доп. полей

#5 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Июль 2013 - 02:24

// Массив данных с "русскими" именами полей
// Author: --- WonderTalik, July 11, 2013
function data_table_w($name_table, $where = "", $return_rows = "1")
{
	//id поля связи в type_field
	$id_type_relations = 5;
	// получаем id таблицы по ее имени
	$sqlQuery = "SELECT * FROM " . TABLES_TABLE . " WHERE name_table='$name_table'";
	$result = sql_query($sqlQuery);
	$table = mysql_fetch_array($result);
	$table_id = $table['id'];
	if ($table_id) {
		$table = get_table($table_id);
		$table_fields = get_table_fields($table);
		// формируем набор полей и заменяем имена в условии
		foreach ($table_fields as $one_field) {

			$fields[$one_field['int_name']]['name'] = $one_field['name_field'];
			$fields[$one_field['int_name']]['type_field']['id'] = $one_field['type_field'];
			switch ($one_field['type_field']) {
				case $id_type_relations:
					$w_tmp = explode("|", $one_field['type_value']);
					//id таблицы связи
					$fields[$one_field['int_name']]['type_field']['id_table_r'] = $w_tmp[0];
					//возможно стоит переписать этот кусок с использованием get_table_fields, вместо простой конкатенации
					$fields[$one_field['int_name']]['type_field']['id_field_r'] = "f" . $w_tmp[1];
					break;
			}
			$where = str_replace("`" . $one_field['name_field'] . "`", $one_field['int_name'], $where);
		}
		// получаем строку данных из таблицы и заменяем внутрение имена полей на внешние
		$sqlQuery = "SELECT * FROM " . DATA_TABLE . $table_id . ($where ? " WHERE $where" : "") . (($return_rows != "all") ? " LIMIT $return_rows" : "");
		$result = sql_query($sqlQuery);
		while ($row = sql_fetch_assoc($result)) {
			foreach ($row as $int_name => $value) {
				switch ($fields[$int_name]['type_field']['id']) {
					case $id_type_relations:
						$sqlQuery = "SELECT " . $fields[$int_name]['type_field']['id_field_r'] . " as field_value FROM
							" . DATA_TABLE . $fields[$int_name]['type_field']['id_table_r'] . " WHERE `id` = " . intval($value);
						$relations_result = sql_query($sqlQuery);
						$row_relations = sql_fetch_assoc($relations_result);
						if (sql_num_rows($relations_result) > 0)
							$value = $row_relations['field_value'];
						else
							$value = "";
						break;
				}
				if ($fields[$int_name])
					$data[$fields[$int_name]['name']] = $value;
			}
			$lines[] = $data;
		}
		// возвращаем результат
		if ($return_rows==1)
			if ($lines) return $lines[0]; else return false;
		else
			if ($lines) return $lines; else return array();
	}
	else
	{
		echo "Error in function 'data_table': table '".$name_table."' no found.";
		return false;
	}
}

Уважаемы разработчики, понадобилось немножко усовершенствовать Вашу функцию data_table. Дело в том, что для полей типа связи она выводила - айди записи из таблицы связи. Моя функция выводит - значение этого поля, которое берется из таблицы связи. Пожалуйста проверьте и если можно замените в functions2.php.
Узкие моменты, вопрос в комментарии, пожалуйста ответьте. Спасибо.
					//возможно стоит переписать этот кусок с использованием get_table_fields, вместо простой конкатенации
					$fields[$one_field['int_name']]['type_field']['id_field_r'] = "f" . $w_tmp[1];


#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2013 - 09:55

Функция data_table выводит значения из БД, а не то, как они представлены в самой программе. Это не баг и не недоработка, а особенность работы данной функции. И касается не только полей связи, те же числа или дата в базе данных тоже представлены по иному. Основная причина этого - совместимость с записью в другие поля, в том числе через прямые запросы в базу, выводить сами значения полей связи для этого не требуется.

#7 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Июль 2013 - 09:56

Просмотр сообщенияCbCoder (11 Июль 2013 - 09:55) писал:

Функция data_table выводит значения из БД, а не то, как они представлены в самой программе. Это не баг и не недоработка, а особенность работы данной функции. И касается не только полей связи, те же числа или дата в базе данных тоже представлены по иному. Основная причина этого - совместимость с записью в другие поля, в том числе через прямые запросы в базу, выводить сами значения полей связи для этого не требуется.

А где я указал на то что это баг? Я просто ее доработал, так как часто появлялась необходимость в таком функционале, и поделился. Спасибо.

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2013 - 10:04

Просмотр сообщенияwondertalik (11 Июль 2013 - 02:24) писал:

Узкие моменты, вопрос в комментарии, пожалуйста ответьте. Спасибо.
					//возможно стоит переписать этот кусок с использованием get_table_fields, вместо простой конкатенации
					$fields[$one_field['int_name']]['type_field']['id_field_r'] = "f" . $w_tmp[1];

					//возможно стоит переписать этот кусок с использованием get_table_fields, вместо простой конкатенации
					$fields[$one_field['int_name']]['type_field']['id_field_r'] = $one_field['s_field_id'])


#9 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2013 - 10:07

Просмотр сообщенияwondertalik (11 Июль 2013 - 09:56) писал:

А где я указал на то что это баг? Я просто ее доработал, так как часто появлялась необходимость в таком функционале, и поделился. Спасибо.

Я просто понял эти ваши слова:

Цитата

Уважаемы разработчики, понадобилось немножко усовершенствовать Вашу функцию data_table. Дело в том, что для полей типа связи она выводила - айди записи из таблицы связи.
как то что функция неправильно работает.

#10 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Июль 2013 - 10:18

Просмотр сообщенияCbCoder (11 Июль 2013 - 10:07) писал:

Я просто понял эти ваши слова:

как то что функция неправильно работает.
Я именно доработал (под свои нужды), а не исправил. Указал что именно она выводит, что я доработал и вообще почему пришлось так сделать. Вот и все. Ни о каких багах речи не идет. И возможно, кому-то, кроме меня понадобится :). А теперь вопрос по существу:

	[scw_set] => Array
		(
		)
	[s_table_id] => 93
	[s_field_id] => 1242
	[s_filter_id] => 0
	[s_show_field_name] => 0
	[s_show_field_inline] => 0
	[links_also_show] => Array
		(
		)
Этот массив не пустой для полей типа связь только?

Сообщение отредактировал wondertalik: 11 Июль 2013 - 10:19


#11 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2013 - 10:20

Да.

#12 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Июль 2013 - 10:25

Просмотр сообщенияCbCoder (11 Июль 2013 - 10:20) писал:

Да.
Спасибо за консультацию. Вы как всегда на высоте.

#13 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Июль 2013 - 10:54

Просмотр сообщенияCbCoder (11 Июль 2013 - 10:04) писал:

					//возможно стоит переписать этот кусок с использованием get_table_fields, вместо простой конкатенации
					$fields[$one_field['int_name']]['type_field']['id_field_r'] = $one_field['s_field_id'])
Мне кажется вы имели ввиду:

					$fields[$one_field['int_name']]['type_field']['id_field_r'] = $one_field['scw_set']['s_field_id'])


#14 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2013 - 11:00

Нет, я все правильно написал. Массив $one_field['scw_set'] - это массив конструктора вычислений (если в настройках поля он задан), собственно к настройкам поля связи отношения не имеет. У вас видимо в конструкторе задано обращение к связанному полю, поэтому там и есть "s_field_id". Но это не то.

#15 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2013 - 11:03

Цитата

Этот массив не пустой для полей типа связь только?

Собственно здесь я поторопился с ответом, массив [scw_set] не пустой, если настроен конструктор вычислений.

#16 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Июль 2013 - 12:10

Просмотр сообщенияCbCoder (11 Июль 2013 - 10:04) писал:

					//возможно стоит переписать этот кусок с использованием get_table_fields, вместо простой конкатенации
					$fields[$one_field['int_name']]['type_field']['id_field_r'] = $one_field['s_field_id'];
Убираем скобку в конце и точку с запятой ставим. Теперь собственно вопрос, вот я допустил ошибку и теперь не могу зайти. Как быть? Даже залогинится не могу. На веб, подключился по фтп и исправил. А на саас?

[b]Parse error[/b][color=#000000]: syntax error, unexpected ')' in [/color][b]/var/www/tao.bitmaster.dp.ua/include/functions_custom.php[/b][color=#000000] on line [/color][b]105[/b]

Сообщение отредактировал wondertalik: 11 Июль 2013 - 12:11


#17 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2013 - 14:58

Цитата

А на саас?

Обратиться в техподдержку.

#18 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 435 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 29 Март 2017 - 23:22

Я тоже сам доходил до структуры БД методом проб и ошибок и написал себе на внешнем скрипте редактор полей, но было бы неплохо иметь встроенную функцию, выводящую не ID, а значение кросс-поля. Просто назвать ее по другому или дать четвертым параметром. например 0 по умолчания - это ID, а 1 - это значение. Но тут есть такой момент - кросс-ссылка может быть глубже 1 уровня - например если мы ссылаемся на таблицу и в качестве связи указываем поле типа связь и в связанной таблице тоже указано поле типа связь. Вообще-то этого надо избегать, но так иногда бывает.





Количество пользователей, читающих эту тему: 5

0 пользователей, 5 гостей, 0 анонимных