Dim42

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

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

  • Посещение


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

  1. Like
    Dim42 изменил репутацию Дмитрий Кондин в Патч системы от спама   
    Недавно обнаружена серьезная уязвимость в системе, благодаря которой выполняется рассылка спама.
    Если вы не хотите обновлять всю систему, то можете исправить только это в файле:
    /apps/mailbox/admin/admin.php
    Находим этот код (функцию)
    function send_friend_message(){ global $smarty; $uid=(int)$_SESSION['user_id']; $this->setRequestValue('sender_id', $uid); $link=$this->getRequestValue('link'); $to=$this->getRequestValue('to'); $message=strip_tags(SiteBill::iconv('utf-8', SITE_ENCODING, $this->getRequestValue('message'))); $email=$this->getRequestValue('email'); //echo $to; if($to==''){ return json_encode(array('answer'=>'no_reciever')); } $recievers=array(); $_recievers=explode(',',$to); foreach($_recievers as $r){ $r=trim(strip_tags($r)); if(preg_match('/(.+)@(.+)/',$r)){ $recievers[]=$r; } } if(empty($recievers)){ return json_encode(array('answer'=>'no_reciever')); } $theme='Ссылка от друга'; /*require_once (SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/system/mailer/mailer.php'); $mailer = new Mailer();*/ $smarty->assign('message',$message); $smarty->assign('link',$link); $smarty->assign('theme',$theme); $body=$smarty->fetch(SITEBILL_DOCUMENT_ROOT.'/apps/mailbox/admin/template/email_friend.tpl.html'); $subject = $_SERVER['SERVER_NAME'].': '.$theme; $from = $email; foreach($recievers as $r){ $this->sendFirmMail($r, $from, $subject, $body); /*if ( $this->getConfigValue('use_smtp') ) { $mailer->send_smtp($r, $from, $subject, $body, 1); } else { $mailer->send_simple($r, $from, $subject, $body, 1); }*/ } return json_encode(array('answer'=>'sended')); } И меняем на этот код
    function send_friend_message() { return; } Либо же просто обновите все приложения в админке до свежих версий.
    И проверьте чтобы mailbox был не ниже 1.4.1
  2. Like
    Dim42 изменил репутацию Дмитрий Кондин в Статическая страница изначально!   
    А ежели все-таки охота побыстрее, то для этого нужно изучить парочку операторов в smarty.
    Вот пример кода
    {if $smarty.server.REQUEST_URI == '/'}Тут будет выводится только для адреса /, т.е. для главной страницы{/if} Также есть упрощенный вариант. Это в админке в страницах создать страничку с URI = index.html, и тогда эта страница будет выводится вместо главной таблицы объектов.
  3. Like
    Dim42 изменил репутацию abushyk в Обновление system 3.3.15   
    Добавил фикс для этого случая.
     
    Добавил языковые переменные для формы ввода кода подтверждения восстановления пароля
  4. Like
    Dim42 изменил репутацию abushyk в Обновление system 3.3.4   
    суть в том, что вычленение кода зависит от домена ссылки. если домен не ютуба, то ссылка пойдет в печь. это поле хранит не ссылку полность, хотя допускает ее ввод, а хранит уже обрезанные ее кусок только с кодом видео. т.е. вводите вы или ссылку, или код - в результате останется только код, просто во втором случае его сохранит, а в первом проверит похожа ли ссылка на ютубовскую и, если да, ее почикает и выкинет все, кроме кода.
    нет. если домен ссылки не будет ютубовским (полным или шортлинком), то ее не обработает. "чужую" ссылку не возьмет потому что плеер под код выводится от ютуба - значит и ссылка должна быть его. Но формально никто не запрешает завести свое поле под любые ссылки и встроить любой движок плеера в шаблон и пытаться показывать видео откудаугодно.
  5. Like
    Dim42 изменил репутацию Дмитрий Кондин в Обновление system 3.3.4   
    Надо поменять код вывода видео в шаблоне на этот
    <iframe width="560" height="315" src="//www.youtube.com/embed/{$data.youtube.value}" frameborder="0" allowfullscreen></iframe>  
  6. Like
    Dim42 получил репутацию от Дмитрий Кондин в Шаблоны писем редактирование   
    В видео зря сказали - какие бы шаблоны вы хотели видеть.
    Итак - Хочется 
    1. Шаблоны напоминающие об окончании Вип, Премиум и Выдел статусах. Допустим за 2 дня до завершения. (На примере - Уведомления о списании абонентской платы)
    2. Шаблон с рекомендациями об обновлении объявления, допустим спустя 30 дней после публикации. С намеками освежить или поднять объявление.
    3. Вот этот шаблон тоже не помешал бы - Отправлять уведомление пользователю о том, что его объявление снято с публикации
    (apps.billing.notify_user_about_unpublish)
     
    Конечно было бы хорошо, что бы это все настраивалось в биллинге по примеру той же абонентской платы - типо уведомить за столько то дней.
     
  7. Like
    Dim42 получил репутацию от Дмитрий Кондин в Важное обновление безопасности system 3.3.10   
    Вот еще до кучи  Наткнулся проверяя новую функцию в настройках "Количество ошибочных попыток авторизации".
    Кто хочет исправить своими руками:
    В файл  apps/language/language/ru/frontend.ini - нужно добавить строчку - L_ACCOUNT_LOGIN_FROZEN="Вы превысили лимит попыток входа, попробуйте позже"

  8. Like
    Dim42 получил репутацию от Realtor в Важное обновление безопасности system 3.3.10   
    1. Обновлял систему с версии 3.2.3 на 3.3.10
    Выдала ошибку:
    Fatal error: Cannot redeclare class simple_html_dom_node in /home/n/usertest/public_html/third/simple_html_dom/simple_html_dom.php on line 83
    Нажал F5 (обновил страницу), показало отчет об установке, что все окей установлено, изменения в бд внесены и т.д.
    На первый взгляд все работает ровно.
    Стоит беспокоится за эту ошибку?
     
    2. Пропала галка активации пользователя в настройках пользователя

  9. Like
    Dim42 изменил репутацию metrpro в Как добавить в поисковый запрос несколько городов   
    Костя, красавчик, как всегда - то, что надо!!!
    Спасибо!
  10. Like
    Dim42 изменил репутацию abushyk в Как добавить в поисковый запрос несколько городов   
    Географические поля такие как country_id, region_id, city_id, district_id, street_id  и близкое им metro_id поддерживают обработку в двух вариантах - единичном и множественном. Т.е. допустимо передавать в запросе
    city_id=N и тогда фильтрация будет по одному городу или
    city_id[]=N1&city_id[]=N2 - в этом случае фильтрация по двум городам. Передадим массив - будет искать по группе локаций.
    Это же справедливо и для всех вышеперечисленных полей.
    Следует быть осторожным с разнородными запросами
    city_id[]=N1&city_id[]=N2&region_id=R1 сделает не поиск по "в городе Н1 ИЛИ в городе Н2 ИЛИ в регионе Р1" как могло бы ожидаться, а поиск по "(в городе Н1 ИЛИ в городе Н2) И в регионе Р1", что скорее всего вернут пустой набор.
  11. Like
    Dim42 изменил репутацию abushyk в проблема с отображением сортировки.   
    /template/frontend/agency/realty_grid.tpl
     
    там есть блок <tr  class="row_head">...</tr>
    Внутри него есть несколько ссылок вида
    <noindex><a href="{$estate_folder}/{$url}&order=type&asc=asc" rel="nofollow">↓</a></noindex> <noindex><a href="{$estate_folder}/{$url}&order=type&asc=desc" rel="nofollow">↑</a></noindex>
     
    Это и есть сортировочные ссылки. Их можно вытащить в шаблон /template/frontend/agency/realty_grid_thumbs.tpl.html расставить и приписать к ним тектовые анкоры вместо простых стрелочек ↓\↑ .
    Справитесь?
  12. Like
    Dim42 изменил репутацию abushyk в Переход на https://   
    хттпс влияет на отдачу сайта. откуда сайт парсером тянет данные или фотки в принципе ничего не означает. хттпс-сайт спокойно может загружать фото хоть с фтп.
    ручная правка ссылок нужна только в том случае, если они были прописаны в абсолютном виде где-либо в данных или в шаблоне. тосозданные кодом ссылки идут почти все в относительном виде, так что протокол подхватывают сами. там где од ссылок кодом необходим в полном виде, с доменом и протоколом (рсс, некоторые фиды), там учитывается настройка  work_on_https  которая устанавливает для этих ссылок нужный протокол.
    обязательно поменять нужно будет ссылки, которые указаны на внешних источниках, например обратные ссылки в приложениях-регистраторах соцсетей, которые указываются в настройках приложений соотвествующих сетей, обратные ссылки возврата в приложениях, которые обслуживаю оплату (робокасса, интеркасса и подобные), глде так же в их кабинетах требуется указать ссылку на которую вернуться. в принципе, если на сайте стоит допправило для сервере редиректить хттп на хттпс, большая часть ссылок таких  останется рабочими (те, которые просто информируют), но некоторые ссылки могут идти в виде ПОСТ-запроса и редирект просто будет их убивать, а поэтому лучше и перепрописать.
  13. Like
    Dim42 изменил репутацию 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; }  
  14. Like
    Dim42 изменил репутацию Chernetskiy в Раскрутка сайта в Интернет   
    Полезные ссылки для вебмастера
    Ссылки, которые пригодятся и вам.

    Общее
    1. Просмотр сайта в различных браузерах: http://browsershots.org/ Ресурс позволяет узнать, как ваш сайт видят пользователи в разных браузерах, в том числе позволяет оценить кроссбраузерную верстку сайта.
    2. Конвертер punycode для .рф доменов: http://2ip.ru/punycode Позволяет получить адрес в punycode для вашего домена в зоне .рф. Или, проще говоря, ресурс позволяет превратить название www.ромашковый-рай.рф в абракадабру, которую понимают компьютеры: xn----7sbbg9accordri2hzb.xn--p1ai.
    3. Декодер почты. Пришло письмо с нечитаемыми символами? Прочитать его можно тут: http://www.charset.ru/
    4. Назад в будущее: http://web.archive.org – ресурс позволяет посмотреть этапы изменения сайта. Не помните, когда меняли текст на сайте или просто интересно посмотреть, как выглядел ваш сайт в день его открытия? Ресурс для вас.
    Оптимизация сайта
    5. Подбор ключевых слов, семантического ядра. Правильно подобрать ключевые слова для вашего сайта поможет сервис Wordstat от Яндекса. Как пользоваться этим сервисом читайте по ссылке: http://1ps.ru/help/word/
    6. Мета-теги title и description. Все знают, что эти теги важны для оптимизации и продвижения сайта. Как правильно прописать мета-теги title и description в примерах читайте по ссылке: http://1ps.ru/blog/seo/title-i-description-v-primerah/
    7. 301 редирект. Сменили доменное имя? До сих пор не настроили постоянное перенаправление с www на без www вашего сайта? 301-редирект вам в помощь. Как настроить редирект 301 хорошо написано на сайте: http://sb-money.ru/article.php?a=75
    8. Карта сайта, sitemap. Создать карту сайта онлайн можно с помощью сервиса http://htmlweb.ru/analiz/sitemap.php . Заодно сервис анализирует ваш сайт и указывает на основные критические ошибки.
    9. Новости SEO, все для оптимизатора: http://www.allseo.ru/news Хороший ресурс о новинках в области SEO.
    10. Форумы по продвижению, оптимизации сайтов: http://seochase.com/ , http://forum.searchengines.ru/
    Анализ сайта
    11. Seo анализ сайта, сервис для оптимизатора: http://mainspy.ru/ - позволяет провести общий анализ сайта, определить тИЦ, PR, и еще много других параметров.
    12. Анализ контента. http://pr-cy.ru/analysis_content – сервис позволяет определить вес главной страницы сайта, релевантность заголовка (title) и другое.
    13. Определить CMS сайта. Сервис http://itrack.ru/whatcms/ - позволяет узнать, на какой CMS разработан ваш сайт.
    14. Проверка сайта на вирусы. https://www.virustotal.com/ru/#url
    Help Яндекса
    15. Служба поддержки Яндекса. Есть вопросы Яндексу? Пишите сюда, Платон ответит: http://feedback.yandex.ru/webmaster/
    16. О том, каким должен быть хороший сайт. Как сделать хороший сайт по мнению Яндекса, можно прочитать по ссылке: http://help.yandex.ru/webmaster/?id=1108938
    17. О robots.txt. Использование robots.txt, что зачем и как узнайте по ссылке: http://help.yandex.ru/webmaster/?id=996567
    18. Что такое зеркала сайтов, кому они нужны, как их настроить: http://help.yandex.ru/webmaster/?id=995297
    19. Карта сайта (sitemap). Что такое карта сайта, для чего нужна, что обязательно нужно учесть при ее создании. http://help.yandex.ru/webmaster/?id=1007070
    20. Рекомендации Яндекса по созданию сайтов: http://help.yandex.ru/webmaster/?id=1108938
    21. Коды региональной выдачи: http://search.yaca.yandex.ru/geo.c2n Сервис позволяет узнать, как выглядит выдача в другом регионе. Например, вы ищите «пластиковые окна» и хотите увидеть результаты поиска для Москвы, достаточно поменять параметр &lr в адресной строки на &lr=213. Будет показана выдача Москвы.
    22. Правила размещения рекламы на Яндексе: http://advertising.yandex.ru/requirement/media/regulations.xml?ncrnd=7571 На данной странице перечислены основные ограничения и требования к рекламе в Интернете.