templates/speaker/detail.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}Консультации наставника (бизнес тренера): {{ speaker.categories|join(', ') }} - {{ speaker }}{% endblock %}
  3. {% block description %}Онлайн консультации от наставника {{ speaker }} по {{ speaker.categories|join(', ') }}. Записывайтесь сегодня.{% endblock %}
  4. {% block meta_preview %}
  5.     <meta property="og:type" content="website">
  6.     <meta property="og:title" content="{{ block('title') }}">
  7.     <meta property="og:description" content="{{ speaker.shortDescription }}">
  8.     <meta property="og:url" content="{{ base_path() ~ '/speakers/' ~ speaker.uri }}">
  9.     <meta property="og:image"
  10.           content="{{ asset(constant('App\\Config\\AssetConfig::IMAGE_BASE_PATH') ~ speaker.photoAvatar)|imagine_filter('speaker_normal') }}">
  11.     <meta property="og:width" content="{{ 355 }}">
  12.     <meta property="og:height" content="{{ 630 }}">
  13. {% endblock %}
  14. {% block body_attr %} class="light_gray head_mar0"{% endblock %}
  15. {% macro stars(rating) %}
  16.     <div class="star">
  17.         {% for star in [1,2,3,4,5] %}
  18.             <i class="{{ rating >= star ? 'fas' : 'far' }} fa-star"></i>
  19.         {% endfor %}
  20.     </div>
  21. {% endmacro %}
  22. {% import '_common/macro_price.html.twig' as mprice %}
  23. {% block body %}
  24.     <div class="speaker_promo_wrapper">
  25.         <div class="speaker_promo_info">
  26.             <div class="">
  27.                 <div class="breadcrumb">
  28.                     <a href="{{ path('speaker.list') }}">{{ 'menu.speakers'|trans }}</a>
  29.                     <i class="fas fa-chevron-right"></i>
  30.                     {% if category %}
  31.                         <a href="{{ path('speaker.list', {'category': category.id}) }}">{{ category }}</a>
  32.                         <i class="fas fa-chevron-right"></i>
  33.                     {% endif %}
  34.                     <span>{{ speaker }}</span>
  35.                 </div>
  36.                 <p class='speaker__type'>
  37.                     <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15" fill="none">
  38.                         <path d="M10.1564 7.6002C10.0754 7.6002 9.99699 7.58722 9.92123 7.56127C9.84547 7.53532 9.77798 7.49395 9.71875 7.43716C8.81001 6.62217 8.03595 5.8449 7.39656 5.10536C6.75719 4.36581 6.4375 3.66957 6.4375 3.01664C6.4375 2.46142 6.62716 1.99432 7.00648 1.61534C7.38581 1.23636 7.85452 1.04688 8.41261 1.04688C8.71906 1.04688 9.02531 1.13032 9.33136 1.2972C9.6374 1.4641 9.9127 1.68965 10.1573 1.97384C10.4018 1.68965 10.6771 1.4641 10.9832 1.2972C11.2892 1.13032 11.5955 1.04688 11.9019 1.04688C12.4597 1.04688 12.929 1.23636 13.3097 1.61534C13.6904 1.99432 13.8808 2.46142 13.8808 3.01664C13.8808 3.66957 13.5611 4.36581 12.9217 5.10536C12.2823 5.8449 11.5086 6.62217 10.6004 7.43716C10.5403 7.49422 10.4719 7.53566 10.3952 7.56148C10.3185 7.5873 10.2389 7.6002 10.1564 7.6002ZM10.1591 6.40862C10.8429 5.7886 11.4629 5.17418 12.0192 4.56536C12.5755 3.95654 12.8536 3.4403 12.8536 3.01664C12.8536 2.73845 12.766 2.51119 12.5907 2.33484C12.4155 2.15849 12.1866 2.07031 11.904 2.07031C11.7341 2.07031 11.5644 2.11135 11.395 2.19344C11.2257 2.27553 11.0537 2.42867 10.8791 2.65284L10.1573 3.53464L9.4392 2.65284C9.26461 2.42867 9.09262 2.27553 8.92323 2.19344C8.75385 2.11135 8.58269 2.07031 8.40975 2.07031C8.1316 2.07031 7.90393 2.15849 7.72673 2.33484C7.54954 2.51119 7.46094 2.73823 7.46094 3.01597C7.46094 3.43603 7.7397 3.95148 8.29722 4.56233C8.85474 5.17317 9.47538 5.7886 10.1591 6.40862ZM8.74016 13.0999L12.6152 11.8811C12.5527 11.7978 12.4735 11.691 12.3778 11.5608C12.282 11.4306 12.1736 11.3655 12.0527 11.3655H8.304C8.29811 11.3655 8.21308 11.3577 8.04891 11.342C7.88474 11.3264 7.72453 11.2822 7.56828 11.2095L6.53703 10.8976C6.41203 10.8586 6.31828 10.7763 6.25578 10.6508C6.19328 10.5254 6.18287 10.3999 6.22453 10.2744C6.2662 10.1498 6.34577 10.0569 6.46323 9.99583C6.58071 9.93476 6.70427 9.92901 6.83391 9.97859L8.32066 10.4705C8.28985 10.468 8.35728 10.4609 8.52292 10.4492C8.68858 10.4376 8.93216 10.4305 9.25366 10.428H9.39641C9.39641 10.2986 9.37297 10.1751 9.32609 10.0575C9.27922 9.93992 9.19849 9.85507 9.08391 9.80298L5.25578 8.34986H3.98438V11.7048L8.74016 13.0999ZM8.49966 14.069L3.98438 12.7789C3.9461 13.0601 3.81086 13.2764 3.57864 13.4277C3.34641 13.5789 3.12681 13.6545 2.91983 13.6545H1.5625C1.26975 13.6545 1.01914 13.5503 0.810672 13.3418C0.602193 13.1332 0.497953 12.8814 0.497953 12.5863V8.3947C0.497953 8.10092 0.602193 7.84943 0.810672 7.64023C1.01914 7.43103 1.26975 7.32642 1.5625 7.32642H5.23267C5.2957 7.32642 5.35874 7.33225 5.42177 7.34392C5.48479 7.35558 5.54608 7.37307 5.60564 7.39641L9.42255 8.83391C9.72124 8.94305 9.97192 9.12166 10.1746 9.36973C10.3773 9.61781 10.4786 9.97056 10.4786 10.428H12.1777C12.638 10.428 13.022 10.5799 13.3296 10.8837C13.6373 11.1874 13.7911 11.6137 13.7911 12.1624C13.7911 12.2994 13.7594 12.4196 13.6962 12.5231C13.6329 12.6266 13.5365 12.7004 13.4069 12.7446L9.10564 14.069C9.00807 14.0948 8.90662 14.1077 8.80131 14.1077C8.696 14.1077 8.59545 14.0948 8.49966 14.069ZM1.52139 12.6311H2.94531V8.34986H1.52141V12.6311H1.52139Z" fill="white"/>
  39.                     </svg>
  40.                     Благотворительный деятель
  41.                 </p>
  42.                 <h1>{{ speaker }}</h1>
  43.                 <div class="tags">
  44.                     {% for item in speaker.categories %}
  45.                         <span class="tag">{{ item }}</span>
  46.                     {% endfor %}
  47.                 </div>
  48.                 <div class="review_info">
  49.                     <strong>{{ speaker.rating|number_format(1) }}</strong>
  50.                     {{ _self.stars(speaker.rating) }}
  51.                     <span>{{ 'plural.reviews'|trans({'reviews': speaker.ratingVote}) }}</span>
  52.                 </div>
  53.                 {% if speaker.charities|length %}
  54.                     <div class="charities">
  55.                         <strong>Фонды, которым спикер помогал:</strong>
  56.                         <ul>
  57.                             {% for speakerCharity in speaker.charities %}
  58.                                 {% if  speakerCharity.getCharity().enabled %}
  59.                                     <li>{{ speakerCharity.getCharity().name }}</li>
  60.                                 {% endif %}
  61.                             {% endfor %}
  62.                         </ul>
  63.                     </div>
  64.                 {% endif %}
  65.                 <div class="promo_btn">
  66.                     <strong>{{ 'title.nearest_consultation'|trans }}</strong>
  67.                     <a href="#timeslots_order_form" class="btn btn_big exist_timeslots"
  68.                        data-template_txt="{{ 'btn.speaker_timeslot_book_for'|trans }}"
  69.                        id="btn_book_for" style="display: none">{{ 'btn.speaker_timeslot_book_for'|trans }}</a>
  70.                     <a href="#timeslots_order_form" class="btn btn_big border_btn_nr exist_timeslots"
  71.                        style="display: none"><i>{{ 'btn.choose_other_date'|trans }}</i></a>
  72.                     <a href="#"
  73.                        class="btn btn_big border_btn_nr no_timeslots">{{ 'label.speaker_timeslots_not_found'|trans }}</a>
  74.                     <a class='btn btn_big no_timeslots_request_consultation' style="display: none" href="{{ path('speaker.request-consultation', {'uri': speaker.uri}) }}">
  75.                         <span>Запросить консультацию</span>
  76.                     </a>
  77.                     <div class="btn_wrapper">
  78.                         {% if app.user %}
  79.                             {#                            <a href="{{ path('speaker.subscribe', {'speaker': speaker.id}) }}" id="subscribe_to_speaker" #}
  80.                             {#                               class="btn btn_light btn_outline_secondary btn_mid2 {{ app.user.subscribedToSpeakers.contains(speaker) ? ' btn_active' : '' }}">{{ 'btn.subscribe_to_speaker'|trans }}</a> #}
  81.                         {% endif %}
  82.                     </div>
  83.                 </div>
  84.                 <span class="sub_txt">{{ speaker.shortDescription }}</span>
  85.             </div>
  86.         </div>
  87.         <div class="speaker_promo"
  88.              style="{{ speaker.user.avatar ? 'background-image: url(\'' ~ asset(constant('App\\Config\\AssetConfig::IMAGE_BASE_PATH') ~ speaker.user.avatar)|imagine_filter('speaker_background') ~ '\')' : 'background-color: #f5f5fa' }}">
  89.             {% if speaker.promoVideo %}
  90.                 <a href="{{ asset(constant('App\\Config\\AssetConfig::VIDEO_BASE_PATH') ~ speaker.promoVideo) }}"
  91.                    data-fancybox class="play_video"><i class="fas fa-play"></i></a>
  92.             {% endif %}
  93.             {% if app.user is not null and speaker == app.user.speaker %}
  94.                 <a href="{{ path('cabinet.speaker_page.index') }}" class="btn btn_mid btn_outline"><i
  95.                             class="fas fa-edit"></i>{{ 'btn.editing_mode'|trans }}</a>
  96.             {% endif %}
  97.         </div>
  98.     </div>
  99.     <div class="desc_speaker">
  100.         <div class="max_wrap">
  101.             <div class="content_col">
  102.                 {# <p class='content_col__title'>
  103.                     Что я могу вам предложить
  104.                 </p>
  105.                 {{ speaker.description|raw }} #}
  106.                 {{ include('_common/speaker_order_form.html.twig', {'speaker': speaker, 'form': orderForm, 'promoVal': promoVal}) }}
  107.             </div>
  108.             <div class="info_col">
  109.                 <div class="soc_links">
  110.                     <ul>
  111.                         {% set iconMapping = {
  112.                             1: 'fab fa-telegram',
  113.                             2: 'fab fa-odnoklassniki-square',
  114.                             3: 'fab fa-vk',
  115.                             4: 'fas fa-globe',
  116.                         } %}
  117.                         {% for link in speaker.speakerLinks %}
  118.                             {% if link.url is not empty %}
  119.                                 <li><a href="{{ link.url }}"><i
  120.                                                 class="{{ iconMapping[link.type] ?? 'fas fa-globe' }}"></i> {{ link.url|replace({'http://': '', 'https://': ''}) }}
  121.                                     </a></li>
  122.                             {% endif %}
  123.                         {% endfor %}
  124.                     </ul>
  125.                 </div>
  126.                 {# <div class="charity_info">
  127.                     <h3 class="title min_title"><span>{{ 'title.charity'|trans }}</span></h3>
  128.                     <p>{{ 'label.charity_text_2'|trans }}</p>
  129.                     <div class="desaturated_img">
  130.                         {% for fond in speaker.charities %}
  131.                             {% if fond.amount > 0 %}
  132.                                 <img alt="{{ fond.charity }}"
  133.                                      src="{{ asset(constant('App\\Config\\AssetConfig::IMAGE_BASE_PATH') ~ fond.charity.image)|imagine_filter('charity_normal') }}"/>
  134.                             {% endif %}
  135.                         {% endfor %}
  136.                     </div>
  137.                 </div> #}
  138.             </div>
  139.         </div>
  140.     </div>
  141.     {% if courses is not empty %}
  142.         <div class="video_slider">
  143.             <div class="max_wrap">
  144.                 <h2 class="title"><span>{{ 'title.speaker_video_courses'|trans }}</span></h2>
  145.             </div>
  146.             <div class="slider_wrapper">
  147.                 <div class="slider_videos">
  148.                     {% for course in courses %}
  149.                         <div class="card_video">
  150.                             <div class="video_overlay">
  151.                                 <img alt=""
  152.                                      src="{{ asset(constant('App\\Config\\AssetConfig::IMAGE_BASE_PATH') ~ course.thumbnail)|imagine_filter('video_course_normal') }}"/>
  153.                                 {% if course.video and app.user and app.user.courses.contains(course) %}
  154.                                     <a href="{{ asset(constant('App\\Config\\AssetConfig::VIDEO_BASE_PATH') ~ course.video) }}"
  155.                                        class="playpause" data-fancybox><i class="fas fa-play"></i></a>
  156.                                 {% else %}
  157.                                     {% if course.price > 0 %}
  158.                                         <div class="buy_wrapper">
  159.                                             <a href="{{ path('cart.add_course', {'course': course.id}) }}"
  160.                                                class="buy_now">
  161.                                                 {{ 'btn.buy'|trans }}
  162.                                                 <span>{{ mprice.formatedPrice(course.price) }}</span>
  163.                                             </a>
  164.                                             <a href="{{ path('cart.add_course', {'course': course.id}) }}"
  165.                                                class="buy_btn"></a>
  166.                                         </div>
  167.                                     {% endif %}
  168.                                 {% endif %}
  169.                             </div>
  170.                             <strong class="name_course">{{ course.name }}</strong>
  171.                             <div class="tags dark_tags">
  172.                                 {% for item in course.categories %}
  173.                                     <span class="tag">{{ item }}</span>
  174.                                 {% endfor %}
  175.                             </div>
  176.                             <p>{{ course.shortDescription }}</p>
  177.                         </div>
  178.                     {% endfor %}
  179.                 </div>
  180.             </div>
  181.         </div>
  182.     {% endif %}
  183.     {% if speaker.reviews is not empty %}
  184.         <div class="reviews_slider">
  185.             <div class="max_wrap">
  186.                 <h2 class="title min_title"><span>{{ 'title.reviews'|trans }}</span></h2>
  187.                 <div class="review_info">
  188.                     <strong>{{ speaker.rating|number_format(1) }}</strong>
  189.                     {{ _self.stars(speaker.rating) }}
  190.                     <span>{{ 'plural.reviews'|trans({'reviews': speaker.ratingVote}) }}</span>
  191.                 </div>
  192.             </div>
  193.             <div class="slider_wrapper">
  194.                 <div class="slider_reviews">
  195.                     {% for review in reviews %}
  196.                         <div class="card_reviews">
  197.                             <strong class="review_name">{{ review.user }}</strong>
  198.                             <div class="rating">
  199.                                 {{ _self.stars(review.rating) }}
  200.                                 <span class="date">{{ review.date|format_datetime('short', 'none') }}</span>
  201.                             </div>
  202.                             {% if review.text|length > 255 %}
  203.                                 <p>{{ review.text|slice(0, 255) }} <a href="#" class="review_more"
  204.                                                                       data-text="{{ review.text|slice(64)|e }}">{{ 'btn.more'|trans }}</a>
  205.                                 </p>
  206.                             {% else %}
  207.                                 <p>{{ review.text }}</p>
  208.                             {% endif %}
  209.                         </div>
  210.                     {% endfor %}
  211.                 </div>
  212.             </div>
  213.         </div>
  214.     {% endif %}
  215.     {# <div class="speaker_slider light_bg">
  216.         {{ include('_common/popular_speakers_block.html.twig') }}
  217.         {{ include('_common/newsletter_block.html.twig') }}
  218.     </div> #}
  219. {% endblock %}
  220. {% block stylesheets %}
  221.     <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
  222.     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/datepicker/1.0.10/datepicker.min.css"
  223.           integrity="sha512-YdYyWQf8AS4WSB0WWdc3FbQ3Ypdm0QCWD2k4hgfqbQbRCJBEgX0iAegkl2S1Evma5ImaVXLBeUkIlP6hQ1eYKQ=="
  224.           crossorigin="anonymous" referrerpolicy="no-referrer"/>
  225.     {{ parent() }}
  226.     {{ encore_entry_link_tags('speaker-detail') }}
  227. {% endblock %}
  228. {% block javascripts %}
  229.     {{ parent() }}
  230.     <script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
  231.     <script src="https://cdnjs.cloudflare.com/ajax/libs/datepicker/1.0.10/datepicker.min.js"
  232.             integrity="sha512-RCgrAvvoLpP7KVgTkTctrUdv7C6t7Un3p1iaoPr1++3pybCyCsCZZN7QEHMZTcJTmcJ7jzexTO+eFpHk4OCFAg=="
  233.             crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  234.     <script src="https://cdnjs.cloudflare.com/ajax/libs/datepicker/1.0.10/i18n/datepicker.ru-RU.min.js"
  235.             integrity="sha512-kp29ggt/JOVnRNWjOUJJmKEgtlJdGgsPAOlMt+jCV7pxPq7mwtZewf49Axl1RHFN5DNJ1qzocWtT4A7uWqFjwQ=="
  236.             crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  237.     {{ encore_entry_script_tags('speaker-detail') }}
  238. {% endblock %}