templates/ProfileList/list.html.twig line 206

Open in your IDE?
  1. {% extends 'ProfileList/grid.html.twig' %}
  2. {# {% extends 'grid.html.twig' %} #}
  3. {%- set linkLangSupport = app.request.locale == 'en' ? '/en' : '' -%}
  4. {%- set excludeRecommendationProfileIds = [] -%}
  5. {# {%- block stylesheet_postload -%}{{ encore_entry_link_tags("styles/public-girl-list") }}{{ parent() }}{%- endblock -%} #}
  6. {%- block preloadAnyData -%}
  7.     {# {%- set photo = profiles|first|avatar -%}
  8.     {%- if photo -%}
  9.         <link rel="preload" href="{{ responsive_asset(photo.path, 'profile_media', "200x280", "jpg") }}" as="image">
  10.         <link rel="preload" as="image"
  11.             href="{{ responsive_asset(photo.path, 'profile_media', "200x280", "jpg") }}"
  12.             imagesrcset="{{ responsive_asset(photo.path, 'profile_media', "200x280", "jpg") }} 200w,
  13.                         {{ responsive_asset(photo.path, 'profile_media', "185x259", "jpg") }} 185w"
  14.             imagesizes="(max-width: 1740px) 185px, 200px"
  15.             media="(min-width: 1740px)" />
  16.     {%- endif -%} #}
  17. {%- endblock -%}
  18. {%- block metaSpecial -%}
  19.     {%- if profiles and profiles.currentPage >= 2 -%}
  20.         <meta name="yandex" content="noindex, nofollow" />
  21.     {%- endif -%}
  22. {%- endblock -%}
  23. {%- block mainContainer -%}
  24.     {%- set isMainCity = city.uriIdentity == default_city().uriIdentity -%}
  25.     {%- set conditionList = [
  26.         'usluga-massage-professionalnyij',
  27.         'usluga-massage-rasslablyayuschij',
  28.         'usluga-massage-tajskij',
  29.         'usluga-massage-urologicheskij',
  30.         '/new/',
  31.         '/search/',
  32.         '/checked/',
  33.         '/salons/',
  34.         '/usluga-striptiz-ne-profi/',
  35.         '/usluga-striptiz-profi/',
  36.         '/price/high/',
  37.         '/usluga-seks-analnyij/',
  38.         '/hair-color-blonde/',
  39.         '/hair-color-brunette/',
  40.         '/price/low/',
  41.         '/video/',
  42.         '/comments/',
  43.         '/map/',
  44.         '/usluga-massage-klassicheskij/',
  45.         '/nationality-asian/',
  46.         '/usluga-anilingus-delayu/',
  47.         '/usluga-gospozha/',
  48.         '/selfie/',
  49.         '/massagers/',
  50.         '/usluga-massage-vetka-sakuryi/',
  51.         '/okrug/vostochnyj-vao/',
  52.         '/okrug/zapadnyj-zao/',
  53.         '/okrug/severnyj-sao/',
  54.         '/okrug/severo-zapadnyj-szao/',
  55.         '/okrug/tsentralnyij/',
  56.         '/okrug/yugo-vostochnyj-yuvao/',
  57.         '/usluga-minet-bez-rezinki/',
  58.         '/usluga-minet-v-mashine/',
  59.         '/usluga-minet-v-prezervative/',
  60.         '/usluga-minet-glubokij/',
  61.         '/nationality-negress/',
  62.         '/main-district/',
  63.         '/hair-color-light-brown/',
  64.         '/hair-color-red/',
  65.         '/usluga-seks-gruppovoj/',
  66.         '/usluga-strapon/',
  67.         '/usluga-uslugi-semejnoj-pare/',
  68.         '/usluga-fisting-analnyij/',
  69.         '/usluga-fisting-klassicheskij/',
  70.         '/hair-color-brown/',
  71.         '/nationality-kazakh/',
  72.         '/nationality-mulatto/',
  73.         '/nationality-russian/',
  74.         '/nationality-tatar/',
  75.         '/nationality-ukrainian/',
  76.         '/okrug/yugo-zapadnyj-yuzao/',
  77.         '/okrug/zelenograd/',
  78.         '/body-type-athletic/',
  79.         '/body-type-fat/',
  80.         '/usluga-seks-klassicheskij/',
  81.         '/usluga-rolevyie-igryi/',
  82.         '/usluga-eskort/',
  83.         '/usluga-trampling/',
  84.         '/usluga-fetish/',
  85.         '/usluga-bondaj/',
  86.         '/usluga-rabyinya/',
  87.         '/usluga-porka/',
  88.         '/body-type-thin/',
  89.         '/body-type-slim/',
  90.         '/body-type-tight/',
  91.         '/usluga-okonchanie-na-grud/',
  92.         '/usluga-okonchanie-na-litso/',
  93.         '/usluga-kopro-vyidacha/',
  94.         '/usluga-okonchanie-v-rot/',
  95.         '/usluga-kunnilingus/',
  96.         '/usluga-massage-eroticheskij/',
  97.         '/usluga-massage-tochechnyij/',
  98.         '/usluga-igrushki/',
  99.         '/usluga-zolot-dozhd-vyidacha/',
  100.         '/usluga-zolotoj-dozhd-priem/',
  101.         '/usluga-legkaya-dominatsiya/',
  102.         '/metro-',
  103.         '/prostitytki-'
  104.         ]
  105.     %}
  106.     {%- set onlyThisPageSeoShow = false -%}
  107.     {%- for str in conditionList -%}
  108.         {%- if str in app.request.pathInfo -%}
  109.             {%- set onlyThisPageSeoShow = true -%}
  110.         {%- endif -%}
  111.     {%- endfor -%}
  112.     {% set route = app.request.attributes.get('_route') %}
  113.     {%- set isIndexPage = app.request.pathInfo == '/' -%}
  114.     {%- set firstPage = profiles.currentPage == 1 -%}
  115.     {%- set isStationPage = route == "profile_list.list_by_station" -%}
  116.     {% set mainListingFirstPage = route == 'profile_list.list_by_city' %}
  117.     {# {%- set isShowTopSeo = (firstPage and isMainCity and onlyThisPageSeoShow) or isIndexPage -%}
  118.     {%- set isShowBottomSeo = (firstPage and isMainCity and onlyThisPageSeoShow ) or isIndexPage -%} #}
  119.     {%- set isShowTopSeo = true -%}
  120.     {%- set isShowTopOnBottomSeo = true -%}
  121.     {%- set isShowBottomSeo = true -%}
  122.     {{- knp_menu_render('breadcrumbs', {'template': '__design/v2023/_menu/breadcrumbs.html.twig'}) -}}
  123.     <div class="heading d-flex">
  124.         <h1 class="heading-title text-title mr-1" role="heading">{{- seo_heading() ? seo_heading() : 'Проститутки и индивидуалки Москвы' -}}</h1>
  125.         <span class="heading-count clr-main-text fw-700" data-count-profiles>{{ profiles.totalCount }}</span>
  126.     </div>
  127.     {# <div aria-hidden="true" class="no-display" style="display: none;">
  128.         <svg xmlns="http://www.w3.org/2000/svg">
  129.             <symbol id="close" viewBox="0 0 25 24">
  130.                 <path fill-rule="evenodd" clip-rule="evenodd" d="M19.46 6.7a1 1 0 0 0-1.42-1.4l-5.29 5.29-5.3-5.3a1 1 0 0 0-1.4 1.42L11.33 12l-5.3 5.3a1 1 0 1 0 1.42 1.4l5.29-5.29 5.3 5.3a1 1 0 0 0 1.4-1.42L14.17 12l5.3-5.3Z" fill="#A3A3A3"/>
  131.             </symbol>
  132.             <symbol id="expand" viewBox="0 0 25 24">
  133.                 <path fill-rule="evenodd" clip-rule="evenodd" d="M5.54 8.3a1 1 0 0 1 1.42 0l5.29 5.29 5.3-5.3a1 1 0 1 1 1.4 1.42l-6 6a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.42Z" fill="#A3A3A3"/>
  134.             </symbol>
  135.             <symbol id="range" viewBox="0 0 25 24">
  136.                 <path d="M21.5 11h-1.18a2.98 2.98 0 0 0-5.64 0h-4.36a2.98 2.98 0 0 0-5.64 0H3.5a1 1 0 1 0 0 2h1.18a2.98 2.98 0 0 0 5.64 0h4.36a2.98 2.98 0 0 0 5.64 0h1.18a1 1 0 0 0 0-2Zm-14 2a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm10 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/>
  137.             </symbol>
  138.         </svg>
  139.     </div> #}
  140.     {%- set isArchivePage =  'profile_list.list_archived' in app.request.attributes.get('_route') -%}
  141.     {%- set isFormExist = false -%}{# profile_filter_form is defined and not isArchivePage #}
  142.     {%- if isFormExist -%}
  143.         <noindex>
  144.             <button class="filter_hide_button" type="button" id="filter_hide_button">
  145.                 <svg class="filter_hide_button__icon" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.96 6h10l-5 6.3-5-6.3Zm-2.75-.39L9.96 13v6a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-6l5.74-7.39A1 1 0 0 0 18.91 4H5.01a1 1 0 0 0-.8 1.61Z" /></svg>
  146.                 <span class="filter_hide_button__text" data-filter-hide-text-show>Показать фильтры</span>
  147.                 <svg class="filter_hide_button__rotate" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.45 9.87a.84.84 0 0 1 1.24 0l3.3 3.5 3.32-3.5a.84.84 0 0 1 1.23 0c.34.36.34.95 0 1.3l-3.92 4.16a.84.84 0 0 1-1.24 0l-3.93-4.15a.96.96 0 0 1 0-1.31Z" /></svg>
  148.             </button>
  149.             <div class="filter_hide_block" id="filter_hide_block">
  150.                 {# Форма полей фильтрации #}
  151.                 {{ form_start(profile_filter_form, {
  152.                     'attr': {
  153.                         'id': 'filter-form',
  154.                         'class': 'filter_form',
  155.                         'data-process-url': path('profile_ctr.increase_shows'),
  156.                         'data-main-class': 'profile_filter'
  157.                     }
  158.                 }) }}
  159.                     {{ include('ProfileList/filter/form.partial.twig', {filterData: profile_filter_form.vars.value, filterListId: 'filter-list'}) }}
  160.                 {{ form_end(profile_filter_form) }}
  161.             </div>
  162.             <div class="profile_filter__tags__container profile_filter__tags__container--mobile fade_slider__container">
  163.                 <div class="profile_filter__tags d-none fade_slider d-none" id="filter_tags"></div>
  164.             </div>
  165.             <div class="profile_filter__line" id="filter_line" style="display: none">
  166.                 <div class="profile_filter__line__title">Найдено <span class="profile_filter__line__title__count">{{ profiles.totalCount }} {{ profiles.totalCount|incline_numeral(['анкета', 'анкеты', 'анкет']) }}</span></div>
  167.                 <button class="profile_filter__line__reset" type="button" id="filter_line_reset">
  168.                     Сбросить фильтры
  169.                     <svg class="profile_filter__line__reset_icon" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14"><path fill-rule="evenodd" clip-rule="evenodd" d="M13.7 1.7A1 1 0 0 0 12.3.3L7 5.58 1.7.29A1 1 0 0 0 .3 1.71L5.58 7l-5.3 5.3a1 1 0 1 0 1.42 1.4L7 8.42l5.3 5.3a1 1 0 0 0 1.4-1.42L8.42 7l5.3-5.3Z" fill="#ED0C34"/></svg>
  170.                 </button>
  171.             </div>
  172.         </noindex>
  173.     {% endif %}
  174.     {% block mainList %}
  175.         <ul class="profile-list d-grid mb-4 full-w-xs" id="profile-list">
  176.             {% include 'ProfileList/list.profiles.html.twig' with {
  177.                 'top_profile': profile_top_placement(),
  178.                 'likeButton': is_user_customer(app.user) == '1'
  179.                 } %}
  180.         </ul>
  181.     {% endblock %}
  182.     {% if profiles and profiles.totalCount > profiles.currentPage * profiles.currentLimit %}
  183.         {% block showMore %}
  184.             {% include 'ProfileList/_show_more.profiles.html.twig' %}
  185.         {% endblock showMore %}
  186.     {% endif %}
  187.     {{ porpaginas_render(profiles) }}
  188.     <div class="map-block mb-4 full-w-xs">
  189.         <picture class="map-picture">
  190.             <source srcset="{{ asset('assets/images/background/map@480.jpg') }}" media="(max-width: 480px)">
  191.             <source srcset="{{ asset('assets/images/background/map@930.jpg') }}" media="(max-width: 960px)">
  192.             <img class="map-image" src="{{ asset('assets/images/background/map@1380.jpg') }}" alt="Интим-карта Москвы" loading="lazy">
  193.         </picture>
  194.         <div class="map-block-content d-flex-c">
  195.             <div class="map-block-title fw-700 mb-2">Интим-карта {{ city.name|geo_name('genitive') }}</div>
  196.             <div class="map-block-text">Поиск анкет рядом с Вами</div>
  197.             <a class="map-block-link btn btn-main" href="{{ path('map.page', {'city': city.uriIdentity}) }}">
  198.                 <svg class="btn-icon" width="25" height="25" fill="none"><path fill-rule="evenodd" d="M4.674 8.944c0-4.314 3.512-7.826 7.826-7.826s7.826 3.512 7.826 7.826c0 5.448-6.809 13.049-7.102 13.372l-.724.802-.724-.802c-.293-.323-7.102-7.924-7.102-13.372Zm1.957 0c0 3.462 3.736 8.667 5.869 11.22 1.712-2.064 5.87-7.474 5.87-11.22a5.874 5.874 0 0 0-5.87-5.87 5.874 5.874 0 0 0-5.87 5.87Zm5.869 0c.812 0 1.467-.656 1.467-1.468 0-.812-.655-1.467-1.467-1.467s-1.467.665-1.467 1.467c0 .812.655 1.468 1.467 1.468Zm-2.935 2.445c0-.978 1.957-1.467 2.935-1.467s2.935.489 2.935 1.467v.118a3.88 3.88 0 0 1-2.935 1.35 3.88 3.88 0 0 1-2.935-1.35v-.118Z" clip-rule="evenodd"/></svg>
  199.                 <span class="btn-text">Искать на карте</span>
  200.             </a>
  201.         </div>
  202.     </div>
  203.     {# Реки #}
  204.     {% if profiles and profiles.currentPage >= 2 %}
  205.         <div id="recommendations">
  206.             {%- set excludeRecommendationProfileIds = profiles|map(p => p.id)|join(', ') -%}
  207.             {%- include 'recommendations/_profile_recommendations.html.twig' with {componentClass: 'mobile'} -%}
  208.         </div>
  209.     {% endif %}
  210.     {% if route == 'homepage' or
  211.         (mainListingFirstPage and app.request.get('city').id == default_city().id)
  212.     %}
  213.         <div class="widget-profiles-by-categories" id="widget_profiles_by_categories"></div>
  214.         <script>
  215.             document.addEventListener('DOMContentLoaded', () => {
  216.                 const widgetElement = document.querySelector('#widget_profiles_by_categories');
  217.                 function getProfiles() {
  218.                     fetch('{{ path('profile_widget.by_categories', {city: app.request.attributes.get('city', default_city()).uriIdentity}) }}', {
  219.                         method: 'GET',
  220.                         headers: {
  221.                             "X-Requested-With": "XMLHttpRequest"
  222.                         },
  223.                     }).then(response => {
  224.                         if (response.status < 300) {
  225.                             return response.text();
  226.                         } else {
  227.                             console.warn(" ");
  228.                             return null;
  229.                         }
  230.                     }).then(response => {
  231.                         widgetElement.innerHTML = response;
  232.                         const elementsRoot = [...document.querySelectorAll('#profile-list-new', '#profile-list-approved', '#profile-list-elite')];
  233.                         elementsRoot.forEach(root => {
  234.                             if (root.childElementCount === 0) {
  235.                                 root.previousElementSibling.remove();
  236.                                 root.remove();
  237.                             }
  238.                         });
  239.                     });
  240.                 }
  241.                 if ('IntersectionObserver' in window) {
  242.                     const observer = new IntersectionObserver((entries) => {
  243.                         if (entries[0].isIntersecting) {
  244.                             observer.disconnect();
  245.                             getProfiles();
  246.                         }
  247.                     }, { rootMargin: '100px' });
  248.                     observer.observe(widgetElement);
  249.                 } else {
  250.                     getProfiles();
  251.                 }
  252.             });
  253.         </script>
  254.     {% endif %}
  255.     {# {% set circle = app.request.get('_route') == 'profile_list.list_by_provided_service' ? inner_linkage_circle('service') : inner_linkage_circle('prostitutes') %}
  256.     {% if circle is not null %}
  257.         <div class="station-pages-linkage-circle">
  258.             {% if circle[0] is defined and circle[0] is not null %}<a href="{{ circle[0].href }}"><i class="prev"></i>{{ circle[0].text }}</a>{% endif %}
  259.             {% if circle[0] is defined and circle[0] is not null
  260.                 and circle[1] is defined and circle[1] is not null %}<i class="sep"></i>{% endif %}
  261.             {% if circle[1] is defined and circle[1] is not null %}<a href="{{ circle[1].href }}">{{ circle[1].text }}<i class="next"></i></a>{% endif %}
  262.         </div>
  263.     {% endif %}
  264.     {% set stations_circle = station_pages_linkage_circle() %}
  265.     {% if stations_circle is not null %}
  266.         <div class="station-pages-linkage-circle">
  267.             {% if stations_circle[0] is defined and stations_circle[0] is not null %}<a href="{{ stations_circle[0].href }}"><i class="prev"></i>{{ stations_circle[0].text }}</a>{% endif %}
  268.             {% if stations_circle[0] is defined and stations_circle[0] is not null
  269.                 and stations_circle[1] is defined and stations_circle[1] is not null %}<i class="sep"></i>{% endif %}
  270.             {% if stations_circle[1] is defined and stations_circle[1] is not null %}<a href="{{ stations_circle[1].href }}">{{ stations_circle[1].text }}<i class="next"></i></a>{% endif %}
  271.         </div>
  272.     {% endif %}
  273.     {% set cities_circle = city_main_pages_linkage_circle() %}
  274.     {% if cities_circle is not null %}
  275.         <div class="station-pages-linkage-circle">
  276.             {% if cities_circle[0] is defined and cities_circle[0] is not null %}<a href="{{ cities_circle[0].href }}"><i class="prev"></i>{{ cities_circle[0].text }}</a>{% endif %}
  277.             {% if cities_circle[0] is defined and cities_circle[0] is not null
  278.                 and cities_circle[1] is defined and cities_circle[1] is not null %}<i class="sep"></i>{% endif %}
  279.             {% if cities_circle[1] is defined and cities_circle[1] is not null %}<a href="{{ cities_circle[1].href }}">{{ cities_circle[1].text }}<i class="next"></i></a>{% endif %}
  280.         </div>
  281.     {% endif %} #}
  282.     {# {{ include('components/last_girl_list.html.twig') }} #}
  283.     {# комменты анкет для листинга станции #}
  284.     {# {% include 'ProfileList/station_comments.partial.html.twig' %} #}
  285.     {%- if isShowTopOnBottomSeo -%}
  286.         {{- include ('__design/v2023/components/seo-article.html.twig', { 'type': 'top', "noindex": true }) -}}
  287.     {%- endif -%}
  288.     {%- if isShowBottomSeo -%}
  289.         {{- include ('__design/v2023/components/seo-article.html.twig', { 'type': 'bottom', "noindex": true }) -}}
  290.     {%- endif -%}
  291. {% endblock %}
  292. {% block javascripts %}
  293.     {{parent()}}
  294.     <script>
  295.         const listingRoute = '{{ app.request.attributes.get('_route') }}' == '' ? 'profile_list.list_by_city' : '{{ app.request.attributes.get('_route') }}';
  296.         window._lD = {
  297.             setLastViewedListing: listingRoute,
  298.             cityUrl: "{{city.uriIdentity}}",
  299.         };
  300.         window.siteData = {
  301.             city: "{{ app.request.attributes.get('city', default_city()).uriIdentity }}",
  302.             stations: {
  303.                 {%- for station in stations() -%}
  304.                     "{{ station.name|trans }}": "{{ path('profile_list.list_by_station', {'city': station.city.uriIdentity, 'station': station.uriIdentity}) }}"{% if not loop.last %},{% endif %}
  305.                 {%- endfor -%}
  306.             }
  307.         };
  308.         {# document.addEventListener('DOMContentLoaded', function() {
  309.             {% if profiles and profiles.totalCount > 0 %}
  310.                 {%- set profilesId = profiles|map(p => p.id)|join(',') -%}
  311.                 window.increase_shows({
  312.                     profiles: [{{ profilesId }}],
  313.                     route: '{{ app.request.attributes.get('_route') }}',
  314.                 })
  315.             {% endif %}
  316.         }); #}
  317.         document.addEventListener('header:update', (event) => {
  318.             const userData = event.detail?.data;
  319.             if (userData.user && userData.role === 'advertiser') return;
  320.             {% include 'ProfileList/_favorite-button.partial.script.js' %}
  321.         })
  322.     </script>
  323. {% endblock %}