XTRO

Участники
  • Публикации

    1039
  • Зарегистрирован

  • Посещение

  • Days Won

    59

Изменения репутации

  1. Like
    XTRO получил репутацию от Realtor в А функция подписи фотографий...   
    в 5 посту разжёвано уже до нельзя, зачем в код лезть? Так и появляется мнение, что dev принуждают стать пользователя программером.
  2. Like
    XTRO изменил репутацию Дмитрий Кондин в Модуль защиты от DDOS-атак   
    DDOS - надо решать на уровне провайдера. 
    Серьезный DDOS - не атакует обычные порты HTTP, там все на низком уровне TCP, поэтому заморачиваться таким для нашей cms нет смысла.
  3. Like
    XTRO изменил репутацию abushyk в [HOWTO] Локальный grid_manager   
    Центральным местом, которое в 90% случаев обрабатывает запросы на извлечение нескольких записей-объявлений (всякого рода сетки-списки, в том числе и спецпредложениях в боковых колонках и забор данных для нанесения на карту), является файл /apps/system/lib/frontend/grid/grid_constructor.php - или Конструктор списка (КС).
    В нем много разного функционала, но самый часто востребованный лежит в двух функциях transformGridData - подготовка данных к выводу и prepareRequestParams - обработка параметров поиска.
    prepareRequestParams выполняет все операции связанные с тем, что бы превратить фильровочные переменные запроса, переданные в Конструктор списка, в части запроса к БД. Она имеет встроенную обработку некоторого числа параметров, но для расширения функционала иногда необходимо добавить свои. prepareRequestParams  НЕ обрабатывает параметры запроса прямо из строки браузера. Все параметры с веб-интерфейса перехватываются отдельной функцией, нормализуются и только тогда передаются в prepareRequestParams.
    transformGridData адаптирует результат выборки из БД к удобоваримому виду. Поскольку результатом выборки списка являются строки из БД, то именно эта функция трансформирует значения указанные ключем, например поля select_box и select_by_query  в текстовые значения. Эта функция так же умеет обрабатывать сама некоторые "стандартные" поля, например географические - country_id, region_id,... street_id, currency_id и все поля типа select_box. "Превращение" в текст остальные ссылочных полей необходимо реализовывать самому
    Как создать для шаблона локальный Grid_manager
    1. Переопределением метода в шаблоне (ручное) - устаревший
    В файле /template/frontend/имя_вашего_шаблона/main/main.php смотрим, есть ли функция __construct(). Если нет, то создаем ее внутри декларации class frontend_main extends SiteBill_Krascap {} в виде 
    public function __construct(){ parent::__construct(); require SITEBILL_DOCUMENT_ROOT.'/template/frontend/'.$this->getConfigValue('theme').'/main/grid/local_grid_constructor.php'; $this->_setGridConstructor(new Local_Grid_Constructor()); } 2. Переопределением метода в шаблоне (автоматическое) - устаревший
    В файле /settings.php.ini добавляем секцию описания локального Конструктора списков
    [GridConstructor] path='/main/grid/local_grid_constructor.php' name='Local_Grid_Constructor' Первая строка - имя секции
    вторая - путь к файлу локального Конструктора списка от корня шаблона
    третья - задекларированное имя класса локального Конструктора списка
    3. Настроечное переопределение - используйте, по возможности, именно этот вариант локализации
    Указываем в Настройки  - Общее галочку Использовать локальный Конструктор списка (classic_local_grid)
    Отличие последнего метода от остальных в том, что в нем имя класса конструктора и имя файла в котором он расположен должны быть соответственно Local_Grid_Constructor и template/frontend/имя_шаблона/grid/local_grid_constructor.php и никакими иначе.
    =============================================================================================
    Одним из этих способов мы указываем шаблону, что нужно использовать для построения списков наш измененный Конструктор списков. Но теперь нам необходимо создать его.
    Для этого нам нужно создать файл по адресу указанному в require_once для первого способа, в path для второго и в /template/frontend/имя_шаблона/grid/local_grid_constructor.php для третьего.
    Базовое наполнение этого файла будет иметь вид:
    class Local_Grid_Constructor extends Grid_Constructor { } Уже после этого локальный КС будет работать, но так как он пока пуст, то он просто, как транслятор, будет передавать заказы в стандартный КС. Для того, что бы добавить что-то свое, нам нужно внести в него изменения.
    1. Добавляем подхват текстового значения для поля типа select_by_query
    Поскольку это операция трансформации из ключевого значения в текстовое, то нам понадобится функция transformGridData . Так как остальные параметры нам нужны и мы просто хотим добавить своего, то мы делаем свою функцию с вызовом родительской
    public function transformGridData($ra, $_collect_user_info=false){ $data=parent::transformGridData($ra, $_collect_user_info);/*используем "стандартный" вызов для выполнения привычных действий*/ /*тут мы можем сделать что-то свое с данными*/ return $data; /*возвращаемся в текущий процесс исполнения*/ } Итак у нас в объявлении есть поле station_id связывающее объект с некоторой станцией из внешней таблицы station в которой станции разложены по строкам вида station_id, name. Так как в данных объявления при выборке мы имеем только ключ станции, а хотим получить именно ее имя и штатный трансформатор за нас этого не делает, то мы проиводим следующее
    foreach($data as $k=>$d){ if ( $d['station_id'] > 0 ) { $data[$k]['station'] = $data_model->get_string_value_by_id('station', 'station_id', 'name', $d['station_id'], true); }else{ $data[$k]['station']=''; } } Либо
    $station_ids=array(); foreach($data as $k=>$d){ $station_ids[intval($d['station_id'])]=intval($d['station_id']); } if(!empty($station_ids)){ $DBC=DBC::getInstance(); $query='SELECT `station_id`, `name` FROM '.DB_PREFIX.'_station WHERE station_id IN ('.implode(',', $station_ids).')'; $stmt=$DBC->query($query); if($stmt){ while($ar=$DBC->fetch($stmt)){ $station_ids[$ar['station_id']]=$ar['name']; } } } foreach($data as $k=>$d){ if(isset($station_ids[intval($d['station_id'])])){ $data[$k]['station']=$station_ids[intval($d['station_id'])]; }else{ $data[$k]['station']=''; } } первый способ короче, но второй на больших количествах записей более продуктивен и более удобен, если нужно получить сложные названия текстового значения, например сцепить с названием станции еще и какой-то другой признак из свойств самой станции.
    Для select_by_query второй вложенности, например если нужно получить имя застройщика, которое является свойством объекта ЖК, с которым связан объект, первый вариант уже не проходит. Т.е. использовать его конечно можно, но количество дополнительных действий сразу перекрывает сложность второго способа. Поэтому используем сразу второй.
    $complex_ids=array(); foreach($data as $k=>$d){ $complex_ids[intval($d['complex_id'])]=intval($d['complex_id']); } if(!empty($complex_ids)){ $DBC=DBC::getInstance(); $query='SELECT d.`name`, c.`complex_id` FROM '.DB_PREFIX.'_complex c LEFT JOIN '.DB_PREFIX.'_developer d USING (developer_id) WHERE complex_id IN ('.implode(',', $complex_ids).')'; $stmt=$DBC->query($query); if($stmt){ while($ar=$DBC->fetch($stmt)){ $complex_ids[$ar['complex_id']]=$ar['name']; } } } foreach($data as $k=>$d){ if(isset($complex_ids[intval($d['complex_id'])])){ $data[$k]['developer']=$complex_ids[intval($d['complex_id'])]; }else{ $data[$k]['developer']=''; } } Очевидно, что принцип схожий и разница заключается только в мелочах вроде запроса на выборку связанного объекта. При чем, в зависимости от сложности желаемого к получению текстового значения будет меняться и сложность запроса, которая запросто может распасться на несколько.
    В итоге наш локальный КС будет выглядеть таким образом:
    <?php class Local_Grid_Constructor extends Grid_Constructor { public function transformGridData($ra, $_collect_user_info=false){ $data=parent::transformGridData($ra, $_collect_user_info);/*используем "стандартный" вызов для выполнения привычных действий*/ /*тут мы можем сделать что-то свое с данными*/ $complex_ids=array(); foreach($data as $k=>$d){ $complex_ids[intval($d['complex_id'])]=intval($d['complex_id']); } if(!empty($complex_ids)){ $DBC=DBC::getInstance(); $query='SELECT `complex_id` FROM '.DB_PREFIX.'_complex WHERE complex_id IN ('.implode(',', $station_ids).')'; $query='SELECT d.`name`, c.`complex_id` FROM '.DB_PREFIX.'_complex c LEFT JOIN '.DB_PREFIX.'_developer d USING (developer_id) WHERE complex_id IN ('.implode(',', $complex_ids).')'; $stmt=$DBC->query($query); if($stmt){ while($ar=$DBC->fetch($stmt)){ $complex_ids[$ar['complex_id']]=$ar['name']; } } } foreach($data as $k=>$d){ if(isset($complex_ids[intval($d['complex_id'])])){ $data[$k]['developer']=$station_ids[intval($d['complex_id'])]; }else{ $data[$k]['developer']=''; } } return $data; /*возвращаемся в текущий процесс исполнения*/ } } 2. Получаем дату в красивом формате
    Иногда нужно подготовить дату под вывод, что бы не мучаться с однотипными действиями в каждом шаблоне. Например подготовим дату добавления в виде "12 ноябра 2013 года".
    public function transformGridData($ra, $_collect_user_info=false){ $data=parent::transformGridData($ra, $_collect_user_info); $months=array( '1'=>'января', '2'=>'февраля', '3'=>'марта', '4'=>'апреля', '5'=>'мая', '6'=>'июня', '7'=>'июля', '8'=>'августа', '9'=>'сентября', '10'=>'октября', '11'=>'ноября', '12'=>'декабря', ); foreach($data as $k=>$d){ $month=date('n', $d['date_added']); $data[$k]['pretty_date']=date('j', $d['date_added']).' '.$months[date('n', $d['date_added'])].' '.$months[date('Y', $d['date_added'])]; } return $data; } и в поле pretty_date в шаблоне у нас будет искомая строка
    3. День добавления
    Подготовим дату добавления, что бы она показывала было ли добавлено объявление сегодня, вчера или в другой день.
    public function transformGridData($ra, $_collect_user_info=false){ $data=parent::transformGridData($ra, $_collect_user_info); $now=date('dmY'); $yesterday=date('dmY', time()-24*3600); foreach($data as $k=>$d){ if($now==date('dmY', strtotime($d['date_added']))){ $data[$k]['pretty_adddate']='сегодня'; }elseif($yesterday==date('dmY', strtotime($d['date_added']))){ $data[$k]['pretty_adddate']='вчера'; }else{ $data[$k]['pretty_adddate']=date('d.m.Y', strtotime($d['date_added'])); } } return $data; } Этот вариант можно скомбинировать с предыдущим.
    4. Форматирование адресной строки
    Форматируем строку адреса для списка вида "Нижний Тагил (Заводской), Лермонтова, 12" [Город (Район), Улица, Дом]
    protected function transformGridData($ra, $_collect_user_info=false){ $data=parent::transformGridData($ra, $_collect_user_info); foreach($data as $k=>$d){ $addrline=array(); if($d['city']!=''){ if($d['district']!=''){ $addrline[]=$d['city'].' ('.$d['district'].')'; }else{ $addrline[]=$d['city']; } } if($d['street']!=''){ $addrline[]=$d['street']; if($d['number']!=''){ $addrline[]=$d['number']; } } if(!empty($addrline)){ $data[$k]['pretty_address']=implode(', ', $addrline); }else{ $data[$k]['pretty_address']=''; } } return $data; }  
  4. Like
    XTRO получил репутацию от Дмитрий Кондин в Перенос сайта на другой домен   
    нет. Если это для кого-то, зависит от того, захотите ли дарить свой ключ, мало ли у вас максимальная ))) А, быть может, вы поставите им демо вариант. Я же не экстрасенс )) Если для себя - ключ тот же.   Подробно о лицензиях.
    название БД - в конфиге, а вам надо работать тогда с таблицами. Если опыта нет - лучше сделайте клон проекта и на нём уже или экспереминтируйте с любым инструментом БД (что будет быстрее) или используйте привычную админку, что для вас будет не быстрее, но намного проще (как совет) . Опять таки уровень вашей подготовки и желание по изучению - неизвестно.
    + есть поиск по форуму с +/-  аналогичными вопросами , если прочитать - вопросов не остается ))
  5. Like
    XTRO получил репутацию от Дмитрий Кондин в Готовый SEO .htaccess   
    если используете файловый менеджер из CPanel , то необходимо включиь галочку для отображения таких файлов.
     

  6. Like
    XTRO изменил репутацию Realtor в Как скрыть админов на сайте   
    Разработчикам написать скрипт настройки выбора групп пользователей публикуемых на сайте в разделе Агенты
  7. Like
    XTRO изменил репутацию Chernetskiy в настройки шаблона (как не надо писать темы)   
    Предлагаю сделать раздел "Развлекалово" и вопросы новичков типа "Хочу чтобы бац и всё было..." адресовать туда. Попутно установить рейтинг вопросов а по итогам квартала-полугодия-года номинировать на премию "Риэлторская калоша" или "Жопой в лужу"...
  8. Like
    XTRO получил репутацию от Chernetskiy в настройки шаблона (как не надо писать темы)   
    о, уважаемый, джедай! ... вы и цвет для изменения видите? и шрифт? а точки вообще убираем или меняем на стрелочки? А стрелочки - как стрелочки или как чёрточки? А это будет "по красивее" очень или не очень?
    Да пребудет с вами сила, меня, очевидно, она покинула. ))))
  9. Like
    XTRO получил репутацию от mavleds в Ошибка mysql_connect в db.inc   
    на то он и лог, чтобы в него всё писалось )) .... пробовали?
  10. Like
    XTRO получил репутацию от bogdanoff в фавикон (favicon) на свой?   
    одна <link rel="shortcut icon"  type="image/x-icon" href="{$estate_folder}/favicon.ico" >
    док.
  11. Like
    XTRO получил репутацию от TopRaN в Пользовательское соглашение   
    для "во-первых", куда уж точнее      или и через пост там же
    для "во-вторых" - и не требуется,
    а ,вообще, незачем дублировать темы.
  12. Like
    XTRO получил репутацию от Helenblondi в проблемы при просмотре сайта с мобильных устройств   
    по логике, и год назад и на сегодня, все шаблоны просто обязаны быть адаптированы, тем более что в вашем случае стоит бутстрап2, а он согласно документации "Bootstrap was made to not only look and behave great in the latest desktop browsers (as well as IE7!), but in tablet and smartphone browsers via responsive CSS as well."
    Как выход - обратиться к разработчику, он поправит.
    p.s. кстати в описании в магазине нет описания параметров)
  13. Like
    XTRO получил репутацию от Юрец в Вылет всех страниц из Яндекса   
    всё чисто, мой вывод - косяк яндекса.
    Думаю на очередном шторме всё вернётся на круги своя.
  14. Like
    XTRO получил репутацию от Юрец в Вылет всех страниц из Яндекса   
    2,3 - выкинуть и почему их несколько?
    и смотреть надо тот, который лежит в корне сайта
  15. Like
    XTRO получил репутацию от Юрец в Вылет всех страниц из Яндекса   
    для меня сорри -только не сегодня.....(у меня hdd в 3 терра умер, возни хватает) ...да и ничего сложного там нет, нужно только время, жамкаете на проигрыватель и смотрите до выхода каждую сессию с мобильника.
  16. Like
    XTRO получил репутацию от Юрец в Вылет всех страниц из Яндекса   
    ничего такого особенного, кроме пустых 300 строк кода, я лично пока не увидел. А в метрике нет данных по переходу с сайта? и метрику перенесите в конец перед </body>
  17. Like
    XTRO изменил репутацию Юрец в Вылет всех страниц из Яндекса   
    А что мне даст вебвизор, если я его уберу? Он вроде ни на что не влияет, только дополнительная статистика для удобства.
  18. Like
    XTRO получил репутацию от FD в Добавляются пробелы...   
    стандартная ошибка. Есть много редакторов, умеющих работать с кодировкой utf8 без BOM. В Notepad надо сделать в меню "Кодировки -> Преобразовать"
  19. Like
    XTRO получил репутацию от abushyk в Размер VIP внизу страницы (Realia)   
    top_special.tpl
  20. Like
    XTRO получил репутацию от Дмитрий Кондин в подключения бд   
    inc\db.inc.php
  21. Like
    XTRO изменил репутацию XTROson в Не выводится меню пользователя [свой шаблон]   
    /frontend/realia/main/main.php
    Проверьте самый верх файла.
    Там не должно быть никаких отступов, пробелов и спец-символов(могут быть и скрытыми), т.е. первая строка должна начинаться ТОЛЬКО с 
    <?php
     
  22. Like
    XTRO получил репутацию от TopRaN в "Связаться с нами" в agency   
    естественно ))
    или используйте под_условия типа {elseif} , т.е {if ..} .{elseif}.... {elseif}... {elseif}.... {if}
    или в одной строке условия || (OR) , т.е. {if  xxxxx || xxxxx || xxxx } ... {/if}
    дока
     
  23. Like
    XTRO изменил репутацию Helenblondi в Вывод статистической страницы между картой и объявлениями   
    вот тема я недавно делала банеры. и еще пару тем очень доступных нашла на форуме где Дмитрий подробно описывает как делать баннер. и видео есть.
  24. Like
    XTRO получил репутацию от TopRaN в Вывод статистической страницы между картой и объявлениями   
    в вашем случае удобнее использовать приложение Банеры или чистый html+css
  25. Like
    XTRO получил репутацию от Helenblondi в Вывод статистической страницы между картой и объявлениями   
    если низя, но очень хочется (для realia):
    1) смотрим в админке на № страницы
    2) открываем realia\realty_grid_list.tpl
    после 1 строки <div class="properties-rows"> дополняем
    <div class="row"> <div class="span9"> <div class=""> {$contentpagebyid} </div> </div> </div> 2) открываем realia\main\main.php
    ищем function main () { и дополняем
    $this->getPageById(); // custom function вне этой функции main() пишем
    private function getPageById(){ $ret1=''; $DBC=DBC::getInstance(); $query='SELECT body FROM '.DB_PREFIX.'_page WHERE page_id=3 LIMIT 1'; $stmt=$DBC->query($query); if($stmt){ if($ar=$DBC->fetch($stmt)){ $ret1=$ar['body']; } } $this->template->assign('contentpagebyid', $ret1); } где id=3 - wbahe 3 надо заменить на свой номер.