Victor_winner

Новый вид сетки объявлений

Recommended Posts

Здравствуйте форумчане. Продолжаю тему добавления статусов объявлений

Сейчас у меня в Сетке объявлений для клиента набор столбцов изменился (смотрите columns_with_status.png )

Но вот незадача

1. У меня не выводится в колонке статус объявлений сами статусы, а выводятся значения столбца status_of_adv таблицы re_data (0 - означает в продаже).

2. Соответственно не настроена сортировка по этому полю (я тут просветился, что сортировка у нас должна добавляться в файле /template/frontend/agency/main/grid/front_grid_local.php).

3. Также не добавлена сортировка и по следующим полям

 

1. Этаж

2. Общая площадь

3. Номер дома

4. Статус объявления

 

Файл realty_grid_list.tpl сейчас выглядит следующим образом (ealty_grid_list.tpl.png)

Также всё же интересно, как можно подсвечивать объявления с разным статусом разными цветами. 

Мне  пользователь abyshuk подсказал , что можно обойтись средствами шаблона. Как всё же это поподробнее...

post-1749-0-99308800-1389353215_thumb.pn

post-1749-0-78074300-1389354274_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

status_of_adv имеет тип select_by_query? Автоматически приводятся значения для select_box-полей, что бы они отображались не цифрами, а значениями.

 

Уточните, мы говорим о выводе в фронт сайта или в админку? В соседнем топике кажется речь шла именно об админке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рассмотрим ситуацию для шаблона Realty.

 

Перед всеми экспериментами - дампить меняемые файлы. Обязательно.

 

Исходные данные:

1. имеем локальный файл конструктора сеток /template/frontend/realty/main/grid_constructor_local.php

2. Имеем желание править под себя шаблон вывода /template/frontend/realty/realty_grid_list.tpl

 

Предусловия.

Статус может задаваться полем типа select_by_query или select_box.

Для того, что бы что-то вывести, это что-то надо отправить в шаблон.

Для того, что бы как-то выделить конкретный статус, надо как-то отметить строку с объявление, которая владеет этим статусом.

Статус можно отправить либо значение, либо ключем и при определении вида статуса в шаблоне ориентироваться именно на переданное значение.

 

Поехали.

Мы ленивы, но практичны. Полагая, что имена статусов могут меняться (Опубликовано -> Опубл.) в силу разных причин, но ключи будут меняться реже, будем ориентироваться на ключи. Что в select_by_query , что в select_box каждое значение имеет ключ-идентификатор. Обычно это число.

Из запроса данные выбираются именно ключами $grid_item.status_of_adv будет исхдно равно 1,2,0 или еще чему-нибудь.

Приводим к текстовому значению.

 

 /template/frontend/realty/main/grid_constructor_local.php строка 725 добавляем блок

$_model=$data_model->get_kvartira_model(false, true);foreach($_model['data'] as $k=>$v){if($v['type']=='select_box'){if(isset($_model['data'][$k]['select_data'][$ra[$item_id][$k]])){$ra[$item_id][$k]=$_model['data'][$k]['select_data'][$ra[$item_id][$k]];}else{$ra[$item_id][$k]='';}}}

 

Тут ничего необычного. По сути приведение локального конструктора к актуальному виду. Этот блок проходится по модели и все числовые значение элементов типа select_box приводит к их текстовым эквивалентам.

Так как нам нужно еще и числовое значение, для идентификации статуса, то перед этим  блоком делаем запоминание.

if(isset($ra[$item_id]['status_of_adv'])){$ra[$item_id]['_mem_status_of_adv']=$ra[$item_id]['status_of_adv'];}

Теперь в шаблоне получить числовое значение для статуса можно как $grid_item._mem_status_of_adv

а текстовое как $grid_item.status_of_adv

 

Но если у нас не select_box, а select_by_query то чуть віше вставленного блока есть комплект инициализаторов таких полей


if ( $item_array['street_id'] > 0 ) {    $ra[$item_id]['street'] = $data_model->get_string_value_by_id('street', 'street_id', 'name', $item_array['street_id'], true);}

и в таком же духе.

 

Тогда делаем копию одного из них и меняем 

