This article documents the Localist Liquid template variables for Places, Groups/Departments, Channel Pages, Components, and Featured Sections. These objects represent the organizational and structural layer of Localist — where events happen (Places), who organizes them (Groups/Departments), and how they’re displayed (Channels and Components).
Overview
Localist’s data model includes several interconnected object types that define the organizational structure of an event calendar:
-
Place — A physical or virtual location where events occur
-
Group/Department — An organization entity that hosts or manages events
-
Channel Page — A customizable page that displays events and other content
-
Component — A display element within a channel page (event lists, filters, calendars)
-
Featured Section — A curated collection of events displayed on a channel
The Place Object
A Place represents a location where events can occur. Places store address information, contact details, geographical coordinates, and classification data.
Identity
| Variable | Type | Description |
|---|---|---|
name |
String | Display name of the place (alias: visible_name) |
url |
String | URL path for the place page |
description |
String | Full HTML description of the place |
photo |
Photo | Associated photo object (see Article 5) |
Location
| Variable | Type | Description |
|---|---|---|
address |
String | Street address |
city |
String | City name |
latitude |
Float | Geographic latitude coordinate |
longitude |
Float | Geographic longitude coordinate |
directions |
String | Directions to the place |
parking |
String | Parking information |
distance |
Float | Distance from a reference point (when applicable) |
Contact
| Variable | Type | Description |
|---|---|---|
phone |
String | Phone number |
hours |
String | Operating hours |
website |
String | URL to the place’s website |
facebook_url |
String | URL to Facebook page |
Classification
Place classification uses the same Tag/TagList and Custom Fields system documented in Article 5 (Shared Object Types). The fields below are the place-specific entry points.
| Variable | Type | Description |
|---|---|---|
place_types |
String | Comma-separated place type classification (alias: business_type) |
types |
Array | Array of place type objects |
tags |
Array | Array of tag strings |
keywords |
Array | Array of keyword strings |
custom_fields |
Custom Fields | Dynamic collection of custom field values (see Article 5) |
Mapping
| Variable | Type | Description |
|---|---|---|
campusbird_id |
String | Identifier for the Concept3D Map integration. (Property name retained for backward compatibility.) |
has_campusbird_map |
Boolean | Whether this place is mapped in the Concept3D Map integration. |
has_c3d_map_override |
Boolean | Whether the Concept3D Map override is enabled for this place. |
Permissions
| Variable | Type | Description |
|---|---|---|
can_edit |
Boolean | Whether the current user can edit this place |
has_details? |
Boolean | Whether the place has available details |
Example: Accessing Place Data
{% if event.place %}
<div class="location">
<h3>{{ event.place.name }}</h3>
<p>{{ event.place.address }}, {{ event.place.city }}</p>
<p>Phone: {{ event.place.phone }}</p>
{% if event.place.latitude and event.place.longitude %}
<a href="https://maps.google.com/?q={{ event.place.latitude }},{{ event.place.longitude }}">
View on Map
</a>
{% endif %}
</div>
{% endif %}
The Group/Department Object
Groups and Departments represent organizational entities within Localist. Both use the same object structure; the distinction is typically organizational (departments are hierarchical units within institutions; groups are independent organizations).
Core
| Variable | Type | Description |
|---|---|---|
name |
String | Display name of the group or department |
description |
String | Full HTML description |
description_text |
String | Plain text version of the description |
urlname |
String | URL-friendly slug for the group/department |
visible_name |
String | Alternate display name |
url |
String | URL path for the group/department page |
photo |
Photo | Associated photo object (see Article 5) |
is_group |
Boolean | Whether this is a group (vs. department) |
is_department |
Boolean | Whether this is a department (vs. group) |
Social/Web
| Variable | Type | Description |
|---|---|---|
twitter_name |
String | Twitter handle |
facebook_url |
String | Facebook page URL |
homepage |
String | Homepage URL |
website |
String | Website URL |
Organization
| Variable | Type | Description |
|---|---|---|
group_types |
Array | Array of group type classifications |
types |
Array | Array of type objects |
custom_fields |
Custom Fields | Dynamic collection of custom field values (see Article 5) |
approve_requests |
Boolean | Whether membership requests require approval |
URLs
| Variable | Type | Description |
|---|---|---|
calendar_url |
String | URL to the group’s calendar page |
edit_description_url |
String | URL to edit group description (if permitted) |
add_request_url |
String | URL to request membership |
feed_link |
String | URL to RSS feed of group events |
Permissions
| Variable | Type | Description |
|---|---|---|
current_user_is_officer |
Boolean | Whether the current user is an officer of the group |
can_manage_group |
Boolean | Whether the current user can manage this group |
Example: Accessing Group/Department Data
<div class="group-info">
<h2>{{ group.name }}</h2>
<p>{{ group.description }}</p>
{% if group.twitter_name %}
<a href="https://twitter.com/{{ group.twitter_name }}">Follow on Twitter</a>
{% endif %}
{% if group.is_department %}
<span class="badge">Department</span>
{% else %}
<span class="badge">Group</span>
{% endif %}
{% if group.can_manage_group %}
<a href="{{ group.edit_description_url }}">Edit Description</a>
{% endif %}
</div>
The Channel Page Object
A Channel Page is a customizable landing page within Localist that displays components, events, and other content. Developers can theme the entire channel page layout, content area, and styling.
| Variable | Type | Description |
|---|---|---|
title |
String | Page title displayed in browser and header |
urlname |
String | URL-friendly slug for the channel |
is_visible |
Boolean | Whether the channel is publicly visible |
enabled |
Boolean | Whether the channel is enabled |
cover_photo |
Photo | Photo object for the page header/background (see Article 5) |
columns |
Array | Array of column definitions for the page layout |
lock_navigation_to_channel? |
Boolean | Whether navigation is restricted to this channel |
custom_css |
String | Custom CSS rules applied to the page |
header_name |
String | Custom name for the page header |
has_map_component |
Boolean | Whether a map component is present on the page |
can_edit |
Boolean | Whether the current user can edit this channel |
Example: Accessing Channel Page Data
<!DOCTYPE html>
<html>
<head>
<title>{{ channel_page.title }}</title>
{% if channel_page.custom_css %}
<style>{{ channel_page.custom_css }}</style>
{% endif %}
</head>
<body>
<div class="channel-page">
{% if channel_page.cover_photo %}
<div class="hero" style="background-image: url('{{ channel_page.cover_photo.hero }}');">
<h1>{{ channel_page.header_name }}</h1>
</div>
{% endif %}
<main class="channel-content">
{% channel_page_components channel_page %}
</main>
</div>
</body>
</html>
Components
Components are display elements that render on channel pages. The base Component type has common properties, but specialized subclasses add additional attributes for specific display modes.
Base Component Properties
All components share the following properties:
| Variable | Type | Description |
|---|---|---|
title |
String | Display name of the component |
type |
String | Component type (e.g., event_list, filter_list, month_calendar) |
visible |
Boolean | Whether the component is visible on the page |
Event List Component
Event List Components display a list of events, sorted and filtered according to configuration. They add the following properties to the base component:
| Variable | Type | Description |
|---|---|---|
days |
Integer | Number of days ahead to include in the list |
num |
Integer | Maximum number of events to display |
sort |
String | Sort order for events (e.g., start_time, name) |
include_in_default |
Boolean | Whether to include in default/home layout |
show_calendar_link |
Boolean | Whether to display a link to the full calendar |
start |
DateTime | Start date/time for the event range |
events |
Array | Array of Event objects to display |
hide_tab |
Boolean | Whether to hide the component tab |
header_text |
String | Custom header text for the component |
size |
String | Display size (e.g., small, medium, large) |
Example: Rendering an Event List Component
{% if component.type == 'event_list' %}
<div class="event-list-component" data-component-id="{{ component.id }}">
<h3>{{ component.header_text }}</h3>
<ul class="event-list">
{% for event in component.events limit: component.num %}
<li>
<div class="event-item">
<p class="event-date">{{ event.starts_at | date: "%b %d, %Y" }}</p>
<h4><a href="{{ event.url }}">{{ event.name }}</a></h4>
{% if event.place %}
<p class="event-location">{{ event.place.name }}</p>
{% endif %}
</div>
</li>
{% endfor %}
</ul>
{% if component.show_calendar_link %}
<a href="#calendar" class="view-calendar-link">View Full Calendar</a>
{% endif %}
</div>
{% endif %}
Filter List Component
Filter List Components allow users to filter events by category, group, place, or other criteria. They add the following property to the base component:
| Variable | Type | Description |
|---|---|---|
show_date_picker |
Boolean | Whether to display a date picker for filtering |
Example: Rendering a Filter List Component
{% if component.type == 'filter_list' %}
<div class="filter-list-component" data-component-id="{{ component.id }}">
<h3>{{ component.title }}</h3>
<form class="filter-form">
{% if component.show_date_picker %}
<div class="filter-group">
<label>Start Date:</label>
<input type="date" name="start_date">
</div>
{% endif %}
<div class="filter-group">
<label>Filter by Category:</label>
<select name="filter">
<option value="">All Categories</option>
<!-- Filter options populated by JavaScript -->
</select>
</div>
<button type="submit">Apply Filters</button>
</form>
</div>
{% endif %}
Month Calendar Component
Month Calendar Components display events in a traditional calendar grid. They add the following properties to the base component:
| Variable | Type | Description |
|---|---|---|
events_per_day |
Integer | Maximum number of events to show per day cell |
include_in_default |
Boolean | Whether to include in default/home layout |
sort |
String | Sort order for events within each day |
Example: Rendering a Month Calendar Component
{% if component.type == 'month_calendar' %}
<div class="month-calendar-component" data-component-id="{{ component.id }}">
<h3>{{ component.title }}</h3>
<table class="calendar-grid">
<thead>
<tr>
<th>Sun</th>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
<th>Sat</th>
</tr>
</thead>
<tbody>
<!-- Calendar cells rendered by JavaScript or server logic -->
<!-- Each cell can display up to component.events_per_day events -->
</tbody>
</table>
</div>
{% endif %}
The Featured Section Object
Featured Sections are curated groups of events displayed on a channel page. They allow administrators to highlight specific events in a dedicated section.
| Variable | Type | Description |
|---|---|---|
name |
String | Display name of the featured section |
is_visible |
Boolean | Whether the section is publicly visible |
link_name |
String | Text label for the section link |
id |
String | Unique identifier for the section |
events |
Array of EventInstance | Array of events in this section |
Example: Rendering a Featured Section
{% if featured_section and featured_section.is_visible %}
<section class="featured-section" id="featured-{{ featured_section.id }}">
<h2>{{ featured_section.name }}</h2>
<div class="featured-events">
{% for event in featured_section.events %}
<article class="featured-event">
<div class="event-image">
{% if event.photo %}
<img src="{{ event.photo.featured }}" alt="{{ event.name }}">
{% endif %}
</div>
<div class="event-content">
<h3><a href="{{ event.url }}">{{ event.name }}</a></h3>
<p class="event-date">{{ event.starts_at | date: "%A, %B %d, %Y" }}</p>
{% if event.place %}
<p class="event-location">{{ event.place.name }}</p>
{% endif %}
<p class="event-description">{{ event.description | truncate: 150 }}</p>
</div>
</article>
{% endfor %}
</div>
</section>
{% endif %}
Common Patterns and Usage
Iterating Over Collections
Templates receive the collections they need for that page—for example groups, departments, selected_groups, and selected_departments on the public event form (see Articles 8–9). Use those variable names in {% for %} loops.
{% for group in groups %}
<a href="{{ group.url }}" class="group-link">{{ group.name }}</a>
{% endfor %}
{% for group in selected_groups %}
<span class="group-pill">{{ group.name }}</span>
{% endfor %}
Conditional Display Based on Permissions
Use place.can_edit to show or hide editing affordances. For edit links, follow the same URL patterns as the default Place templates in the theme.
{% if place.can_edit %}
<!-- Add edit link using the same route pattern as the default Place page -->
{% endif %}
{% if group.can_manage_group %}
<div class="admin-panel">
<!-- Group management UI -->
</div>
{% endif %}
Accessing Custom Fields
All objects that support custom fields (Place, Group/Department, Event) expose them through the custom_fields accessor. Custom fields are documented in detail in Article 5 (Shared Object Types).
<!-- Access a custom field by key -->
<p>{{ place.custom_fields.capacity }}</p>
<!-- Check if a custom field exists before displaying -->
{% if group.custom_fields.meeting_room %}
<p>Meeting Room: {{ group.custom_fields.meeting_room }}</p>
{% endif %}
Related Articles
This article is part of a 9-part series on Localist developer theming:
-
Introduction to Localist Developer Theming
-
Site Configuration and Global Objects
-
Events, Instances, and Related Objects
-
Places, Groups, Departments, and Channels
-
Shared Object Types
-
Custom Liquid Tags Reference
-
Custom Liquid Filters Reference
-
Template Variable Reference
-
Forms and User Management