Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 51a92ea45e | |||
| 1a4811cb02 |
@@ -9,7 +9,7 @@ use Contao\StringUtil;
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['member_organizations'] = '{title_legend},name,headline,type;{eventmanager_legend},editPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['member_events'] = '{title_legend},name,headline,type;{eventmanager_legend},editPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['event_filter'] = '{title_legend},name,headline,type;{eventmanager_legend},cal_calendar,eventListDomId;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['eventmanager_map'] = '{title_legend},name,headline,type;{eventmanager_legend},mapShowOrganizations,organizationTypeTags,mapShowExternalOrganizations,mapShowEvents,mapInitialDisplay,mapEventColor,mapOrganizationColor,mapCenterMode;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['eventmanager_map'] = '{title_legend},name,headline,type;{eventmanager_legend},mapShowOrganizations,organizationTypeTags,mapShowExternalOrganizations,mapShowEvents,mapInitialDisplay,mapEventColor,mapOrganizationColor,mapPitch,mapCenterMode;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['organization_edit'] = '{title_legend},name,headline,type;{eventmanager_legend},listPage,logoFolder,organizationTypeTags;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['event_edit'] = '{title_legend},name,headline,type;{eventmanager_legend},listPage,eventFolder,termsPage,frontendAuthorId,frontendArchiveId,eventTypeTags;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
|
||||
@@ -74,15 +74,33 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['organizationTypeTags'] = [
|
||||
'exclude' => true,
|
||||
'inputType' => 'checkbox',
|
||||
'options_callback' => static function () {
|
||||
$database = Database::getInstance();
|
||||
$labelExpression = $database->fieldExists('title', 'tl_tags')
|
||||
? "COALESCE(NULLIF(t.title, ''), t.tag)"
|
||||
: 't.tag';
|
||||
|
||||
$rows = Database::getInstance()
|
||||
->prepare('SELECT DISTINCT t.id, t.tag FROM tl_tags t LEFT JOIN tl_tags_rel r ON r.tag_id=t.id AND r.ptable=? AND r.field=? ORDER BY t.tag ASC')
|
||||
->prepare(sprintf(
|
||||
'SELECT DISTINCT t.id, %1$s AS label
|
||||
FROM tl_tags_rel r
|
||||
INNER JOIN tl_tags t ON t.id=r.tag_id
|
||||
WHERE r.ptable=? AND r.field=?
|
||||
ORDER BY label ASC',
|
||||
$labelExpression,
|
||||
))
|
||||
->execute('tl_organization', 'tags')
|
||||
->fetchAllAssoc();
|
||||
|
||||
$options = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$options[(int) $row['id']] = (string) $row['tag'];
|
||||
$label = trim((string) ($row['label'] ?? ''));
|
||||
|
||||
if ('' === $label) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$options[(int) $row['id']] = $label;
|
||||
}
|
||||
|
||||
return $options;
|
||||
@@ -162,7 +180,7 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['eventListDomId'] = [
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['__selector__'][] = 'mapCenterMode';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['__selector__'][] = 'mapInitialDisplay';
|
||||
$GLOBALS['TL_DCA']['tl_module']['subpalettes']['mapCenterMode_custom'] = 'mapCenterLat,mapCenterLng,mapCenterZoom,mapPitch';
|
||||
$GLOBALS['TL_DCA']['tl_module']['subpalettes']['mapCenterMode_custom'] = 'mapCenterLat,mapCenterLng,mapCenterZoom';
|
||||
$GLOBALS['TL_DCA']['tl_module']['subpalettes']['mapInitialDisplay_organization_tag'] = 'mapInitialOrganizationTagId';
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_module']['fields']['mapShowOrganizations'] = [
|
||||
@@ -204,15 +222,33 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['mapInitialOrganizationTagId'] = [
|
||||
'exclude' => true,
|
||||
'inputType' => 'select',
|
||||
'options_callback' => static function (): array {
|
||||
$rows = Database::getInstance()
|
||||
->prepare('SELECT DISTINCT t.id, t.tag FROM tl_tags t LEFT JOIN tl_tags_rel r ON r.tag_id=t.id AND r.ptable=? AND r.field=? ORDER BY t.tag ASC')
|
||||
$database = Database::getInstance();
|
||||
$labelExpression = $database->fieldExists('title', 'tl_tags')
|
||||
? "COALESCE(NULLIF(t.title, ''), t.tag)"
|
||||
: 't.tag';
|
||||
|
||||
$rows = $database
|
||||
->prepare(sprintf(
|
||||
'SELECT DISTINCT t.id, %1$s AS label
|
||||
FROM tl_tags_rel r
|
||||
INNER JOIN tl_tags t ON t.id=r.tag_id
|
||||
WHERE r.ptable=? AND r.field=?
|
||||
ORDER BY label ASC',
|
||||
$labelExpression,
|
||||
))
|
||||
->execute('tl_organization', 'tags')
|
||||
->fetchAllAssoc();
|
||||
|
||||
$options = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$options[(int) $row['id']] = (string) $row['tag'];
|
||||
$label = trim((string) ($row['label'] ?? ''));
|
||||
|
||||
if ('' === $label) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$options[(int) $row['id']] = $label;
|
||||
}
|
||||
|
||||
return $options;
|
||||
|
||||
@@ -44,6 +44,14 @@ class EventMapController extends AbstractFrontendModuleController
|
||||
array_map('intval', StringUtil::deserialize($model->organizationTypeTags ?? null, true)),
|
||||
static fn (int $tagId): bool => $tagId > 0,
|
||||
)));
|
||||
$availableOrganizationTags = $this->mapModuleDataProvider->getOrganizationTags();
|
||||
$availableOrganizationTagIds = array_map(
|
||||
static fn (array $tag): int => (int) ($tag['id'] ?? 0),
|
||||
$availableOrganizationTags,
|
||||
);
|
||||
$selectedOrganizationTagIds = [] === $selectedOrganizationTagIds
|
||||
? []
|
||||
: array_values(array_intersect($selectedOrganizationTagIds, $availableOrganizationTagIds));
|
||||
$initialDisplay = (string) ($model->mapInitialDisplay ?? self::DEFAULT_INITIAL_DISPLAY);
|
||||
$initialOrganizationTagId = (int) ($model->mapInitialOrganizationTagId ?? 0);
|
||||
$centerMode = (string) ($model->mapCenterMode ?? self::DEFAULT_CENTER_MODE);
|
||||
|
||||
@@ -150,7 +150,7 @@ class MapModuleDataProvider
|
||||
*/
|
||||
public function getOrganizationTags(array $selectedTagIds = []): array
|
||||
{
|
||||
if (!$this->tableExists('tl_tags')) {
|
||||
if (!$this->tableExists('tl_tags') || !$this->tableExists('tl_tags_rel')) {
|
||||
return [];
|
||||
}
|
||||
|
||||
@@ -168,8 +168,13 @@ class MapModuleDataProvider
|
||||
|
||||
$qb = $this->connection->createQueryBuilder();
|
||||
$qb
|
||||
->select('t.id', sprintf('t.%s AS label', $labelColumn))
|
||||
->from('tl_tags', 't')
|
||||
->select('DISTINCT t.id', sprintf('t.%s AS label', $labelColumn))
|
||||
->from('tl_tags_rel', 'r')
|
||||
->innerJoin('r', 'tl_tags', 't', 't.id = r.tag_id')
|
||||
->andWhere('r.ptable = :organization_ptable')
|
||||
->andWhere('(r.field = :organization_field OR r.field IS NULL OR r.field = \'\')')
|
||||
->setParameter('organization_ptable', 'tl_organization')
|
||||
->setParameter('organization_field', 'tags')
|
||||
->orderBy(sprintf('t.%s', $labelColumn), 'ASC');
|
||||
|
||||
if ([] !== $selectedTagIds) {
|
||||
@@ -216,23 +221,36 @@ class MapModuleDataProvider
|
||||
return [];
|
||||
}
|
||||
|
||||
$tagColumns = $this->getColumnMap('tl_tags');
|
||||
$tagLabelColumn = isset($tagColumns['title']) ? 'title' : (isset($tagColumns['tag']) ? 'tag' : null);
|
||||
|
||||
if (null === $tagLabelColumn) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$rows = $this->connection->executeQuery(
|
||||
'SELECT r.pid AS organization_id, r.tag_id, t.tag AS label
|
||||
sprintf(
|
||||
'SELECT r.pid AS organization_id, r.tag_id, t.%s AS label
|
||||
FROM tl_tags_rel r
|
||||
INNER JOIN tl_tags t ON t.id = r.tag_id
|
||||
WHERE r.ptable = ? AND r.field = ? AND r.pid IN (?)
|
||||
ORDER BY r.pid ASC, r.tag_id ASC',
|
||||
$tagLabelColumn,
|
||||
),
|
||||
['tl_organization', 'tags', $organizationIds],
|
||||
[ParameterType::STRING, ParameterType::STRING, ArrayParameterType::INTEGER],
|
||||
)->fetchAllAssociative();
|
||||
|
||||
if ([] === $rows) {
|
||||
$rows = $this->connection->executeQuery(
|
||||
'SELECT r.pid AS organization_id, r.tag_id, t.tag AS label
|
||||
sprintf(
|
||||
'SELECT r.pid AS organization_id, r.tag_id, t.%s AS label
|
||||
FROM tl_tags_rel r
|
||||
INNER JOIN tl_tags t ON t.id = r.tag_id
|
||||
WHERE r.ptable = ? AND r.pid IN (?)
|
||||
ORDER BY r.pid ASC, r.tag_id ASC',
|
||||
$tagLabelColumn,
|
||||
),
|
||||
['tl_organization', $organizationIds],
|
||||
[ParameterType::STRING, ArrayParameterType::INTEGER],
|
||||
)->fetchAllAssociative();
|
||||
@@ -246,13 +264,16 @@ class MapModuleDataProvider
|
||||
$tagId = (int) ($row['tag_id'] ?? 0);
|
||||
$label = trim((string) ($row['label'] ?? ''));
|
||||
|
||||
if ($organizationId <= 0 || $tagId <= 0 || '' === $label || isset($seen[$organizationId][$tagId])) {
|
||||
if ($organizationId <= 0 || $tagId <= 0 || isset($seen[$organizationId][$tagId])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$seen[$organizationId][$tagId] = true;
|
||||
$map[$organizationId]['ids'][] = (string) $tagId;
|
||||
$map[$organizationId]['labels'][] = $label;
|
||||
|
||||
if ('' !== $label) {
|
||||
$map[$organizationId]['labels'][] = $label;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($map as $organizationId => $tagData) {
|
||||
|
||||
Reference in New Issue
Block a user