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


Публикации OlegSmirnov

36 публикаций создано OlegSmirnov (учитываются публикации только с 06-Май 23)



#22441 Добавление записи через вычисление

Отправлено от OlegSmirnov в 11 Март 2014 - 19:44 in Как это сделать

Здравствуйте!

Нужно сделать так, чтобы в зависимости от значения одного из полей в таблице, для каждой конкретной строки становились обязательными для заполнения разные колонки. Вот пример - допустим, есть три поля:

F1 - поле типа "список", может принимать значение 2 или 3.
F2 - поле типа "связь", оно отображается и становится обязательно для заполнения только если в поле F1 выбрано значение 2.
F3 - поле типа "связь", оно отображается и становится обязательно для заполнения только если в поле F1 выбрано значение 3.

Т.е. если пользователь в списке F1 выбирает значение 2 - то он должен заполнить поле F2, а поле F3 - не отображается в форме. Если выбирает значение 3 - то, соответственно, должен заполнить поле F3, а поле F2 - не отображается.

Я написал JavaScript, который в зависимости от значения F1 показывает/скрывает поля F2 и F3 при изменении значения поля F1, а также при загрузке страницы с формой для добавления/редактирования записи. Но вот как быть с обязательностью заполнения того или иного поля - никак не соображу... Основная проблема в том, что это поля типа "связь". Т.е. не достаточно просто на том же JS проверить, что в поле что-то есть и соответствует определённому формату, а нужно убедиться, что в связанной таблице есть такое значение. При этом и просто поставить галочку в настройках таблицы, что поле является обязательным - тоже нельзя, поскольку эта галочка применяется для всех записей в таблице. А мне нужно, чтобы для каждой строки в таблице обязательными для заполнения могли быть разные поля в зависимости от значения одного из полей той же строки. Предусмотрена ли такая возможность в программе?

Можно ли это сделать с помощью вычислений? Могу ли я в вычислении на сохранение данных отклонить запись данных из формы в таблицу и сформировать текст сообщения причины отказа? Не нашёл такой информации в описании вычислений...



#22484 Добавление записи через вычисление

Отправлено от OlegSmirnov в 13 Март 2014 - 17:58 in Как это сделать

А вообще, мне кажется, возможность в вычислении отклонять запись данных - была бы не лишней. Например, я думаю можно сделать, чтобы вычисление на сохранение данных могло с помощью return возвращать отказ и текст сообщения - почему отказ. Ну типа
return array('accept' => false, 'message' => 'Не верно заполнено поле XXX');



#22483 Добавление записи через вычисление

Отправлено от OlegSmirnov в 13 Март 2014 - 17:51 in Как это сделать

CbCoder,
благодарю за ответ. Не обратил внимание на наличие скрытого поля с id связанной записи.



#23040 как можно ограничить текстовое поле определенным кол-вом символов?

Отправлено от OlegSmirnov в 15 Апрель 2014 - 08:48 in Как это сделать

Есть ли сейчас способ подключить свой JavaScript в шапке? Чтобы он подключался к страницам с таблицами. Метод, предложенный выше пользователем andibrag:

Просмотр сообщенияandibrag (11 Октябрь 2011 - 11:47) писал:

Ну а пока можно использовать выше названное поле для css и вписать туда:
/Ваша_файл_стилей.css" type="text/css"><script type="text/javascript" src="/cb_modules/addscr.js"></script><link rel="stylesheet
сейчас не работает (видимо, название файла теперь проходит через htmlspecialchars).

Проект находится на xxxxx.clientbase.ru - на сколько я понимаю, прямого доступа на редактирование файлов у меня там нет, чтобы можно было что-то вписать в какой-то файл.



#23044 как можно ограничить текстовое поле определенным кол-вом символов?

Отправлено от OlegSmirnov в 15 Апрель 2014 - 10:15 in Как это сделать

Про functions_custom.php - не знал, спасибо.



#22529 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 16:40 in Как это сделать

