Вопрос о расширении стандартной таксономии

Главные вкладки

Аватар пользователя Владимир Ситников Владимир Ситников 22 августа 2006 в 8:00

Здравствуйте, уважаемые.
Довольно долго присматриваюсь к Дрюпалу, нравится многое, в том числе и идея таксономии (вернее классификация материалов с ее помощью). Сейчас появилась задача: сделать сайт Агентства Недвижимости. Стоит задача: классифицировать продаваемые квартиры по некой совокупности критериев:
1. Число комнат в квартире (1,2,3,4 и т.д.)
2. Район, где расположена квартира (советский р-он, железнодорожный р-он и т.д.)
3. Материал стен (несколько видов)
4. Цена квартиры – ВОТ здесь я не понял что делать.

Например, надо вывести 1комнатные квартиры в любом р-не с конкретным материалом стен (с этим как я понимаю, справится и стандартная таксономия) и с ценой меньше 100000 долларов. А вот здесь, что делать? Мне кажется, одним из вариантов было бы введение в категории таксономии цифровой категории с возможностью при выводе информации организовать операции сравнения (больше меньше) . Т.е. новая категория Цена (например) если ее значение больше какого-то числа, то выводим, если меньше не выводим.
Если задать число комнат в квартире как родительский элемент, то можно было бы при нажатии на кнопку меню «1комнатные квартиры» получать подменю: сортировка по цене, районам, материалу стен и т.д.
Можно было бы выводить контекстную рекламу: рассматривает человек, какую то конкретную квартиру, а рядом выводится список квартир максимально похожих на рассматриваемую и т.д.

Вопрос: Делал ли кто-либо сайты Недвижимости на Дрюпале и как там делалась сортировка и вывод информации?

Комментарии

Аватар пользователя Dan Dan 22 августа 2006 в 10:14

Что-то мне подсказывает, что тебе поможет вездесущий Views Smile
Есть на форуме у нас девушка, она тебе точно скажет. Угадаешь её имя? Wink

Аватар пользователя dyp@drupal.org dyp@drupal.org 22 августа 2006 в 14:42

мне увжется еще в сочетании с вздесужим cck, можно будет сделать цифровое поле цена, и потом по его значению делать отбор через views

Аватар пользователя Владимир Ситников Владимир Ситников 22 августа 2006 в 16:13

Девушку, как мне кажется, зовут Натали Smile
Дорогие друзья, неужели никто из вас не делал сайт по недвижимости? Может, те вопросы, которые я задаю давно уже решены?

Аватар пользователя Natalie Natalie 22 августа 2006 в 16:54

Vadbars, кажется, делал сайт по недвижимости, но я его здесь не вижу Smile
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Dan Dan 22 августа 2006 в 17:08

Только что сделал в ССК тип квартира с приведёнными здесь полями.
Настроил Views, в фильтры добавил поле "Integer: Стоимость" (поле, созданное в ССК), но для этого поля присутствуют только два оператора: "is equal to" и "is not equal to". А нам надо "more than" (или less). Как быть?

Аватар пользователя Dan Dan 22 августа 2006 в 17:24

Нет, думаю это надо делать на стороне Views, а не ССК.
Я себе это так представляю:
- человек заполняет некую форму с полями: Число комнат, Район, Материал стен, Цена квартиры.
- затем форма вызывает наш вид с параметрами-аргументами, например так: /flat/1/center/iron/100/200, где
flat - вид
1 - кол-во комнат
center - рай-он
iron - материал
100 - нижняя граница цены
200 - верхняя граница цены

Всё понятно, кроме цены - как выбрать диапазон?

Аватар пользователя Владимир Ситников Владимир Ситников 22 августа 2006 в 18:05

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

Аватар пользователя Dan Dan 22 августа 2006 в 18:33

