templates/front/course/_course-card.html.twig line 1

Open in your IDE?
  1. {% if course.owner is instanceof('App\\Entity\\Coach') %}
  2.     {% set type = 'coach' %}
  3. {% elseif course.owner is instanceof('App\\Entity\\Club') %}
  4.     {% set type = 'club' %}
  5. {% else %}
  6.     {% set type = 'operator' %}
  7. {% endif %}
  8. <div class="course-card {% if view is defined and view == "map" %}map-view{% endif %}" {% if view is defined and  view == 'map' %}data-lat="{{ course.address.latitude }}" data-lng="{{ course.address.longitude }}" data-name="{{ course | cheapestavailability.price }} €" data-type="{{ type }}"{% endif %}>
  9.     
  10.     {% if course.token in app.session.get('seenCourses') and (not app.user or (app.user and app.user is instanceof('App\\Entity\\Trainee'))) %}
  11.          <i class="fal fa-eye"></i>
  12.     {% endif %}
  13.     
  14.     {% if app.user and is_granted('ROLE_TRAINEE') %}
  15.     <a href="{{ path('add_course_favorite', {'id': course.id}) }}" class="btn btn-like-course" data-update data-token="{{ csrf_token('favorite' ~ course.id) }}">
  16.         <i class="fas fa-heart {% if app.user.isCourseFavorite(course) %}favorite{% endif %}"></i>
  17.     </a>
  18.     {% elseif not app.user %}
  19.     <button type="button" class="btn btn-like-course" data-toggle="modal" data-target="#add-to-favorite">
  20.         <i class="fas fa-heart"></i>
  21.     </button>
  22.     {% endif %}
  23.     <div class="course-img">
  24.         
  25.         {% if is_granted('ROLE_PRO') and menu is defined and menu == 'manage-courses' and app.user == course.owner %}
  26.         <!-- Modal delete course -->
  27.         <div class="modal fade" id="delete-course-{{ course.token }}" tabindex="-1" role="dialog" aria-labelledby="update-course-modal" aria-hidden="true">
  28.             <div class="modal-dialog modal-dialog-centered" role="document">
  29.                 <div class="modal-content">
  30.                     <form action="{{ path('handle_course_status', {'token': course.token}) }}" method="post">
  31.                         <div class="modal-body">
  32.                             <div class="modal-title-wrap">
  33.                                 <h5 class="modal-title">{{ "courses.delete_course" | trans }}</h5>
  34.                                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  35.                                     <i class="fal fa-times"></i>
  36.                                 </button>
  37.                             </div>
  38.                             <div class="row">
  39.                                 <div class="col-12">
  40.                                     <input type="hidden" name="status" value="deleted">
  41.                                     <p class="modal-text text-center">{{ "manage_courses.confirm_course_delete" | trans }}</p>
  42.                                     <p class="modal-text text-center">{{ "manage_courses.course_suspend_delete_impact" | trans }}</p>
  43.                                     <hr>
  44.                                     <div class="form-group pb-5">
  45.                                         <label for="reason">{{ "messaging.refusal_reason.label_select" | trans }}</label>
  46.                                         <input type="text" name="reason" id="reason" class="form-control" placeholder="Indiquez la raison de la suppression" required>
  47.                                     </div>
  48.                                 </div>
  49.                             </div>
  50.                             <div class="modal-actions">
  51.                                 <button type="submit" class="btn main-btn btn-sm mx-auto" name="save" value="save">{{ "manage_courses.yes_delete" | trans }}</button>
  52.                             </div>
  53.                         </div>
  54.                     </form>
  55.                 </div>
  56.             </div>
  57.         </div>
  58.         
  59.         {% if course.status == 'active' %}
  60.         <!-- Modal suspend course -->
  61.         <div class="modal fade" id="suspend-course-{{ course.token }}" tabindex="-1" role="dialog" aria-labelledby="update-course-modal" aria-hidden="true">
  62.             <div class="modal-dialog modal-dialog-centered" role="document">
  63.                 <div class="modal-content">
  64.                     <form action="{{ path('handle_course_status', {'token': course.token}) }}" method="post">
  65.                         <div class="modal-body">
  66.                             <div class="modal-title-wrap">
  67.                                 <h5 class="modal-title">{{ "courses.suspend_course" | trans }}</h5>
  68.                                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  69.                                     <i class="fal fa-times"></i>
  70.                                 </button>
  71.                             </div>
  72.                             <div class="row">
  73.                                 <div class="col-12">
  74.                                     <input type="hidden" name="status" value="suspended">
  75.                                     <p class="modal-text text-center">{{ "manage_courses.confirm_course_suspend" | trans }}</p>
  76.                                     <hr>
  77.                                     <div class="form-group">
  78.                                         <div class="checkbox icheck-primary terms">       
  79.                                             <input type="checkbox" id="cancelBooking" name="cancelBooking" class="form-check-input">
  80.                                             <label class="form-check-label" for="cancelBooking">Annuler les réservations liées au stage</label>
  81.                                         </div>
  82.                                     </div>
  83.                                 </div>
  84.                             </div>
  85.                             <div class="modal-actions">
  86.                                 <button type="submit" class="btn main-btn btn-sm mx-auto" name="save" value="save">{{ "manage_courses.yes_suspend" | trans }}</button>
  87.                             </div>
  88.                         </div>
  89.                     </form>
  90.                 </div>
  91.             </div>
  92.         </div>
  93.         
  94.         <div class="course-pro-actions">
  95.             <a class="btn pro-edit-btn on-course" href="{{ path('update_course', {'token': course.token}) }}" data-toggle="tooltip" data-placement="top" title="{{ "manage_courses.modify_course" | trans }}">
  96.                 <i class="fas fa-pen"></i>
  97.             </a>
  98.             <a class="btn pro-edit-btn pro-duplicate-btn on-course" href="{{ path('duplicate_course', {'token': course.token}) }}"  data-toggle="tooltip" data-placement="top" title="{{ "manage_courses.duplicate_this_internship" | trans }}">
  99.                 <i class="far fa-layer-plus"></i>
  100.             </a>
  101.             <a class="btn pro-edit-btn pro-template-btn on-course" href="{{ path('course_template', {'token': course.token}) }}" data-toggle="tooltip" data-placement="top" title="{{ "manage_courses.view_templates" | trans }}">
  102.                 <i class="far fa-arrow-from-top"></i>
  103.             </a>
  104.             <button class="btn pro-edit-btn on-course" data-toggle="modal" data-target="#suspend-course-{{ course.token }}">
  105.                 <i class="far fa-pause"></i>
  106.             </button>
  107.             <button class="btn pro-edit-btn on-course" data-toggle="modal" data-target="#delete-course-{{ course.token }}">
  108.                 <i class="far fa-trash-alt"></i>
  109.             </button>
  110.         </div>
  111.         {% elseif course.status == 'pending' or course.status == 'suspended' %}
  112.         
  113.         <div class="course-pro-actions">
  114.             <a class="btn pro-edit-btn on-course" href="{{ path('update_course', {'token': course.token}) }}" data-toggle="tooltip" data-placement="top" title="{{ "manage_courses.modify_course" | trans }}">
  115.                 <i class="fas fa-pen"></i>
  116.             </a>
  117.             
  118.             {% if course.status == 'pending' %}
  119.             <a class="btn pro-edit-btn pro-duplicate-btn on-course" href="{{ path('duplicate_course', {'token': course.token}) }}"  data-toggle="tooltip" data-placement="top" title="{{ "manage_courses.duplicate_this_internship" | trans }}">
  120.                 <i class="far fa-layer-plus"></i>
  121.             </a>
  122.             {% endif %}
  123.             
  124.             <button class="btn pro-edit-btn on-course" data-toggle="modal" data-target="#delete-course-{{ course.token }}">
  125.                 <i class="far fa-trash-alt"></i>
  126.             </button>
  127.         </div>
  128.         {% elseif course.status == 'completed' %}
  129.         <div class="course-pro-actions">
  130.             <a class="btn pro-edit-btn pro-duplicate-btn on-course" href="{{ path('duplicate_course', {'token': course.token}) }}"  data-toggle="tooltip" data-placement="top" title="{{ "manage_courses.duplicate_this_internship" | trans }}">
  131.                 <i class="far fa-layer-plus"></i>
  132.             </a>
  133.         </div>
  134.         {% elseif course.status == 'archived' %}
  135.             <div class="course-pro-actions">
  136.                 <a class="btn pro-edit-btn pro-duplicate-btn on-course" href="{{ path('duplicate_course', {'token': course.token}) }}"  data-toggle="tooltip" data-placement="top" title="{{ "manage_courses.duplicate_this_internship" | trans }}">
  137.                     <i class="far fa-layer-plus"></i>
  138.                 </a>
  139.                 <button class="btn pro-edit-btn on-course" data-toggle="modal" data-target="#delete-course-{{ course.token }}">
  140.                     <i class="far fa-trash-alt"></i>
  141.                 </button>
  142.             </div>
  143.         {% endif %}
  144.         {% endif %}
  145.         <a href="{{ path('view_course', {'token': course.token }) }}" class="course-link-img">
  146.         {% if course is hasseveralavailabilities %}
  147.             <div class="course-dates">{{ "directory.several_dates" | trans }}</div>
  148.         {% endif %}
  149.         {% if course.cover and course.cover is fileexists('courses_img_directory') %}
  150.             {% set firstPhoto = course.cover %}
  151.         {% else %}
  152.             {% set firstPhoto = 'default.png' %}
  153.         {% endif %}
  154.         <img loading="lazy" src="{{ asset('/images/stages/' ~ firstPhoto) }}" alt="Stage">
  155.         </a>
  156.         <div class="sports-wrap">
  157.             {% for sport in course.sports %}
  158.                 <a href="{{ path('courses', {'sports[]': sport.id, 'search': 'true'}) }}" class="sport-item">
  159.                     {{ ("sport_name." ~ sport.slug) | trans }}
  160.                 </a>
  161.             {% endfor %}
  162.         </div>
  163.     </div>
  164.     <div class="course-infos">
  165.         <a href="{{ path('view_course', {'token': course.token }) }}" class="course-link">
  166.             <h3 class="course-title">
  167.                 {{ course.getTranslatedContent(app.request.locale).name | raw }} 
  168.             </h3>
  169.             <div class="course-author {{ type }}">
  170.                 <div class="author">
  171.                     <a href="{{ path('view_pro', {'type': type, 'slug': course.owner.slug}) }}" class="author-link">
  172.                         {% if course.owner.photo is fileexists('avatar_directory') %}
  173.                             {% set avatar = course.owner.photo %}
  174.                         {% else %}
  175.                             {% set avatar = 'default-profile.png' %}
  176.                         {% endif %}
  177.                         <img loading="lazy" src="{{ asset('/images/profiles/' ~ avatar) }}" alt="{{ type | slice(0, 1) }}">
  178.                         <p class="course-owner-name">{{ course.owner.proInfo.fullname }}</p>
  179.                     </a>
  180.                 </div>
  181.                 
  182.                 <div class="author-stars">
  183.                     {% set averageNotes = getAverageNotes(course.owner)%}
  184.                     {% set average = averageNotes.total %}
  185.                     {% if average != 0 %}
  186.                         {% for i in 1..5 %}
  187.                             {% if average >= i %}
  188.                                 <i class="fas fa-star"></i>
  189.                             {% else %}
  190.                                 {% if average > (i - 1) %}
  191.                                     <i class="fas fa-star-half-alt"></i>
  192.                                 {% else %}
  193.                                     <i class="far fa-star"></i>                                    
  194.                                 {% endif %}
  195.                             {% endif %}
  196.                         {% endfor %}
  197.                     {% else %}
  198.                         {% for i in 1..5 %}
  199.                                 <i class="fas fa-star grey-star"></i>
  200.                             
  201.                         {% endfor %}
  202.                     {% endif %}
  203.                     <span class="pro-review-note">({{ averageNotes.count }})</span>
  204.                 </div>
  205.                 
  206.             </div>
  207.             
  208.             <div class="course-bottom">
  209.                 <div class="left-wrap">
  210.                     <div class="location">
  211.                         <img loading="lazy" src="{{ asset('/images/flag/') ~ course.countryCode | lower }}.svg" class="country-flag" alt="{{ course.countryCode }}">
  212.                         <span class="text">{{ course.address.city }}</span>
  213.                     </div>
  214.                     <div class="date">
  215.                     {% if course.status == "pending" or course.status == "active" %}
  216.                         <img loading="lazy" src="/images/icons/calendar-icon.svg" alt="Dates">
  217.                         {% if course.availabilities | length > 0 and course | nextdate(startingDate).begin != null %}
  218.                             {% if course is hasseveralavailabilities %}
  219.                                 <span class="text">{{ "courses.next_date" | trans }} : {{ course | nextdate(startingDate).begin }}</span>
  220.                             {% else %}
  221.                                 <span class="text">{{ "page_course_detail.from_short" | trans }} {{ course | nextdate(startingDate).begin }} {{ "page_course_detail.to" | trans }} {{ course | nextdate(startingDate).end }}</span>
  222.                             {% endif %}
  223.                         {% endif %}
  224.                     {% endif %}
  225.                     </div>
  226.                 </div>
  227.                 <div class="right-wrap">
  228.                     {% if course.availabilities | length > 0 and course | cheapestavailability.price != null %}
  229.                         <span class="price">{{ course | cheapestavailability.price }} €</span>
  230.                         <span class="duration">{{ "directory.on" | trans }} {{ course | cheapestavailability.duration }} {{ "page_course_detail.days" | trans | lower }}</span>
  231.                     {% endif %}
  232.                 </div>
  233.             </div>
  234.         </div>
  235.     </a>
  236. </div>