В общем сейчас распишу на примере, отбросив лишние поля и оставив то, что важно для вопроса.

Есть 4 таблицы с их полями:

Проекты:
- поле название (текст)

Услуги:
- поле проект (связь с проекты.название),
- поле название (текст),
- поле стоимость (число)

Позиции:
- поле сделка (связь с сделки.идентификация),
- поле проект (связь с проекты.название, невидимое при редактировании, заполняется вычислением - определяет проект по услуге),
- поле услуга (связь с услуги.название)
- поле стоимость (число, поле заполняется вычислением, значение берётся из соответствующей услуги)

Сделки:
- поле идентификация (текст)
- поле проекты (текст)
- поле услуги (текст)
- поле сумма (число)

И есть вычисление в таблице позиции, которое при изменении таблицы позиции (добавление, удаление, восстановление, редактирование записей):
1) получает все позиции, которые относятся к той же сделке, что и текущая позиция
2) перебирая полученные позиции, составляет список названий проектов (просто текст через запятую), к которым относятся эти позиции. Вообще, сперва набирает массив id проектов (из поля-связи проект), потом по этим id уже получает названия
3) аналогично, перебирая полученные позиции - составляет список названий услуг.
4) перебирая полученные позиции подсчитывает общую сумму
5) вносит список названий проектов, список названий услуг и общую сумму в соответствующую строку таблицы сделки.

И это работает. Но если, например, в таблице проекты изменить название - то в таблице сделки в списке проектов оно не изменится. Можно написать свои вычисления на таблицу проекты и на таблицу услуги, которые будут делать тоже самое, что вычисление на таблице позиции. Просто я подумал, что может можно при изменении названия проекта - определить список позиций, которые относятся к данному проекту и далее для этих позиций (можно предварительно отсеять позиции с одинаковыми сделками) - запустить то вычисление из таблицы позиции, которое уже готово, а не создавать ещё его клоны.



#22527 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 16:11 in Как это сделать

Я уже думал про встроенные update-функции, чтобы с их помощью запускать вычисления. Но в той таблице, в которой находится вычисление - я ничего не меняю. Там поля типа "связь". Меняю значения - в связанных таблицах, а в той, где вычисление - там-то id остаются как и были...



#22530 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 16:50 in Как это сделать

О, пока писал текст - вы уже ответили про функцию popup_event, сейчас буду искать



#22524 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 15:08 in Как это сделать

Понятно, спасибо за подсказку!

Скажите, а можно ли как-то из кода одного вычисления принудительно запустить работу нужного вычисления из определённой таблицы? Как будто произошло событие в той, другой таблице?
Просто есть несколько таблиц с определёнными связями, и в одной из таблиц - довольно длинное вычисление, которое генерирует строки текста, основываясь на данных из этих таблиц. Потом эти строки вставляются ещё в другую таблицу. Вычисление срабатывает при добавлении, изменении, удалении или восстановлении записи в своей таблице. Однако если была отредактирована запись в одной из связанных таблиц и было изменено определённое поле - то нужно, чтобы то вычисление сработало по новой и сгенерировало новые строки с учётом изменений в связанной таблице. Сперва начал копировать код вычисления ещё в несколько таблиц, корректируя немного под них, а сейчас подумал - может можно не копировать его, а как-то "дёргать" из других вычислений, передавая $ID той строки, над которой нужно, чтобы оно отработало?



#22516 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 13:17 in Как это сделать

Вот ещё - не могу разобраться, как-то странно отрабатывает вычисление при удалении записей.

Есть такой код в вычислении:

$dealId = (int) $line['Сделка']['ID'];
$res = data_select(271, "`f3701` = ", $dealId, " AND `status` = ", 0);
По идее он должен бы выбрать только активные записи (AND `status` = 0), однако в выборку почему-то попадают все строки.

И ещё - есть возможность повесить вычисление на удаление строки, но не вижу возможности как-то обрабатывать восстановление записи из удалённых обратно в активные.



#22511 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 12:14 in Как это сделать