у меня в файле cck/number.module
есть следующие строчки:
<?php
case 'filter operators':
return array(
'=' => t('is equal to'),
'!=' => t('is not equal to'),
// TODO: views.module seems to break anything with > or < in it.
// '>' => t('is greater than'),
// '<' => t('is less than'),
// '>=' => t('is greater than or equal to'),
// '<=' => t('is less than or equal to'),
?>
может это TODO уже сделали (я давно модули не обновлял).

Аватар пользователя Natalie Natalie 22 августа 2006 в 18:34

а почему нет? Можно сделать так, чтобы это поле равнялось 1, если цена больше или равно определенной сумме, и 0, если меньше. Потом через фильтры выводим только те материалы, у которых это поле равно 1. Само поле скрываем для пользователей через шаблоны.

Если вы хотите, чтобы пользователь сам выбирал, тогда можно сделать полей несколько и назвать соответственно, чтобы было понятно.
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Dan Dan 22 августа 2006 в 18:42

Так, строчки я расскоментировал - всё работает.
Теперь вопрос в другом - как взять из аргументов ( /flat/1/center/iron/100/200) и отправить в фильтры?

Natalie, ничего не понял Sad
Какое "это поле"?
Когда вычислять больше меньше определённой цены?

Аватар пользователя Natalie Natalie 22 августа 2006 в 18:45

Ну если работает тогда проехали Smile С аргументами я сама не разобралась.
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Dan Dan 22 августа 2006 в 20:21

Алгоритм работы понятен. Осталось код написать. Что не выходит пока чаша Smile

Видится мне это так.
1. Имеем вид. Самое главное, что в нём это фильтры, а именно:
"Node: Type" - тип материала, что создали в ССК;
"Integer: Количество комнат (field_room_num)" - оттуда же, оператор у него "is equal to" и "value" = 1;
"Integer: Стоимость ($) (field_cost)", оператор - "is greater than or equal to", "value" = 0;
"Integer: Стоимость ($) (field_cost)", оператор - "is less than or equal to", "value" = 99999999;
2. Делаем экспорт и смотрим структуру вида.
3. Теперь надо в "Argument Code" вставить код, который будет брать из пути (/1/100/200 - только кол-во комнат и мин/макс цены, для простоты) аргументы и менять параметры, что мы задали в настройках вида.

Я вставил следующий код:
<?php
// 1/100/200,
foreach ($view->filter as $filter) {
if($filter->tablename == 'node_data_field_room_num')
$filter->value = $args[0];
if($filter->tablename == 'node_data_field_cost')
{
if($filter->operator == '>=')
$filter->value = $args[1];
if($filter->operator == '<=')
$filter->value = $args[2];
}
}
return $args;
?>
Что-то не пашет. Надо всё-таки заняться изучением PHP Smile

Аватар пользователя Natalie Natalie 22 августа 2006 в 20:23

Можно пока просто сделать поле integer для цены, а потом вывести фильтр цена больше или равна значению. Если мы хотим позволить пользователям самим отфильтровывать результаты, то делаем его expose.
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Dan Dan 22 августа 2006 в 20:40

Можно и так, но:
1. не кошерно
2. глючат они (у меня по крайней мере)
3. пора бы уже и с аргументами научиться работать Smile

Аватар пользователя Dan Dan 22 августа 2006 в 20:45

Вопрос к знающим PHP.
есть массив $view->filter:
<?php
$view->filter = array (
array (
'tablename' => 'node',
'field' => 'type',
'operator' => 'OR',
'options' => '',
'value' => array ( 0 => 'content-flour', ),
),
array (
'tablename' => 'node_data_field_room_num',
'field' => 'field_room_num_value',
'operator' => '=',
'options' => '',
'value' => '1',
),
array (
'tablename' => 'node_data_field_cost',
'field' => 'field_cost_value',
'operator' => '>=',
'options' => '',
'value' => '0',
),
array (
'tablename' => 'node_data_field_cost',
'field' => 'field_cost_value',
'operator' => '<=',
'options' => '',
'value' => '300000',
),
);
?>
надо в подмассиве
<?php
array (
'tablename' => 'node_data_field_room_num',
'field' => 'field_room_num_value',
'operator' => '=',
'options' => '',
'value' => '1',
),
?>
вместо value=1 сделать value=100
как?

Аватар пользователя Natalie Natalie 22 августа 2006 в 20:52

Почему не кошерно, если мы хотим позволить пользователям самим выбирать?
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Dan Dan 22 августа 2006 в 21:11

Лень объяснять, прости. Просто "мне так видится" Smile Да пользователь дожен сам вводить, но по другому. Это моё мнение, но я не хочу спорить. Меня больше волнует решение проблемы.

Аватар пользователя mouse mouse (не проверено) 23 августа 2006 в 7:46

foreach работает с копией массива. попробуй так:

<?php
// 1/100/200,
reset($view->filter);
while (list($key, $val) = each($view->filter)) {
  if($val->tablename == 'node_data_field_room_num')
    $view->filter[$key]->value = $args[0];
  if($val->tablename == 'node_data_field_cost')
  {
    if($val->operator == '>=')
      $view->filter[$key]->value = $args[1];
    if($filter->operator == '<=')
      $view->filter[$key]->value = $args[2];
  }
}
return $args;
?>
Аватар пользователя Dan Dan 23 августа 2006 в 16:39

Ух ты! Не знал, что foreach работает с копией, спасибо!
(...пора уже всерьёз заняться PHP...)

Но всё равно не работает. Такое впечатление, что эти фильтры потом переопределяются...

Ну ничего, мы ещё потрепыхаемся... Smile

Аватар пользователя Natalie Natalie 23 августа 2006 в 17:46

Dan, а может, у автора спросить? Он вроде должен лучше знать Smile
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Natalie Natalie 30 августа 2006 в 20:00

Ну выложи хотя бы результаты что ли Smile
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя kiev1 kiev1 18 января 2007 в 13:11

где-то был сайт по поиску квартир - на друпале views - подскажите ссылочку пожалуйста - не могу найти

Аватар пользователя vadbars@drupal.org vadbars@drupal.org 18 января 2007 в 15:38

Если про мой идет разговор - то вот: http://novostroyka-ru.ru
Только я уже не помню, был у меня там отбор по стоимости или нет Smile Кажется нет, просто сортировка по стоимости.

p.s. Dan, а где же обещанное описание победы над фильтрами? Smile