Вот, еще один вопрос назрел.
Нужно организовать фильтрацию вывода запроса.
Пока получается такой код:
<select name="clinic"> <!--выпадающий список-->
<option value="Клиника1">Клиника2</option>
<option value="Клиника2">Клиника2</option>
<option value="Клиника3">Клиника3</option>
</select>
<input name="Submit" type='submit' value='Отправить'>
</form>
<?php
print $body;
if (!empty($_POST['clinic'])) { echo $_POST['clinic']; };
if(!($node = menu_get_object()))
return;
$count_per_page = 10;
$sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic' ORDER BY Фирма";
$sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic'";
$result = pager_query($sql,$count_per_page, 0, $sql_count, $node->title);
$rows = array();
while($row = db_fetch_object($result)){
$header = array('Название по прайсу', 'Мед. компания', 'Цена услуги');
$rows[] = array($row->Название, $row->Фирма, $row->Цена);
}
$output = theme('table', $header, $rows, array());
$output .= theme('pager', NULL, $count_per_page, 0);
print $output;
?>
Я так понимаю, что параметр $clinic или не передается, или передается неправильно. Помогите, пожалуйста. Знаю, что уже злоупотребляю, но за пару недель sql мне не осилить, тем более, что это не единственная задача...
Комментарии
Вам его не надо "силить" есть визуальный "создатель" такой страницы с фильтрами и "решатель" этой задачи views
По нему могу ответить Вам на вопросы. Если Вы его поставите и начнете создавать свою страницу.
В настоящее время уже 1300 страниц на сайте. Может, я не прав, но, вроде, при использовании views придется "перенабирать" их, вносить изменения в каждую? Я недавно пробовал, но не нашел: где там можно sql-запрос вставить? Сейчас запрос в content templates - он сразу на все распространяется (ну, почти: на все типы материалов, на которые написан запрос).
может, можно как-то все-таки передать параметр в запрос?
Не придется - это данные которые использует views
Не надо !
Так, понял. Views есть; подскажите где там запрос вставляется? Я никак не могу найти ему применение. Пейджинг, сортировку - все это легко нашел. А что делать с запросом?
FROM Таблица
WHERE Имя='%s'
ORDER BY Фирма
А еще я не знаю как сделать так, чтобы 1 настройка views распространялась на все страницы одного типа (на node, например).
В справке тоже: еще раз порылся. Не найти описания "где писать запрос".
1) Запрос Вам не виден и не нужен - "визуальный конструктор". (вернее внизу при отладке виден результирующий запрос)
2) Вы выбираете "что" выводите, в фильтрах что отбирает - если поставить "раскрывать" фильтр - то он появиться на странице Views Вашего, то что Вам надо - просто посмотрите уже готовые views страницы - все поймете.
а как вывести значения таблицы, ячейки первого столбца которой = названию страницы (ноды, страницы подшивок и др.)?
Создать "фильтр" - "тип материала", можно "развернутый".
Там в поле нужно ввести: Is equal = ЧЕМУ? Пишу название_таблицы.поле - пустой результат получается...
"Мурзилка"
У меня все на английском. И совсем не так все выглядит.
Может, версия другая? У меня 6.x-2.10.
Хотя, от версии, наверное, мало что зависит.
Где можно почитать о принципе работы views?
Не понятна схема работы:
1. Как указать таблицу базы данных, столбцы из которых будут отбираться записи?
2. Как указать, что записи должны быть отобраны по критерию "Столбец1=Названию_Страницы"? Столбец1 при этом отображатся не должен (это важно для внешнего вида таблицы).
3. Как определить, что фильтр должен строиться по данным, содержащихся в отобранных столбцах? Т.е. если после отбора записей на выходе имеем три столбца (Столбец2,3,4 из исходной, хранящейся в базе данных) - в Столбце2: а, б, в, г, д; в Столбце3: a, b, c, d; в Столбце4: 1, 2, 3 (каждое значение каждого столбца может повторяться сколько угодно раз) - как отсеить "лишние" записи, если нам нужны только те, где стоит "3" в Столбце4 или "б" в Столбце2?
В общем, отдельные какие-то элементы я настроить, вроде, уже могу (это, в основном, касается раздела Basic Settings); а вот Relationships, Arguments, Sort Criteria (тут и с фильтрами суть ясна, конечно - настройка сортировки и, собственно, фильтра, который мне и нужен), Фильтры - тут уже сложнее. Тем более, не понятно, как они между собой связаны.
Если вы установите модуль Advanced help (см. http://drupal.org/project/advanced_help), то вы получите более удобную справку
Создать фильтр для "Столбец1" и не делать его расширенным - он не будет отображаться при использовании для изменения "Названию_Страницы"
В фильтрах только данные не из отобранных а из базы беруться
В фильтре есть галочка "только уникальные"
Советую посмотреть уже настроенные views - многие моменты станут понятны.
С views пока тяжело. Разбираюсь. Но вот, на форуме phpforum.ru предложили проверить передаваемые параметры на соответстивие. Почему-то выводится "не найдено соответствие". Решение, вроде, где-то рядом...
Пытался убирать одинарные кавычки; если убрать все, то сообщение о соответствии не выводится вообще. Добиться "найдено соответствие" не получилось...
<?php<form method='post'>
/* Проверка на соответствие префикс CH */
$count_per_page = 10;
$result = pager_query($sql,$count_per_page, 0, $sql_count, $node->title);
$rows = array();
$output = theme('table', $header, $rows, array());
<select name="clinic"> <!--выпадающий список-->
<option value="Клиника1">Клиника2</option>
<option value="Клиника2">Клиника2</option>
<option value="Клиника3">Клиника3</option>
</select>
<input name="Submit" type='submit' value='Отправить'>
</form>
<?php
$and = '';
if (!empty($_POST['clinic']))
{
echo $_POST['clinic'];
$and = " AND Фирма='$clinic' ";
$clinic=$_POST['clinic'];
$CHcheck = mysql_query("SELECT DISTINCT Фирма FROM Таблица WHERE Имя='%s'",$CHdb); // Запрос
$CHfirms = mysql_fetch_assoc($CHcheck);
if(
in_array($clinic, $CHfirms))echo "Найдено соответствие";
else
echo "Не найдено соответствие";
///////////////////////////////////
}
if(!($node = menu_get_object()))
return;
/* $sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic' ORDER BY Фирма"; */
$sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s'".$and." ORDER BY Фирма";
/* $sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic'"; */
$sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s'".$and;
while($row = db_fetch_object($result)){
$header = array('Название по прайсу', 'Мед. компания', 'Цена услуги');
$rows[] = array($row->Название, $row->Фирма, $row->Цена);
}
$output .= theme('pager', NULL, $count_per_page, 0);
print $output;
?>
Мне кажется, с views не получится: нет возможности выбрать не связанную с другими таблицами таблицу БД, в которой хранятся данные; и, соответственно, поля из нее для вывода. Может, конечно, я что-то не понял или понял не так.
Views эти и занимается - выбирает данные из таблиц - весь вопрос в конкретной задаче ?!
Да, я не могу запросить данные из конкретной таблицы. Она находится в той же базе данных.
Из нее надо "вытащить" значения трех столбцов (это, насколько я понял, можно было бы сделать с помощью блока "Поля" в настройках views). Далее, их надо отсортировать: тут я не определился что лучше или надо использовать: в описании сказано, что Аргументы (Arguments) выполняют функции, схожие с Фильтрами. Но использовать и те, и другие я пока не могу, т.к. саму таблицу (вообще ни одну таблицу из базы данных) выбрать не могу. Уже всю справку перечитал...
В процессе обсуждения кода на одном из форумов (phpforum) код несколько преобразовался. Проблема в том, что передача параметра clinic в post осуществляется (выводтся нужный текст после выбора нужной клиники/лаборатории); также осуществляется "фильтарция", если напрямую указать какая лаборатория должна быть выбрана. А вот через данные, которые содержатся в post это осуществить не удается. Единственное предположение, что, возможно, данные в post хранятся в какой-то другой кодировке: таблица в базе данных сохранена в utf-8, сравнение в базе данных - тоже. А передачи - нет.
Views, я конечно, разберу, в любом случае - слишком много в нем возможностей, чтобы упускать его. Но на настоящем этапе решения пока нет - ни views (пока не "сдается"), ни запрос не обрабатывается как нужно.
<?php
/* Проверка на соответствие префикс CH */
$CHfirms = mysql_fetch_assoc($CHcheck);
$count_per_page = 10;
$result = pager_query($sql,$count_per_page, 0, $sql_count, $node->title);
$rows = array();
$output = theme('table', $header, $rows, array());
<form method='post'>
<select name="clinic"> <!--выпадающий список-->
<option value="Клиника1">Клиника2</option>
<option value="Клиника2">Клиника2</option>
<option value="Клиника3">Клиника3</option>
</select>
<input name="Submit" type='submit' value='Отправить'>
</form>
<?
php$and = '';
if (!empty($_POST['clinic']))
{
$clinic=trim($_POST['clinic']);
echo $clinic;
$and = " AND Фирма='$clinic' ";
$CHcheck = mysql_query("SELECT DISTINCT Фирма FROM Таблица WHERE Имя='%s'",$CHdb); // Запрос
print_r($CHfirms);
if(
in_array($clinic, $CHfirms))echo "Найдено соответствие";
else
echo "Не найдено соответствие";
///////////////////////////////////
}
if(!($node = menu_get_object()))
return;
/* $sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic' ORDER BY Фирма"; */
$sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s'".$and." ORDER BY Фирма";
/* $sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic'"; */
$sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s'".$and;
while($row = db_fetch_object($result)){
$header = array('Название по прайсу', 'Мед. компания', 'Цена услуги');
$rows[] = array($row->Название, $row->Фирма, $row->Цена);
}
$output .= theme('pager', NULL, $count_per_page, 0);
print $output;
?>
заголовки разобрался как делать. там же и сортировка может настраиваться. а где указать откуда извлекать данные, т.е. из какой таблицы?
я так понял у вас чисто "своя таблица" никаким боком к друпалу отношения не имеет, тогда юзайте модуль Table Wizard там через конструктор интегрируюете таблицу с views а потом в полях будете выбирать нужные данные.
да, именно так. попробую "волшебника")
чтобы задать соответствие одного поля моей таблицы таблице из БД drupal нужно определить ключ моей таблицы (ключ должен быть тем полем, которое я хочу связать с другими данными)?
AndreyL, при создании view идет выбор "базовой таблицы", user, node, comment и тд вот там должна выбираться "таблица"
ок
Вроде, готово.
Фильтр должен так выглядеть?
Таблица: Столбец1 = Node: title
Т.е. нужно, чтобы показывались записи, в которых Столбец1 содержит данные, совпадающие с названием страницы.
Только еще не понятно где можно указать, на которых страницах этот views должен показываться?
блок нужен? тогда надо указывать аргумент
Таблица: Столбец1 -> Provide default argument -> PHP Code
if (($node = menu_get_object('node')) && !arg(2)) {
return $node->title;
}
не, блок не нужен нужно только сопоставить данные столбца1 и название страницы. вывод - в основной части страницы (content).
и указать в которых типах материалов этот views будет использоваться; пока не отображается нигде.
Таблица: Столбец1 = Node: title - наверное, неправильно написано.
Да, сделал блоком. Но отображается только заголовок.
А еще внизу, под результатом вывода views отображается:
Отчего так? Я такого не писал нигде.