metrpro

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

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

  • Посещение

  • Days Won

    15

Все публикации пользователя metrpro

  1. 1. Колонки каких типов относятся к varchar? 2. Могу ли я переделать в text через админку сайта или надо в phpmyadmin?
  2. Почему-то есть вопросик еще, что у меня поля новые не добавляются - добавляешь в таблице data, на странице редактирования объявления отображается поле, но при попытке сохранить отредактированное объявление, выдает ошибку, чтоб поле такое-то не найдено в "field list". Может, база повреждена?
  3. Разрешение ключа включено на карты, панорамы и геокодирование для всего домена, где расположен сайт. Поэтому геокодирование "на лету" на странице показа объявления работает. Включено это добро тоже. Но при создании/редактировании объявления координатам не присваивается значение (остаётся null).
  4. Через google cloud получен платный api, все карты и панорамы теперь отлично отображаются без всяких режимов только для разработки, в т.ч. в админке. Но геокодирование не работает. Update: самое интересное, геокодирование на лету, т.е. с выставленной функцией геокода при присмотре объявлений, работает. А вот создании нового объявления нет, координаты не создаются и не сохраняются
  5. Система стоит 3.5.14, все обновления, выше пока не поднимал. iframe или другая - это не принципиально, мне нужно, чтобы геокодер работал - он не зависит от встройки
  6. У меня такая же проблема - темпов нет, но геокодирование не работает ни принудительно, ни автоматически, ни "на лету" при выставленной опции ". Установлены карты google в настройках и geodata как "использовать геокодирование" - "g" Выставлен монитор ошибок, который при заходе на страницу объявления пишет следующие ошибки для geo: Notice: Undefined index: grid_geodata in /home/admin/web/_сайт_/public_html/apps/system/lib/frontend/grid/grid_constructor.php on line 427 Notice: Undefined index: geoobjects_collection_clustered in /home/admin/web/_сайт_/public_html/apps/system/lib/frontend/grid/grid_constructor.php on line 428 Notice: Undefined index: geo in /home/admin/web/_сайт_/public_html/apps/system/lib/model/model.php on line 991 Notice: Undefined index: geo in /home/admin/web/_сайт_/public_html/apps/system/lib/model/model.php on line 996 Вручную координаты в закладке при редактировании объявления указываются и впоследствии показываются без проблем, центральные координаты, прописанные в настройках, тоже отображаются. Но геокодирование не работает. Права на все папки и файлы рекурсивно установлены на 777
  7. Костя, как можно сделать для картинки доппараметр не Описание в параметре title, а,.скажем, чекбокс, например Скрыть фото? Где это вообще меняется? Спасибо
  8. Так, иначе сформулирую вопрос. Есть рабочая кнопка, вызывающая модальное окно: <button type="button" class="btn btn-info" data-toggle="modal" data-target="#prettyMortgageTable"> <span class="glyphicon glyphicon-phone-alt" aria-hidden="true" ></span> Расчёт ипотеки </button> А есть иконка png, которая имеет три положения - неактивная, hover и активная: {if isset($smarty.session.favorites)} {if in_array($data.id.value, $smarty.session.favorites)}<a class="fav-rem" alt="{$data.id.value}" title="{$L_DELETEFROMFAVORITES}" href="#remove_from_favorites"></a> {else}<a class="fav-add" alt="{$data.id.value}" title="{$L_ADDTOFAVORITES}" href="#add_to_favorites"></a> {/if} {else}<a class="fav-add" alt="{$data.id.value}" title="{$L_ADDTOFAVORITES}" href="#add_to_favorites"></a> {/if} Вот мне бы хотелось решение, когда фаворитка выглядит также, как и обычная кнопка.
  9. Добрый день! Прошу напомнить, как и где устанавливается ограничение на ХХ дней до того, как объявление станет неактивным (или не будет заново поднято). Не могу никак вспомнить (( И вроде без крона модуля биллинга не срабатывает это отключение - напомните тоже, пожалуйста, как его прописать? (стёр случайно запись при переходе на другой хостинг) Спасибо!
  10. Легко!: <button type="button" class="btn btn-info"> <span class="glyphicon glyphicon-phone-alt" aria-hidden="true" > {if isset($smarty.session.favorites)} {if in_array($data.id.value, $smarty.session.favorites)}<a alt="{$data.id.value}" title="{$L_DELETEFROMFAVORITES}" href="#remove_from_favorites">Убрать из избранного</a> {else}<a alt="{$data.id.value}" title="{$L_ADDTOFAVORITES}" href="#add_to_favorites">В избранное</a> {/if} {else}<a alt="{$data.id.value}" title="{$L_ADDTOFAVORITES}" href="#add_to_favorites">В избранное</a> {/if} </span> </button>
  11. Спасибо, друг, теперь всё стало понятно. Думаю, на любой заданный на форуме вопрос можно ответить именно так: - При просмотре карточки квартиры добавить кнопку "написать риелтору" - Что тут непонятного? Вешаете стиль и обрабатываете скриптом! или - Ваше имя, телефон, е-mail должны по умолчанию быть заполнены из профиля - Что тут непонятного? Вешаете стиль и обрабатываете скриптом! можно даже - Подскажите пожалуйста как в Realia установить картинку фоном ?? - Что тут непонятного? Вешаете стиль и обрабатываете скриптом!
  12. Добрый день! Шаблон realia, стоит необходимость изменить оформление добавления/убавления из списка "Избранное". Нынешнее решение выглядит следующим образом: {if isset($smarty.session.favorites)} {if in_array($data.id.value, $smarty.session.favorites)}<a class="fav-rem" alt="{$data.id.value}" title="{$L_DELETEFROMFAVORITES}" href="#remove_from_favorites"></a> {else}<a class="fav-add" alt="{$data.id.value}" title="{$L_ADDTOFAVORITES}" href="#add_to_favorites"></a> {/if} {else}<a class="fav-add" alt="{$data.id.value}" title="{$L_ADDTOFAVORITES}" href="#add_to_favorites"></a> {/if} А мне бы хотелось уйти от картинок, предусмотренных стилем, чтобы выглядеть это стало как обычная кнопка, типа тех, что вызывают в шаблоне модальные окна. Буду рад, если кто сможет поделиться подобными наработками (у меня не вышло)
  13. Каковы возможные причины того, что autocomplete не работает, при всех включенных параметрах?
  14. Что-то не работает нифига эта функция - все опции прописал в re_data street_id, все равно не хочет работать ((
  15. ХЗ, надо делать кластеры, еще не занимался. Хорошо бы, если Костя решение предложил
  16. Добрый день! Все знают, что некоторое время назад корпорация добра решила заработать на сайтах, применяющих на своих страницах карты и панорамы google. И если в России и, возможно, странах СНГ эта проблема не так критична благодаря присутствию там карт Яндекса, то для зарубежных проектов остро стоит необходимость альтернативных решений, таких как Leaflet. Итак... Здесь и далее - решение на примере шаблона Realia с картами google. 1. В файл шаблона header.tpl добавляем стили leaflet: <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin=""/> Если у вас там же болтаются api-скрипты карт google, можете смело их грохнуть: <script type="text/javascript" src="//maps.googleapis.com/maps/api/js?v=3&amp;sensor=true"></script> <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=drawing"></script> 2. Переходим в файл шаблона realty_view.tpl: Ищем следующую строку: <div id="property-map" data-geo="{$data.geo.value.lat};{$data.geo.value.lng}"></div> И меняем её на: <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js" integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" crossorigin=""></script> <div id="mapid" style="width:100%;height:300px;"></div> <script>var pobj_lat={$data.geo.value.lat};var pobj_lng={$data.geo.value.lng};</script> {literal} <script> var mymap = L.map('mapid').setView([pobj_lat, pobj_lng], 16); L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' + '<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' + 'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>', id: 'mapbox.streets' }).addTo(mymap); L.marker([pobj_lat, pobj_lng]).addTo(mymap) .bindPopup("Описалка объекта"); </script> {/literal} В принципе, это всё.
  17. А что это за модуль такой, вы где его прикупили? В стандартных приложениях не углядел его
  18. Добрый день. Как добавить в поисковый запрос через template_search возможность вывода объявлений, размещенных за последний период - 24 часа, неделю или месяц? Может, кто уже вникал в это? При этом следует учитывать две разные даты - дату СОЗДАНИЯ объявления и дату его АКТУАЛИЗАЦИИ (поднятия). Как понимаю, сейчас они всегда равны.
  19. Добрый день. Установленная маска номера телефона mobilephone в таблице data предусматривает вид: _ (___) ___-__-__ Как его поменять на, скажем, ХХХ ХХХ ХХХ?
  20. Следуя тенденциям времени, решил поставить себе на сайт уведомление об использовании cookie. Пока это требование установлено законодательством Евросоюза, но, говорят, добавляет кармы сайту в глазах поисков (посмотрим). Решение состоит из двух частей - внешнего javascript-файла, который с завидной периодичностью (раз в 365 дней) уведомляет пользователя о том, что на сайте куки, и вызова этого скрипта. 1. Скрипт, ставится во внешний файл - у меня он лежит по адресу: /js/ck.js. Вот его текст: (function (window, undefined){ "use strict"; var document = window.document; function log() { if (window.console && window.console.log) { for (var x in arguments) { if (arguments.hasOwnProperty(x)) { window.console.log(arguments[x]); } } } } function AcceptCookie() { if (!(this instanceof AcceptCookie)) { return new AcceptCookie(); } this.init.call(this); return this; } AcceptCookie.prototype = { init: function () { var self = this; if(self.readCookie('pjAcceptCookie') == null) { self.appendCss(); self.addCookieBar(); } var clear_cookie_arr = self.getElementsByClass("pjClearCookie", null, "a"); if(clear_cookie_arr.length > 0) { self.addEvent(clear_cookie_arr[0], "click", function (e) { if (e.preventDefault) { e.preventDefault(); } self.eraseCookie('pjAcceptCookie'); document.location.reload(); return false; }); } }, getElementsByClass: function (searchClass, node, tag) { var classElements = new Array(); if (node == null) { node = document; } if (tag == null) { tag = '*'; } var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"); for (var i = 0, j = 0; i < elsLen; i++) { if (pattern.test(els[i].className)) { classElements[j] = els[i]; j++; } } return classElements; }, addEvent: function (obj, type, fn) { if (obj.addEventListener) { obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { obj["e" + type + fn] = fn; obj[type + fn] = function() { obj["e" + type + fn](window.event); }; obj.attachEvent("on" + type, obj[type + fn]); } else { obj["on" + type] = obj["e" + type + fn]; } }, createCookie: function (name, value, days){ var expires; if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); expires = "; expires="+date.toGMTString(); } else { expires = ""; } document.cookie = name+"="+value+expires+"; path=/"; }, readCookie: function (name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0) === ' ') { c = c.substring(1,c.length); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); } } return null; }, eraseCookie: function (name) { var self = this; self.createCookie(name,"",-1); }, appendCss: function() { var self = this; var cssId = 'pjAcceptCookieCss'; if (!document.getElementById(cssId)) { var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.id = cssId; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = 'https://fonts.googleapis.com/css?family=Open+Sans'; link.media = 'all'; head.appendChild(link); } var cssCode = ""; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn,"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:after { -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; transition: all .5s ease-in-out; }"; cssCode += "#pjAcceptCookieBar { position: fixed; bottom: 0; left: 0; z-index: 9999; overflow-x: hidden; overflow-y: auto; width: 100%; max-height: 100%; padding: 10px 0; background: #3b3988; opacity: 0.8; font-family: 'Open Sans', sans-serif; text-align: center;}"; cssCode += "#pjAcceptCookieBar * { padding: 0; margin: 0; outline: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarShell { width: 90%; margin: 0 auto; }"; cssCode += "#pjAcceptCookieBar a[href^=tel] { color: inherit; }"; cssCode += "#pjAcceptCookieBar a:focus,"; cssCode += "#pjAcceptCookieBar button:focus { outline: unset; outline: none; }"; cssCode += "#pjAcceptCookieBar p { font-size: 14px; line-height: 1.4; color: #fff; font-weight: 400; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarActions { padding-top: 10px; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn { position: relative; display: inline-block; height: 20px; padding: 0 30px; border: 0; background: #4285f4; opacity: 0.9; font-size: 14px; line-height: 14px; color: #fff; text-decoration: none; vertical-align: middle; cursor: pointer; border-radius: 0; -webkit-appearance: none; -webkit-border-radius: 0; -webkit-transform: translateZ(0); transform: translateZ(0); -webkit-backface-visibility: hidden; backface-visibility: hidden; -moz-osx-font-smoothing: grayscale; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:hover,"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:focus { text-decoration: none; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:after { position: absolute; top: 0; right: 52%; bottom: 0; left: 52%; z-index: -1; border-bottom: 4px solid #14428d; background: rgba(20, 66, 141, .3); content: ''; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:hover:after,"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:focus:after { right: 0; left: 0; }"; cssCode += "@media only screen and (max-width: 767px) {"; cssCode += "#pjAcceptCookieBar { padding: 15px 0; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarShell { width: 96%; }"; cssCode += "#pjAcceptCookieBar p { font-size: 14px; }"; cssCode += "}"; var styleElement = document.createElement("style"); styleElement.type = "text/css"; if (styleElement.styleSheet) { styleElement.styleSheet.cssText = cssCode; } else { styleElement.appendChild(document.createTextNode(cssCode)); } document.getElementsByTagName("head")[0].appendChild(styleElement); }, addCookieBar: function(){ var self = this; var htmlBar = ''; htmlBar += '<div class="pjAcceptCookieBarShell"><form action="#" method="post">'; htmlBar += '<p>Для улучшения работы сайта и его взаимодействия с пользователями мы используем файлы cookie. Продолжая работу с сайтом, Вы разрешаете использование cookie-файлов. Вы всегда можете отключить файлы cookie в настройках Вашего браузера.</p>'; htmlBar += '<div class="pjAcceptCookieBarActions"><button type="button" class="pjAcceptCookieBarBtn">ОК</button></div></form></div>'; var barDiv = document.createElement('div'); barDiv.id = "pjAcceptCookieBar"; document.body.appendChild(barDiv); barDiv.innerHTML = htmlBar; self.bindCookieBar(); }, bindCookieBar: function(){ var self = this; var btn_arr = self.getElementsByClass("pjAcceptCookieBarBtn", null, "button"); if(btn_arr.length > 0) { self.addEvent(btn_arr[0], "click", function (e) { if (e.preventDefault) { e.preventDefault(); } self.createCookie('pjAcceptCookie', 'YES', 365); document.getElementById("pjAcceptCookieBar").remove(); return false; }); } } }; window.AcceptCookie = AcceptCookie; })(window); window.onload = function() {AcceptCookie = AcceptCookie();} 2. В своем шаблоне (у меня Реалия) ищем файл main.tpl, лежит по адресу /template/frontend/realia/. Перед закрывающим тегом </body> вызываем внешний скрипт: <script src="/js/ck.js"></script> 3. Получаем решение: Все. Каждый пользователь ежегодно будет уведомляться о куках. PS: данное решение найдено на просторах интернета и немного адаптировано. Сам скрипт может быть ужат, но я не стал этого делать, т.к. работать с ним легче в таком форматировании. PPS: кому не нравится полупрозрачность фона уведомления, уберите параметр opacity: 0.8;