Помню, толи в руководстве, толи здесь на форуме - была рекомендация вычисления привязывать к сохранению/изменению данных, а не к отображению - для снижения нагрузок.
Но если потом отредактируют таблицу-источник и телефон там поменяется? Получается, это вычисление нужно привязывать к отображению поля и при каждом просмотре таблицы будет заново отрабатывать UPDATE-запрос?



#22520 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 14:31 in Как это сделать

Так, с первым вопросом разобрался. В выборку попадают не все удалённые записи, а только та, которую удаляю сейчас, а те, что были удалены ранее - их в выборке нет. То есть, на сколько я понимаю, на момент, когда выполняется код вычисления (обрабатывающий удаление записи) - статус этой записи в базе ещё не обновился, она ещё считается активной. И статус удалённой ей присваивается уже после завершения работы вычисления. Соответственно, в том вычислении можно при переборе результата выборки "вручную" исключить текущую (удаляемую) запись по $ID, например.

Остаётся второй вопрос. Если записи восстанавливаются из удалённых обратно в активные - как можно обработать это событие?



#22508 Вывод полей из других таблиц

Отправлено от OlegSmirnov в 17 Март 2014 - 11:59 in Как это сделать

Знаю, что можно установить связь между таблицами по определённому полю и выводить значения некоторых других полей из соответствующей строки привязанной таблицы. Но эти значения выводятся в том же поле, по которому происходит связь, как некоторые дополнительные данные. А можно ли выводить эти дополнительные поля из соответствующей строки связанной таблицы - именно как отдельные поля, а не дополнительные данные поля связи? Чтобы и сортировка по ним работали и выглядели именно как поля? Или этого можно добиться только копированием значений из одной таблицы в другую?



#22752 Доп. действие во всплывающем окне

Отправлено от OlegSmirnov в 31 Март 2014 - 08:36 in Как это сделать

Просмотр сообщенияCbCoder (27 Март 2014 - 08:32) писал:

В принципе код для всплывающего окна (форму) можно разместить и так. Разница в том, что он будет выполнятся в текущем окне, и после обработки данных нужно перенаправлять обратно в таблицу (или в любое другое место программы)
Не понял, о чём речь, можно немного подробнее? "и так" - это где?



#22757 Доп. действие во всплывающем окне

Отправлено от OlegSmirnov в 31 Март 2014 - 10:29 in Как это сделать

Всё равно не понял, как это должно работать, что нужно сделать. Вот допустим, создал таблицу, добавил в неё доп.действие и написал такой код вычисления (просто для пробы):

if(isset($_POST['mytext'])) {
echo htmlspecialchars($_POST['mytext']);
}
echo '
<form name="testform" method="post">
Текст: <input type="text" name="mytext" value="" />
<input type="submit" value="Отправить" />
</form>';
Но когда я над таблицей выбираю это доп.действие - уходит на сервер запрос и просто перезагружается текущая таблица, никакая форма не отображается. Как мне нужно написать вычисление, или что я ещё пропустил?



#22687 Доп. действие во всплывающем окне

Отправлено от OlegSmirnov в 26 Март 2014 - 18:25 in Как это сделать

Суть вопроса была в том, что представление - это единственный способ реализовать такое:

Цитата

Интересует вопрос, как можно в режиме таблицы выбрать несколько строк, после чего при нажатии на кнопку - откроется некая форма, а далее выполнятся некие вычисления для этих выбранных строк с учётом данных из заполненной формы?
или есть ещё варианты какие-то, основанные на стандартных таблицах?



#22654 Доп. действие во всплывающем окне

Отправлено от OlegSmirnov в 26 Март 2014 - 03:46 in Как это сделать

Добавил дополнительное действие в таблице, но его кнопки над таблицей не появляется. Причём если в настройках доп. действия указать, что оно выполняется в текущем окне - то кнопка для действия появляется. А когда выбираешь выполняется во всплывающем окне - то его кнопка над таблицей опять исчезает. Причём в режиме просмотра отдельной записи - кнопка такого доп. действия (выполняющегося в новом окне) - отображается и при нажатии открывается новое окно этого доп. действия. А вот в режиме таблицы - кнопка доп. действия, выполняющегося во всплывающем окне - отсутствует.

