abushyk

Модераторы
  • Публикации

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

  • Посещение

  • Days Won

    269

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

  1. Если ему это будет нужно чуть дольше, чем до первого обновления, то лучше сделать как я написал)))
  2. И даже такая словарная метка оказывается есть))) Только не меняем. А в папке шаблона создаем набор папок /apps/search/language/ru/ (в папке шаблона папку apps, в ней папку search, в ней папку language, в ней папку ru - если какие-то папки уже есть, например apps, то создавать не нужно ее по второму разу) В него кладем копию файла /apps/search/language/ru/dictionary.ini с таким же именем. Удаляем из него все, кроме строки SEARCH_PLSH="Поиск по ключевым словам (через пробел)" сохраняем и в нем уже вносим правку.
  3. Админка - редактор форм. Разворачиваете таблиц data (кликаете в синюю полосу где указано название таблицы) и выводится список ее полей модели. Первая колонка на латиннице - это системное имя поля модели. В большинстве случаев оно соответствует "своей" колонку в таблице re_data в базе данных. Исключением будут только поля которіе не хранятся в дата напрямую (мультививыборный селект) или, например поле типа geodata, которое имеет в модели имя geo, но в бд хранится в re_data в двух колонках - geo_lat и geo_lng. Но для простых полей типа safe_string и textarea соотвествие будет один один. Поля типа выбиралки (select_box, selectbox_by_query) хранятся так же в этой таблице по своему имени, но в качестве значения у них в БД не текстовое значение (имя риелтора или название города), а айдишка соотв. записи из другой таблицы или ключ значения (select_box). Для selectbox_by_query (города\районы\юзеры) название таблиці где они лежат можно посмотреть, если открыть в Редакторе форм нужный элемент на редактирование в поле "Имя таблицы для связки". И уже в ней по айдишке из ре_дата можем найти в нужной таблице искомое текстовое значение.
  4. сайт не выводится в топ. в топ выводятся отдельные страницы сайта. а теперь представьте, что у вас есть две страницы, отвечающие на один запрос своим контентом. естественно, что они будут конкурировать друг с другом, отбирая вес друг у друга. и при этом им еще нужно конкурировать со страницами других сайтов. именно поэтому и делаются лендинговые и посадочные страницы, заточенные под конкретный запрос по самое нехочу и продвигаются всеми способами от общедоступных, до платной рекламы. А дальше с этих страниц уже начинается разводка ссылками на другие страницы. Продвигать эфективно одну страницу всегда легче чем "больше, чем одну". мы использовали следующий способ - сначала закрывали вообще все. потом раскрывали только страницы типа раздел-страна - групп ирующие. потом открывали уже карточки. что бы вес первыми набрали именно нужные страницы. ссылки на результаты поиска, на сортировки списков, на страницы в пейджере - банились сразу и навсегда. результаты тех же списков далее первой страницы робот всегда найдет через сайтмап. сортировки и фильтры поиска возвращают дублирующиеся результаты в неописуемых количествах страниц - мне не нужно миллион страниц в индексе, которые будут шататься на 100-й странице. Мне лучше иметь 10-20 страниц в 1-3 странице результата. Зацепившийся за топовую страницу клиент попадет на сайт и там уже сам будет путешествовать. хоть через фильтр, хоть через страницы.
  5. Гугль делайет щадящую компресиию просто удаляя лишние отступы и незначащие пробелы. Обычно такую компрессию легко привести к норм читаемому виду декомпрессером. Сторонние ресурсы обычно имеют два режима компресии - полный, когда жмется все до самого упора и щадящий, когда читабельность в какой-то мере сохраняется. Превый критичен для яваскриптов - в них даже имена функций ужимаются в однобуквенные идентификаторы и, кроме снижения читабельности, мы еще получаем полную невозможность расжать файл до исходного состояния.
  6. Вот тут есть пример генератора У вас на руках модель объекта с данными $form_data_shared и вы уже на свое усмотрение что-то берете из нее, что-то тянете дополнительно и заполняете поля схемы.
  7. Получают со ссылок на странице - напрмер с педжеров, с сортировочных ссылок, если они есть и т.д. + допускаю, что с метрики и подобных аналитических инструментов. Преобразовать их через линк-менеджер маловероятно, та ккак в зависимости от количества параметров на форме количество вариантов таких адресов начинает стремиться к огромным цифрам. Такие адреса следует закрывать в robots.txt. Например директивами Disallow: /?* Адреса, содержащие параметры в себе, обычно априори являются дублями основного адреса - так как параметры - это модификаторы чего-то.
  8. Для начала вставьте после RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L] или конкретно под домен, если у вас сайт доступен только с одного домена RewriteCond %{HTTP_HOST} ^www.rumagnolia.ru$ [NC] RewriteRule ^(.*)$ http://rumagnolia.ru/$1 [R=301,L] Этого может и не быть в htaccess, так как это настройка не самого редиректа, а настройка сервера и она может быть включена на самом сервере.
  9. 1. То, что стоит опция - использовать мыло как логин, никак не отменяет наличия поля логина в модели юзера. Она просто говорит, какой из параметров юзера будет использован для проверке при авторизации. Оно может существовать и вместе с мылом, просто исполняьь например роль никнейма, а для авторизации будет использоваться именно мыло. Убрать его с формы регистрации можно либо удалив из модели бюзера, либо сделав там неактивным или необязательным. 2. Кнопку вернул. 3. Эти полдсказки показывают какие поля не заполнены. Я доабвил стиль их скрытия до первого нажатия кнопки Сохранить.
  10. Тогда пока оставим как есть, а в новую версию карточки я добавлю переменную с таким массивом родительских разделов, что бы не приходилось так изгибаться.
  11. 1. На этой конкретной форме этот чекбокс работает так, что деактивирует кнопку Сохранить. Форма загружается, кнопка деактивируется и, отметив чекбокс, вы активируете кнопку и она становится нажимабельной. Проблема в том, что в header.tpl у вас убрано подключение провайдера карты, но поле под указание координат на форме есть и требует его. Скрипт падает и не дает сработать скрипту, который связывает состояние кнопки и чекбокса. Посмотрите в header.tpl есть ли у вас такие строки {if $map_type=='yandex'} <script type="text/javascript" src="http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU"></script> {else} <script src="https://maps.googleapis.com/maps/api/js?libraries=drawing,geometry"></script> {/if} ПС. Это я поправил уже. 2. Чекбокс на самом деле в форме. А вот эти белые листки, куда бы вы его хотели занести - это не вся форма, а лишь ее страницы. Вы можете добавить стиль\ .account .tabbed_form_block { background: white; padding: 10px; } который протянет белую область дальше и кнопка+чекбокс не будут такими оторванными от остального контента формы.
  12. накидайте список параметров, которые нужно вывести. типа город, площадь, цена итд. я сверстаю шаблон, который будет выводить только их и только то, что нужно - это значительно облегчит ему работу. можете даже нарисовать картинку условную с блочками - тут картинка, тут параметры. что бы ориентироваться можно было.
  13. Сорри, это я так объясняю криво))) Поправил исходный топик.
  14. Это значит, что мы открываем скопированный файл, делаем Ctrl+A и Delete. После этого в получившийся пустой файл вставляем код <?php class Local_Kvartira_View extends Kvartira_View { } Все. Заготовка готова.
  15. Чаще всего, его нет. Но в некоторых случаях может быть, если шаблон уже модифицировался. Если двиг ставится с нуля, то в папке шаблона такого файла не будет. Поэтому мы берем системный из /apps/system/lib/frontend/view/kvartira_view.php тащим в шаблон, создавая недостающие папки /template/frontend/ИМЯ_ШАБЛОНА/main/view/, переименовываем его в local_kvartira_view.php
  16. не надо что-то добавлять в систему, только потому, что для этого есть возможность. если вы не знаете к чему это применить, значит оно вам скорее всего и не нужно в данный момент. там, где необходимость этого нужна я так и пишу "нужно использовать локальный обработчик карточки" или "нужно использовать локальный грид-менеджер". Что можно закинуть в карточку? 1. В теме о сео вчера только обсуждали генератор разметки схемы 2. функции создания менее деревянных сео-заголовков 3. предварительная обработка и сложное форматирование выводимых параметров 4. подключение дополнительных сущностьей или каких-то данных, которые нужны в карточке в данном контексте 5. вывод связанных объектов с объявлением, которые не подбираются системой по умолчанию 7. реализация каких-то счетчиков переходов, сбор utm-меток ... да еще тыщи вариантов извращений))
  17. Там скорее упирается в форматирование описания. Если взять разметку как есть, то времени модулю не хватает, что бы еке отрисовать в пдф. Если поставить вырезку разметки, то отрисовывает, но не читабельно.
  18. Используется для изменения логики работы генератора карточки объекта. В тех случаях, когда требуемые изменения невозможно сделать настройками в силу отсутствия таковых или их ограниченности. Позволяет реализовать свою логику работы карточки в плане показа или сбора для показа данных. Все, что сложно реализовать в самом шаблоне или невозможно скорее всего будет реализовано через это.
  19. Я делал локальный обработчик карточки - https://www.sitebill.ru/s/topic/3635-howto-локальный-обработчик-карточки/ Тянул в него функцию protected function makeUserOperatios($form_data_shared) в которую приходит полная модель данных просматриваемого объекта. <?php class Local_Kvartira_View extends Kvartira_View { protected function makeUserOperatios($form_data_shared){ } } Внутри нее ставил код создания. И в header.tpl внутри head-тега размещал вставку результата {if $ldjson!=''} <script type="application/ld+json">{$ldjson}</script> {/if}
  20. Методика создания своего обработчика карточки. 1. Копируем файл /apps/system/lib/frontend/view/kvartira_view.php в /template/frontend/ИМЯ_ВАШЕГО_ШАБЛОНА/main/view/local_kvartira_view.php 2. Заменяем все его содержимое на <?php class Local_Kvartira_View extends Kvartira_View { } 3. В Настройки - Общее отмечаем галочку Использовать классический локальный конструктор карточки(classic_local_view) C этого момента обслуживать показ объектов у нас начинает наш локальный обработчик. В данный момент он пуст и по факту всю работу за него будет делать пока еще родительский модуль. Но, перенося в него некоторые функции из родителя и меняя их логику, мы можем добиться своего функционала.
  21. Где-то на втором часу попыток расписать разметку схемы в шаблоне, что бы и вложенность обеспечить и свои данные согласно макета разместить, я плюнул и реализовал сборку json-кода разметки в локальном модуле карточки и заброску его в шаблон.)))) Разборщики схемы понимают ее не только в виде тегов, но и в виде json-объектов. В разметке осталась только разметка крошек и блок о компании. А весь продукт внутри генератора карточки. Вот сам код сборки объекта (в данном случае в функции makeUserOperatios, там же собираются и всякие og-параметры и прочая дребедень для соцсеток, телеграмма и шары): $JSONLDL=array(); $JSONLDL['@context']='http://schema.org/'; $JSONLDL['@type']='Product'; $JSONLDL['name']=$form_data_shared['meta_h1']['value']; $JSONLDL['url']=$this->getServerFullUrl().'/'.Sitebill::getClearRequestURI(); $JSONLDL['description']=mb_substr(strip_tags($form_data_shared['text']['value']), 0, 200, 'utf-8'); $JSONLDL['image']=$this->getServerFullUrl().'/img/data/'.$form_data_shared['image']['image_array'][0]['normal']; $JSONLDL['offers']=array(); $JSONLDL['offers']['@type']='Offer'; if($form_data_shared['optype']['value']==2){ $JSONLDL['offers']['businessFunction']='Sell'; }elseif($form_data_shared['optype']['value']==1){ $JSONLDL['offers']['businessFunction']='LeaseOut'; } $JSONLDL['offers']['price']=$form_data_shared['price']['value']; $JSONLDL['offers']['priceCurrency']=$form_data_shared['currency_id']['value_string']; $JSONLDL['offers']['availableAtOrFrom']['@type']='Place'; $JSONLDL['offers']['availableAtOrFrom']['address']['@type']='PostalAddress'; $JSONLDL['offers']['availableAtOrFrom']['address']['addressCountry']=$form_data_shared['country_id']['value_string']; $JSONLDL['offers']['availableAtOrFrom']['address']['addressRegion']=$form_data_shared['region_id']['value_string']; $JSONLDL['offers']['availableAtOrFrom']['address']['addressLocality']=$form_data_shared['city_id']['value_string']; $this->template->assign('ldjson', json_encode($JSONLDL)); и вот так он внутри head-тега вставляется {if $ldjson!=''} <script type="application/ld+json">{$ldjson}</script> {/if}
  22. Если не растеряться, то можно понять структуру вложенности еще отсюда https://search.google.com/structured-data/testing-tool/u/0/?hl=uk#url=http%3A%2F%2Fprorealproperty.com%2Frealty68953.html
  23. Примерно вот так бы это выглядело в плане вложенности в разметке. <div itemscope itemtype="http://schema.org/Product"> <div itemprop="name">Аренда квартир / 1-комн., Россия, Белгородская область, Белгород, Молодежная, 7 000 руб.</div> <div itemscope itemtype="http://schema.org/Offer"> <div itemprop="price" content="7000"> <div itemprop="priceCurrency" content="UAH"> </div> </div>
  24. Внутри него есть блок с классом overview - он вам подойдет. Если в форме ввода объявления в выпадашке валюты отображаются у вас в виде знаков а не кодов (EUR|RUB) то все сделали правильно. Только должно быть как-то так. А то сечас вываливает три валюты, если не доллар. {if $data_shared.currency_id.value == 2} <meta itemprop="priceCurrency" content="USD"> {elseif $data_shared.currency_id.value == 1} <meta itemprop="priceCurrency" content="UAH"> {elseif $data_shared.currency_id.value == 2} <meta itemprop="priceCurrency" content="RUB"> {else} <meta itemprop="priceCurrency" content="BYN"> {/if} Свойство Price является свойством не элемента Product а элемента типа Offer который должен быть дочерним к Product Вот пример вложенности в скрипте $JSONLDL=array(); $JSONLDL['@context']='http://schema.org/'; $JSONLDL['@type']='Product'; /*Верхний уровень - Product*/ /*Тут параметрі продукта типа имя, урл*/ $JSONLDL['name']=$form_data_shared['meta_h1']['value']; ... /*Тут начинаются предложения. Єто нечто более узкое чем продукт вообще*/ $JSONLDL['offers']=array(); $JSONLDL['offers']['@type']='Offer'; if($form_data_shared['optype']['value']==2){ $JSONLDL['offers']['businessFunction']='Sell'; }elseif($form_data_shared['optype']['value']==1){ $JSONLDL['offers']['businessFunction']='LeaseOut'; } /*и вот для оффера мы уже определяем цену, валюту и доступность*/ $JSONLDL['offers']['price']=$form_data_shared['price']['value']; $JSONLDL['offers']['priceCurrency']=$form_data_shared['currency_id']['value_string']; $JSONLDL['offers']['availableAtOrFrom']['@type']='Place'; $JSONLDL['offers']['availableAtOrFrom']['address']['@type']='PostalAddress'; $JSONLDL['offers']['availableAtOrFrom']['address']['addressCountry']=$form_data_shared['country_id']['value_string']; $JSONLDL['offers']['availableAtOrFrom']['address']['addressRegion']=$form_data_shared['region_id']['value_string']; $JSONLDL['offers']['availableAtOrFrom']['address']['addressLocality']=$form_data_shared['city_id']['value_string'];