Страница 1 из 1

Автоматическое "причесывание" адресов недвижимости

СообщениеДобавлено: 01 дек 2014, 20:41
psdich
Здравствуйте
Задался вопросом автоматизировать процесс причесывания адресов недвижимости в объявлениях.
написал небольшую функцию в mysql для преобразования адреса недвижимости(назовем ее к примеру beauty_address(text))
Хотел внедрить ее при сохранении объявления или просмотре объявлений, но не получилось :(
в коде натыкаюсь на такую строчку
Код: Выделить всё
$data->getStrByLang('address') 
(\themes\classic\views\modules\apartments\views\_tab_general.php), но не могу понять откуда переменная $data берет информацию из БД. *WALL*
Подскажите, пожалуйста, где в коде можно внедрить mysql функцию, чтобы сохранить преобразованный адрес в бд или преобразовывать адрес с помощью все той же функции при отображении объявлений?

P.S. в php не силен

Re: Автоматическое "причесывание" адресов недвижимости

СообщениеДобавлено: 03 дек 2014, 15:42
Foton
Опишите подробнее как именно работает Ваша функция, чтобы было проще вам помочь.

Re: Автоматическое "причесывание" адресов недвижимости

СообщениеДобавлено: 03 дек 2014, 21:39
psdich
Код: Выделить всё
CREATE DEFINER=`root`@`localhost` FUNCTION `beAd`(`adr` TEXT) RETURNS text CHARSET utf8
    NO SQL
begin
-- beaty ardes
Declare ba text
;
set ba =upper(adr);

set ba = replace(ba,"Д."," ");
set ba = replace(ba,"."," ");
set ba = replace(ba,","," ");
set ba = replace(ba,"УЛ "," ");
set ba = replace(ba,"УЛИЦА"," ");
set ba = replace(ba,"ПР-КТ","ПР");

set ba = replace(ba,"  "," ");
set ba = trim(ba);


return ba;
end


удаляет сокращения, делает заглавные буквы
В принципе уже решил данный вопрос, в паре мест добавил добавил код

Re: Автоматическое "причесывание" адресов недвижимости

СообщениеДобавлено: 04 дек 2014, 16:07
Foton
Было бы неплохо, если бы вы подробно описали решение, наверняка кому то пригодится

Re: Автоматическое "причесывание" адресов недвижимости

СообщениеДобавлено: 04 дек 2014, 19:17
Xpycm
Чем метод afterFind в модели не походит для этих целей?
https://www.google.ru/search?q=afterFind+yii

На мой взгляд куда нагляднее и упрощает поддержку программистам, нежели добавление функции в mySQL, о которой в будущем можно и не вспомнить или банально не знать.

Re: Автоматическое "причесывание" адресов недвижимости

СообщениеДобавлено: 05 дек 2014, 21:33
psdich
Чем метод afterFind в модели не походит для этих целей?

с методом afterFind не был знаком, с php и yii так же все плохо у меня
Было желание сделать функцию в БД и время от времени дорабатывать код, не трогая сайт

Было бы неплохо, если бы вы подробно описали решение, наверняка кому то пригодится

Я реализовал вариант когда в БД хранится адрес именно тот, что указал пользователь, а при просмотре на сайте из БД уже вываливается обработанный адрес с помощью SQL функции.

чтобы функция применялась к листу объявлений в виде списка на главной странице да и на других страницах где есть этот лист,
то в файле \themes\classic\views\modules\apartments\views\widgetApartments_list.php
перед кодом
Код: Выделить всё
            $dataProvider = new CActiveDataProvider('Apartment', array(
                'criteria'=>$criteria,
                'pagination'=>false,
            )); 


указываем такой код, чтобы явно указать выбираемые поля и подменить поле address_ru на функцию с обработкой(нужно составить полный список полей таблицы apartment, т.к. могут быть отличия если используете несколько языков на сайте)
Код: Выделить всё
  $criteria->select = 'id, type, obj_type_id, loc_country, loc_region, loc_city, city_id, visits, date_updated, date_created,
 date_end_activity, activity_always, is_price_poa, price, price_to, num_of_rooms, floor, floor_total, square, land_square, window_to,
 title_ru, description_ru, description_near_ru, living_conditions, services, 
bead(address_ru) as address_ru, 
berths, active, lat, lng, rating, date_up_search, is_special_offer, is_free_to, price_type, sorter, owner_active, owner_id, exchange_to_ru, 
note, phone, autoVKPostId, autoFBPostId, autoTwitterPostId'
; 


чтобы адрес менялся в самом объявлении, то правим файл \protected\modules\apartments\controllers\MainController.php
в коде
Код: Выделить всё
        if($id) {
            $apartment = Apartment::model()->with(array('windowTo', 'objType', 'city'))->findByPk($id);
        } 


добавляем строчки, чтобы получилось так
Код: Выделить всё
        if($id) {
            $apartment = Apartment::model()->with(array('windowTo', 'objType', 'city'))->findByPk($id);          
                   $tmp 
= Apartment::model()->findByPk($id, array('select' => 'bead(address_'.Yii::app()->language.') as address_'.Yii::app()->language));        
            $apartment
->address_ru = $tmp->getStrByLang('address');            
                
}