 <p>There error is the two dimensional array in the <code>columns</code> function is not being set correctly. The variable name is missing and in the incorrect place for each column.</p> <p>Either you can set the columns like this:</p> <pre><code>public function columns() { return array( 'Title' =&gt; array( 'title'=&gt;_t('PageListByTypeReport.PageName', 'Page name') ), 'ClassName' =&gt; array( 'title'=&gt;_t('PageListByTypeReport.ClassName', 'Page type') ) ); } </code></pre> <p>Or even simpler like this:</p> <pre><code>public function columns() { return array( 'Title' =&gt; _t('PageListByTypeReport.PageName', 'Page name'), 'ClassName' =&gt; _t('PageListByTypeReport.ClassName', 'Page type') ); } </code></pre> <p>The current <code>sourceRecords</code> function will work, although we can make this much simpler by just returning the results of <code>Page::get()</code> like this:</p> <pre><code>public function sourceRecords($params = array(), $sort = null, $limit = null) { $pages = Page::get()-&gt;sort($sort); return $pages; } </code></pre> <p>Here is a working and simplified version of the Report code: </p> <pre class="lang-php prettyprint-override"><code>class PageListByType extends SS_Report { function title() { return 'Page List by Type'; } function description() { return 'List all the pages in the site, along with their page type'; } public function sourceRecords($params = array(), $sort = null, $limit = null) { $pages = Page::get()-&gt;sort($sort); return $pages; } public function columns() { return array( 'Title' =&gt; _t('PageListByTypeReport.PageName', 'Page name'), 'ClassName' =&gt; _t('PageListByTypeReport.ClassName', 'Page type') ); } } </code></pre>