Интересует вопрос, как можно в режиме таблицы выбрать несколько строк, после чего при нажатии на кнопку - откроется некая форма, а далее выполнятся некие вычисления для этих выбранных строк с учётом данных из заполненной формы? Я так понял, что это можно сделать с помощью доп. действия, выполняющегося во всплывающем окне. Вот в документации написано:

Цитата

Пример 2. Есть таблица "Задания" и нам необходимо чтобы по нажатию кнопки
"Принять" (код которой мы опишем ниже) во всех строках выделенные галочками
поле "Принято" менялось свое значение на "Да", а в поле "Дата выполнения"
проставлялись текущие дата и время. Также в поле "Оценка" должно подставляться
значение из всплывающего окна.

В этом случае "Тип доп. действия" ставим "Во всплывающем окне" и пишем следующий код:

Однако, когда я ставлю "во всплывающем окне" - кнопки над таблицей для этого действия нету и применить его для всех строк, выделенных галочками не получается.



#22657 Доп. действие во всплывающем окне

Отправлено от OlegSmirnov в 26 Март 2014 - 10:52 in Как это сделать

Просмотр сообщенияCbCoder (26 Март 2014 - 08:39) писал:

Доп. действия "во всплывающем окне" работают только в режиме просмотра записи. Это связано с некоторыми особенностями работы доп.действий.
То есть для реализации того, что я хочу сделать - мне получается нужно создать представление, в котором уже выводить таблицу с галочками и нужными мне дополнительными инпутами?



#23275 Собственные функции на php

Отправлено от OlegSmirnov в 28 Апрель 2014 - 16:55 in Как это сделать

