| ... | ... |
@@ -12,13 +12,16 @@ |
| 12 | 12 |
* Table tl_eSM_team |
| 13 | 13 |
*/ |
| 14 | 14 |
|
| 15 |
+use Contao\DC_Table; |
|
| 16 |
+use Contao\DataContainer; |
|
| 17 |
+ |
|
| 15 | 18 |
$GLOBALS['TL_DCA']['tl_eSM_team'] = array |
| 16 | 19 |
( |
| 17 | 20 |
|
| 18 | 21 |
// Config |
| 19 | 22 |
'config' => array |
| 20 | 23 |
( |
| 21 |
- 'dataContainer' => 'Table', |
|
| 24 |
+ 'dataContainer' => DC_Table::class, |
|
| 22 | 25 |
'ptable' => 'tl_eSM_team_group', |
| 23 | 26 |
'enableVersioning' => true, |
| 24 | 27 |
'sql' => array |
| ... | ... |
@@ -38,17 +41,20 @@ $GLOBALS['TL_DCA']['tl_eSM_team'] = array |
| 38 | 41 |
'sorting' => array |
| 39 | 42 |
( |
| 40 | 43 |
|
| 41 |
- 'mode' => 4, |
|
| 44 |
+ 'mode' => DataContainer::MODE_PARENT, |
|
| 42 | 45 |
'fields' => array('division', 'lastname'),
|
| 43 | 46 |
'headerFields' => array('title'),
|
| 44 | 47 |
'panelLayout' => 'filter,search;sort,limit', |
| 45 | 48 |
'child_record_callback' => array('tl_eSM_team', 'listMembers')
|
| 46 |
- ), |
|
| 49 |
+ ), |
|
| 50 |
+ 'label' => array |
|
| 51 |
+ ( |
|
| 52 |
+ |
|
| 53 |
+ ), |
|
| 47 | 54 |
'global_operations' => array |
| 48 | 55 |
( |
| 49 | 56 |
'all' => array |
| 50 | 57 |
( |
| 51 |
- 'label' => &$GLOBALS['TL_LANG']['MSC']['all'], |
|
| 52 | 58 |
'href' => 'act=select', |
| 53 | 59 |
'class' => 'header_edit_all', |
| 54 | 60 |
'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"' |
| ... | ... |
@@ -58,43 +64,45 @@ $GLOBALS['TL_DCA']['tl_eSM_team'] = array |
| 58 | 64 |
( |
| 59 | 65 |
'edit' => array |
| 60 | 66 |
( |
| 61 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['edit'], |
|
| 62 | 67 |
'href' => 'act=edit', |
| 63 |
- 'icon' => 'edit.gif' |
|
| 68 |
+ 'icon' => 'edit.svg' |
|
| 64 | 69 |
), |
| 65 | 70 |
'copy' => array |
| 66 | 71 |
( |
| 67 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['copy'], |
|
| 68 |
- 'href' => 'act=copy', |
|
| 69 |
- 'icon' => 'copy.gif' |
|
| 72 |
+ 'href' => 'act=paste&mode=copy', |
|
| 73 |
+ 'attributes' => 'onclick="Backend.getScrollOffset()"', |
|
| 74 |
+ 'icon' => 'copy.svg' |
|
| 70 | 75 |
), |
| 76 |
+ 'cut' => array |
|
| 77 |
+ ( |
|
| 78 |
+ 'href' => 'act=paste&mode=cut', |
|
| 79 |
+ 'icon' => 'cut.svg', |
|
| 80 |
+ 'attributes' => 'onclick="Backend.getScrollOffset()"' |
|
| 81 |
+ ), |
|
| 71 | 82 |
'delete' => array |
| 72 | 83 |
( |
| 73 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['delete'], |
|
| 74 | 84 |
'href' => 'act=delete', |
| 75 |
- 'icon' => 'delete.gif', |
|
| 76 |
- 'attributes' => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['tl_eSM_team']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"' |
|
| 85 |
+ 'icon' => 'delete.svg', |
|
| 86 |
+ 'attributes' => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"' |
|
| 77 | 87 |
), |
| 78 | 88 |
'toggle' => array |
| 79 | 89 |
( |
| 80 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['toggle'], |
|
| 81 |
- 'icon' => 'visible.gif', |
|
| 82 |
- 'attributes' => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleVisibility(this,%s)"', |
|
| 83 |
- 'button_callback' => array('tl_eSM_team', 'toggleIcon')
|
|
| 90 |
+ 'href' => 'act=toggle&field=invisible', |
|
| 91 |
+ 'icon' => 'visible.svg', |
|
| 92 |
+// 'button_callback' => array('tl_eSM_team', 'toggleIcon')
|
|
| 84 | 93 |
), |
| 85 |
- 'show' => array |
|
| 86 |
- ( |
|
| 87 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['show'], |
|
| 88 |
- 'href' => 'act=show', |
|
| 89 |
- 'icon' => 'show.gif' |
|
| 90 |
- ) |
|
| 94 |
+ 'show' => array |
|
| 95 |
+ ( |
|
| 96 |
+ 'href' => 'act=show', |
|
| 97 |
+ 'icon' => 'show.svg' |
|
| 98 |
+ ) |
|
| 91 | 99 |
) |
| 92 | 100 |
), |
| 93 | 101 |
|
| 94 | 102 |
// Palettes |
| 95 | 103 |
'palettes' => array |
| 96 | 104 |
( |
| 97 |
- 'default' => '{person_legend},firstname,lastname;{company_legend},position,division;{picture_legend},singleSRC;{publish_legend:hide},published'
|
|
| 105 |
+ 'default' => '{person_legend},firstname,lastname,comment;{company_legend},position,division;{picture_legend},singleSRC;{publish_legend:hide},published'
|
|
| 98 | 106 |
), |
| 99 | 107 |
|
| 100 | 108 |
// Subpalettes |
| ... | ... |
@@ -146,6 +154,14 @@ $GLOBALS['TL_DCA']['tl_eSM_team'] = array |
| 146 | 154 |
'eval' => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'),
|
| 147 | 155 |
'sql' => "varchar(128) NOT NULL default ''" |
| 148 | 156 |
), |
| 157 |
+ 'comment' => array |
|
| 158 |
+ ( |
|
| 159 |
+ 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['comment'], |
|
| 160 |
+ 'exclude' => true, |
|
| 161 |
+ 'inputType' => 'textarea', |
|
| 162 |
+ 'eval' => array('mandatory'=>false, 'maxlength'=>128, 'tl_class'=>'clr'),
|
|
| 163 |
+ 'sql' => "varchar(128) NOT NULL default ''" |
|
| 164 |
+ ), |
|
| 149 | 165 |
'division' => array |
| 150 | 166 |
( |
| 151 | 167 |
'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['division'], |
| ... | ... |
@@ -12,13 +12,18 @@ |
| 12 | 12 |
* Table tl_eSM_team_group |
| 13 | 13 |
*/ |
| 14 | 14 |
|
| 15 |
+use Contao\DC_Table; |
|
| 16 |
+use Contao\DataContainer; |
|
| 17 |
+use Contao\System; |
|
| 18 |
+use Contao\CoreBundle\Security\ContaoCorePermissions; |
|
| 19 |
+ |
|
| 15 | 20 |
$GLOBALS['TL_DCA']['tl_eSM_team_group'] = array |
| 16 | 21 |
( |
| 17 | 22 |
|
| 18 | 23 |
// Config |
| 19 | 24 |
'config' => array |
| 20 | 25 |
( |
| 21 |
- 'dataContainer' => 'Table', |
|
| 26 |
+ 'dataContainer' => DC_Table::class, |
|
| 22 | 27 |
'ctable' => array('tl_eSM_team'),
|
| 23 | 28 |
'switchToEdit' => true, |
| 24 | 29 |
'enableVersioning' => true, |
| ... | ... |
@@ -36,7 +41,7 @@ $GLOBALS['TL_DCA']['tl_eSM_team_group'] = array |
| 36 | 41 |
( |
| 37 | 42 |
'sorting' => array |
| 38 | 43 |
( |
| 39 |
- 'mode' => 1, |
|
| 44 |
+ 'mode' => DataContainer::MODE_SORTED, |
|
| 40 | 45 |
'fields' => array('title'),
|
| 41 | 46 |
'flag' => 1, |
| 42 | 47 |
'panelLayout' => 'filter,search;sort,limit', |
| ... | ... |
@@ -50,7 +55,6 @@ $GLOBALS['TL_DCA']['tl_eSM_team_group'] = array |
| 50 | 55 |
( |
| 51 | 56 |
'all' => array |
| 52 | 57 |
( |
| 53 |
- 'label' => &$GLOBALS['TL_LANG']['MSC']['all'], |
|
| 54 | 58 |
'href' => 'act=select', |
| 55 | 59 |
'class' => 'header_edit_all', |
| 56 | 60 |
'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"' |
| ... | ... |
@@ -60,36 +64,31 @@ $GLOBALS['TL_DCA']['tl_eSM_team_group'] = array |
| 60 | 64 |
( |
| 61 | 65 |
'edit' => array |
| 62 | 66 |
( |
| 63 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['edit'], |
|
| 64 | 67 |
'href' => 'table=tl_eSM_team', |
| 65 |
- 'icon' => 'edit.gif' |
|
| 68 |
+ 'icon' => 'edit.svg' |
|
| 66 | 69 |
), |
| 67 | 70 |
'editheader' => array |
| 68 | 71 |
( |
| 69 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['editheader'], |
|
| 70 | 72 |
'href' => 'act=edit', |
| 71 |
- 'icon' => 'header.gif', |
|
| 73 |
+ 'icon' => 'header.svg', |
|
| 72 | 74 |
'button_callback' => array('tl_eSM_team_group', 'editHeader')
|
| 73 | 75 |
), |
| 74 | 76 |
'copy' => array |
| 75 | 77 |
( |
| 76 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['copy'], |
|
| 77 | 78 |
'href' => 'act=copy', |
| 78 |
- 'icon' => 'copy.gif' |
|
| 79 |
- ), |
|
| 80 |
- 'delete' => array |
|
| 81 |
- ( |
|
| 82 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['delete'], |
|
| 83 |
- 'href' => 'act=delete', |
|
| 84 |
- 'icon' => 'delete.gif', |
|
| 85 |
- 'attributes' => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['tl_eSM_team_group']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"' |
|
| 79 |
+ 'icon' => 'copy.svg' |
|
| 86 | 80 |
), |
| 87 |
- 'show' => array |
|
| 88 |
- ( |
|
| 89 |
- 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['show'], |
|
| 90 |
- 'href' => 'act=show', |
|
| 91 |
- 'icon' => 'show.gif' |
|
| 92 |
- ) |
|
| 81 |
+ 'delete' => array |
|
| 82 |
+ ( |
|
| 83 |
+ 'href' => 'act=delete', |
|
| 84 |
+ 'icon' => 'delete.svg', |
|
| 85 |
+ 'attributes' => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"' |
|
| 86 |
+ ), |
|
| 87 |
+ 'show' => array |
|
| 88 |
+ ( |
|
| 89 |
+ 'href' => 'act=show', |
|
| 90 |
+ 'icon' => 'show.svg' |
|
| 91 |
+ ) |
|
| 93 | 92 |
) |
| 94 | 93 |
), |
| 95 | 94 |
|
| ... | ... |
@@ -156,6 +155,6 @@ class tl_eSM_team_group extends Backend |
| 156 | 155 |
*/ |
| 157 | 156 |
public function editHeader($row, $href, $label, $title, $icon, $attributes) |
| 158 | 157 |
{
|
| 159 |
- return $this->User->canEditFieldsOf('tl_eSM_team') ? '<a href="'.$this->addToUrl($href.'&id='.$row['id']).'" title="'.specialchars($title).'"'.$attributes.'>'.Image::getHtml($icon, $label).'</a> ' : Image::getHtml(preg_replace('/\.gif$/i', '_.gif', $icon)).' ';
|
|
| 158 |
+ return System::getContainer()->get('security.helper')->isGranted(ContaoCorePermissions::USER_CAN_EDIT_FIELDS_OF_TABLE,'tl_eSM_team') ? '<a href="'.$this->addToUrl($href.'&id='.$row['id']).'" title="'.specialchars($title).'"'.$attributes.'>'.Image::getHtml($icon, $label).'</a> ' : Image::getHtml(preg_replace('/\.gif$/i', '_.gif', $icon)).' ';
|
|
| 160 | 159 |
} |
| 161 | 160 |
} |
| 162 | 161 |
\ No newline at end of file |
| ... | ... |
@@ -8,7 +8,15 @@ |
| 8 | 8 |
* @license LGPL-3.0+ |
| 9 | 9 |
*/ |
| 10 | 10 |
|
| 11 |
-$GLOBALS['TL_DCA']['tl_module']['palettes']['teamlist'] = '{title_legend},name,headline,type;{team_legend},eSM_team_group,eSM_team_divisions;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space';
|
|
| 11 |
+$GLOBALS['TL_DCA']['tl_module']['palettes']['team_list'] = ' |
|
| 12 |
+ {title_legend},name,headline,type;
|
|
| 13 |
+ {team_legend},eSM_team_group,eSM_team_divisions;
|
|
| 14 |
+ {image_legend},imgSize;
|
|
| 15 |
+ {template_legend:hide},customTpl;
|
|
| 16 |
+ {protected_legend:hide},protected;
|
|
| 17 |
+ {expert_legend:hide},guests,cssID
|
|
| 18 |
+'; |
|
| 19 |
+ |
|
| 12 | 20 |
|
| 13 | 21 |
$GLOBALS['TL_DCA']['tl_module']['fields']['eSM_team_group'] = array |
| 14 | 22 |
( |
| ... | ... |
@@ -29,11 +37,4 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['eSM_team_divisions'] = array |
| 29 | 37 |
'reference' => &$GLOBALS['TL_LANG']['REF']['divisions'], |
| 30 | 38 |
'eval' => array('mandatory'=>true, 'multiple'=>true),
|
| 31 | 39 |
'sql' => "blob NULL" |
| 32 |
-); |
|
| 33 |
- |
|
| 34 |
-$GLOBALS['TL_DCA']['tl_module']['palettes']['team_list'] = ' |
|
| 35 |
- {title_legend},name,headline,type;
|
|
| 36 |
- {template_legend:hide},customTpl;
|
|
| 37 |
- {protected_legend:hide},protected;
|
|
| 38 |
- {expert_legend:hide},guests,cssID
|
|
| 39 |
-'; |
|
| 40 |
+); |
|
| 40 | 41 |
\ No newline at end of file |
| 41 | 42 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,54 @@ |
| 1 |
+{% extends '@Contao/block_searchable' %}
|
|
| 2 |
+{% import "@ContaoCore/Image/Studio/_macros.html.twig" as studio %}
|
|
| 3 |
+ |
|
| 4 |
+{% block content %}
|
|
| 5 |
+ {% if teammembers is not empty %}
|
|
| 6 |
+ <div class="swiper-slider"> |
|
| 7 |
+ <div id="swiper-{{ id }}"class="swiper-container">
|
|
| 8 |
+ <ul class="swiper-wrapper"> |
|
| 9 |
+ {% for member in teammembers %}
|
|
| 10 |
+ <li class="swiper-slide"> |
|
| 11 |
+ {% if member.imageFigure %}
|
|
| 12 |
+ {{- studio.figure(member.imageFigure, { attr: { class: ('image_container ') }}) -}}
|
|
| 13 |
+ {% endif %}
|
|
| 14 |
+ <div class="name">{{ member.firstname }} {{ member.lastname }}</div>
|
|
| 15 |
+ <div class="position">{{ member.position }}</div>
|
|
| 16 |
+ <div class="comment">{{ member.comment }}</div>
|
|
| 17 |
+ </li> |
|
| 18 |
+ {% endfor %}
|
|
| 19 |
+ </ul> |
|
| 20 |
+ <div class="swiper-button-next"></div> |
|
| 21 |
+ <div class="swiper-button-prev"></div> |
|
| 22 |
+ </div> |
|
| 23 |
+ </div> |
|
| 24 |
+ {% endif %}
|
|
| 25 |
+ |
|
| 26 |
+ <script> |
|
| 27 |
+ var swiperEl = document.getElementById('swiper-{{ id }}');
|
|
| 28 |
+ new Swiper(swiperEl, {
|
|
| 29 |
+ "loop": true, |
|
| 30 |
+ "speed": 500, |
|
| 31 |
+ "slidesPerView": 5, |
|
| 32 |
+ "slidesPerGroup": 5, |
|
| 33 |
+ "spaceBetween": 5, |
|
| 34 |
+ "effect": "slide", |
|
| 35 |
+ "navigation": {
|
|
| 36 |
+ "nextEl": swiperEl.querySelectorAll('.swiper-button-next')[0],
|
|
| 37 |
+ "prevEl": swiperEl.querySelectorAll('.swiper-button-prev')[0]
|
|
| 38 |
+ }, |
|
| 39 |
+ "breakpoints": {
|
|
| 40 |
+ 900: {
|
|
| 41 |
+ "slidesPerView": 5, |
|
| 42 |
+ "slidesPerGroup": 5, |
|
| 43 |
+ }, |
|
| 44 |
+ 599: {
|
|
| 45 |
+ "slidesPerView": 2, |
|
| 46 |
+ "slidesPerGroup": 2, |
|
| 47 |
+ }, |
|
| 48 |
+ 0: {
|
|
| 49 |
+ "slidesPerView": 1, |
|
| 50 |
+ "slidesPerGroup": 1, |
|
| 51 |
+ } |
|
| 52 |
+ } |
|
| 53 |
+ })</script> |
|
| 54 |
+{% endblock %}
|
| ... | ... |
@@ -6,16 +6,63 @@ namespace App\Controller\FrontendModule; |
| 6 | 6 |
|
| 7 | 7 |
use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController; |
| 8 | 8 |
use Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule; |
| 9 |
+use Contao\CoreBundle\Image\Studio\Studio; |
|
| 9 | 10 |
use Contao\ModuleModel; |
| 11 |
+use Contao\StringUtil; |
|
| 12 |
+use Contao\System; |
|
| 10 | 13 |
use Contao\Template; |
| 14 |
+use Doctrine\DBAL\Connection; |
|
| 11 | 15 |
use Symfony\Component\HttpFoundation\Request; |
| 12 | 16 |
use Symfony\Component\HttpFoundation\Response; |
| 13 | 17 |
|
| 14 | 18 |
#[AsFrontendModule(category: "miscellaneous")] |
| 15 | 19 |
class TeamListController extends AbstractFrontendModuleController |
| 16 | 20 |
{
|
| 21 |
+ /** |
|
| 22 |
+ * @var Connection |
|
| 23 |
+ */ |
|
| 24 |
+ protected $db; |
|
| 25 |
+ |
|
| 26 |
+ public function __invoke(Request $request, ModuleModel $model, string $section, array $classes = null): Response |
|
| 27 |
+ {
|
|
| 28 |
+ $this->db = System::getContainer()->get('database_connection');
|
|
| 29 |
+ return parent::__invoke($request, $model, $section, $classes); // TODO: Change the autogenerated stub |
|
| 30 |
+ } |
|
| 31 |
+ |
|
| 17 | 32 |
protected function getResponse(Template $template, ModuleModel $model, Request $request): Response |
| 18 | 33 |
{
|
| 34 |
+ $Team = $this->db->executeQuery( |
|
| 35 |
+ "SELECT * FROM tl_eSM_team WHERE division IN (:division) AND pid = :group AND published = '1' ORDER BY division, lastname", |
|
| 36 |
+ [ |
|
| 37 |
+ 'division' => StringUtil::deserialize($model->eSM_team_divisions), |
|
| 38 |
+ 'group' => $model->eSM_team_group |
|
| 39 |
+ ], |
|
| 40 |
+ ['division' => Connection::PARAM_STR_ARRAY] |
|
| 41 |
+ ); |
|
| 42 |
+ |
|
| 43 |
+ if ($Team->rowCount()) |
|
| 44 |
+ {
|
|
| 45 |
+ $arrTeam = []; |
|
| 46 |
+ $figureBuilder = System::getContainer() |
|
| 47 |
+ ->get(Studio::class) |
|
| 48 |
+ ->createFigureBuilder() |
|
| 49 |
+ ->enableLightbox(); |
|
| 50 |
+ |
|
| 51 |
+ foreach ($Team->fetchAllAssociative() as $member) |
|
| 52 |
+ {
|
|
| 53 |
+ $arrTeam[] = array_merge($member,[ |
|
| 54 |
+ 'imageFigure' => $figureBuilder->fromUuid($member['singleSRC'])->setSize($model->imgSize)->build() |
|
| 55 |
+ ]); |
|
| 56 |
+ } |
|
| 57 |
+ |
|
| 58 |
+ shuffle($arrTeam); |
|
| 59 |
+ |
|
| 60 |
+ $template->teammembers = $arrTeam; |
|
| 61 |
+ |
|
| 62 |
+ $GLOBALS['TL_CSS']['swiper'] = 'bundles/esalesmediacontaoswiper/css/swiper-custom.css'; |
|
| 63 |
+ $GLOBALS['TL_JAVASCRIPT']['swiper'] = 'bundles/esalesmediacontaoswiper/js/lib/swiper/6.5.0/swiper-bundle.min.js'; // load swiper |
|
| 64 |
+ } |
|
| 65 |
+ |
|
| 19 | 66 |
return $template->getResponse(); |
| 20 | 67 |
} |
| 21 | 68 |
} |