Leaderboard


Popular Content

Showing content with the highest reputation since 06/14/13 in all areas

  1. 6 points
    Добавлю несколько слов от себя: 1. Используйте seo-возможности страниц с объявлениями. Если нет возможности заполнять мета-титл для каждого объявления, генерируйте их. Откажитесь от стандартного h1, определяемого переменной $title - лучше компонуйте его на уровне шаблона _view из переменных массива data, таких как: {$data.city_id.value_string} - название города; {$data.street_id.value_string} - название улицы; {$data.number.value} - номер дома; {$data_shared.price.value} - цена; {$data.text.value} - текстовое описание (укорачивайте его функцией truncate) Помните, что согласно статистике google, 15% ежедневных поисковых запросов уникальны, они никогда больше не повторятся, поэтому 100-1000-10000 объявлений с качественными заголовками meta-title, h1-title, meta-description дадут большой пласт НЧ-запросов. 2. На любом сайте объявлений самое ценное - это страницы листингов (_grid). Используйте Линк-менеджер, чтобы добавить геотаргетированные списки объявлений, таких как "Продажа 1-комнатных в Ялте" или "Аренда домов в Ялте посуточно". Это поможет охватить большой сегмент СЧ-запросов. У меня на сайте разделов predefindlinks - более 300шт и их количество я продолжаю ежедневно увеличивать. 3. Регулярно проверяйте наличие дублей страниц через Google Webmaster. 4. Закройте в robots.txt все параметры, кроме page, которые не умеете использовать, а именно price, order, grid_type, city_id, street_id. 5. По недвижимости всегда полно запросов типа "Город, Улица" - попробуйте использовать city_id и street_id в комбинации, чтобы создать огромное количество гео-листингов по НЧ-запросам. У меня любой поиск через стандартную форму sitebill формата "город такой-то, улица такая-то" выдаст листинг с заголовками типа "СЕВАСТОПОЛЬ, Октябрьской Революции проспект - объявления по продаже и аренде квартир, домов, недвижимости недорого без посредников". Вот пример очень даже неплохих ПФ при заходе на подобную генерированную страницу: 6. Генерируйте alt и title для всех изображений как на страницах объявлений, так и на страницах листингов. Используйте для этого те же переменные, что и в п. 1, добавляя уникальность переменной {$smarty.section.j.index} (для шаблона _view). 7. Никогда не удаляйте объявления. Не делайте их неактивными. Используйте для этого дополнительную переменную и оперируйте ею на уровне шаблона, чтобы не потерять посетителя. Тогда объявление будет участвовать в поиске и в листингах, а пользователь не попадет на 404. 8. Улучшайте ПФ простым образом - помните, что не все пользователи будут кликать на ниспадающее меню (как в realia или estatico), половина из них будет искать привычные быстрые ссылки, к которым они привыкли на авито. 9. Пропишите 404 с ссылками на основные разделы сайта. 10. Прочитайте великолепный мануал Саши Алаева про продвижение сайта объявлений недвижимости - он от 2014 года, но всё, что там написано, сверхактуально. 11. Поставьте на сайт поиск от Яндекса или Google. 12. Будьте аккуратнее со штатным seo-приложением sitebill. Не включайте .html, не используйте сложных структур uri (особенно, если у вас объявления могут добавлять зарегистрированные пользователи, которые имеют обыкновение путать категорию). 13. Каждую новую страницу листинга, где вы исправили заголовки или описание, добавляйте вручную в Я и G. UPDATE 28-09-16: 14. Не пожалейте часа времени и посмотрите видео "SEO для сайтов по продаже и аренде недвижимости". Его автор - Руководитель департамента продаж SeoPult Евгений Костин, и рассказывает он занятнейшие вещи. Работы по тому, что я тут написал, у себя начал в 20 числах августа (т.е. около месяца назад). Результат не в абсолютном выражении, а в относительном, меня радует - рост трафика составил более чем в 2 раза: Указаны среднесуточные переходы из ПС. Спад в текущей неделе связан с тем, что сегодня еще вторник. У меня всё, можете начинать срач.
  2. 6 points
    MaxTu

    Хорошая, годная CMS

    Добрый день! Сразу же хочется поблагодарить разработчиков CMS Sitebill за столь гибкую и хорошую CMS для агентств недвижимости, а также за адекватную, полезную помощь и поддержку! У нашей студии большой опыт работы с проектами для недвижимости, и даже есть собственная CMS заточенная под эту область, но Sitebill в последнем проекте показал свои сильные стороны. Хочется рассказать о нашем новом проекте - сайте агентства недвижимости "Академия м2" http://www.akademiyametrov.ru, и особенно о тех модулях и нововведениях, которые мы использовали для Sitebill при работе над ним, потому как считаем, что они будут полезны всему сообществу: ------------------------------------------ 0. Сайт сверстан на Twitter Bootstrap 3. Пока мы не видели новых проектов на Sitebill с этим css-фреймворком. Верстка велась на основе шаблона agency. В целом, подключение CSS и JS Bootstrap 3 не вызвало больших проблем. 1. Написали свой модуль краткой Заявки в свободной форме! По-умолчанию, в CMS сделана большая, громоздкая форма заявки на аренду и покупку недвижимости. Мы же, по своему опыту знаем, что форма должна иметь как можно меньше полей для заполнения посетителем - конверсия выше будет. Модуль сделан в виде одного php-скрипта (дочитайте до конца и узнаете как его получить!). Данные отправляются на почту и появляются у админа в разделе "Заявки на аренду". Поэтому была написана форма всего с 4 полями, которая выводится в модальном окне bootstrap 3. Отправка данных сделана через ajax в наш скрипт simple-order.php. А в скрипте просто заносится данные в таблицу: $query="INSERT INTO re_data_get_rentSET name='".$name."', phone='".$phone."', more='".$message." (".NOW.")', date_added='".TIMESTAMP."'";2. Слайдер. Слайдер - это краеугольный камень презентационных сайтов, к коим относятся и сайты по недвижимости. Слайдер на главной странице сделан на основе верстки модуля/шаблона right_special.tpl и подключен к js-библитеке Sly slider. Доработки: - корректная обрезка описания объекта, с помощью функции шаблонизатора Smarty - truncate:200 \template\frontend\akademiyametrov\right_special.tpl:14 <p>{$special_items2[i].text|strip_tags|truncate:200}</p>- Вывод нескольких фото в слайдер (по-умолчанию, в CMS выводится одно фото) - подсказали в теме http://www.etown.ru/s/topic/357-превью-в-модуле-спецпредложений/: Файл /apps/system/lib/frontend/grid/grid_constructor.php:838:1551:2251 $image_array = $data_model->get_image_array ( 'data', 'data', 'id', $item_array['id'], 1 );тут убираем последний аргумент, который и указывает на количество фото $image_array = $data_model->get_image_array ( 'data', 'data', 'id', $item_array['id']);3. Существенно переработана форма поиска: оставлены только необходимые поля. Плюс, сделано так, чтобы по-умолчанию был выбран необходимый город (с помощью jQuery): $('select#city_id :nth-child(2)').attr("selected", "selected");Для стилизации полей формы использовали jquery.formstyler.min.js (по-моему, его можно включить в дефолтные шаблоны CMS). 4. Таблица объектов также существенно переработана: - выводится три фото (вместо одного): {if $grid_items[i].img[1] != '' } <a class="preview" href="{$grid_items[i].href}"><img src="{$estate_folder}/img/data/{$grid_items[i].img[1].preview}" width="50"></a> {/if}{if $grid_items[i].img[2] != '' } <a class="preview" href="{$grid_items[i].href}"><img src="{$estate_folder}/img/data/{$grid_items[i].img[2].preview}" width="50"></a> {/if}- если указана сортировка по какому-то столбцу (стоимость, район и др.), он выделяется серым цветом css-класса cell-1: class="{if strpos($smarty.server.REQUEST_URI, "order=type") == true}cell-1{/if}- проставлены относительные даты добавления объекта вместо абсолютных ("сегодня", "вчера" вместо дефолтных "11.12"). Использована функция Smarty $smarty.now|date_format:"%d.%m" : {if $grid_items[i].date==$smarty.now|date_format:"%d.%m"} сегодня{elseif $grid_items[i].date==($smarty.now-(60*60*24))|date_format:"%d.%m"} вчера{else} {$grid_items[i].date}{/if}- благодаря новым классам в Bootstrap 3 некоторые столбцы на мобильных устройствах скрываются и таблица становится компактной и помещается на экранах вплоть до планшетов: <td ... class="visible-lg">...</td>5. Существенно переработана страница объекта - к примеру, вот продажа 1-к квартиры. - Фото выводятся с помощью библиотеки photosetGrid , которая в виде мозаики размещает их. - Форма отправки заявки на объект также сделана по-другому: некрасивое всплывающее окно с большим количеством полей мало кто будет заполнять, поэтому форма выводится тут же на странице и выглядит как два поля - "Имя" и "Телефон". И все! Отправка данных из нее реализована через ajax. Для этого пришлось скопировать дефолтный шаблон form.tpl в свой шаблон в папку \template\frontend\akademiyametrov\apps\mailbox\site\template\ , и таким образом, работать уже с собственным подключаемым шаблоном. Спасибо за подсказку в теме http://www.etown.ru/s/topic/331-отдельный-шаблон-новостей/ 6. Главную страницу тоже существенно переверстали. К примеру, на основе функций Smarty сделали так, чтобы кое-какие блоки верстки выводились только на главной странице (в примере ниже - это слайдер, который выводится только на главной): {if $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" eq '/'} <!-- Slider --> ... <!-- /.Slider -->{/if} или не выводились в определенных разделах (тут блок поиска не выводится на стат.страницах): {if $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" ne '/services/' && $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" ne '/aboutakademiyametrov/' && $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" ne '/contacts/' && $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" ne '/news/' && $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" ne '/rostovhistory/' && $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" ne '/order/'} <h2 class="topic"> Каталог недвижимости</h2>{/if}7. Для бекэнда тоже постарались: написали свой модуль для автоматического экспорта объектов на доску объявлений "Авито" - http://www.akademiyametrov.ru/xml/avito.xml, чем с удовольствием пользуется клиент, а также модуль автоматического парсинга определенных сайтов и добавления квартир с них в админку. Но, на текущий момент, первый модуль оформлен как кнопка со ссылкой на URL (по которому генерируется xml) в разделе "Выгрузка Яндекс.Недвижимость" и представляет собой один php-скрипт, т.к. до написания полноценного плагина для CMS руки не дошли. Вполне вероятно, что при работе над другими проектами оформим их как плагины. В итоге 1-месячной работы имеем: 2 новых собственных шаблона модулей (news, mailbox - все они копировались из дефолтных в папку \template\frontend\akademiyametrov\apps\ , к примеру собственный шаблон новостей для работы должен иметь путь \template\frontend\akademiyametrov\apps\news\site\template\), 8 переверстанных шаблонов (header.tpl, footer.tpl, main.tpl, right_special.tpl, standart_search_form.tpl, realty_view.tpl, realty_grid.tpl, news_list_column.tpl), 4-6 файлов собственных модулей ... и ~10 вопросов на форуме Готовы поделиться скриптом для формы свободной заявки (1 php-скрипт + js-код для отправки данных + код под bootstrap для верстки модальн.окна). Пишите в личку. При разработке даже сделали небольшой хак - "Установка шаблона из URL 'на лету' " http://www.etown.ru/s/topic/332-хак-установка-шаблона-из-url-на-лету/ И в конце работы над проектом, хочется высказать пожелания для разработчиков, быстрее включить в дефолтные шаблоны Bootstrap 3. ----------------- Отдаем даром форму краткой Заявки на объекты В ходе работы над последним проектом на основе Sitebill, мы сделали краткую форму Заявки на объект. Знаем по собственному опыту работы с сайтами агентств недвижимости - такая форма с 2-4 полями дает существенную конверсию и отдачу. Форма добавляет заявку в админку и отправляет заявку на email. Готовы поделиться скриптом для формы свободной заявки (1 php-скрипт + js-код для отправки данных + код под bootstrap для верстки модальн.окна). Просто напишите в личку.
  3. 5 points
    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 На данной странице перечислены основные ограничения и требования к рекламе в Интернете.
  4. 5 points
    abushyk

    Улыбнуло

    Были вчера на "празднике шоколада". Кроме всякой сладкой вкусно-всячины попалось и такое и что самое интересное - шоколадные гайки таки скручивались с шоколадных болтов))
  5. 5 points
    vetalysd

    Шаблон DOMIKUS

    Предлагаю вашему вниманию шаблон DOMIKUS 2.0. ДЕМО http://demo1.orangeee.net/ логин: admin пароль: admin Описание http://orangeee.net/новый-шаблон-domikus-2-0-для-cms-sitebill/ Стоимость шаблона: 2900 р. спешите! скоро много обновлений! ПРИОБРЕСТИ МОЖНО ТУТ http://www.sitebill.ru/shablon-domikus или пишите в личку Шаблон подойдет не только современным доскам объявлений , но и классическим агенствам недвижимости.Пример реализации в строгом стиле ===>> Bootstrap 3.3.2 Jquery 2.1.3 JqueryUI 1.11.4 Glyphicons и Font awesome - В картах GOOGLE используеться векторный маркер SVG - Минимум кода СSS около 15кб. -Используються максимально стили BOOTSTRAP и встроенный функционал. -Слайдеры и карусели BOOTSTRAP -Табы Jquery UI заменены на Бутстраповские. -Litebox заменен на Сolorbox и скомбинирован для удобства с каруселью. -Улучшен интерфейс (чекбоксы, селекты, кнопки) -Все функции последнего стандартного шаблона сохранены на 100%. Уникальные особенности: 1. Вывод Слайдера с special_adver_cost (специальными предложениями) вместо случайного объявления (заменяет объявление). 2. Вывод в виде иконок наличия бытовой техники и услуг: "кондиционер", "стиральная машина", "интернет" и т.д. 3. Кнопки быстрого поднятия,удаления,редактирования и т.д. прямо из REALTY_GREED (сетки обявлений) и карточки объявления. 4. Поднятие объявления администратором из фронтальной части. 5. Поле "контакты хозяина" доступное из фронтальной части автору объявления и администратору. 6. Быстрый просмотр фото из REALTY_GREED (сетки обявлений). 7. Список агентов с AJAX JSON подгрузкой..+счетчик обявлений у пользователей. 5.Некоторые функции в разработке.Некоторые добавим по вашему желанию. ФОТО
  6. 4 points
    1. Предистория Допустим мы имеем базовый сайт на сайтбилле. У нас есть стандартная модель квартиры-недвижимости со всякими Цена, Площадь и прочими свойствами по вкусу. И вот, в один прекрасный момент, мы решили заняться торговлей квартирами в новостройках. А новостройки эти у нас зачастую представлены не отдельными зданиями, а целыми комплексами зданий, которые в свою очередь разбиты на секции. 2. Анализ. Сначала разберемся со структурой. Самый простой вариант - мы решили еализовывать каждую квартиру в виде отдельного объекта. Например, если в ЖК "Элитный" у нас есть корпус А, а в нем секция I и в этой секции, грубо говоря, 15 квартир одной планировки, но некоторые на разных этажах, мы будем считать, что каждая квартира, даже одинаковой планировки - является одним объектом. Иными словами, мы не делаем группировок по типам, а ведем каждую квартиру отдельно. Это дает нам некоторую гибкость, так как квартиры на крайних этажах могут иметь меньшую цену в отличии от одноплановых с ними, на остальных этажах. Так же, из плюсов то, что мы можем задать какие-то особенности поквартирно, даже не смотря на то, что они одноплановые. Особенно это касается, когда квартиры продаются не в сыром виде, а меблированные или с финишной отделкой. Либо учесть иные особенности каждой квартиры. Из минусов такого подхода то, что если секция у нас 9-ти этажная с 4 квартирами на этаж, то на секцию получается 36 объектов. И дальше в геометрической прогрессии в зависимости от количества секций в корпусе и корпусов в ЖК. Соответственно, логично предположить, что кроме обычных для недвижимости параметров (цена, площадь, этаж,и т.д.) нам придется снабдить модель недвижимости дополнительными параметрами, устанавливающими ее привязку к конкретному положению в разрезе ЖК - конкретный ЖК, корпус ЖК, секция корпуса ЖК. И так же очевидно, что при заполнении формы эти параметры должны бы быть связаны цепочкой, как то при выборе отдельного ЖК, мы должны получить под выбор список корпусов только этого ЖК, что бы не рыскать в длиннющем списке всех корпусов. Аналогино и с секциями. 3. Инструментарий. Для реализации нам понадобятся свежие приложения system, admin, table, customentity. Привлекать готовые приложения типа "Жилые комплексы" мы не будем. Из настроек нам будет необходимо включить параметр Настройки - Дополнительно - Off system Ajax. Данная опция выключает автоматические связки между зависимыми элементами и предоставляет нам полный контроль над определением своих зависимостей. Из почитать - http://wiki.sitebill.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B 4. Подготовка дополнительных сущностей. Если мы должны иметь возможность выбрать корпус, ЖК и секцию, значит у нас где-то должны быть списки этих значений. В Сайтбилле, для организации списков значений существует два типа полей - select_box и selectbox_by_query. Первый нам не подходит, так как не поддерживает организацию наследия. Т.е. штатными средствами этого элемента мы можем задать набор его вариантов значений, но не можем указать какие-то связующие ключи с другим элементом. Второй, поскольку хранится в БД в виде отдельной таблицы, вполне на это способен. Но для его использования необходима соответствующая таблица в БД. В нашем случае таблиц будет три - таблица ЖК, таблица корпусов и секций корпусов. Что бы избавить себя от рутинной работы по наполнению этих данных через phpMyAdmin создадим соответствующие таблицы в Редакторе форм. 4.1. Жилые комплексы. Для ЖК - это таблица czhilkom с полями czhilcom_id (primary_key) и name (safe_string). Создав таблицу и наполнив ее элементами, нажимаем кнопку Создать таблицу. Теперь таблица ЖК существует физически в БД. Надо наполнить ее какими-то жилыми комплексами. Для того, что бы получить доступ к работе с этой сущность через стандартную админку, воспользуемся приложением Пользовательские сущности. Для начала проверим, что приложение установлено. Для этого в админке переходим по адресу /admin/index.php?action=customentity&do=install При переходе по нему, в случае отсутствия необходимых таблиц для работы приложения, они будут созданы. После этого возвращаемся в Редактор форм и в заголовке таблицы czhilkom ищем кнопку со завездочкой Эта кнопка отвечает за создание мини-обработчика для сущности, у которой нет штатного обработчика (в виде встроенного модуля или стандартного\стороннего приложения). NB. Попытка создать этой кнопкой обработчик для встроенных сущностей, как Город, Район или для тех у которых есть приложения - Баннеры, Новости - ни к чему не приведет. После нажатия кнопки Создания обработчика мы увидим следующее окно где в поле Название вам нужно ввести вменяемое название для вашего обработчика, что бы вы знали к чему он относится. Введем например Жилой комплекс и нажмем Создать. После перезагрузки страницы в верху, возле кнопки раскрытия списка приложений мы получим дополнительную кнопку Пользовательские, а под ней и наше квази приложение Жилой комплекс Если перейти по предложенной ссылке, вы получите минималистический инструмент для управления вашими ЖК где вы можете добавить ЖК в список, изменить существующий или удалить ненужный. Приложение не следит за целостностью, т.е. если вы удаляете ЖК, то об удалении соответствующих зависимых корпусов и секций вам так же придется позаботиться самому. Не надейтесь на возможность реализации таким способом каких-то "творческих вывихов" - это исключительно инструмент для обеспечения удобства. Для полноценной работы с такими сущностями, как разделение их по пользователям с возможностью редактирования последними, организация страницы, например конкретного ЖК, шаблонизация необходимо создавать полноценное приложение. Для наших целей добавим два ЖК - Элитный и Морской с помощью кнопки Добавить запись Процесс, как вы можете заметить, вполне привычный и не должен вызвать трудностей 4.1. Корпуса. Создание таблицы корпусов абсолютно ничем не отличается от создания таблицы ЖК кроме того, что у корпусов есть зависимость от ЖК. Например ЖК Элитный имеет два корпуса - Корпус А и Корпус Б. Тогда модель корпуса (ckorps) будет состоять из полей Поле czhilcom_id является обычным полем селектбокса подбирающим данныеиз внешней таблицы, в данном случае из таблицы czhilcom Простыня под спойлером Дальше все по алгоритму - создали таблицу в Редакторе форм, наполнили полями, создали физическую таблицу, зарегистрировали обработчик. Из Пользовательских переходим в Корпуса добавляем Названия сущностей рекомендую давать расширенные - с включением родительского описания. Так как обработчик весьма прост, то особых способов отличить Корпус А от ЖК Элитный и Корпус А от ЖК Морской у вас не будет. В результате мы получаем нечто похожее на
  7. 4 points
    mmkulikov

    Переменные в main.php

    Если администрация не против - предлагаю здесь собирать информацию о доступных переменных для шаблона. Переменные: Просмотреть содержимое любого массива, например, {$special_items2|@print_r} $estate_folder - корневая папка сайта $current_theme_name - имя используемой темы $smarty.session.user_id - если пусто, значит пользователь не залогинен. Лучше проверять как {if intval($smarty.session.user_id)!=0}Значит авторизирован{/if} $main_file_tpl - имя подгружаемого файла шаблона для отображения, например, realty_grid.tpl - шаблон вывода списка категории недвижимости $main - в отличии от предыдущего - это готовый контент для вывода (готовится в контроллере или приложении) $special_items2 - массив, содержащий список спецпредложений(VIP) $grid_items - массив обычных объявлений $news_list_column - массив списка новостей $apps_page_view - если переменная определена, значит идет просмотр статической страницы $meta_keywords - keywords $meta_description - description $breadcrumbs - "хлебные крошки" $map_type - google, yandex $is_account - указывает на то, что мы сейчас в личном кабинете (1/0) $_layout - текущий макет, по умолчанию (как правило) layout_basic.tpl (используется, например, в main.tpl для подгрузки основного файла шаблона)
  8. 4 points
    abushyk

    Панорама

    Для гугля 1. Блок под панку <div id="panoview" style="width:100%;height:300px;"></div> 2. Коры для точки панорамы {if $data.geo.value.lat!='' && $data.geo.value.lng!=''} <script> var pobj_lat={$data.geo.value.lat}; var pobj_lng={$data.geo.value.lng}; </script> {else} <script> var pobj_lat=''; var pobj_lng=''; </script> {/if} 3. Скрипт запуска панорамки {literal} <script> /*объект-обработчик*/ var PanoRunner={}; PanoRunner.panorama=null; PanoRunner.initialize=function(pobj_lat, pobj_lng) { var panoposition = {lat: pobj_lat, lng: pobj_lng}; var sv = new google.maps.StreetViewService(); PanoRunner.panorama = new google.maps.StreetViewPanorama(document.getElementById('panoview')); sv.getPanorama({location: panoposition, radius: 50}, PanoRunner.processSVData); }; PanoRunner.processSVData=function(data, status){ if(status === google.maps.StreetViewStatus.OK){ PanoRunner.panorama.setPano(data.location.pano); PanoRunner.panorama.setPov({ heading: 270, pitch: 0 }); PanoRunner.panorama.setVisible(true); }else{ /*стирание блока под панорамку, если облом*/ $('#panoview').remove(); } } $(document).ready(function(){ if(pobj_lat!='' && pobj_lng!=''){ /*запуск подключателя панорамы*/ PanoRunner.initialize(pobj_lat, pobj_lng); }else{ /*стирание блока под панорамку, если координат нет*/ $('#panoview').remove(); } }); </script> {/literal}
  9. 4 points
    TopRaN

    CK Editor

    Версия 4.2.2

    11 скачиваний

    Личная сборка CKEditor 4 ckeditor.rar
  10. 4 points
    Triser

    Благодарность!!!!!

    Доброе время суток уважаемые форумчане!!!! не буду лукавить подкинули мне идею отличную. я Думаю что я не единственный человек здесь, кому помог Константин Abushyk. есть огромное желание отблагодарить этого великолепного человека, гуру нашего сайта)) Предлагаю Подарить ему подарок от всей души!!! Скидываемся кто сколько может так сказать)))) собираем финансы, переводим Константину, и он сам покупает что ему нужно. или покупаем подарок отправляем ему в город Львов, с просьбой потом отписаться о получение.. у кого какие мысли? думаю это будет правильно.. Спасибо всем кто меня поддерждит!!!
  11. 4 points
    abushyk

    Выгрузка Yandex.Realty

    Если брать смый общий случай, то я иногда делаю в шаблоне вот так:{if $some_phone_number != '' && $some_phone_number|strlen==12}{$some_phone_number|regex_replace:'/(\d{3,3})(\d{2,2})(\d{3,3})(\d{2,2})(\d{2,2})$/':'+${1} (${2}) ${3}-${4}-${5}'}{/if}Самая примитивная регулярка которая раздирает исходных набор цифр на куски и форматирует из кусочков нужное отображение. Для mobilephone, которые однотипны и имеют равную длину и числовую составляющую, работает на ура. Для прочих номеров возможно больше вариантов из-за необходимости очистки исходного номера от мусора и разной длины номеров из-за свободной формы записи.
  12. 4 points
    http://my.digitalwerkstatt.ru/files/predefinedlinks.zip Распаковываем в /apps/ Приложение появится в админке под именем Заходим в него. Запрашиваем адрес /admin/index.php?action=predefinedlinks&do=install, что бы установилась табличка в БД. Потом добавить запись: После этого при запросе /elites/ - вы должны получить желаемое. ПС. Приложение не особо популярное, так что если будут косяки, пишите.
  13. 4 points
    Продолжаю отдельными постами, так как исчерпал лимит на картинки в одном сообщении )) 4.1. Секции. Не буду давать расширенного описания, скажу только, что все идентично как для корпусов. Таблица csection и поля csection_id, name, ckorps_id (по таблице ckorps) В принципе для секций можно было бы установить двойную зависимость - указывать принадлежность секции к корпусу и к ЖК. Для некоторых случаев это оправдано (особенено если делается полноценное приложение), но в нашем случае, когда необходимо лишь поразграничивать принадлежности и сам корпус и ЖК будет указан в свойствах недвижимости, такая связка будет избыточной. В итоге 5. Внедрение в недвижимость Сущности у нас готовы, можно приступать к привязке их на объявление. Нам необходимо добавить три свойства в нашу таблицу data - ЖК, Корпус и Секция. Все они будут добавляться полями типа select_by_query, что бы мы могли сформировать их списки в элементах выбора из соответствующих таблиц. Носить имена будут эти элементы czhilcom_id, ckorps_id и csection_id Если теперь мы перейдем в форму добавления объявления мы увидим, что наши новые три поля уютно прописались в форме в виде привычных списков выбора. Но если их поразворачивать, то вы увидите, что они вмещают все варианты из своих таблиц и не реагируют на состояние "родительского" элемента. Например выбор ЖК никак не отражается на содержимом списка корпусов. Приступаем к наладке связей. 6. Связывание Основой для связывания служит принцип связанных элементов формы - http://wiki.sitebill.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B Нам необходимо в рамках одной формы указать элементам на какие другие элементы они влияют в форме и от каких зависят. Например - ЖК. От состояния этого элемента зависит возможный список выбора в элементе Корпуса. Эта зависимость описывается какЭто значит, что элемент, в котором мы выбираем название ЖК связан с элементом с системным именем ckorps_id (элемент выбора Корпуса ЖК), а ключем, который внутри Корпуса соответствует жилому корпусу является значение из поля czhilcom_id модели Корпуса. Если взлянете выше, то это значение в модели Корпуса у нас является идентификатором ЖК, к которому привязан Корпус.Больше ЖК у нас ни на что не влияет, потому и других параметров нет. Далее Корпус. Корпус, аналогично ЖК влияет на "следующий" элемент - Секцию. Но, кроме этого, он еще должен знать от какого элемента зависит сам - это необходимо для формирования адекватного списка значений элемента Корпус, но не тогда, когда сделан выбор конкретного ЖК, а при загрузке формы. Например, если вы открыли на редактирование объявление в котором ЖК был указан как Элитный, тогда в списке Корпусов вполне ожидаемо окажется уже готовый список корпусо ЖК Элитный. linked - описывает зависмость когда элемент влияет на что-то.depended - когда что-то влияет на элемент И, наконец, Секция. Самый простой элемент. Он ни на что не влияет, но на него влияет Корпус. Что и видно из параметров. Нет ничего страшного, если вы ничего не поняли про связи с первого раза. Это нормально, Я гарантирую это. Если теперь вы попробуете загрузить форму добавления объявления, вы видите, что у вас доступен на выбор только элемент ЖК, а остальные будут подгружены только после выбора соответствующего родительского. Для того, что бы увидеть этот эффект в Настройках необходимо включить параметр Настройки - Дополнительно - Off system Ajax 7. Эпилог Ай, у меня не работают элементы выбора географии. Что делать?... Тут все ожидаемо. Изначально принцип связанных элементов предназначался как-раз для географических элементов, что бы вывести из кода движка жесткие зависимости Страна-Регион-Город-Район\Улица и иметь более широкую возможность настройки своих связей. А так же, иметь возможность введения промежуточных элементов (Страна-Регион-Субрегион-Город), которые разрывали бы существующие связи, заложенные в код Сайтбилля. Именно поэтому опция Off system Ajax отрубает всю систему заложенных связей. Возможно это слишком кардинально и стоило бы предусмотреть ступенчатую систему, когда подключение пользовательских связанных элементов регулировалось бы одной настройкой, а отключение привычной связки от Страны к Улице другой. На данный момент четкого мнения у меня пока нет. Для себя я решил эту проблему навеской связей на географические элементы в виде, аналогичном системным правилам. Т.е.country_idlinked region_id,country_id region_idlinked city_id,region_iddepended country_id city_idlinked street_id,city_id;district_id,city_iddepended region_id district_idlinked mkrn_id,district_iddepended city_id street_iddepended city_id mkrn_iddepended district_id 8. Offtop С другой стороны, даже этот способ немного избыточен. Если Город является дочерним к Региону, а Регион к Стране, то хранение всех трех значений для объявления - это "лишние" данные, хотя при организации поиска они весьма кстати. Суть в том, что географические данные вполне возможно хранить в виде, схожем со структурой и получать к ним доступ более "человечным" путемНо в этом случае остается так же много вопросов связанных с совместимостью с многими приложениями, принципом организации смой геоструктуры (ведь если заструктурить географию от страны до улиц - это может стать неподъемным грузом, а если закончить городом, то не совсем понятно, как вести связь дальше к улицам, которые должны таки быть привязаны к городам или чему-то наследному от них). В общем идея у нас полно, была бы возможность все реализовать)
  14. 4 points
    Думаю надо сделать отдельную ветку в форуме. Там будет каждая новая фича отдельным топиком. Если пользователю интересна эта фича, то он там пишет +1, в результате тема которая интересна большему количеству появится в новой версии.
  15. 4 points
    IGOR

    Перенос сайта на другой хостинг

    Ваши dns регистрируются, скоро сайт будет доступен по обычному адресу.. p.s C каждым вопросом Вы создаете новую тему.........Создайте уже тему "Konstantin Nikolaevich" и пишите туда все свои вопросы.... не в обиду, но сколько же можно одновопросных тем создавать? вот такая-же тема, можно в неё написать http://www.etown.ru/s/topic/515-%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81-%D1%81%D0%B0%D0%B9%D1%82%D0%B0-%D0%BD%D0%B0-%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B9-%D1%85%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/
  16. 3 points
    Допустим у нас в базе есть 100 городов. Все они отсортированы по алфавиту. Но мы хотим чтобы город Москва всегда был на первом месте при выборе. Ведь это логично, что большинство объявлений будут базироваться там (для Москвы и Московской области это актуально). Для этого заходим в Приложения - Редактор форм. 1. Раскрываем поля таблицы city 2. Добавляем поле sort_order с типом safe_string, название даем "Порядок сортировки" (храниться в базе), сохраняем 3. Идем в редактирование городов (Справочники - Города), находим город Москва и указываем в поле "Порядок сортировки" значение 100. 4. Теперь возвращаемся в Приложения - Редактор форм, открываем таблицу data, находим колонку city_id, нажимаем редактировать эту колонку. 5. Находим строчку SQL-запрос, кликаем по "Показать запрос", увидим что там написано: select * from re_city order by name6. Меняем на select * from re_city order by sort_order desc, name7. Сохраняем Теперь Москва всегда будет первой в списке.
  17. 3 points
    Ну или вариант готового блока кнопок, под заголовок объявления: <div class="editblock"> <a title="На главную" href="/" class="btn btn-info"><i class="icon-white icon-home"></i></a> <a title="Назад" href="#" onclick="history.back();return false;" class="btn btn-info"><i class="icon-white icon-chevron-left"></i> Назад</a> {if $apps_pdfreport_enabled==1} <a title="Печать PDF" href="?format=pdf" class="btn btn-info"><i class="icon-white icon-print"></i></a> {/if} <a title="Печать" href="#" onClick="window.print()" class="btn btn-info"><i class="icon-white icon-print"></i></a> {if $photo|count>0} <a title="Скачать все фото" href="{$estate_folder}/imgzip/{$data.id.value}" class="btn btn-info"><i class="icon-white icon-share-alt"></i></a> {/if} {if $data.user_id.value eq $smarty.session.user_id} <a title="Редактировать" href="{$estate_folder}/account/data/?do=edit&id={$data.id.value}" class="btn btn-warning"><i class="icon-white icon-pencil"></i></a> <a title="Удалить" href="{$estate_folder}/account/data/?do=delete&id={$data.id.value}" class="btn btn-danger"><i class="icon-white icon-trash"></i></a> {/if} </div> Последние кнопки Редактировать и Удалить для удобства владельца объявления и показываются зарегистрированным - риэлтору, админу... кого определите в настройках. К стати, можете "Выгрузить все фото" переместить к показу не всем а туда-же, к зарегистрированным, если это платная услуга.
  18. 3 points
    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; }
  19. 3 points
    Для того чтобы у пользователя был после регистрации тариф по-умолчанию. Например, тариф Начальный у которого tariff_id = 1 нужно сделать в phpmyadmin вот такую операцию alter table re_user alter column tariff_id set default 1;Соответственно вам также нужно скрыть поле user.tariff_id от других групп, и должно быть доступно только администратору это поле для редактирования, чтобы пользователи сами не могли менять тарифы.
  20. 3 points
    Насущная проблема агентства недвижимости или частного риэлтора - ведение собственной базы предложений объектов и их представление/реклама на просторах Интернета, с максимальным охватом целевой аудитории. Думаю, что на настоящий момент этот вопрос максимально решен в CMS Sitebill. Гибкое решение и открытый код в CMS Sitebill позволяет адаптировать еe к конкретным требованиям владельца сайта и добавлять свои решения. Однако большинство пользователей данной CMS - далекие от программирования риэлторы, которым приходится осваивать азы программирования по ходу общения с продуктом, методом проб и ошибок, консультаций, изучения форума. Многие подсказки что и как настроить или сделать на сайте уже имеются на форуме и в Wiki, однако мало материала изложенного в простой и доступной форме, а имеющийся больше рассчитан на людей знакомых с основами PHP и HTML. Что и как работает в CMS, назначение многих настроек и функций наверное для подавляющего большинства её пользователей - большая загадка, и если на эти вопросы не находятся ответы, то вопрос откладывается в долгий ящик или вовсе забрасывается, что заканчивается обилием сайтов в зародышевом состоянии на протяжении года и более. В связи с этим, CMS сдерживается в практическом применении и как следствие - её распространенности среди риэлторов. Хорошим подспорьем являются видео-уроки по основным моментам настройки и внедрения дополнительного функционала. У CMS имеется много преимуществ перед решениями конкурентов, но для того, чтобы перейти на неё, зачастую требуется большой опыт проб и ошибок в работе с другими продуктами, желание разбираться в настройках и изучении кода, а главное - терпение + свободное время, которого всегда нет. Почему перешел на CMS Sitebill? На эту CMS наткнулся случайно, по рекламе в Интернете. В это время был достаточный опыт общения с подобными решениями конкурентов, но у них функционал был менее гибок и ограничен, техподдержка по большей части никакая, предложения по улучшениям или устранениям очевидных недоработок или ошибок - отвергались или этим просто некому было заниматься. Самостоятельно что-либо изменить - не обсуждалось и такая возможность не предоставлялась. Сторонние решения предоставлялись как есть, по большей части основанные на древних разработках со скудным функционалом и без желания разработчиков на их развитие. К этому времени пропало желание кормить сторонние сервисы солидными суммами за любой малозначимый функционал (например мета-теги к объявлениям ), как и отдавать свой бизнес под настроение владельцев этих сервисов. Примерно полгода я присматривался к CMS Sitebill, но уже сначала было понятно, что у этого проекта есть хорошая перспектива, а разработка CMS в тандеме c действующими риэлторами и руководителями агентств недвижимости, объединенными на форуме техподдержки, позволило доработать CMS до высокого уровня готовности к работе со старта и обеспечить всем необходимым функционалом. В конечном итоге я перевел свой сайт на CMS Sitebill и вполне доволен. Выгода перехода на CMS Sitebill в том, что не приходится зависеть от кого-либо, в твоем распоряжении готовое, относительно недорогое и гибкое решение с открытым кодом, что дает возможность в любое время что-то изменить, дополнить или доработать применительно к своим требованиям, требованиям рынка, SEO, поисковиков и соцсетей, сторонних рекламных порталов, поддерживая систему в технологически актуальном состоянии. Наличие готовых современных шаблонов значительно упрощает задачу по разработке сайта агентства недвижимости, а наличие дополнительных специализированных модулей расширяет возможности CMS для узко-специализированных решений в сфере недвижимости. CMS Sitebill может стать одинаково полезным и эффективным инструментом как для частного риэлтора, так и для агентства недвижимости, строительной компании, отеля, портала объявлений недвижимости. С небольшими доработками может быть применена в иных сферах - автобизнес, турбизнес, витрина или портал предложений чего-либо из однотипного ассортимента и т.п. Возможности CMS ограничены только вашей фантазией
  21. 3 points
    Легко. Пошагово для realia: 1. В первую очередь определяем, что вообще используем schema.org типа product. Для этого в шаблоне realty_view.tpl находим блок, содержащий все, что между крошками и футером/спецпредложениями - это div класса row - и корректируем под нужную нам схему: <div class="row" itemscope itemtype="http://schema.org/Product"> 2. Определяем имя продукта - это то, что находится под заголовком стиля page-header (по умолчанию, правда, это почему-то заголовок второго уровня, рекомендую поменять его h1): <h1 class="page-header"><span itemprop="name"> ЗДЕСЬ ТО, ЧТО У ВАС ИДЕТ В КАЧЕСТВЕ ЗАГОЛОВКА ОБЪЯВЛЕНИЯ, СКОРЕЕ ВСЕГО {$title} </span></h1> 3. Т.к. мы этот продукт предлагаем, то значит это тип Offer - для этого всю таблицу с характеристиками помечаем нужным образом. Ищем соответствующий <div class="noverview-short"> и меняем его: <div class="noverview-short" itemprop="offers" itemscope itemtype="http://schema.org/Offer"> 4. Добавляем изображение - для этого ищем ниже заглавное изображение объявлений вида <img src="{$estate_folder}/img/data/{$photo[0].normal}" и добавляем к нему параметр itemprop="image": <img src="{$estate_folder}/img/data/{$photo[0].normal}" itemprop="image"> 5. Все объявления актуальны? Вставляйте в любом месте тег "На складе": <link itemprop="availability" href="http://schema.org/InStock"> 6. Не забываем про ценник - система его вывода достаточно неоднозначна и скорее всего, у Вас он формируется автоматически в процедурах вывода характеристик объекта, поэтому мы с ним в стили лезть не будем, а просто пропишем отдельно. Вариант, если у Вас только рубли: <meta itemprop="price" content="{$data_shared.price.value|number_format:0:".":""}"> <meta itemprop="priceCurrency" content="RUB"> Но у меня цены есть еще и в долларах, поэтому приходится проверять - если в рублях, то рубли, если в USD, то в USD: <meta itemprop="price" content="{$data_shared.price.value|number_format:0:".":""}"> {if $data_shared.currency_id.value == 2} <meta itemprop="priceCurrency" content="USD"> {else} <meta itemprop="priceCurrency" content="RUB"> {/if} 7. Описание товара - ищем {$data.text.value|nl2br} и обволакиваем нужными нам параметрами: <span itemprop="description">{$data.text.value|nl2br}</span> 8. В принципе, основная часть готова. Проверить то, что сделали, можете в валидаторах. Валидатор от Гугла - https://search.google.com/structured-data/testing-tool Валидатор от Яндекса - https://old.webmaster.yandex.ru/microtest.xml Рекомендую пользоваться и тем, и другим - причем в отличие от мобильной дружелюбности, здесь гугл гораздо строже. PS: модераторы, исправьте, пожалуйста, название этой темы - не хватает одной буквы в слове sChema.org
  22. 3 points
    mmkulikov

    Убираем page=1

    Для устранения дублей страниц, т.к. страница пагинации page=1 является дублем страницы без пагинации Добавляем в main.php шаблона в самом начале функции main следующий код: $r_uri = $_SERVER['REQUEST_URI']; // Полная строка с GET параметрамиif (preg_match("#([\?\&]+page=1)\D*$#",$r_uri,$matches)) {$new_location=SITEBILL_MAIN_URL.str_replace($matches[1],"",$r_uri);header('HTTP/1.1 301 Moved Permanently');header('Location: '.$new_location);exit();} // Убираем page=1 из урл
  23. 3 points
    Уже пол года я иду с CMS Sitebill за руку и я реально доволен, мне нравится что разработчики не стоят на месте и постоянно улучшают и всячески дополняют свой продукт, мне нравится что в обновлениях и дополнениях я вижу все мои пожелания, которыми я делюсь у них на форуме, мне нравится постоянная онлайн помощь и поддержка от разработчиков, мне нравится цена за услуги, мне нравится философия которой они руководствуются при создании всего, мне нравится когда в ответ на мои бредовые порою пожелания мне отвечают позитивно и доброжелательно! Да господи я вообще счастлив что встретил этих ребят
  24. 3 points
    Суть Разрешить просмотр контактных данных объявления для пользователей, которые подключили и оплатили некоторый список просмотра (СП). Список просмотра регламентирует количество дней на протяжении которых доступен просмотр контактов и стоимость данного периода. Подключение СП проходит через раздел Личного кабинета (ЛК), а оплата списка производится из ЛК посредством Робокассы. Намеренно исключаю возможность задания СП при регистрации, когда вместе с регистрационными данными пользователь должен выбрать конкретный вариант СП, что бы унифицировать процедуру пользования СП для обычных пользователей и пользователей регистрирующихся через соцсети. Пример будет приведен на базе шаблона realia, но для любого другого шаблона принцип будет аналогичен. Приницип работы При загрузке страницы происходит извлечение СП для текущего пользователя. Если есть в наличии хоть один активный для данного момента времени СП в переменную сессии сохраняется состояние "открыто". Этот параметр проверяется в местах, где необходим вывод контактны данных и средствами шаблона принимается решение - выводить или скрыть блок с контактными данными. Задействованные приложения registersms - приложение используется формально. Находится в выключенном состоянии и служит для хранения настроки соотношения периода СП и цены за этот период. В принципе не критично и может быть реализовано отдельной настройкой watchlistmanager - приложение-хранилище функционала для работы СП. Должно быть, быть включенным и установленным. настройки Робокассы - must have Необходимые файлы Набор вспомогательных файлов можно скачать тут Файлы в архиве расфасованы согласно структуре шаблона. Т.е. то, что находится в папке main должно лечь в папку main вашего шаблона etc. Изменения В файле main.php Внутри class frontend_main extends SiteBill_Krascap {...} добавляем функцию getViewOptions, которая загружает СП для пользователя. Код функции копируем из http://pastebin.com/8rMZNU4U В функции main() производим вызов вставленной выше функции и загрузку цен на СП из конфигурации. Общий код изменений тут Блок А вставляем после строк $work_subcontroller='';$has_result=false;$undetected_url=false;Блоком Б заменяем блок if ( !$has_result && preg_match('/\/robox/', $_SERVER['REQUEST_URI']) ) {...}Блоком В дополняем ветвистость if ( preg_match('/^account\/profile/', $REQUESTURIPATH) ) {перед последним }else{ В файле header.tpl Добавляем кусочек, заносящий цены в переменные скриптов {literal}<script type="text/javascript">var _costs={/literal}{if $_costs ne ''}{$_costs}{else}[]{/if}{literal};</script>{/literal}Блок ставится в любом месте между тегами <head> и </head> В файле realty_view.tpl Фактически основные функциональные изменения, которые скрывают контактные данные. Находим блок, отображающий контактные данные и обрамляем его конструкцией {if $smarty.session.viewOptions.mode=='opened'}<!--Тут собственно контактные данные-->{else}Оплатите доступ к данным или другая информация{/if}Настройка Руководящими настройками для работы СП являются настройка цен. Соответствие цен и длительности периодов указывается в переменной Настройки - Регистрация через SMS - Стоимость категорий (apps.registersms.costs_array). Значения задаются в виде строки {N1:P1}{N2:P2}{N3:P3}{N4:P4}{N5:P5} - где N- длительность периода. По-умолчанию в днях. Р- стоимость этого периода. Например: {1:70}{2:100}{3:150}мы предусматриваем открытие просмотров контактов в вариантах на 1, 2 или 3 дня с соответствующими стоимостями 70, 100 и 150 рублей. Кроме этого места необходимо еще указать допустимые периоды (продублировать) в обработчике СП - /template/frontend/шаблон/main/local_watchlistmanager.php. В этом файле необходимо найти функцию getWLModel() и в ней изменить строку $form_data['period']['grade_values'] = array('1', '2', '3', '7', '31');где указать наш перечень периодов $form_data['period']['grade_values'] = array('1', '2', '3');Замечание Шаблон realia оборудован плагином-украшателем ezMark, который, не смотря на свою красивость, доказал несостоятельность при работе с элементами типа radio - кружочки с точечками в форме. Поскольку форма добавления СП использует именно такие элементы, а в остальных формах мы практически не используем их, то рекомендую сузить область работы этого плагина только элементами типа checkbox. Для этого в файле /template/frontend/realia/js/realia.js в функции InitEzmark() следует закомментировать строку $('input[type="radio"]').ezMark();
  25. 3 points
    XTRO

    Полезные ресурсы (for dev)

    Where.io — вручную подобраные ресурсы на разные темы cssreflex — наглядным образом посмотрим про CSS вкусности Clusterize.js — плагин для отображения больших обьемов данных
  26. 3 points
    Задача скорее практически не решаемая. Такое решение оптимально подходит для систем где есть однозначный признак сортировки - например соцсети, где фактически сортирующим признаком является идешка, направление роста которой всегда направлено в сторону увеличения. Что позволяет постраничные выборки делать в виде дополнительной фильтрации "от уже показанного ид и выше" обрезая полученную выборку от начала на длинну записей на странице. В результате запросы лимитируются по виду LIMIT N, что оч хорошо. В работе с недвижкой сортирующих факторов больше чем один, а самый "удобный" - по ид - является так же и самым бесполезным. Поэтому все постарничные запросы приходят к виду LIMIT M, N. А принцип выборок по таким запросам весьма трудоемок с ростом M. Т.е. если вам нужно получить 5-ю страницу и на странице у вас 10 объектов, то по факту вам нужно выдернуть с базы 50-объектов и первые 40-к выкинуть. Естественно на 1000-й странице объемы возрастут. Так что тут дело не в количестве на страницу, а скорее в балансе между количеством на страницу и количеством страниц. Для поисковика по факту важна первая страница из постранички. Вторую и далее он вообще не должен видеть. А первая обычно ВСЕГДА загружается менее напряжно по сравнению с остальными. Так что не парьте голову и учитывайте именно удобство людей. Листать странички по 3 объекта и листать списки по 500\страницу - две крайности.
  27. 3 points
    К сожалению, это проблема скрипта prettyPhoto. Везде где я сталкивался с этим скриптом, присутствует данная проблема. Точно уже не помню, но если мне не изменяет память, то я избавлялся от этой проблемы путем добавления подобной строчки $("a[rel^=prettyPhoto]").prettyPhoto({deeplinking: false});
  28. 3 points
    Smoke

    Предложения для будущих версий.

    Предлогаю в будущем сделать вариант выбора категорий продажи и аренды по отдельности. К примеру пользователь выбирает тип размещаемого объявления Продажа или Аренда и далее открывается второй селект бокс с вариантами для продажи или аренды соответственно. Актуально для тех, у кого много категорий и подкатегорий. При добавлении или поиске слишком длинный список вариантов открывается и это хороший вариант его уменьшить.
  29. 3 points
    Я тоже хочу сказать немного об этом движке. У меня тоже был выбор между двумя платными CMS, но выбрал эту. Честно сказать не жалею. То что хотел сделать, я сделал малыми потерями для себя, так как немного понимаю в этом всем, но и помощь была оказана. Конкуренты мне завернули такую сумму за переделки, которые нужны были мне, что у меня волосы дыбом встали. С точки зрения тех поддержки тут все нормально. С точки зрения функциональности даже самой админки, есть много вопросов (я думаю все доведут до ума). Но и конечно же что меня смутило больше всего это отсутствие описания по каждой функции, некоторые настройки вообще не понятны, приходится все проверять методом научного тыка. Документации тоже не очень много, либо она очень сложная для понимания. В оправдание хочу сказать что многие популярные движки начинали точно так же, все приходит со временем. Джумлу постоянно улучшают вот уже больше 10 лет. Подводя итог хочу сказать вот что: 1) не жалею о выбранном движке, 2) ребята доведут до ума не только функционал, но и все настройки 3) а так же выпустят онлайн документацию, возможно даже со всеми наработками, которые уже приходилось делать для пользователей
  30. 3 points
    Файл main.tpl, закомментировать или удалить строку <li><a href="#" data-toggle="modal" data-target="#prettyLogin">{$L_LOGIN_BUTTON}</a></li>меню Вход ↑ <li><a href="#" data-toggle="modal" data-target="#prettyLogin">{$L_AUTH_REGISTRATION}</a></li> меню Регистрация ↑ <a class="btn btn-primary btn-small" data-toggle="modal" href="{$estate_folder}/logout/">{$L_LOGOUT_BUTTON}</a>меню Выход, файл top_fixed_menu.tpl.html ↑
  31. 3 points
    AndreyTs

    Предложения для будущих версий.

    Хочу опробовать внести свою небольшую лепту. Может что и звучало уже тут но не увидел. Исхожу в первую очередь из своего опыта работой с DLE и что не увидел здесь и мне кажется этого зря нет. 1. Работа с базой данных. Что бы можно было из админки а не заходя на сервер, сохранять базу данных перед любыми изменениями на сайте которые могут внести некорректность в работу CMS, то есть одной кнопкой сохраняем, второй можно восстановить базу. Пример этого на вложенной картинке. 2. По рекламного блоку в движке, а именно по блоку который называется VIP. Сделать что бы реклама показывать не бездумно где попало и кому попала, а по выбранным категориям. То есть если есть на сайте несколько городов, ну или даже в случае если город всего один то есть аренда допустим квартир и гаражей, есть продажа домов. И что бы не было это мешанине в блоке. Присвоить каждому меню свою категорию и при установки рекламы, что бы можно было выбрать в каких категориях её крутить а в каких не надо. Пример как на DLE. Обсуждение по этой теме вёл уже в http://www.etown.ru/s/topic/2308-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD-agency/
  32. 3 points
    Не понимаете разницу между фиксированной, резиновой, адаптивной и отзывчивой вёрсткой? Сайт Liquidapsive демонстрирует их различия. Можно выбрать интересующий вас тип вёрстки и изменить размеры окна браузера, чтобы посмотреть, как он себя ведёт в разных условиях.
  33. 3 points
    Дмитрий Кондин

    Обновление 2.8.2

    Сначала обновить system до 2.8.2 Затем приложения admin, table, columns, config, comment (у кого есть). В обновлениях: 1. Заменили редактор структуры, теперь удобнее удалять и редактировать. 2. Добавили новый тип загрузчика картинок (в редакторе форм для таблицы data - удалить старое поле image и добавить новое поле image с типом uploads и отмеченной галочкой "Хранить значение поля в таблице") 3. В конфиге добавились опции: Не публиковать объявления из ЛК без премодерации, Использовать встроенный счетчик просмторов (когда он выключен, то работает система гораздо быстрее), Mailer: Отключить передачу дополнительных флагов в заголовках письма - на некоторых хостингах с этим флагом почта не идет, Сохранять копию изображений без водяного знака (для этого нужно создать каталог /img/data/nowatermark/Вскоре сделаю видео об этих новых функциях и их использовании. NB. Поле типа uploads по сути не является заменителем для поля типа uploadify_image. Мы предприняли некоторые действия для поддержания новым полем старых данных, но, в первую очередь, следует рассматривать поле типа uploads как новый тип данных со схожим с uploadify_image функционалом. (abushyk)
  34. 3 points
    Спасибо разобрался. Если кому нужно то выводиться вот таким кодом {$grid_items.img|count}
  35. 3 points
    Нашел решение. Может кому еще сгодится /*** Получение количества объявлений* @param int $catID - ID категории (необ.)* @param date $start - Дата начала публикаций (необ.)* @param date $end - Дата конца публикаций (необ.)** @return array $ret****/ private static function getAdvtCount($catID=false,$start=false,$end=false) { $ret = array(); $where = ""; $table = "`".DB_PREFIX."_data`";$DBC=DBC::getInstance(); if (false !== $catID) $where = " AND $table.`topic_id` = $catID"; if (false !== $start && false === $end ) $where .= " AND $table.`date_added` <= '$start'"; if (false === $start && false !== $end ) $where .= " AND $table.`date_added` >= '$end'"; if (false !== $start && false !== $end ) $where .= " AND ($table.`date_added` <= '$start' AND $table.`date_added` >= '$end')"; $query = "SELECT count(*) AS total FROM $table WHERE $table.`active`=1".$where; $result = $DBC->query($query); if ($result) {while($r = $DBC->fetch($result)){$ret[] = $r; } } return $ret; }
  36. 3 points
    Возрадуйтесь люди! Грядет новая форма поиска! Вводите здесь в Вид деятельности что-нибудь и выбирайте, а потом снова вводите http://base.line-inform.ru/
  37. 3 points
    2015/05/26 21:26:57 [error] 69392#0: *58461 FastCGI sent in stderr: "PHP message: PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0" while reading response header from upstream, request: "POST /js/ajax.php?action=get_my_favorites HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fpm.sock:"2015/05/26 21:26:57 [error] 69392#0: *58461 FastCGI sent in stderr: "PHP message: PHP Warning: Cannot modify header information - headers already sent in Unknown on line 0" while reading upstream, client: 82.116.42.42, server: arb64.ru, request: "POST /js/ajax.php?action=get_my_favorites HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fpm.sock:"Собственно о чем тема.Переносил сайт со старого хостинга на новый, на старом была версия php 5.3, а на новом 5.6. Принципиально не стал понижать, дабы использовать самую последнююСобственно на 5.3 ошибки этой не было а на 5.6 естьНа стандартном шаблоне при переходе по вкладками Избранное и Спецпредложения, была вечная "Загрузка"Поставил в php.ini значение always_populate_raw_post_data="-1" и все заработалоМожет кому пригодитсяСпасибо.
  38. 3 points
    johnsage

    .htaccess

    # Блокируем хитро..ые (Request) запросы через .htaccess <ifModule mod_alias.c> RedirectMatch 403 /(\$|\*)/?$ RedirectMatch 403 (?i)(<|>|:|;|\'|\s) RedirectMatch 403 (?i)([a-zA-Z0-9]{18}) RedirectMatch 403 (?i)(https?|ftp|php)\:/ RedirectMatch 403 (?i)(\"|\.|\_|\&|\&amp)$ RedirectMatch 403 (?i)(\=\\\'|\=\\%27|/\\\'/?)\. RedirectMatch 403 (?i)/(author\-panel|submit\-articles)/?$ RedirectMatch 403 (?i)/(([0-9]{5})|([0-9]{6}))\-([0-9]{10})\.(gif|jpg|png) RedirectMatch 403 (?i)(\,|//|\)\+|/\,/|\{0\}|\(/\(|\.\.|\+\+\+|\||\\\"\\\") RedirectMatch 403 (?i)/uploads/([0-9]+)/([0-9]+)/(cache|cached|wp-opt|wp-supercache)\.php RedirectMatch 403 (?i)\.(asp|bash|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf|well) RedirectMatch 403 (?i)/(^$|1|addlink|btn_hover|contact?|dkscsearch|dompdf|easyboard|ezooms|formvars|fotter|fpw|i|imagemanager|index1|install|iprober|legacy\-comments|join|js\-scraper|mapcms|mobiquo|phpinfo|phpspy|pingserver|playing|postgres|product|register|scraper|shell|signup|single\-default|t|sqlpatch|test|textboxes.css|thumb|timthumb|topper|tz|ucp_profile|visit|webring.docs|webshell|wp\-lenks|wp\-links|wp\-plugin|wp\-signup|wpcima|zboard|zzr)\.php RedirectMatch 403 (?i)/(\=|\$\&|\_mm|administrator|auth|bytest|cachedyou|cgi\-|cvs|config\.|crossdomain\.xml|dbscripts|e107|etc/passwd|function\.array\-rand|function\.parse\-url|livecalendar|localhost|makefile|muieblackcat|release\-notes|rnd|sitecore|tapatalk|wwwroot) RedirectMatch 403 (?i)(\$\(this\)\.attr|\&pws\=0|\&t\=|\&title\=|\%7BshopURL\%7Dimages|\_vti\_|\(null\)|$itemURL|ask/data/ask|com\_crop|document\)\.ready\(fu|echo.*kae|eval\(|fckeditor\.htm|function.parse|function\(\)|gifamp|hilton.ch|index.php\&amp\;quot|jfbswww|monstermmorpg|msnbot\.htm|netdefender/hui|phpMyAdmin/config|proc/self|skin/zero_vote|/spaw2?|text/javascript|this.options) </ifModule>
  39. 3 points
    Прошу прощения за малоинформативное сообщение. Имелось в виду отключение блоков Наши агенты и Агент в шаблоне Realia без правки кода. Думал, что можно отключить виджет с классами widget our-agents через настройки без удаления или комментирования кода.
  40. 3 points
    XTRO

    css3 и IE 6-9

    если кому-то принципиально нужно http://css3pie.com/
  41. 3 points
    В самом общем случае: {if $smarty.session.user_id eq ''}<a class="btn btn-primary btn-large list-your-property arrow-right" href="{$estate_folder}/add/">{$L_ADD_ADV}</a>{else}<a class="btn btn-primary btn-large list-your-property arrow-right" href="{$estate_folder}/register/">{$L_ADD_ADV}</a>{/if}если делать на кнопках. Если копнуть глубже, то в main.php шаблона найти блок if ( !$has_result && preg_match('/^add(\/?)$/', $REQUESTURIPATH) ) {...}и в нем добавить условие if ( !$has_result && preg_match('/^add(\/?)$/', $REQUESTURIPATH) ) { if(0==(int)$_SESSION['user_id']){ header('location: '.SITEBILL_MAIN_URL.'/register/'); exit(); } ... тут все что было}
  42. 3 points
    Дмитрий Кондин

    Вопросы от новичка 1.0

    Так как сюда пишут уже все подряд, и никто здесь уже ничего толком найти не сможет решено закрыть тему. Теперь общие темы будут глушиться. Только конкретные заголовки и только конкретные вопросы.
  43. 3 points
    Берем файл /template/frontend/realia/realty_view.tpl Добавляем код {if $data.user_id.value eq $smarty.session.user_id}<a href="{$estate_folder}/account/data/?do=edit&id={$data.id.value}">Редактировать</a>{/if}
  44. 3 points
    Поскольку в Sitebill'e есть модуль Робокассы и возможность клиенту внести деньги на счет агентства, может есть смысл организовать платные услуги для клиентов - запрос выписок из ЕГРП, кадастровых паспортов, внесение денег в счет бронирования объектов (если клиент не местный)... Смысл предполагается в том, что клиент заходит на сайт, заказывает ту или иную услугу (список и расценки на которые редактирует админ), выставляет себе счет и оплачивает через Робокассу (соглашаясь с договором оферты)... далее риэлтор бегает ножками а клиент впоследствии получает свою справочку... Если тема интересна, наверное есть смысл сразу продумать форму заказа, поскольку от клиента нужны будут сведения по объекту недвижимости - адрес, кадастровый или условный номер и т.п., собственно эти сведения могу указать дополнительно. Может быть и решить вопрос таким образом, чтобы по результату запроса клиента, на стороне агентства сразу составлялась или печаталась форма заявления в Росреестр.... Образцы тоже могу выслать. Может быть и в ЛК клиента сделать список заказов и присваивать им статус, как в интернет-магазине "Принято", "В работе", "Исполнено" с отправкой результата по электронке или иным вариантом. Клиенты иногда такими услугами интересуются, почему-бы не автоматизировать? Как идея?
  45. 3 points
    Realtor

    Предложения для будущих версий.

    Добавить в базу таблицу черный список телефонов. При добавлении объявления через ссылку на сайте добавить объявление или через загрузку exel файла или при загрузке xml файла, будет происходить сравнение номера телефона подающего объявление с черным списком. В случае совпадения объявление с таким телефоном не будет активироваться и попадать в архив с определенной пометкой. Механизм поиска по номерам телефонов уже есть в админке.
  46. 3 points
    http://www.youtube.com/watch?v=2L9_Tmxg5jY
  47. 3 points
    В ЛК разделить таблицу объявлений на Все Активные Архив (неактивные) Корзина с возможностью оптовой Активации, Деактивации, Удаления и Восстановления
  48. 3 points
    Итак, мы имеем набор полей: is_wifi Наличие интернета - поле типа checkbox. На форме присутствует в сиде чекбокса. floor_type Тип покрытия пола - select_box с вариантами {0~~не указано}{1~~плитка}{2~~дерево}{3~~ламинат} - отображается в виде выпадающего списка sea_distance Расстояние до моря. Тип safe_string, но отмеченный как is_ranged=1, что бы в форме поиска выводилось в виде двух полей - макс. и мин. значения. Мы добавили эти поля в модель, каким-то образом разместили их на формах поиска. Теперь главная задача - заставить движек обработать их. Для этого существует файл шаблонного поиска, который размещается в /template/frontend/имя_шаблона/main/ и носит имя template_search.php и не иначе. При наличии этого файла движек автоматически обратится к нему и запросит данные для осуществления выборки. В минимальной комплектации этот файл состоит из класса и двух функций: http://pastebin.com/TmBSS9q8 Задача функции getParams забрать данные из запроса и подумать, стоит ли их передавать дальше. А функции run, к которой обращается движек за данными, решить каким образом следует сравнить\обработать полученные параметры для формирования нужной выборки данных. Итак, поехали. 1 Начнем с самого простого - чекбокса is_wifi. Чекбоксы отличаются тем, что в запросе они либо приходят, либо нет. Из запроса берем его функцией $this->getRequestValue('is_wifi'), которая возвращает значение NULL, если такого параметра не существует. if(NULL!==$this->getRequestValue('is_wifi')){ $params['is_wifi'] = 1; } Проверили, не пусто ли, если нет, значит чекбокс отметили и мы записываем его в $params в виде утвердительной единицы. Единицы потому, что в принципе больше нам инфы не нужно, достаточно знать, что параметр запрошен. Дальше floor_type. Этот тип передается в запрос в виде ключа своих значений. Т.е. выбрав "дерево" в запрос у нас приедет "2". Значит мы знаем, что будет целая цифра. if(0!==(int)$this->getRequestValue('floor_type')){ $params['floor_type'] = (int)$this->getRequestValue('floor_type'); } Мы гарантированно делаем из значения параметра целое число с помощью (int) и сравниваем его с 0 - нашим значением никакого значения. Если оно не равно нулю, значит пользователь запросил конкретный тип покрытия и мы сохраняем его значение в $params['floor_type']. Но сохраняем уже конкретным начением, таккак, в отличии от чекбокса, тут нам важно само значение, а не его наличие. sea_distance. При использовании пользовательских форм, которые енерирует движек на основе ваших выборок это поле представится в виде двух полей с именами созданными по принципу sea_distance_min и sea_distance_max. Соотв. и дву переменные прийдут в запросе. Каждую ловим отдельно. Для простоты допустим, что мы готовы обработать целые расстояния до моря: 1, 5, 100. if(0!==(int)$this->getRequestValue('sea_distance_min')){ $params['sea_distance_min'] = (int)$this->getRequestValue('sea_distance_min'); } if(0!==(int)$this->getRequestValue('sea_distance_max')){ $params['sea_distance_max'] = (int)$this->getRequestValue('sea_distance_max'); } Принцип прост. Мы приводим значение к целому. Если пользователь вписал в поле не число, а "аврцуоац" строку, она приведется к нулю. И сравниваем все это с нулем. Искать по нулевому значению смысла нет, поэтому мы сохраняем только те значения, которые от него отличны. Разницы между мин и макс значением в момент их забора из запроса мы не делаем. Она не важна сейчас, но будет важна в следующей функции. 2 Переходим к функции run() Методика ее работы такая 1. взять параметр 2. создать кусочек запроса. Для чекбокса if(isset($params['is_wifi']) && isset($data_model_array['is_wifi'])){$where_array[]=DB_PREFIX.'_data.is_wifi=1';}Расшифровка. Проверяем, есть ли в параметрах запроса переменная is_wifi и есть ли в нашей модели поле с таким именем (так как условие может быть, а поле мы давно погасили за ненадобностью). Если все эти условия выполнены, мы указываем, что хотим дополнить условия нашего запроса сравнением, которое выберет записи, где is_wifi равно1, т.е. при сохранении записи был отмечен чекбокс. Для floor_typeif(isset($params['floor_type']) && isset($data_model_array['floor_type'])){$where_array[]=DB_PREFIX.'_data.floor_type='.$params['floor_type'];}Все аналогично предыдущему за исключением того, что тут мы просим сравнить поле floor_type записи, которое хранит ключ указанного типа покрытия, с переданным в запросе. Для ранжированного sea_distance if(isset($params['sea_distance_min']) && isset($data_model_array['sea_distance'])){$where_array[]=DB_PREFIX.'_data.sea_distance*1>='.$params['sea_distance_min'];}if(isset($params['sea_distance_max']) && isset($data_model_array['sea_distance'])){$where_array[]=DB_PREFIX.'_data.sea_distance*1<='.$params['sea_distance_max'];}И тут почти без изменений. Главное отличие - мы устанавливаем условия в зависимости от того _max или _min параметр мы хотим сравнить. Обратите внимание на DB_PREFIX.'_data.sea_distance*1. В неоптимизированных БД сайтбилля поля под safe_string имеют строковой тип. Поэтому, что бы не было строкового сравнения, где строковое "2" больше строкового "100", мы принудительно делаем значение поля числом перед сравнением. И тогда уже будет натуральное сравнение, где 2<100. и вот примерно вот так http://pastebin.com/8jX7WEEH все єто будет выглядеть в конце.
  49. 3 points
    Сегодня я расскажу как поменять внешний вид (отображение блоками). Урок достаточно простой. Для начала мы продумаем как мы хотим видеть наш блок. 1.Создаем разметочную область, сам блок. Задаем высоту, ширину, прижимаем влево. .boxt{width: 212px;height: 350px;margin: 40px auto;float: left;margin-left: 15px;position: relative;}2 Добавляем обводку блока для изображения border: 1px solid rgba(39, 33, 33, 0.27);3 Создаем 3 блока с датой, id и тип квартиры .boxt_data {width: 45px;height: 20px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}.boxt_id {width: 45px;height: 20px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}.boxt_tip {width: 102px;height: 20px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}4. Добавляем блок изображения .boxt_image {width: 200px;height: 150px;margin: 0px auto;float: left;margin-left: 5px;border: 1px solid rgba(39, 33, 33, 0.27);position: relative;}5. Создаем 4 разметочные области для блоков .boxt_1 {width: 200px;height: 155px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}.boxt_2 {width: 210px;height: 30px;margin: 0px auto;float: left;margin-left: px;position: relative;}.boxt_3 {width: 210px;height: 30px;margin: 0px auto;float: left;margin-left: px;position: relative;}.boxt_4 {width: 200px;height: 60px;margin: 0px auto;float: left;margin-left: 5px;margin-top: -5px;position: relative;border: 1px solid rgba(39, 33, 33, 0.27);}6.В каждой из разделочных областей мы создадим индивидуальные блоки с нужной нам информацией. Я взял такие как город, улица, площадь и описание. .boxt_g {width: 45px;height: 20px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}.boxt_g1 {width: 152px;height: 20px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}.boxt_u {width: 202px;height: 20px;margin: 0px auto;float: left;margin-left: 5px;position: relative;}.boxt_p {width: 45px;height: 20px;margin: 0px auto;float: left;margin-left: 5px;position: relative;}.boxt_p1 {width: 152px;height: 20px;margin: 0px auto;float: left;margin-left: 5px;position: relative;}7. добавим еще 2 блока ( 1 с ценой – 2 с избранным) так же создадим для них разделочную область. Поместим данный блок в блок с изображением. .boxt_ipr {width: 210px;height: 30px;margin: -32px auto;float: left;margin-left: 5px;position: relative;}.boxt_i {text-align: center;width: 25px;height: 20px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}.boxt_pr {text-align: center;width: 157px;height: 20px;margin: 5px auto;float: left;margin-left: 5px;position: relative;}8.Теперь приступим ко второму этапу и по-моему мнению самому важному. Мы будем украшать наши блоки, напишем для них стили. 8.1. блоку .boxt_data, .boxt_id, .boxt_tip мы зададим цвет фона, цвет текста, и зададим положение текста по центру. background:#5599E4;color:white;text-align: center;8.2 аналогично действие мы выполним с другими блоками 9. Теперь для блока boxt_pr добавим размер и цвет текста color: #EBE6E8;font-size: 20px;10. Приступаем помещаем основные функции в созданные нами блоки {section name=i loop=$grid_items} <div class="boxt"> <div class="boxt_data"> {$grid_items[i].date} </div> <div class="boxt_id"> ID {$grid_items[i].id} </div> <div class="boxt_tip"> {$grid_items[i].type_sh} </div> {if $grid_items[i].img != '' } <div class="boxt_image"> <a href="{if $grid_items[i].url!=''}{$grid_items[i].url}{else}{$grid_items[i].href}{/if}" title="{$grid_items[i].city}/{$grid_items[i].district}/{$grid_items[i].street}"> <img src="{$estate_folder}/img/data/{$grid_items[i].img[0].preview}" alt="{$grid_items[i].city}/{$grid_items[i].district}/{$grid_items[i].street}" width="110" /> </a> <div class="boxt_ipr"> <div class="boxt_i"> {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} </div> <div class="boxt_pr"> {$grid_items[i].price|number_format:0:",":""} </div> </div> </div> {else} <div class="boxt_image"> <a href="{if $grid_items[i].url!=''}{$grid_items[i].url}{else}{$grid_items[i].href}{/if}" title="{$grid_items[i].city}/{$grid_items[i].district}/{$grid_items[i].street}"> <img src="{$estate_folder}/img/no_foto.png" alt="{$grid_items[i].city}/{$grid_items[i].district}/{$grid_items[i].street}" width="110" /> </a> <div class="boxt_ipr"> <div class="boxt_i"> {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} </div> <div class="boxt_pr"> {$grid_items[i].price|number_format:0:",":""} </div> </div> </div> {/if} <div class="boxt_1"> <div class="boxt_g"> г. </div> <div class="boxt_g1"> {if $grid_items[i].city ne ''} {$grid_items[i].city} {/if} </div> </div> <div class="boxt_2"> <div class="boxt_u"> {if $grid_items[i].street ne ''} {$grid_items[i].street} {if $grid_items[i].number ne ''}, {$grid_items[i].number}{/if} {else} {if $grid_items[i].street ne ''} {$grid_items[i].street} {if $grid_items[i].number ne ''}, {$grid_items[i].number} {/if} {/if}{/if} </div> </div> <div class="boxt_3"> <div class="boxt_p"> пл. </div> <div class="boxt_p1"> {if $grid_items[i].square_all ne ''}{$grid_items[i].square_all}{else}-{/if} / {if $grid_items[i].square_live ne ''}{$grid_items[i].square_live}{else}-{/if} / {if $grid_items[i].square_kitchen ne ''}{$grid_items[i].square_kitchen}{else}-{/if} </div> </div> <div class="boxt_4"> {$grid_items[i].text|strip_tags|truncate:200} </div></div>{/section}Ну вот и все . Пользуемся на здоровье. P.S. перед тем как изменять что-то на своем сайте ОБЯЗАТЕЛЬНО ДЕЛАЙТЕ КОПИЮ!!! Р.s/s/s/s/s Изменения писались под чистую систему (считается та система которая только-что установлена). Но если вы не делали координальных изменений то можете смело заливать. Если Вам интересны мои уроки то пишите отзывы Вы можете написать сами или просто заменить файл который находиться ниже. realty_grid_thumbs.tpl.html
  50. 3 points
    Не согласен насчет сайта, если ваше агентство предусматривает работу исклчительно с помощью сайта, тогда да. А если вы планируете обычное и пресловутое агентство коих миллионы тогда и сайт вам ненужен. Я бы посоветовал начать с базы квартир и клиентской базы. Все супер крутые департаменты недвижимости, которые я видел на протяжении 5 лет стажа работают на "коленке с тетрадочкой";-)))