8x11 DIRECTORY for PRINT

As much as possible we encourage our members to use the Church Center app to access the directory. However, there are some members of our congregation who do not have or want digital directory access, and have requested a printed copy of the information. This code was generated in March 2026 with the help of ChatGPT. I was using an older PCO chef template (A5 Directory) but some of the recent updates to Planning Center seem to have broken the template, so I had to start over. This report displays 3-4 households per page. For each household, the Household Photo is displayed, names in the household, and contact information for each person. Household phone numbers are consolidated, but each person's email and mobile phone are listed separately. 1. Create a LIST in Planning Center / People. The rule for the list is "+include / People / Directory / is listed". 2. Open the list and generate/download this report. Print on 8 1/2 x 11" paper, front and back. Bind with a comb binder. You can create/add a separate cover page if you want (this report does not include a cover page)

Preview

Report Preview


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<html>
<head>

<style>

@page {
  size: letter;
  margin: 0.5in 1in 0.5in 1.5in; /* top, right, bottom, left for comb binding */
}

body {
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 0;
}

.directory-list {
  width: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center; /* centers households vertically */
  min-height: 100vh; /* ensures full page height for centering */
  page-break-after: auto;
}

/* Each household entry */
.directory-entry {
  display: flex;
  padding: 10px 0;
  page-break-inside: avoid;
}

/* Photo column */
.directory-photo {
  width: 200px;
  height: 200px;
  margin-right: 20px;
  flex-shrink: 0;
}

.directory-photo img {
  width: 200px;
  height: 200px;
  object-fit: cover;
}

/* Details column */
.directory-details {
  flex: 1;
  font-size: 13px;
}

/* Name styling */
.names {
  font-size: 16px;
  margin-bottom: 6px;
}

.names .last-name {
  font-weight: bold;
}

/* Address / phone / email spacing */
.address, .phone, .email {
  margin-top: 5px;
}

.phone span, .email span {
  display: block;
}

</style>

</head>

<body>

<div class="directory-list">

{% assign sorted_households = households | sort_natural: "name" %}

{% for household in sorted_households %}

<div class="directory-entry">

  <!-- Photo -->
  <div class="directory-photo">
    {% if household.photo_url %}
      <img src="{{ household.photo_url }}">
    {% endif %}
  </div>

  <!-- Details -->
  <div class="directory-details">

    <!-- Household Names -->
    <p class="names">
      {% assign primary = household.primary_contact %}
      <span class="last-name">{{ primary.last_name | upcase }}</span>,

      {% assign name_list = "" %}
      {%- for adult in household.active_adults -%}
        {%- if adult.id == primary.id -%}
          {% assign name_list = adult.first_name %}
        {%- endif -%}
      {%- endfor -%}

      {%- for adult in household.active_adults -%}
        {%- if adult.id != primary.id -%}
          {% assign name_list = name_list | append: "|" | append: adult.first_name %}
        {%- endif -%}
      {%- endfor -%}

      {%- for child in household.active_children -%}
        {% assign name_list = name_list | append: "|" | append: child.first_name %}
      {%- endfor -%}

      {% assign names_array = name_list | split: "|" %}
      {% assign count = names_array.size %}

      {% for name in names_array %}
        {% if forloop.last and count > 1 %}
          {% if count > 2 %} & {% else %} & {% endif %}
          {{ name }}
        {% elsif forloop.first %}
          {{ name }}
        {% else %}
          , {{ name }}
        {% endif %}
      {% endfor %}
    </p>

    <!-- Address -->
    {% if household.primary_address %}
    <p class="address">
      {{ household.primary_address.street }}<br>
      {{ household.primary_address.city }}, {{ household.primary_address.state }} {{ household.primary_address.zip }}
    </p>
    {% endif %}

    <!-- Phone -->
    <p class="phone">
      {% assign home_shown = false %}
      {% for adult in household.active_adults %}
        {% for phone in adult.phone_numbers %}
          {% if phone.location == "Home" and home_shown == false %}
            <span><strong>H:</strong> {{ phone.number }}</span>
            {% assign home_shown = true %}
          {% elsif phone.location == "Mobile" %}
            {% if household.active_adults | size > 1 %}
              <span><strong>M:</strong> {{ phone.number }} ({{ adult.first_name }})</span>
            {% else %}
              <span><strong>M:</strong> {{ phone.number }}</span>
            {% endif %}
          {% endif %}
        {% endfor %}
      {% endfor %}
    </p>

    <!-- Email -->
    <p class="email">
      {% for adult in household.active_adults %}
        {% for email in adult.emails %}
          {% if household.active_adults | size > 1 %}
            <span>{{ email.address }} ({{ adult.first_name }})</span>
          {% else %}
            <span>{{ email.address }}</span>
          {% endif %}
        {% endfor %}
      {% endfor %}
    </p>

  </div>

</div>

{% endfor %}

</div>

</body>
</html>