Forum

Thread tagged as: Problem, Blog

Search Results - not showing full URL

In my search results the blog app isnt outputting the full URL which breaks the link. Is there anyway of updating this URL.

Here is a screenshot of what I mean https://goo.gl/fwp5X7 (The bottom link is for a normal page the top link is for a blog post)

One of the problems could be is that I am using multiple blogs. A blog for Europe and one for the US and nothing in the default blog. (Here is a screenshot of how my set up is looking - https://goo.gl/CxVive)

I have switched on DEBUG for our staging site and this is what it outputs

Debug Message [77] SELECT p.pagePath, pr.routePattern, pr.routeRegExp, p.pageTemplate FROM perch2_pages p LEFT JOIN perch2_page_routes pr ON p.pageID=pr.pageID ORDER BY pr.routeOrder ASC, p.pagePath ASCMatched page: /en-us/search, so not using routes.Using master page: /templates/pages/search.php [1] SELECT * FROM perch2_pages WHERE pagePath='/en-us/search' LIMIT 1Using template: /templates/pages/attributes/language_code.htmlUsing template: /templates/pages/attributes/language_code.htmlUsing template: /templates/pages/attributes/language_code.htmlUsing template: /templates/pages/attributes/language_code.htmlUsing template: /templates/pages/attributes/language_code.htmlUsing template: /templates/pages/attributes/language_code.htmlUsing template: /templates/pages/attributes/twitter_name.htmlUsing template: /templates/pages/attributes/twitter.htmlUsing template: /templates/pages/attributes/facebook.htmlUsing template: /templates/pages/attributes/seo.htmlUsing template: /templates/pages/attributes/body_attributes.html [1] SELECT pageID, pageParentID, pageDepth, pageTreePosition FROM perch2_pages WHERE pagePath='/en-us' OR pageSortPath='/en-us' LIMIT 1 [10] SELECT * FROM perch2_pages WHERE pageNew=0 AND pageHidden=0 AND pageTreePosition LIKE '000-003%' AND pageDepth >=1 AND pageDepth<=3 ORDER BY pageTreePosition ASC [1] SELECT pageTreePosition FROM perch2_pages WHERE pagePath='/en-us/search' LIMIT 1 [2] SELECT pageID FROM perch2_pages WHERE pageTreePosition IN ('000-003-008', '000-003', '000') ORDER BY pageTreePosition DESCUsing template: /templates/navigation/nav.html [4] Using template: /templates/navigation/subnav.htmlUsing template: /templates/search/search-form.html [1] SELECT groupID FROM perch2_navigation WHERE groupSlug='europe' LIMIT 1 [10] SELECT np.pageID, np.pageParentID, p.pagePath, p.pageTitle, p.pageNavText, p.pageNew, p.pageOrder, np.pageDepth, p.pageSortPath, np.pageTreePosition, p.pageAccessTags, p.pageAttributes FROM perch2_navigation_pages np, perch2_pages p WHERE p.pageID=np.pageID AND np.groupID=2 AND p.pageNew=0 AND np.pageDepth >=0 AND np.pageDepth<=1 ORDER BY np.pageTreePosition ASC [0] SELECT np.pageTreePosition FROM perch2_pages p, perch2_navigation_pages np WHERE np.pageID=p.pageID AND np.groupID=2 AND p.pagePath='/en-us/search' LIMIT 1 [10] Using template: /templates/navigation/choose_region.html [1] SELECT groupID FROM perch2_navigation WHERE groupSlug='north-america' LIMIT 1 [3] SELECT np.pageID, np.pageParentID, p.pagePath, p.pageTitle, p.pageNavText, p.pageNew, p.pageOrder, np.pageDepth, p.pageSortPath, np.pageTreePosition, p.pageAccessTags, p.pageAttributes FROM perch2_navigation_pages np, perch2_pages p WHERE p.pageID=np.pageID AND np.groupID=3 AND p.pageNew=0 AND np.pageDepth >=0 AND np.pageDepth<=1 ORDER BY np.pageTreePosition ASC [0] SELECT np.pageTreePosition FROM perch2_pages p, perch2_navigation_pages np WHERE np.pageID=p.pageID AND np.groupID=3 AND p.pagePath='/en-us/search' LIMIT 1 [3] Using template: /templates/navigation/choose_region.html [1] SELECT groupID FROM perch2_navigation WHERE groupSlug='south-america' LIMIT 1 [1] SELECT np.pageID, np.pageParentID, p.pagePath, p.pageTitle, p.pageNavText, p.pageNew, p.pageOrder, np.pageDepth, p.pageSortPath, np.pageTreePosition, p.pageAccessTags, p.pageAttributes FROM perch2_navigation_pages np, perch2_pages p WHERE p.pageID=np.pageID AND np.groupID=4 AND p.pageNew=0 AND np.pageDepth >=0 AND np.pageDepth<=1 ORDER BY np.pageTreePosition ASC [0] SELECT np.pageTreePosition FROM perch2_pages p, perch2_navigation_pages np WHERE np.pageID=p.pageID AND np.groupID=4 AND p.pagePath='/en-us/search' LIMIT 1 [1] Using template: /templates/navigation/choose_region.html [1] SELECT groupID FROM perch2_navigation WHERE groupSlug='asia' LIMIT 1 [1] SELECT np.pageID, np.pageParentID, p.pagePath, p.pageTitle, p.pageNavText, p.pageNew, p.pageOrder, np.pageDepth, p.pageSortPath, np.pageTreePosition, p.pageAccessTags, p.pageAttributes FROM perch2_navigation_pages np, perch2_pages p WHERE p.pageID=np.pageID AND np.groupID=5 AND p.pageNew=0 AND np.pageDepth >=0 AND np.pageDepth<=1 ORDER BY np.pageTreePosition ASC [0] SELECT np.pageTreePosition FROM perch2_pages p, perch2_navigation_pages np WHERE np.pageID=p.pageID AND np.groupID=5 AND p.pagePath='/en-us/search' LIMIT 1 [1] Using template: /templates/navigation/choose_region.htmlSearch term: Microfibre Light [31] SELECT DISTINCT settingID, settingValue FROM perch2_settings WHERE userID=0 [10] SELECT SQL_CALC_FOUND_ROWS DISTINCT 'PerchContent_SearchHandler' AS source, MATCH(ci.itemSearch) AGAINST('Microfibre Light') AS score, r.regionPage AS col1, ci.itemSearch AS col2, ci.itemJSON AS col3, r.regionOptions AS col4, p.pageNavText AS col5, p.pageTitle AS col6, regionTemplate AS col7, r.regionKey AS col8 FROM perch2_content_regions r, perch2_content_items ci, perch2_pages p WHERE r.regionID=ci.regionID AND r.regionRev=ci.itemRev AND r.pageID=p.pageID AND r.regionPage!='*' AND r.regionSearchable=1 AND (MATCH(ci.itemSearch) AGAINST('Microfibre Light') OR MATCH(ci.itemSearch) AGAINST('Microfibre Light') ) AND r.regionPage LIKE 'en-us%' UNION SELECT 'PerchContent_RunwaySearch' AS source, MATCH(ci.itemSearch) AGAINST('Microfibre Light') AS score, c.collectionKey AS col1, ci.itemSearch AS col2, ci.itemJSON AS col3, c.collectionOptions AS col4, c.collectionKey AS col5, c.collectionKey AS col6, collectionTemplate AS col7, c.collectionKey AS col8 FROM perch2_collections c, perch2_collection_items ci, perch2_collection_revisions cr WHERE c.collectionID=cr.collectionID AND cr.itemID=ci.itemID AND cr.itemRev=ci.itemRev AND c.collectionSearchable=1 AND cr.itemSearchable=1 AND (MATCH(ci.itemSearch) AGAINST('Microfibre Light') OR MATCH(ci.itemSearch) AGAINST('Microfibre Light') ) UNION SELECT 'PerchBlog_SearchHandler' AS source, MATCH(postTitle, postDescRaw, postTags) AGAINST('Microfibre Light') AS score, postTitle, postSlug, postDateTime, postDescHTML, postID, sectionSlug, "", "" FROM perch2_blog_posts p, perch2_blog_sections s WHERE postStatus='Published' AND postDateTime<'2016-04-29 09:08:34' AND p.sectionID=s.sectionID AND MATCH(postTitle, postDescRaw, postTags) AGAINST('Microfibre Light') ORDER BY score DESC LIMIT 0, 10 [70] SELECT FOUND_ROWS() AS `count` [10] Using template: /templates/search/search-result.html [1] SELECT blogID FROM perch2_blogs WHERE blogSlug='en-us' LIMIT 1 [4] SELECT SQL_CALC_FOUND_ROWS DISTINCT tbl.* FROM ( SELECT idx.itemID, main.*, idx2.indexValue as sortval FROM perch2_blog_index idx JOIN perch2_blog_posts main ON idx.itemID=main.postID AND idx.itemKey='postID' JOIN perch2_blog_index idx2 ON idx.itemID=idx2.itemID AND idx.itemKey='postID' AND idx2.indexKey='postDateTime' WHERE 1=1 AND ((idx.indexKey='postSlug' AND idx.indexValue != '')) AND idx.itemID=idx2.itemID AND idx.itemKey=idx2.itemKey GROUP BY idx.itemID, idx2.indexValue, postID ) as tbl WHERE ( blogID=2 AND postStatus='Published' AND postDateTime<='2016-04-29 09:08:00' ) GROUP BY itemID, sortval ORDER BY sortval DESC LIMIT 0, 4 [1] SELECT FOUND_ROWS() AS `count` [4] Using template: /templates/blog/post_sidebar.html [1] SELECT * FROM perch2_blog_sections ORDER BY sectionTitle ASC [3] SELECT * FROM perch2_blogs ORDER BY blogTitle ASCUsing template: /templates/pages/attributes/twitter_name.html [1] SELECT * FROM perch2_twitter_tweets WHERE tweetType='mine' AND tweetAccount='Chicopee_NA' ORDER BY tweetDate DESC LIMIT 1 [1] Using template: /templates/twitter/tweet.html [1] SELECT regionID, regionTemplate, regionPage, regionRev AS rev FROM perch2_content_regions WHERE regionKey='Telephone en-us' AND (regionPage='/en-us/search' OR regionPage='*') [1] SELECT * FROM ( SELECT idx.itemID, c.regionID, idx.pageID, c.itemJSON, idx2.indexValue as sortval FROM perch2_content_index idx JOIN perch2_content_items c ON idx.itemID=c.itemID AND idx.itemRev=c.itemRev AND idx.regionID=c.regionID JOIN perch2_content_index idx2 ON idx.itemID=idx2.itemID AND idx.itemRev=idx2.itemRev AND idx2.indexKey='_order' WHERE ((idx.regionID=172 AND idx.itemRev=6)) AND idx.itemID=idx2.itemID AND idx.itemRev=idx2.itemRev ) as tbl GROUP BY itemID, pageID, itemJSON, sortval ORDER BY sortval ASC [1] Using template: /templates/content/text.html [1] SELECT groupID FROM perch2_navigation WHERE groupSlug='footer-en-us' LIMIT 1 [5] SELECT np.pageID, np.pageParentID, p.pagePath, p.pageTitle, p.pageNavText, p.pageNew, p.pageOrder, np.pageDepth, p.pageSortPath, np.pageTreePosition, p.pageAccessTags, p.pageAttributes FROM perch2_navigation_pages np, perch2_pages p WHERE p.pageID=np.pageID AND np.groupID=8 AND p.pageNew=0 ORDER BY np.pageTreePosition ASC [0] SELECT np.pageTreePosition FROM perch2_pages p, perch2_navigation_pages np WHERE np.pageID=p.pageID AND np.groupID=8 AND p.pagePath='/en-us/search' LIMIT 1 [5] Using template: /templates/navigation/item.html [1] SELECT pageID, pageParentID, pageDepth, pageTreePosition FROM perch2_pages WHERE pagePath='/en-us/segments' OR pageSortPath='/en-us/segments' LIMIT 1 [7] SELECT * FROM perch2_pages WHERE pageNew=0 AND pageHidden=0 AND pageTreePosition LIKE '000-003-002%' AND pageDepth >=2 AND pageDepth<=3 ORDER BY pageTreePosition ASC [1] SELECT pageTreePosition FROM perch2_pages WHERE pagePath='/en-us/search' LIMIT 1 [2] SELECT pageID FROM perch2_pages WHERE pageTreePosition IN ('000-003-008', '000-003', '000') ORDER BY pageTreePosition DESC [6] Using template: /templates/navigation/item.html [1] SELECT regionID, regionTemplate, regionPage, regionRev AS rev FROM perch2_content_regions WHERE regionKey='Social en-us' AND (regionPage='/en-us/search' OR regionPage='*') [1] SELECT * FROM ( SELECT idx.itemID, c.regionID, idx.pageID, c.itemJSON, idx2.indexValue as sortval FROM perch2_content_index idx JOIN perch2_content_items c ON idx.itemID=c.itemID AND idx.itemRev=c.itemRev AND idx.regionID=c.regionID JOIN perch2_content_index idx2 ON idx.itemID=idx2.itemID AND idx.itemRev=idx2.itemRev AND idx2.indexKey='_order' WHERE ((idx.regionID=169 AND idx.itemRev=5)) AND idx.itemID=idx2.itemID AND idx.itemRev=idx2.itemRev ) as tbl GROUP BY itemID, pageID, itemJSON, sortval ORDER BY sortval ASC [1] Using template: /templates/content/footer/social.htmlRequest time: 0.2549Process time: 0.2542Memory: 4.8775 - See more at: https://chicopee.teamfc.uk/en-us/search?q=Microfibre+Light#sthash.XD1m4vCT.dpuf

Here is my DR:

Perch Runway: 2.8.29
Production mode: Production (100)
Installed apps: content (2.8.29), assets (2.8.29), categories (2.8.29), perch_blog (5.0), perch_forms (1.8.3), perch_twitter (3.5.1)
DB driver: PDO
DB tables: perch2_backup_plans (0), perch2_backup_resources (0), perch2_backup_runs (0), perch2_blog_authors (3), perch2_blog_comments (0), perch2_blog_index (4079), perch2_blog_posts (135), perch2_blog_posts_to_tags (0), perch2_blog_sections (1), perch2_blog_tags (0), perch2_blogs (3), perch2_categories (60), perch2_category_counts (8), perch2_category_sets (6), perch2_collection_index (47690), perch2_collection_items (956), perch2_collection_revisions (207), perch2_collections (12), perch2_content_index (11460), perch2_content_items (1690), perch2_content_regions (133), perch2_forms (4), perch2_forms_responses (1), perch2_navigation (6), perch2_navigation_pages (28), perch2_page_routes (45), perch2_page_templates (28), perch2_pages (67), perch2_resource_log (10202), perch2_resource_tags (0), perch2_resources (1691), perch2_resources_to_tags (0), perch2_settings (31), perch2_twitter_scheduled_tweets (0), perch2_twitter_settings (1), perch2_twitter_tweets (1033), perch2_user_passwords (0), perch2_user_privileges (42), perch2_user_role_privileges (41), perch2_user_roles (3), perch2_users (7)
Users: 7
App runtimes:
<?php
    $apps_list = array(
        'content',
        'categories',
        'perch_blog',
        'perch_twitter',
        'perch_forms',
    );
Scheduled tasks for perch_twitter: post_tweets (1 mins), update_tweets (60 mins)
Scheduled tasks for perch_blog: delete_spam_comments (1440 mins)
Editor plug-ins: markitup
H1: c0fe4e9645faca51fb440cc5acbe78ca
L1: 20240be7944a7944e62b3cd88072c3ae
F1: 2edba60ed1f613d6dd804feb202456a2
headerColour: #e61e26
content_singlePageEdit: 1
helpURL:
siteURL: /
hideBranding: 1
content_collapseList: 1
lang: en-gb
update_2.8.16: done
headerScheme: dark
update_runway_2.8.16: done
latest_version: 2.8.15
on_sale_version: 2.8.29
update_runway_2.8.19: done
dashboard: 0
hide_pwd_reset: 0
content_hideNonEditableRegions: 0
content_frontend_edit: 0
perch_blog_update: 5.0.1
perch_blog_post_url: /{blogSlug}/news/{postSlug}
perch_blog_slug_format: %Y-%m-%d-{postTitle}
perch_blog_akismet_key:
perch_blog_max_spam_days: 1
perch_blog_comment_notify: 0
update_runway_2.8.23: done
perch_blog_site_name: Chicopee Solutions
logoPath: /admin/resources/1453300953_chicopee-logo.png
perch_twitter_update: 3.5
update_runway_2.8.24: done
update_runway_2.8.25: done
update_runway_2.8.28: done
update_runway_2.8.29: done
PERCH_DEVELOPMENT: 10
PERCH_STAGING: 50
PERCH_PRODUCTION: 100
PERCH_SITEPATH: /var/www/html/chicopee/staging/public_html
PERCH_SCHEDULE_SECRET: 8wJeeQvIgirzvJPg
PERCH_DB_USERNAME: teamfcuk_chicope
PERCH_DB_SERVER: 87.117.230.208
PERCH_DB_DATABASE: teamfcuk_chicopee
PERCH_DB_PREFIX: perch2_
PERCH_YOUTUBE_API_KEY: AIzaSyBeSDvZackLJIyG4btIaz8qppXIDf8I0mo
PERCH_EMAIL_FROM: barry@teamfc.co.uk
PERCH_EMAIL_FROM_NAME: Barry Corrigan
PERCH_LOGINPATH: /admin
PERCH_PATH: /var/www/html/chicopee/staging/public_html/admin
PERCH_CORE: /var/www/html/chicopee/staging/public_html/admin/core
PERCH_RESFILEPATH: /var/www/html/chicopee/staging/public_html/admin/resources
PERCH_RESPATH: /admin/resources
PERCH_CLEAN_RESOURCES:
PERCH_HTML5: 1
PERCH_TZ: UTC
PERCH_DEBUG:
PERCH_RUNWAY: 1
PERCH_ERROR_MODE: DIE
PERCH_DATE_LONG: %d %B %Y
PERCH_DATE_SHORT: %d %b %Y
PERCH_TIME_SHORT: %H:%M
PERCH_TIME_LONG: %H:%M:%S
PERCH_RUNWAY_ROUTED:
PERCH_STRONG_PASSWORDS:
PERCH_PREVIEW_ARG: preview
PERCH_TEMPLATE_PATH: /var/www/html/chicopee/staging/public_html/admin/templates
PERCH_DEFAULT_DOC: index.php
PERCH_DEFAULT_EXT: .php
PERCH_PRODUCTION_MODE: 100
PERCH_RWD:
PERCH_HTML_ENTITIES:
PERCH_SSL:
PERCH_STRIPSLASHES:
PERCH_PROGRESSIVE_FLUSH: 1
PERCH_PARANOID:
PERCH_FORCE_SECURE_COOKIES:
PERCH_PASSWORD_MIN_LENGTH: 6
PERCH_MAX_FAILED_LOGINS: 10
PERCH_AUTH_LOCKOUT_DURATION: 1 HOUR
PERCH_VERIFY_UPLOADS:
PERCH_AUTH_PLUGIN:
PERCH_DB_CHARSET: utf8
PERCH_DB_PORT:
PERCH_DB_SOCKET:
PERCH_SESSION_TIMEOUT_MINS: 20
PERCH_APPS_EDITOR_PLUGIN: markitup
PERCH_APPS_EDITOR_MARKUP_LANGUAGE: textile

Any ideas?

Fishtank Creative

Fishtank Creative 2 points

  • 5 years ago
Drew McLellan

Drew McLellan 2638 points
Perch Support

What does your search result template look like?

Its pretty much the standard template

<perch:before>
<header>
   <h1 class="block-heading  block-heading--grey  block-heading--news  a350  gamma">
        <perch:if exists="paging"><perch:search id="total" /> - </perch:if>Search results for &#8220;<perch:search id="search_key" />&#8221;
    </h1>
</header>

<div class="news-article  news-article__search">

</perch:before>

        <div class="<perch:search id="perch_item_odd" />">
            <h2><a href="<perch:search id="result_url" />"><perch:search id="result_title" /></a></h2>
            <perch:if exists="result_excerpt"><p class="excerpt">&hellip;<perch:search id="result_excerpt" encode="false" />&hellip;</p></perch:if>

        </div>

<perch:after>

        <perch:if exists="paging">
            <div class="paging">
                Page <perch:search id="current_page" /> of <perch:search id="number_of_pages" />
                <perch:if exists="not_first_page">
                    <a href="<perch:search id="prev_url" encode="false" />">Previous</a>
                </perch:if>
                <perch:if exists="not_last_page">
                    <a href="<perch:search id="next_url" encode="false" />">Next</a>
                </perch:if>
            </div>
        </perch:if>

    </div>

    <div class="social-sharing">
        <h3 class="c700  zeta  caps  primary">Share this post</h3>
        <span class='st_facebook_large' displayText='Facebook'></span>
        <span class='st_twitter_large' displayText='Tweet'></span>
        <span class='st_linkedin_large' displayText='LinkedIn'></span>
    </div>


</perch:after>


<perch:noresults>
    <perch:if exists="search_key">
        <header>
        <h1 class="block-heading  block-heading--grey  block-heading--news  a350  gamma">Search results for &#8220;<perch:search id="search_key" />&#8221;</h1>
        </header>
    <perch:else />
        <header>
        <h1 class="block-heading  block-heading--grey  block-heading--news  a350  gamma">Search</h1>
        </header>
    </perch:if>
    <perch:if exists="search_key">
        <p>Sorry, there are no results for &#8220;<perch:search id="search_key" />&#8221;.</p>
    </perch:if>
</perch:noresults>
Drew McLellan

Drew McLellan 2638 points
Perch Support

Where is "Automotive" coming from? Are you sure that's a blog post in the search results?

"Automotive" is a page not a blog post - But this link is wrong as well.

It should be - https://chicopee.com/en-us/segments/automotive/

The blog post should be https://chicopee.com/en-eu/news/2016-04-01-microfibre-the-cleaning-material-of-choice-at-issa-interclean-2016

Its really strange, A lot of the results are not displaying the correct links.

Drew McLellan

Drew McLellan 2638 points
Perch Support

If you use <perch:showall /> do you see the correct value listed?

For News Articles the value appears as:

URL - //news/2015-08-14-chicopee-launches-superior-short-term-use-microfibre-cloth-for-healthcare-cleaning
result_url - //news/2015-08-14-chicopee-launches-superior-short-term-use-microfibre-cloth-for-healthcare-cleaning

For Segment pages i.e Automotive

URL - Automotive

I had this problem on my sitemap template I had to solve this by setting a variable

PerchSystem::set_vars(array(
      'segment' => 'automotive',
      'pagetitle' => 'products',
));

But I had to do this for each collection separately. Maybe this is why we are having these problems with URLs

Drew McLellan

Drew McLellan 2638 points
Perch Support

What values do you have set for the search result URL for those in options?

For all collections I have set the field to be /en-eu/segments/automotive/products/{slug}

But some links work and some don't

This site is live if you want to view what I am seeing - https://chicopee.com/en-eu/search?q=Microfibre+Light

Drew McLellan

Drew McLellan 2638 points
Perch Support

What do you have the path set to for blog posts?

/{blogSlug}/news/{postSlug}

Drew McLellan

Drew McLellan 2638 points
Perch Support

So is it safe to say that the issue is that the blogSlug does not appear to be in scope when the URL it put together? That's what it's looking like to me currently, but I'm very confused with the multiple issues.

Found a solution to this by modifying the PerchBlog_SearchHandler.class.php file to include the blogSlug in the SQL search & format results:

public static function get_search_sql($key)
{
    $API = new PerchAPI(1.0, 'perch_blog');
    $db = $API->get('DB');

    $sql = 'SELECT \''.__CLASS__.'\' AS source, MATCH(postTitle, postDescRaw, postTags) AGAINST('.$db->pdb($key).') AS score, postTitle, postSlug, postDateTime, postDescHTML, postID, sectionSlug, blogSlug, ""
            FROM '.PERCH_DB_PREFIX.'blog_posts p, '.PERCH_DB_PREFIX.'blog_sections s, '.PERCH_DB_PREFIX.'blogs b
            WHERE postStatus=\'Published\'
                AND postDateTime<'.$db->pdb(date('Y-m-d H:i:s')).'
                AND p.sectionID=s.sectionID
                AND p.blogID=b.blogID
                AND MATCH(postTitle, postDescRaw, postTags) AGAINST('.$db->pdb($key).')';

    return $sql;
}
public static function format_result($key, $options, $result)
{
    $result['postTitle']    = $result['col1'];
    $result['postSlug']     = $result['col2'];
    $result['postDateTime'] = $result['col3'];
    $result['postDescHTML'] = $result['col4'];
    $result['postID']       = $result['col5'];
    $result['_id']          = $result['col5'];
    $result['sectionSlug']  = $result['col6'];
    $result['blogSlug']     = $result['col7'];
...
Drew McLellan

Drew McLellan 2638 points
Perch Support

Great - that was pretty much our solution too.