Накосячил. :(
В файле functions_custom.php допустил синтаксическую ошибку по невнимательности, поспешил и точку с запятой поставил где не надо. Теперь на любой странице вижу только сообщение

Цитата

Parse error: syntax error, unexpected ';', expecting ')' in /home/test51/public_html/include/functions_custom.php on line 27
В том числе, теперь не могу попасть и на ту страницу, через которую можно редактировать этот файл functions_custom.php - конфигурация и менеджер файлов теперь тоже стали недоступны (видно только сообщение об ошибке). Что можно сделать теперь?



#23277 Собственные функции на php

Отправлено от OlegSmirnov в 28 Апрель 2014 - 17:05 in Как это сделать

Ясно, спасибо. Да, речь про saas-аккаунт.



#23280 Собственные функции на php

Отправлено от OlegSmirnov в 28 Апрель 2014 - 23:19 in Как это сделать

Просмотр сообщенияOlegSmirnov (28 Апрель 2014 - 17:18) писал:

А не знаете, что написать в полях "Номер версии" и "Ревизия"? А то они обязательны для заполнения в форме заявки в тех.поддержку, но посмотреть сейчас какая версия и ревизия не могу из-за той всё же ошибки
В общем, так и написал - "не могу посмотреть".



#23278 Собственные функции на php

Отправлено от OlegSmirnov в 28 Апрель 2014 - 17:18 in Как это сделать

А не знаете, что написать в полях "Номер версии" и "Ревизия"? А то они обязательны для заполнения в форме заявки в тех.поддержку, но посмотреть сейчас какая версия и ревизия не могу из-за той всё же ошибки



#22533 срабатывание вычисления после UPDATE

Отправлено от OlegSmirnov в 17 Март 2014 - 23:44 in Как это сделать

Покопался в include/functions2.php и вот написал такую функцию. Она не является полноценной обёрткой для popup_event и работает для вызова вычислений, которые привязаны к изменению поля. Есть некоторые моменты, о которых хочу предупредить. Эта функция при подготовке данных для запуска popup_event - записывает не настоящие данные в информацию об обновляемом поле. По идее, функция popup_event должна получить (помимо всего прочего) данные, которые были записаны в поле до редактирования и данные, которые оказались там после редактирования. Я не знаю, насколько это важно, чтобы при запуске вычисления была верная информация о старых и новых данных поля, но поскольку мне понадобилось запускать вычисление вообще без реального редактирования поля - я просто указал в качестве старых данных - пустую строку. Новые данные можно указать любые, передав их в качестве аргумента. Опять-таки не знаю, на сколько это важно - передавать верные новые данные. Функция не обновляет значение поля, только запускает вычисление, и эта информация, возможно, нужна для каких-то внутренних нужд popup_event - может сохранение в лог какой-нибудь. Есть ещё один момент, на который, наверно, следует обратить внимание: я вижу, что в той копии "Клиентской базы", с которой я работаю, внутренние названия полей выглядят как fXXX, где XXX - числовой id поля. Т.е. внутреннее название поля - это префикс в виде буквы f, после которого идёт число - идентификатор поля. Не исключаю, что в какой-то другой конфигурации, вместо буквы f префиксом может быть какая-то другая строка текста.

Получилась вот такая функция:

function run_update_event($table_id, $line_id, $field_id, $new_data) {
  $table = get_table($table_id);
  $table_fields = get_table_fields($table);
  $event = array(
	'type' => 'update_query',
	'table_id' => $table_id,
	'line_id' => $line_id,
	'changed' => array(
	  $field_id => array(
		'field_id' => $field_id,
		'int_name' => 'f' . $field_id,
		'old' => '',
		'new' => $new_data
	  )
	)
  );
  $sqlQuery = "SELECT * FROM `" . DATA_TABLE . $table_id . "` WHERE `id` = {$line_id}";
  $res = sql_query($sqlQuery);
  if($res and mysql_num_rows($res)) {
	$line = mysql_fetch_array($res);
	popup_event($table, $line, $event);
  }
}

Аргументы функции:
$table_id - это числовой id таблицы, с которой связано вычисление, которое нужно запустить. Это число можно узнать, например, открыв в браузере эту таблицу и посмотрев в строку адреса текущей страницы.
$line_id - это id той строки в таблице, для которой нужно запустить вычисление. Т.е. как будто строка с этим id была отредактирована.
$field_id - это числовой id столбца, для которого нужно запустить вычисление. Т.е. как будто поле с этим id (в строке $line_id таблицы $table_id) было отредактировано. Это id можно узнать, открыв в браузере нужную таблицу и щёлкнув на сортировку таблицы по интересуещему нас полю, после чего этот id также буден виден в адресной строке браузера (это значение переменной sort_by). Здесь нужно указать id того поля, к изменению которого привязан запуск вычисления.
$new_data - это новые данные, которые записаны в поле после его редактирования. Поскольку эта функция может быть полезна скорее в ситуации, когда данные в поле реально не менялись, но нужно запустить вычисление, как будто они поменялись - то в качестве $new_data я указываю текущее значение поля.

Вот подумал, что кому-то ещё может когда-нибудь пригодится такая функция и решил опубликовать свой вариант.



#22531 срабатывание вычисления после UPDATE

Отправлено от OlegSmirnov в 17 Март 2014 - 17:11 in Как это сделать

Вот, на мой взгляд ещё было бы неплохо, если бы добавили некую обёртку для popup_event, чтобы можно было просто указать название таблицы, id строки и какой-то простой способ указания события - например, его название или может id тоже, если есть у событий id, и эта функция уже чтобы подготовила данные и запустила функцию popup_event.



#22617 Атоматическое заполнение полей

Отправлено от OlegSmirnov в 22 Март 2014 - 07:56 in Как это сделать

А так, чтобы эти поля ссылались на разные таблицы - никак не сделаешь? Ну тоесть поле "Клиент" - на таблицу "Организации", поле "ФИО" - на таблицу "Сотрудники", естественно при этом каждая строка таблицы "Сотрудники" относится к какой-либо записи из таблицы "Организации"...