if ( $item_array['status_of_adv'] > 0 ) {$ra[$item_id]['_mem_status_of_adv']=$ra[$item_id]['status_of_adv']; //тут мы тоже запоминаем числовое значение$ra[$item_id]['status_of_adv'] = $data_model->get_string_value_by_id('имя таблицы в которой хранятся статусы', 'имя первичного ключа таблицы статусов', 'поле из таблицы статусов, которое содержит текстовое значение названия статуса', $item_array['status_of_adv'], true);}

Аналогично получаем в шаблоне значения через

$grid_item._mem_status_of_adv и  $grid_item.status_of_adv

 

Теперь идем в шаблон.

Там, где у нас должен быть вывод имени статуса вставляем {$grid_item.status_of_adv}

Далее, в зависимости от разметки. Например вывод строками таблицы в виде 

 

{section name=i loop=$grid_items}

<tr valign="top" class="row3{if $grid_items[i].bold_status==1} grid_table_bold{/if}{if $grid_items[i].premium_status==1} grid_table_premium{/if}" {if $grid_items[i].active == 0}style="color: #ff5a5a;"{/if}>

Делаем

<tr valign="top" class="row3 advstatus{$grid_item[i]._mem_status_of_adv}{if $grid_items[i].bold_status==1} grid_table_bold{/if}{if $grid_items[i].premium_status==1} grid_table_premium{/if}" {if $grid_items[i].active == 0}style="color: #ff5a5a;"{/if}>

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

После этого пишем css правила вида

.advstatus0 {/*стили*/}.advstatus1 {/*стили*/}.advstatus2 {/*стили*/}

такой способ хорош если нужны все статусы или их очень много. Но для малого количества и большей гибкости можно создавать классы более осмысленно

<tr valign="top" class="row3{if $grid_item[i]._mem_status_of_adv==1} usual_adv{elseif $grid_item[i]._mem_status_of_adv==2} extremally_interesting{/if}{$grid_item[i]._mem_status_of_adv}{if $grid_items[i].bold_sta...

Как-то так.

 

Перед всеми экспериментами - дампить меняемые файлы. Обязательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

status_of_adv имеет тип select_by_query? Автоматически приводятся значения для select_box-полей, что бы они отображались не цифрами, а значениями.

 

Уточните, мы говорим о выводе в фронт сайта или в админку? В соседнем топике кажется речь шла именно об админке.

Дело в том, что когда создавал колонку status_of_adv, я использовал сначала методику добавления колонки через админку. Создал колонку типа select-box, и добавил значения  в неё - {0~~в продаже}{1~~бронировано}{2~~в архиве}. 

Но чтоб её, не получилось так добавить (Дмитрий предположил, что не хватает прав, для добавления столбца). Тогда пришлось действовать через phpmyadmin, в котором создал колонку следующим запросом:

alter table re_data add column status_of_adv int(11) not null default 0;

Но вот как хранятся значения {0~~в продаже}{1~~бронировано}{2~~в архиве}. - я не совсем понял, так как они проинициированы числа, а какое число за какой статус отвечает, я в таблице нигде не писал (это ведь не тип данных enum).

 

status_of_adv имеет тип select_by_query? Автоматически приводятся значения для select_box-полей, что бы они отображались не цифрами, а значениями.

 

Уточните, мы говорим о выводе в фронт сайта или в админку? В соседнем топике кажется речь шла именно об админке.

 

 

Говорим про фронт сайта, так как меня интересует именно как будет видеть клиент и риелтор объявления. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Но вот как хранятся значения {0~~в продаже}{1~~бронировано}{2~~в архиве}. - я не совсем понял, так как они проинициированы числа, а какое число за какой статус отвечает, я в таблице нигде не писал (это ведь не тип данных enum).

 

 

Для обработчика важно именно то, под каким типом поле указано в редакторе форм - select_box или select_by_query. Именно от этого он отталкивается при выборе способа переведения значения из ключа в текстовое представление.

Но если это select_box , то набор допустимых значений вы указываете в редакторе флрм в форме правки данного поля в поле @Набор опций выбора в формате пар {key~~value}@

 

 

Дмитрий предположил, что не хватает прав, для добавления столбца

 

А после того, как создали колонку запросом к БД, она физически появилась в таблице data?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Продолжаю тему. Пользователь abushyk, я добавил  код

if(isset($ra[$item_id]['status_of_adv'])){$ra[$item_id]['_mem_status_of_adv']=$ra[$item_id]['status_of_adv'];}
$_model=$data_model->get_kvartira_model(false, true);foreach($_model['data'] as $k=>$v){if($v['type']=='select_box'){ if(isset($_model['data'][$k]['select_data'][$ra[$item_id][$k]])) {  $ra[$item_id][$k]=$_model['data'][$k]['select_data'][$ra[$item_id][$k]]; }else{ $ra[$item_id][$k]='';}}}

в файл /template/frontend/realty/main/grid_constructor_local.php строка 725. Получился вот такой код

if(isset($prepared_textchains[$item_array['topic_id']])){				$ra[$item_id]['topic_array']=$prepared_textchains[$item_array['topic_id']];			}elseif(isset($textchains[$item_array['topic_id']])){				$topics=explode('|', $textchains[$item_array['topic_id']]);				if(!empty($topics)){					$topics_array=array();					foreach($topics as $tp)					{						$strlen = mb_strlen($tp, SITE_ENCODING);						$firstChar = mb_substr($tp, 0, 1, SITE_ENCODING);												//------------- VICTOR 1-------------						if(isset($ra[$item_id]['status_of_adv']))						{							$ra[$item_id]['_mem_status_of_adv']=$ra[$item_id]['status_of_adv'];						}												//------------- VICTOR 1-------------												//------------- VICTOR 2-------------						$_model=$data_model->get_kvartira_model(false, true);						foreach($_model['data'] as $k=>$v)						{							if($v['type']=='select_box')							{								if(isset($_model['data'][$k]['select_data'][$ra[$item_id][$k]]))								{									$ra[$item_id][$k]=$_model['data'][$k]['select_data'][$ra[$item_id][$k]];								}									else								{									$ra[$item_id][$k]='';								}							}						}												//------------- VICTOR 2-------------																		$then = mb_substr($tp, 1, $strlen - 1, SITE_ENCODING);						$topics_array[]=mb_strtoupper($firstChar, SITE_ENCODING) . $then;					}					$ra[$item_id]['topic_array']=$topics_array;					$prepared_textchains[$item_array['topic_id']]=$topics_array;				}else{					$ra[$item_id]['topic_array']=array();				}			}

Затем добавил вывод столбца статус-объявления в файл realty_grid_list.tpl следующий код

<tr valign="top" class="row3{if $grid_item[i]._mem_status_of_adv==0} in_sale_adv{elseif $grid_item[i]._mem_status_of_adv==1} bron_adv {elseif $grid_item[i]._mem_status_of_adv==2} archive_adv {/if}" {if $grid_items[i].active == 0}style="color: #00ffff;"{/if}>				<td>		{if isset($smarty.session.favorites)}			{if in_array($grid_items[i].id,$smarty.session.favorites)}				<a class="remove_from_favorites" alt="{$grid_items[i].id}" title="{$L_DELETEFROMFAVORITES}" href="#remove_from_favorites"></a>			{else}				<a class="add_to_favorites" alt="{$grid_items[i].id}" title="{$L_ADDTOFAVORITES}" href="#add_to_favorites"></a>			{/if}		{/if}		</td>		<td{if $admin == ''}  onClick="document.location='{$grid_items[i].href}'" {/if}><b><a href="{$grid_items[i].href}">{$grid_items[i].room_count}</a></b></td>		<td{if $admin == ''}  onClick="document.location='{$grid_items[i].href}'" {/if}><b><a href="{$grid_items[i].href}">{$grid_items[i].street}</a></b></td>						<td{if $admin == ''}  onClick="document.location='{$grid_items[i].href}'" {/if}><b>{$grid_items[i].number}</b></td>		<td{if $admin == ''}  onClick="document.location='{$grid_items[i].href}'" {/if}>{$grid_items[i].floor}</td>		<td{if $admin == ''}  onClick="document.location='{$grid_items[i].href}'" {/if}>{$grid_items[i].square_all}</td>		<td{if $admin == ''}  onClick="document.location='{$grid_items[i].href}'" {/if} nowrap><b>{$grid_items[i].price|number_format:0:",":" "} {if $grid_items[i].currency_name != ''}{$grid_items[i].currency_name}{/if}</b></td>		<!--VICTOR 4 статус объявления-->		<td{if $admin == ''}  onClick="document.location='{$grid_items[i].href}'" {/if}>{$grid_item[i].status_of_adv}</td>

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

 

Стили добавлял в файле realty_grid_list.tpl

<style type="text/css">		.in_sale_adv 		{ 			color: #00ffff ;		}				.bron_adv 		{ 			color: #ffa500;		}				.archive_adv		{ 			color:  #f0f;		}		</style>

post-1749-0-59342200-1389695909_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У нас либо разная нумерация строк в редакторах файлов, либо отличаются /template/frontend/realty/main/grid_constructor_local.php.

 

Вы почти попали в нужное место.

Все, что вы ставили, нужно перенести ниже. Идете от этого места, которое вы выклали в посте, вниз до встречи с 

$params['topic_id'] = $item_array['topic_id'];

И перед этой строкой перевставьте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сделал, как Вы сказали. Всё равно эффекта ноль. Нужно ещё просмотреть, может неправильно в файле realty_grid_list.tp неправильно вставлена переменная $grid_item.status_of_adv. Да, а что насчёт стилей? Они тоже не применяются. Да и вставлять я так понимаю, их нужно не в файл realty_grid_list.tpl, а в какой то файл css. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Куда вставлять - не суть важно. Главное что бы они были в поле видимости скрипта.

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

 

Если дадите доступ на фтп и в админку - можно будет взглянуть изнутри.

 

И я не помню, давали ли вы ссылку на сайт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

предлагаю все это перенести в тему уроки! и прикрепить файлы ( которые пользователь) сможет скачать и посмотреть. Все изменения в файле отметить красным цветом или комментарием)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пользователь abyshuk, спасибо. Я исправил опечатку. Теперь выводится статус, Но вот выделение разным цветом объявлений с разным статусом всё равно не происходит.

 

А вот вопрос на засыпку, как добавить сортировку для статуса (нажимаю на стрелочки сортировки), и получаю следующую абра-кодабру

 

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'asc' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'asc LIMIT 0, 5' at line 1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'asc LIMIT 0, 20' at line 1
 
То есть сортировка по данному полю не добавлена. А как её добавлять. Тем более , что та же ситуация с полями - номер дома, общая площадь. Сортировка не задана. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Но вот выделение разным цветом объявлений с разным статусом всё равно не происходит.

 

 

Тут смотрите по стилям. Применение стиля к элементу tr таблицы не есть гут - они плохо применяются. Обычно применяют к td. Например tr.someclass td {}

 

 

Свои сортировки можно добавить в /template/frontend/realty/main/grid_constructor_local.php строка 444. Тут начинается блок разбора сортировки.

Тут перечислены стандартные.

if     ( $params['order'] == 'type' ) $order = 'type_sh ';elseif ( $params['order'] == 'street' ) $order = 're_street.name ';elseif ( $params['order'] == 'district' ) $order = 're_district.name ';elseif ( $params['order'] == 'metro' ) $order = 're_metro.name ';elseif ( $params['order'] == 'city' ) $order = 're_city.name ';elseif ( $params['order'] == 'date_added' ) $order = 're_data.date_added ';elseif ( $params['order'] == 'price' ){$order = 'price ';}

Если нужно добавить свои - после последей скобки добавляем

....$order = 'price ';}elseif($params['order'] == 'number'){    $order = 're_data.number ';}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для сортировки дописал 

elseif ( $params['order'] == 'status_of_adv' ){ $order = 're_data.status_of_adv ';elseif ( $params['order'] == 'number' ){ $order = 're_data.number ';  	}...

но сортировка все равно не пошла. Дмитрий говорил, что нужно править в области кода

if(isset($params['order']) && $params['order']!='' && in_array($params['order'], $grid_head_ids)){

и вставлять свои сортировки. Но подскажите как всё же это делать. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

но сортировка все равно не пошла. Дмитрий говорил, что нужно править в области кода и вставлять свои сортировки. Но подскажите как всё же это делать. 

 

 

А вы разве используете пользовательские сетки выввода? Кажется вы на стандартной работаете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Либо не туда вставили, либо уже вытерли.

Поправил. Нашел, что выдавало ошибку. Вы давно обновлялись?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Abushuk, спасибо. Всё работает. А как сделать, чтобы объявления, которые имеют статус "в архиве", не показывались на сайте, и их мог видеть только администратор или риелтор. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас