<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>RichardSoeteman.net</title>
  <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/" />
  <link rel="self" href="http://www.richardsoeteman.net/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2013-02-26T09:34:55.3093253+01:00</updated>
  <author>
    <name>Richard Soeteman</name>
  </author>
  <subtitle />
  <id>http://www.richardsoeteman.net/</id>
  <generator uri="http://dasblog.info/" version="2.3.9074.18820">DasBlog</generator>
  <entry>
    <title>SEO Checker V1 released!</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2013/02/14/SEOCheckerV1Released.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,b168215f-975a-45d0-a8c6-f4c83a1b6f07.aspx</id>
    <published>2013-02-14T11:29:23.774+01:00</published>
    <updated>2013-02-26T09:34:55.3093253+01:00</updated>
    <category term="SEO Checker" label="SEO Checker" scheme="http://www.richardsoeteman.net/CategoryView,category,SEOChecker.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Your DisplayName here!</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
It took a few months of development but I’m glad to finally announce SEO checker V1!
If you haven’t done already you can <a href="http://www.richardsoeteman.net/CategoryView,category,SEOChecker.aspx" target="_blank">read
previous blogposts about this package</a> or watch the <a href="https://vimeo.com/tag:seochecker" target="_blank">screencasts
about SEO checker</a>. I think it’s a package every site should have installed, when
building sites for clients. I have followed the #umbraco tag on twitter for more than
a year and have seen most sites that are released contain SEO issues.  When those
sites had SEO Checker installed it would have warned you before putting the site live.
So I hope you will at least <a href="http://soetemansoftware.nl/seochecker" target="_blank">download
SEO checker</a> and check you sites on localhost before putting it live. 
</p>
        <h3>Using SEO Checker for content editors
</h3>
        <p>
        </p>
        <p>
There is one big feature <a href="http://www.richardsoeteman.net/CategoryView,category,SEOChecker.aspx" target="_blank">the
previous blogposts</a> didn’t cover and that is using SEO Checker for content editors.SEO
Checker comes with a Data Type that can be added to document types. The SEO Checker
Data Type will show a Snippet preview how the page will be shown  in the Google
search results. If you are using a relevant  Title and Meta Description Google
will use these in the search results. Therefore these elements are important.
</p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="seochecker-contenteditor" alt="seochecker-contenteditor" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1released_926D/seochecker-contenteditor_3.png" border="0" height="374" width="640" />
          <br />
It’s possible to specify a focus keyword, this is the keyword you want to rank the
page for, use the Keyword tool icon to get help selecting the keywords you want to
rank the page for.  SEO Checker will validate if the keyword can be found in
the most important elements of the page:
</p>
        <ul>
          <li>
Page Title (H1) 
</li>
          <li>
Url 
</li>
          <li>
SEO Title (&lt;title&gt;) 
</li>
          <li>
SEO  Description (&lt;meta name="description"…..) 
</li>
          <li>
At least once more in the text of the page 
</li>
        </ul>
        <p>
You can also specify the SEO Title, SEO Description and SEO keywords (when configured).
The page will also be checked for other SEO Issues on the page.  See the documentation
for a list of all validations. 
<br /><strong>The unpublished version of the page will be checked, this allows you to solve
issues before publishing the page!</strong></p>
        <h3>Configuration of the Data type
</h3>
        <p>
By default the SEO Checker data type will show a field for SEO title and description.
If you already have those properties on your document type you can use configuration
of the document type to map those . 
</p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1released_926D/image_3.png" border="0" height="381" width="605" />
        </p>
        <p>
1.    Map SEO title against the existing SEO title property 
<br />
2.    Map SEO keywords against the existing SEO keywords property 
<br />
3.    Map SEO description against the existing SEO description property 
<br />
4.    Use the keywords meta tag (Google and all major search engines
ignore this meta tag).
</p>
        <h3>Document type meta data configuration
</h3>
        <p>
Using default SEO Properties you can specify default values  for SEO Title and
SEO description. When the page is missing the SEO title or description info these
mapped properties will be used.  The title will be copied. The description will
take the first paragraph from the mapped property. This ensures you always have you
meta tags filled. The validation process will validate if the tags are matching length
criteria.
</p>
        <h5>Title template
</h5>
        <p>
It’s also possible to specify a template for the SEO Title. This template will be
used to render the &lt;title&gt; tag in snippet preview and on the page.The template
can contain fixed text and placeholders, placeholders have the same syntax as you
would use in Umbraco Macro’s:
</p>
        <ul>
          <li>
[#Property alias ] will get the property from the current document 
</li>
          <li>
[$property alias] recursive look up the property 
</li>
        </ul>
        <p>
The following fixed properties can be used in the template:
</p>
        <ul>
          <li>
@nodeName contains the name of the page 
</li>
          <li>
@seoTitle contains the value of the SEO title property 
</li>
        </ul>
        <p>
When using the above template configuration the &lt;title&gt; tag will be rendered
as:
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">title</span>
          <span class="kwrd">&gt;</span>Simple
website | Simple website &amp;#169; 2013<span class="kwrd">&lt;/</span><span class="html">title</span><span class="kwrd">&gt;</span></pre>
        <style type="text/css">




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <h3>Use Metadata inside your template
</h3>
        <p>
SEO Checker comes with a small library to render Meta Tags in HTML. This is only necessary
when you use the SEO Checker data type. You can use the library in Razor, XSLT and
usercontrol macro’s. The library can be used in both MVC and Masterpage mode. To render
the metatags for the current page in razor simply use:
</p>
        <p>
This will render all metatags for the page like this:
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">title</span>
          <span class="kwrd">&gt;</span>Using
Modules | SEO Checker<span class="kwrd">&lt;/</span><span class="html">title</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">meta</span><span class="attr">name</span><span class="kwrd">="description"</span><span class="attr">content</span><span class="kwrd">="Umbraco
modules encapsulate specific bits of advanced functionality that are easily added
to your website."</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">meta</span><span class="attr">name</span><span class="kwrd">="robots"</span><span class="attr">content</span><span class="kwrd">="index,
follow"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">meta</span><span class="attr">http-equiv</span><span class="kwrd">="Content-Type"</span><span class="attr">content</span><span class="kwrd">="text/html;
charset=utf-8"</span><span class="kwrd">/&gt;</span></pre>
        <h3>Download V1 Trial
</h3>
        <p>
        </p>
        <p>
What are you waiting for. <a href="http://soetemansoftware.nl/seochecker" target="_blank">download
SEO Checker</a> and have a play on your local machine!
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=b168215f-975a-45d0-a8c6-f4c83a1b6f07" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Validate pages using SEO Checker</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2013/02/04/ValidatePagesUsingSEOChecker.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,d1acb552-0722-4ecf-b448-e69888fee4ec.aspx</id>
    <published>2013-02-04T14:32:47.042714+01:00</published>
    <updated>2013-02-04T14:35:37.683339+01:00</updated>
    <category term="SEO Checker" label="SEO Checker" scheme="http://www.richardsoeteman.net/CategoryView,category,SEOChecker.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
The RC is already removed from the version info, a release is around the corner! A
perfect time to talk about validating pages using SEO Checker. To validate a site,
or a portion of a site for SEO issues, open SEO Checker and select the <b>Validate
Pages</b> option from the menu. This will show the following screen. By default the
root is selected, if you want to validate a portion of a site specify the start location.
When the include children is checked all published children will be validated also.
When you hit start the pages will be added to the validation queue. 
</p>
        <p>
 <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/ValidatepagesusingSEOChecker_C1D2/validate%20pages_5.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="validate pages" border="0" alt="validate pages" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/ValidatepagesusingSEOChecker_C1D2/validate%20pages_thumb_1.png" width="880" height="283" /></a></p>
        <p>
Besides this manual process, pages will be added to the validation queue when they
are published also. <b>Only published pages having a template assigned will be validated!</b></p>
        <h2>Validation queue
</h2>
        <p>
        </p>
        <p>
Pages will not be validated immediately, instead they will be added to the validation
queue. Validation occurs on the background so you will not have to wait until the
validation process is finished. When all pages are validated the result will be available
in the Validation issues overview.
</p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="validationqueue-small" border="0" alt="validationqueue-small" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/ValidatepagesusingSEOChecker_C1D2/validationqueue-small_3.png" width="891" height="295" />
        </p>
        <p>
        </p>
        <h2>Validation issues
</h2>
        <p>
This overview will show all issues found when validating the page. The documentation
will contain a full list of validation when it’s released. When an issue contains
the description “Template issue” it means that the issue is found in the template.
A template issue is only reported once for every template instead of reported on every
document that uses the template. 
</p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ValidationIssues-markedwithoptions" border="0" alt="ValidationIssues-markedwithoptions" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/ValidatepagesusingSEOChecker_C1D2/ValidationIssues-markedwithoptions_3.png" width="913" height="619" />
        </p>
        <p>
          <strong>Options:</strong>
        </p>
        <ol>
          <li>
When selected warnings will included in the overview. 
</li>
          <li>
When selected errors will included in the overview. 
</li>
          <li>
When a period is selected solved items since the selected period are also displayed
in the overview. Solved issues are displayed in strikethrough. In the example above
the metadata issues are solved. 
</li>
          <li>
Opens the document in a popup 
</li>
          <li>
Opens the template assigned to the document in a popup. This option will only be available
for Users that have access 
</li>
          <li>
Deletes the issue from the overview, or adds the item to the ignore list. 
</li>
        </ol>
        <h2>Delete and ignore issues
</h2>
        <p>
Using the delete button in the various overviews you can delete an issue from the
overview. This will show the following dialog.
</p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="deleteissuedialog" border="0" alt="deleteissuedialog" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/ValidatepagesusingSEOChecker_C1D2/deleteissuedialog_3.png" width="409" height="309" />
        </p>
        <p>
        </p>
        <p>
When you hit “delete” it will just remove the item from the overview. Next time validation
occurs the issue will be reported again. When you check the “Ignore this issue next
time” checkbox the item will be added to the ignore list and the issue will not be
reported again next time validation occurs. Use the Ignore list overviews to see which
items are ignored.
</p>
        <h4>
        </h4>
        <h2>Download
</h2>
        <p>
Want to try SEO Checker today? <a href="soetemansoftware.nl/downloads/seochecker-1.0-rc.zip" target="_blank">Download
the release candidate.</a></p>
        <p>
          <strong>Non production Warning: 
<br /></strong>This is a  release candidate!! SEO checker is tested on different sites
but can still have some issues in specific situations. We love to get some feedback
but don't use this package in production yet! If you find any issues please send us
an email support@soetemansoftware.nl and we will get back to you ASAP!  Also
keep an eye on our <a href="http://www.richardsoeteman.net/ct.ashx?id=de2181e8-66ce-400f-8712-ef9d84741b58&amp;url=http%3a%2f%2fhotfix.soetemansoftware.nl%2fseochecker%2f">hotfix
location</a>! Here you find the most recent bugfixes.  The release candidate
will expire on May 1th 2013. After May 1th it will fall back to trial mode which means
it will only work on localhost and you can only validate one page at a time.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=d1acb552-0722-4ecf-b448-e69888fee4ec" />
      </div>
    </content>
  </entry>
  <entry>
    <title>SEO Checker RC is here</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2013/01/22/SEOCheckerRCIsHere.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,de2181e8-66ce-400f-8712-ef9d84741b58.aspx</id>
    <published>2013-01-22T21:58:32.0482625+01:00</published>
    <updated>2013-01-22T21:58:32.0482625+01:00</updated>
    <category term="Package" label="Package" scheme="http://www.richardsoeteman.net/CategoryView,category,Package.aspx" />
    <category term="SEO Checker" label="SEO Checker" scheme="http://www.richardsoeteman.net/CategoryView,category,SEOChecker.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
After releasing the <a href="http://www.richardsoeteman.net/2012/11/30/SEOCheckerV10Beta.aspx" target="_blank">beta
version of SEO Checker</a> almost two months ago, it’s time for a <a href="http://soetemansoftware.nl/downloads/seochecker-1.0-rc.zip" target="_blank">release
candidate</a>. An exciting time because if all goes well we have the final release
available in just a few weeks(it’s all about writing the user manual ;-) ). The release
candidate solves the following issues found in the beta version:
</p>
        <ul>
          <li>
Fixed encoding issues in the validation process 
</li>
          <li>
Added a validator to prevent robots.txt, or meta follow/index  is blocking the
whole site being crawled 
</li>
          <li>
If a robots.txt file exist on disk, use that one instead of generating a dynamic one 
</li>
          <li>
Fixed several issues regarding  url rewriting 
</li>
          <li>
Fixed several issues regarding broken inbound links 
</li>
          <li>
Changed low level error messages to user friendly ones when an exception occurs 
</li>
          <li>
Added several improvements in configuration 
</li>
          <li>
Fixed Umbraco V6 RC compatibility issues 
</li>
        </ul>
        <p>
If you already installed SEO Checker beta it’s best to upgrade since the beta expires
February 1th and upgrading is easy, just use the package installer. So what are you
waiting for….<a href="http://soetemansoftware.nl/downloads/seochecker-1.0-rc.zip" target="_blank">download
the RC today</a></p>
        <p>
          <strong>Non production Warning: 
<br /></strong>This is a  release candidate!! SEO checker is tested on different sites
but can still have some issues in specific situations. We love to get some feedback
but don't use this package in production! If you find any issues please send us an
email support@soetemansoftware.nl and we will get back to you ASAP!  Also keep
an eye on our <a href="http://hotfix.soetemansoftware.nl/seochecker/" target="_blank">hotfix
location</a>! Here you find the most recent bugfixes.  The release candidate
will expire on May 1th 2013. After May 1th it will fall back to trial mode which means
it will only work on localhost and you can only validate one page at a time. 
</p>
        <p>
        </p>
        <p>
          <strong>
            <font size="4">
            </font>
          </strong>
        </p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=de2181e8-66ce-400f-8712-ef9d84741b58" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Fix inbound link issues using SEO Checker</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2013/01/16/FixInboundLinkIssuesUsingSEOChecker.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,9bc76e34-45d5-4576-9411-e9c7b92102b0.aspx</id>
    <published>2013-01-16T10:51:44.3304946+01:00</published>
    <updated>2013-01-16T10:54:25.8564566+01:00</updated>
    <category term="Package" label="Package" scheme="http://www.richardsoeteman.net/CategoryView,category,Package.aspx" />
    <category term="SEO Checker" label="SEO Checker" scheme="http://www.richardsoeteman.net/CategoryView,category,SEOChecker.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of weeks ago <a href="http://www.richardsoeteman.net/2012/11/30/SEOCheckerV10Beta.aspx" target="_blank">I
blogged about SEO Checker</a>. With the first release candidate and final release
around the corner it’s time to highlight some features. Today I want to talk about
fixing Inbound Links.We all had this experience, searching for information and found
a page in Google and when we hit that link we get a 404 page, friendly message or
not it’s not the best experience and Google doesn’t like this either.
</p>
        <p>
In the example below I’m using the basic starter kit that comes with Umbraco and visit
the page gofurther.aspx. the 404 page will be shown, but SEO Checker will also log
the url.  When you open the  Inbound link error page in SEO Checker you
will see that gofurther.aspx is reported as broken. Using the content picker you can
select the page you want to redirect to. Next time someone is visiting the gofurther.aspx
the request is redirected to the selected page.
</p>
        <p>
 <img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="InboundLinkErrors" border="0" alt="InboundLinkErrors" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/FixinboundlinkissuesusingSEOChecker_F0DA/InboundLinkErrors_6.png" width="902" height="499" />   
</p>
        <p>
        </p>
        <h3>Handling different extensions
</h3>
        <p>
If you migrate a site from php environment you can setup the same structure in your
umbraco site. Let’s say the previous php site had this structure:
</p>
        <ul>
          <li>
mytestsite.com/ 
<ul><li>
mytestsite.com/installing-modules.php 
</li><li>
mytestsite.com/go-further.php 
</li><li>
mytestsite.com/getting-started.php 
</li></ul></li>
        </ul>
        <p>
Our new Umbraco site is using aspx extensions (or no extensions at all), so when we
try to access the installing-modules.php page, the visitor will see a 404 page. 
If you have SEO Checker installed it will make sure the <strong>installing-modules.php</strong> page
will be redirected to the <strong>installing-modules.aspx</strong> page. 
</p>
        <p>
This means search results from Google will still work (and get updated to the new
page because of the 301 redirect) and all links to the php version of your site will
still work. 
</p>
        <p>
When the page cannot be found at all the url will be logged and we can map the correct
url on the Inbound Links page as described in the previous scenario.
</p>
        <h4>Handling structure changes
</h4>
        <p>
When you rename or move a document in Umbraco the structure will change. For example
when we change the Installing modules page to Installing Umbraco modules. The url
changes from installing-modules.aspx to installing-umbraco-modules.aspx. The result
will be that when people are visiting the old installing-modules.aspx  url, they
will see a 404 instead of the Page. SEO Checker will keep track of changes in the
url structure and will redirect the old <strong>installing-modules.aspx</strong> 
url to the new <strong>installing-umbraco-modules.aspx </strong>url. 
</p>
        <p>
If you are only interested in this scenario you might want to check out the free <a href="http://our.umbraco.org/projects/developer-tools/301-url-tracker" target="_blank">301
Url Tracker</a> package. 
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=9bc76e34-45d5-4576-9411-e9c7b92102b0" />
      </div>
    </content>
  </entry>
  <entry>
    <title>SEO checker V1.0 Beta</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2012/11/30/SEOCheckerV10Beta.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,876e943a-9d63-4c2f-b9b5-475fe4634d63.aspx</id>
    <published>2012-11-30T10:24:41.8905526+01:00</published>
    <updated>2013-01-22T22:02:20.0332762+01:00</updated>
    <category term="Package" label="Package" scheme="http://www.richardsoeteman.net/CategoryView,category,Package.aspx" />
    <category term="SEO Checker" label="SEO Checker" scheme="http://www.richardsoeteman.net/CategoryView,category,SEOChecker.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
  
<br />
For those of you following me <a href="https://twitter.com/rsoeteman" target="_blank">on
twitter</a> probably know I’ve been working on a new package, SEO checker for the
last few months(thinking about it for a few years). Today it’s time to finally release
the first beta version of this package and this is the first blog post giving you
an overview of most possibilities. The next blog posts will cover more detailed information
about a certain feature.
</p>
        <p>
SEO Checker is build to optimize your Umbraco Site SEO! It will help you <strong>find
common SEO issues</strong> on the website, help you pages <strong>rank better for
a certain keyword</strong> by making sure that keyword is found on the necessary HTML
elements. It comes from the idea that most Umbraco websites have SEO Issues, missing
meta tags, canonical url’s , broken links, test content, inline scripting, huge viewstate
(my favorite ;-)) etc. When you install SEO Checker you will find a new section where
you can validate pages, find inbound link errors and find configuration errors. 
</p>
        <p>
I’ve <a href="https://vimeo.com/tag:seochecker" target="_blank">recorded a few screencasts</a> that
demo the functionality, check them out. I would love to have feedback so please read
further, watch the screencasts,  install the package and let me know what you
think.
</p>
        <h3>
        </h3>
        <h3>Validate pages
</h3>
        <p>
SEO checker allows you to validate a complete  site, or portions of a site. Simply
select validate pages from the menu, select a root node and hit start, as you can
see in the image below.  
<br />
Validation happens on a background thread, you can validate 1000 pages without having
to wait for the results before leaving the page. Instead pages are added to the validation
queue first. 
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_12.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_thumb_5.png" width="717" height="380" />
          </a>
        </p>
        <p>
          <strong>When you publish a page it will automatically being added to the validation
queue by default</strong>. 
</p>
        <p>
Once the validation queue is empty you can open the validation issues page which gives
you an overview of all validation issues for a given page or template. All validations
are (somehow) based on the <a href="http://tinyurl.com/yjm24yq" target="_blank">Search
Engine Optimization Starter Guide</a> document from Google , so it’s based on facts
and not on opinions from SEO consultants. You can filter the overview by errors and 
warnings.It’s also possible to show resolved issues since a given date. The image
below shows you the url to simplesite.com is resolved and shows you a few open issues.
You can edit the page, or template directly from this overview. It’s also possible
to delete the item from the overview. When you delete the item you can select the
option to always ignore the issue during validation. 
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_13.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_thumb.png" width="990" height="357" />
          </a>
        </p>
        <p>
 
</p>
        <h3>SEO checker datatype
</h3>
        <p>
SEO checker allows you to preview the Google search result snippet using the SEO checker
datatype when editing content  and will give feedback about keyword usage in
content and meta information. The same datatype will report validation issues based
on the <strong>unpublished version</strong> of the document. This allows you to <strong>fix
all issues before publishing</strong> the page to your website. In the image below
you’ll see that we want to rank the page for <strong>Umbraco Modules.  </strong>If
the keyword is not found in a certain tag, this will be reported as a validation issue.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_6.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_thumb_2.png" width="591" height="395" />
          </a>
        </p>
        <p>
SEO checker will look for the focus keyword in the following tags:
</p>
        <ul>
          <li>
Title 
</li>
          <li>
Meta description 
</li>
          <li>
H1 
</li>
          <li>
Body 
</li>
          <li>
Url of the page 
</li>
        </ul>
        <p>
SEO checker will also report any other content related issue it found on the page.
In this case it found the broken link htp://www.umbraco.com. SEO checker knows this
must be <a href="http://www.umbraco.com/">http://www.umbraco.com/</a> and suggest
you will use http:// instead of htp:// in the error description.
</p>
        <h3>
        </h3>
        <h3>Fix and avoid Inbound link issues
</h3>
        <p>
SEO checker will report any inbound link that is broken. To fix a broken link you
select the page you want to redirect to and the next time a user is browsing to the
broken link the user will be redirected to that selected page. In the example below
the user requested installin-modulezz.aspx. This was reported as broken. and is now
pointing to the installing modules page. So the next time a user is requesting the
installin-modulezz.aspx the request will be redirected to installing-modules.aspx.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_8.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_thumb_3.png" width="490" height="208" />
          </a>
        </p>
        <p>
Seo checker will avoid broken links by redirecting  url’s with the wrong extension
to the correct one. So if a user is requesting <a href="http://www.somesite.nl/modules.php">http://www.somesite.nl/modules.<strong>php</strong></a> the
request will be redirected to <a href="http://www.somesite.nl/modules.aspx">http://www.somesite.nl/modules.<strong>aspx</strong></a><strong>.</strong> When
you<strong> rename or move a document</strong> inside Umbraco SEO checker will makes
sure <strong>every request for the old url is redirected to the new url</strong>.
</p>
        <h3>Dynamic robots.txt and sitemap.xml
</h3>
        <p>
SEO checker allows you to generate a dynamic Robots.txt and Sitemap.xml files. This
will make sure search engines don’t index Umbraco system folders and allows you to
submit an xml sitemap to Google. You can specify settings for the xml sitemap per
document type, so if you want to exclude a certain document type or change the priority
it’s possible with a few clicks. 
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_10.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_thumb_4.png" width="531" height="312" />
          </a>  
</p>
        <h3>URL Rewriting
</h3>
        <p>
You want to make sure every page can be accessed by one url. If a url can be accessed
with and without www. prefix for example, search engines treat those url’s as unique
and it can cost you page rank. When I was building SEO checker I had some issues with
URL rewriting by editing the XML configuration files. To make it easier for you SEO
checker comes with a built-in URL rewriting module that you can configure with a few
mouse clicks (only one if you are not using directory url’s).  
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_15.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/SEOCheckerV1.0Beta_C67E/image_thumb_1.png" width="395" height="99" />
          </a>
        </p>
        <h3>Requirements
</h3>
        <p>
SEO checker requires: 
</p>
        <ul>
          <li>
IIS7 
</li>
          <li>
Umbraco Version 4.8 and up. 
</li>
          <li>
One of the following database SQL Server 2005/2008 (Express), SQL CE 4 and Mysql 
</li>
          <li>
            <div align="left">modify rights to folders: /bin, /umbraco, and /app_data folder 
</div>
          </li>
        </ul>
        <h3>Commercial package
</h3>
        <p>
Once the beta is over SEO checker will be a commercial package.Prices will be the
same as the <a href="http://our.umbraco.org/projects/developer-tools/cmsimport/" target="_blank">CMSImport</a> 
package:
</p>
        <ul>
          <li>
€ 99,00  for a domain license 
</li>
          <li>
€ 299,00 for a server license 
</li>
          <li>
€ 499,00 unlimited license 
</li>
        </ul>
        <h3>Download
</h3>
        <p>
          <strong>Update 1/22/2012 : </strong>
          <a href="http://www.richardsoeteman.net/2013/01/22/SEOCheckerRCIsHere.aspx" target="_blank">SEO
Checker Release candidate is available</a>
        </p>
        <p>
          <a href="http://www.soetemansoftware.nl/downloads/seochecker-1.0-beta.zip" target="_blank">Download
the beta version of SEO checker today</a>. 
</p>
        <p>
          <strong>BETA Warning: 
<br /></strong>This is a Beta release!! SEO checker is tested on different sites but can
still have some issues in specific situations. We love to get some feedback but don't
use this package in production! If you find any issues please send us an email support@soetemansoftware.nl
and we will get back to you ASAP!  This beta version will expire on Feb 1 2013. 
</p>
        <p>
        </p>
        <p>
          <strong>
            <font size="4">
            </font>
          </strong>
        </p>
        <p>
Also keep an eye on our <a href="http://hotfix.soetemansoftware.nl/seochecker/" target="_blank">hotfix
location</a>! Here you find the most recent bugfixes.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=876e943a-9d63-4c2f-b9b5-475fe4634d63" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Support multiple versions of a strongly named assembly in your Umbraco package</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2012/09/25/SupportMultipleVersionsOfAStronglyNamedAssemblyInYourUmbracoPackage.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,8cf2d4fb-021b-4b71-90ba-b4ea2ada9046.aspx</id>
    <published>2012-09-25T10:36:02.0426524+02:00</published>
    <updated>2012-10-02T22:11:40.4335669+02:00</updated>
    <category term="Package" label="Package" scheme="http://www.richardsoeteman.net/CategoryView,category,Package.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of months ago, Umbraco V4.8 was released and when I was testing CMSImport
against this version I got a weird exception. 
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Supportmultipleversionsofastronglynameda_908C/dllerror_4.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="dllerror" border="0" alt="dllerror" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Supportmultipleversionsofastronglynameda_908C/dllerror_thumb_1.png" width="1160" height="446" />
          </a>
        </p>
        <h2>What happened?
</h2>
        <p>
I’m using the <a href="http://htmlagilitypack.codeplex.com/" target="_blank">HTMLAgilityPack</a> to
extract images and files from the bodytext property so we can import them into Umbraco.
In previous versions, Umbraco shipped with the 1.3.0 version. The version of the HTMLAgilityPack
that is shipped in 4.8+ is version 1.4.5.0. Since the dll is signed it’s throwing
an error in case of a version conflict. I’ve seen a <a href="http://our.umbraco.org/projects/backoffice-extensions/ucomponents/questionssuggestions/33021-Upgrading-to-Umbraco-48-breaks-support-for-uComponents" target="_blank">post
on the forum</a> where <a href="https://twitter.com/leekelleher" target="_blank">Lee
Kelleher</a> describes a similar issue. In the case of UComponents it’s the Lucene
DLL but it’s the same problem as I was facing. To fix this issue as described in the
forum thread requires an entry in the web.config file and putting the Legacy DLL into
a separate folder. It’s all fine to use upgrade instructions for a client project
but when you develop a package you don’t want your customers manual upgrade web.config
files for a specific version. You also don’t want to have a big if statement in your
installer that creates entries based on a version number and you also don’t want to
drop support for older versions of Umbraco because of this minor conflict.
</p>
        <h2>The solution
</h2>
        <p>
After searching a bit, I found this <a href="http://msdn.microsoft.com/en-us/library/ff527268.aspx" target="_blank">interesting
article</a> that describes the <a href="http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx" target="_blank">AppDomain.AssemblyResolve
Event</a>. This event gets triggered when an Assembly is required that can’t be found
and allows you to return the correct assembly. In our case the DLL Version 1.3.0.0
of HTMLAgilityPack. In the example below you see that I derive my class from ApplicationBase
(I know there is a new class in 4.8, but I’m still supporting 4.7 also ;-)) so this
class will be picked up automatically . When the  required assembly (Args.Name
on line 13) is the HTMLAgilityPack Version 1.3.0 I load that assembly from the /bin/legacy/
location and all is working again :)  
<br /><br /><strong>Update 2-10-2012 Modified source code. It doesn’t use HTTPContext anymore
since that might not be available</strong></p>
        <div class="csharpcode">
          <pre>
            <span class="lnum">
            </span>
            <div class="csharpcode">
              <div class="csharpcode">
                <div class="csharpcode">
                  <pre>
                    <span class="lnum"> 1: </span>
                    <span class="kwrd">public</span>
                    <span class="kwrd">class</span> UpdateThirdPartyDllBindings
: ApplicationBase</pre>
                  <pre>
                    <span class="lnum"> 2: </span> {</pre>
                  <pre>
                    <span class="lnum"> 3: </span>
                    <span class="kwrd">public</span> UpdateThirdPartyDllBindings()</pre>
                  <pre>
                    <span class="lnum"> 4: </span> {</pre>
                  <pre>
                    <span class="lnum"> 5: </span> AppDomain.CurrentDomain.AssemblyResolve
+= <span class="kwrd">new</span> ResolveEventHandler(CurrentDomain_AssemblyResolve);</pre>
                  <pre>
                    <span class="lnum"> 6: </span> }</pre>
                  <pre>
                    <span class="lnum"> 7: </span> </pre>
                  <pre>
                    <span class="lnum"> 8: </span>
                    <span class="rem">///
&lt;summary&gt;</span>
                  </pre>
                  <pre>
                    <span class="lnum"> 9: </span>
                    <span class="rem">///
Assembly could not be resolved let's see if we can load it dynamically</span>
                  </pre>
                  <pre>
                    <span class="lnum"> 10: </span>
                    <span class="rem">///
&lt;/summary&gt;</span>
                  </pre>
                  <pre>
                    <span class="lnum"> 11: </span> Assembly CurrentDomain_AssemblyResolve(<span class="kwrd">object</span> sender,
ResolveEventArgs args)</pre>
                  <pre>
                    <span class="lnum"> 12: </span> {</pre>
                  <pre>
                    <span class="lnum"> 13: </span>
                    <span class="kwrd">if</span> (args.Name
== <span class="str">"HtmlAgilityPack, Version=1.3.0.0, Culture=neutral, PublicKeyToken=bd319b19eaf3b43a"</span>)</pre>
                  <pre>
                    <span class="lnum"> 14: </span> {</pre>
                  <pre>
                    <span class="lnum"> 15: </span>
                    <span class="kwrd">try</span>
                  </pre>
                  <pre>
                    <span class="lnum"> 16: </span> {</pre>
                  <pre>
                    <span class="lnum"> 17: </span>
                    <span class="rem">//Get
the bin folder. Don't use HTTPContext since that can be null</span>
                  </pre>
                  <pre>
                    <span class="lnum"> 18: </span>
                    <span class="kwrd">string</span> binFolder
= Path.Combine(AppDomain.CurrentDomain.BaseDirectory, <span class="str">"bin\\legacy"</span>);</pre>
                  <pre>
                    <span class="lnum"> 19: </span>
                    <span class="kwrd">string</span> legacyFile
= Path.Combine(binFolder, <span class="str">"HtmlAgilityPack.dll"</span>);</pre>
                  <pre>
                    <span class="lnum"> 20: </span>
                    <span class="kwrd">return</span> Assembly.LoadFile(legacyFile);</pre>
                  <pre>
                    <span class="lnum"> 21: </span> </pre>
                  <pre>
                    <span class="lnum"> 22: </span> }</pre>
                  <pre>
                    <span class="lnum"> 23: </span>
                    <span class="kwrd">catch</span> (Exception
ex)</pre>
                  <pre>
                    <span class="lnum"> 24: </span> {</pre>
                  <pre>
                    <span class="lnum"> 25: </span> Log.Add(LogTypes.Error,
-1, <span class="kwrd">string</span>.Format(<span class="str">"SEOChecker error
loading HTMLAgilityPack version {0}:{1} "</span>, args.Name, ex));</pre>
                  <pre>
                    <span class="lnum"> 26: </span> }</pre>
                  <pre>
                    <span class="lnum"> 27: </span> }</pre>
                  <pre>
                    <span class="lnum"> 28: </span>
                    <span class="kwrd">return</span>
                    <span class="kwrd">null</span>;</pre>
                  <pre>
                    <span class="lnum"> 29: </span> }</pre>
                  <pre>
                    <span class="lnum"> 30: </span> }</pre>
                </div>
                <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
              </div>
              <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
            </div>
            <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
          </pre>
        </div>
        <p>
All I need to do now is make sure the Legacy DLL is shipped in the package. When you
are using an older version of Umbraco this Legacy DLL will exists in your bin folder
but will be ignored and for version 4.8 + the AssemblyResolve implementation will
make sure the legacy DLL is loaded.
</p>
        <p>
Hope this helps you solve version conflicts of dll’s in your own packages
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=8cf2d4fb-021b-4b71-90ba-b4ea2ada9046" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Released MemberExport 2.0</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2011/12/20/ReleasedMemberExport20.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,8a19799d-4fc8-4e67-bcb4-37907201cf57.aspx</id>
    <published>2011-12-20T14:57:00+01:00</published>
    <updated>2011-12-20T16:04:14.1427586+01:00</updated>
    <category term="MemberExport" label="MemberExport" scheme="http://www.richardsoeteman.net/CategoryView,category,MemberExport.aspx" />
    <category term="Package" label="Package" scheme="http://www.richardsoeteman.net/CategoryView,category,Package.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I’ve just released MemberExport 2.0. Apart from another awesome logo by <a href="https://twitter.com/#!/aim24" target="_blank">Arnold
Visser</a>.I’ve added some functionality as well.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/memberexport100x100_2.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="memberexport100x100" border="0" alt="memberexport100x100" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/memberexport100x100_thumb.png" width="104" height="104" />
          </a>
        </p>
        <h2>Native Excel export
</h2>
        <p>
MemberExport 1.x could only export to a csv file. This is great for most of us but
when you select a wrong separator and want to open the csv file in Excel directly
it will probably looks a bit messy like the example below. 
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/wrongformat_4.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="wrongformat" border="0" alt="wrongformat" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/wrongformat_thumb_1.png" width="1099" height="239" />
          </a>
        </p>
        <p>
          <strong>MemberExport 2.0 Pro</strong> let’s you select the export option csv or Excel
file. When you select Excel file it will export the data to an Excel file instead
of csv and all the data is formatted correctly.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/image_6.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/image_thumb_2.png" width="499" height="475" />
          </a>
        </p>
        <h2>Export provider
</h2>
        <p>
I don’t like closed systems, all of my packages are open for extension. When creating
the Excel export option I wanted the export option to be a provider model. Not only
to make this task easier for myself but also so you can use MemberExport to connect
to your custom ERP system. Implementing an export provider is pretty straight forward.
The example below is the implementation of the CSV Provider. 
</p>
        <h2>CSVProviderUI
</h2>
        <p>
The <strong>CSVProviderUI</strong> class is the class which is responsible for the
UI part of the provider. Add a reference to the <strong>MemberExport.Library dll</strong> and
derive from <strong>ExportProviderUIBase</strong> class. Implement to following methods:
</p>
        <ul>
          <li>
OnInit, create the UI controls 
</li>
          <li>
Initialize, initialize the UI options based on the stored export provider settings.
In this case exportProvider will hold the text delimiter and text indicator options. 
</li>
          <li>
GetOptions will return the export provider settings so we use those settings when
exporting records 
</li>
          <li>
The name property will return the name of the provider stored in the Export as dropdownlist
when selecting an export provider. 
</li>
        </ul>
        <pre class="csharpcode">
          <span class="kwrd">using</span> System; <span class="kwrd">using</span> System.Web.UI; <span class="kwrd">using</span> System.Web.UI.WebControls; <span class="kwrd">using</span> MemberExport.Resources.Helpers; <span class="kwrd">using</span> umbraco.uicontrols; <span class="kwrd">namespace</span> MemberExport.Library.ExportProviders.CSV
{ <span class="rem">/// &lt;summary&gt;</span><span class="rem">/// Renders the Layout
for the CSV Provider</span><span class="rem">/// &lt;/summary&gt;</span><span class="kwrd">public</span><span class="kwrd">class</span> CSVProviderUI
: ExportProviderUIBase, INamingContainer { <span class="kwrd">protected</span> DropDownList
_csvTextIndicatorDropDownList = <span class="kwrd">new</span> DropDownList(); <span class="kwrd">protected</span> DropDownList
_csvSVSeperatorDropDownList = <span class="kwrd">new</span> DropDownList(); <span class="kwrd">protected</span><span class="kwrd">override</span><span class="kwrd">void</span> OnInit(EventArgs
e) { <span class="kwrd">base</span>.OnInit(e); _csvSVSeperatorDropDownList.Items.Add(<span class="kwrd">new</span> ListItem(<span class="str">";"</span>, <span class="str">";"</span>));
_csvSVSeperatorDropDownList.Items.Add(<span class="kwrd">new</span> ListItem(<span class="str">","</span>, <span class="str">","</span>));
_csvTextIndicatorDropDownList.Items.Add(<span class="kwrd">new</span> ListItem(ResourceHelper.Current.GetStringResource(<span class="str">"CSVNoTextIndicator"</span>), <span class="str">""</span>));
_csvTextIndicatorDropDownList.Items.Add(<span class="kwrd">new</span> ListItem(<span class="str">"\""</span>, <span class="str">"\""</span>));
_csvTextIndicatorDropDownList.Items.Add(<span class="kwrd">new</span> ListItem(<span class="str">"\'"</span>, <span class="str">"\'"</span>));
PropertyPanel delimiterPropery = <span class="kwrd">new</span> PropertyPanel(); delimiterPropery.Text
= ResourceHelper.Current.GetStringResource(<span class="str">"CSVSeperatorProperty"</span>);
delimiterPropery.Controls.Add(_csvSVSeperatorDropDownList); PropertyPanel stringIndicatorPropery
= <span class="kwrd">new</span> PropertyPanel(); stringIndicatorPropery.Text = ResourceHelper.Current.GetStringResource(<span class="str">"CSVTextIndicatorProperty"</span>);
stringIndicatorPropery.Controls.Add(_csvTextIndicatorDropDownList); Controls.Add(delimiterPropery);
Controls.Add(stringIndicatorPropery); } <span class="rem">/// &lt;summary&gt;</span><span class="rem">///
Sets the export options (delimiter and string indicator).</span><span class="rem">///
&lt;/summary&gt;</span><span class="rem">/// &lt;param name="exportProvider"&gt;The
export provider.&lt;/param&gt;</span><span class="kwrd">public</span><span class="kwrd">override</span><span class="kwrd">void</span> Initialize(ExportProviderBase
exportProvider) { CSVProvider csvProvider = exportProvider <span class="kwrd">as</span> CSVProvider; <span class="kwrd">if</span> (csvProvider
!= <span class="kwrd">null</span>) { _csvSVSeperatorDropDownList.SelectedValue = csvProvider.Delimiter;
_csvTextIndicatorDropDownList.SelectedValue = csvProvider.StringIndicator; } } <span class="rem">///
&lt;summary&gt;</span><span class="rem">/// Returns the selected export options (delimiter
and string indicator).</span><span class="rem">/// &lt;/summary&gt;</span><span class="rem">///
&lt;returns&gt;&lt;/returns&gt;</span><span class="kwrd">public</span><span class="kwrd">override</span> ExportProviderBase
GetOptions() { CSVProvider csvProvider = <span class="kwrd">new</span> CSVProvider();
csvProvider.Delimiter = _csvSVSeperatorDropDownList.SelectedValue; csvProvider.StringIndicator
= _csvTextIndicatorDropDownList.SelectedValue; <span class="kwrd">return</span> csvProvider;
} <span class="rem">/// &lt;summary&gt;</span><span class="rem">/// Return the name
of the provider. this will be displayed in the selectbox</span><span class="rem">///
&lt;/summary&gt;</span><span class="rem">/// &lt;value&gt;The selected name.&lt;/value&gt;</span><span class="kwrd">public</span><span class="kwrd">override</span><span class="kwrd">string</span> Name
{ get { <span class="kwrd">return</span><span class="str">"CSV file"</span>;
} } } }</pre>
        <style type="text/css">





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <h2>CsvProvider
</h2>
        <p>
The second part we need implement is the provider itself which handles the actual
export process. Create a new class and derive from <strong>ExportProviderBase</strong>. 
This will give the following methods/properties:
</p>
        <ul>
          <li>
Export, responsible for the export process 
</li>
          <li>
Icon, will be displayed when opening the saved exports tree 
</li>
        </ul>
        <p>
In this implementation we’ve added the StringIndicator and Delimiter options, which
gets set from the UI. The export method will give a list of columns to export and
all records using an <strong>IRecordReader</strong>.  The rest of the code is
implementation specific. Two important things to know when exporting records. 
When assigning a value always use the <strong>ValueParser factory</strong><br /></p>
        <pre class="csharpcode">ValueParser.Parse(reader.GetObject(column.Alias), column));</pre>
        <style type="text/css">




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
To write the file to the browser either use the <strong>WriteResponseString</strong> (for
stringvalues ) or <strong>WriteResponseBytes</strong> (for a byte array) methods.
Both methods need the Contenttype (Mimetype) and fileExtension, in this case csv.
</p>
        <pre class="csharpcode">
          <span class="kwrd">using</span> System; <span class="kwrd">using</span> System.Collections.Generic; <span class="kwrd">using</span> MemberExport.Library.Csv; <span class="kwrd">using</span> MemberExport.Library.Members; <span class="kwrd">using</span> MemberExport.Library.Types; <span class="kwrd">namespace</span> MemberExport.Library.ExportProviders.CSV
{ <span class="rem">/// &lt;summary&gt;</span><span class="rem">/// CSV (Default)
implementation of MemberExport</span><span class="rem">/// &lt;/summary&gt;</span> [Serializable()] <span class="kwrd">public</span><span class="kwrd">class</span> CSVProvider
: ExportProviderBase { <span class="rem">/// &lt;summary&gt;</span><span class="rem">///
Exports the data to a csv file</span><span class="rem">/// &lt;/summary&gt;</span><span class="rem">///
&lt;param name="columns"&gt;Collection of column info&lt;/param&gt;</span><span class="rem">///
&lt;param name="reader"&gt;The actual data to export&lt;/param&gt;</span><span class="kwrd">public</span><span class="kwrd">override</span><span class="kwrd">void</span> Export(List&lt;Types.MemberField&gt;
columns, umbraco.DataLayer.IRecordsReader reader) { <span class="rem">//Use a csv
writer object</span> CsvWriter writer = <span class="kwrd">new</span> CsvWriter(Delimiter,
StringIndicator); <span class="rem">//Add columns to export</span><span class="kwrd">foreach</span> (MemberField
field <span class="kwrd">in</span> columns) { writer.Columns.Add(field.Text); } <span class="rem">//Add
data to export</span><span class="kwrd">while</span> (reader.Read()) { <span class="rem">//Get
values for the current row</span> List&lt;<span class="kwrd">object</span>&gt; values
= <span class="kwrd">new</span> List&lt;<span class="kwrd">object</span>&gt;(); <span class="kwrd">foreach</span> (MemberField
column <span class="kwrd">in</span> columns) { values.Add(ValueParser.Parse(reader.GetObject(column.Alias),
column)); } <span class="rem">//write values to csvwriter;</span> writer.Add(values.ToArray());
} <span class="rem">//Write response to the browser</span> WriteResponseString(writer.Parse(), <span class="str">"application/excel"</span>, <span class="str">"csv"</span>);
} <span class="rem">/// &lt;summary&gt;</span><span class="rem">/// Gets or sets
the string indicator.</span><span class="rem">/// &lt;/summary&gt;</span><span class="rem">///
&lt;value&gt;The string indicator.&lt;/value&gt;</span><span class="kwrd">public</span><span class="kwrd">string</span> StringIndicator
{ get; set; } <span class="rem">/// &lt;summary&gt;</span><span class="rem">/// Gets
or sets the delimiter.</span><span class="rem">/// &lt;/summary&gt;</span><span class="rem">///
&lt;value&gt;The delimiter.&lt;/value&gt;</span><span class="kwrd">public</span><span class="kwrd">string</span> Delimiter
{ get; set; } <span class="rem">/// &lt;summary&gt;</span><span class="rem">/// Returns
the icon that will be displayed in the saved tree</span><span class="rem">/// &lt;/summary&gt;</span><span class="rem">///
&lt;value&gt;The icon.&lt;/value&gt;</span><span class="kwrd">public</span><span class="kwrd">override</span><span class="kwrd">string</span> Icon
{ get { <span class="kwrd">return</span><span class="str">"csvexport.gif"</span>;
} } } }</pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
          <strong>That’s all, compile and add to the bin folder of your Umbraco install and
you can use the provider!</strong>
        </p>
        <h2>ValueParsers
</h2>
        <p>
By default MemberExport exports the stored value from  the database. When this
value is an Id value you might want to export the text value instead. This can be
achieved using a value parser. By default MemberExport comes with value parsers for
the following datatypes :
</p>
        <ul>
          <li>
Checkbox 
</li>
          <li>
Dropdownlist 
</li>
          <li>
MNTP 
</li>
          <li>
MuiltipleDropdownlist 
</li>
          <li>
Radiobox 
</li>
          <li>
Ultimatepicker 
</li>
        </ul>
        <p>
In the example below we will write a value parser for the True/false datatype. By
default values will be exported as 1/0. We want the values to be exported as yes/no
for this example. 
</p>
        <p>
          <strong>
            <em>
              <font size="3">Before you ask, this isn’t in the core because some people
want 0/1, some true/false, some yes/no etc.</font>
            </em>
          </strong>
        </p>
        <p>
First we need to add a reference to the <strong>MemberExport.Library dll</strong>.
Then we can create a class that implements the <strong>IValueParser</strong> interface
</p>
        <pre class="csharpcode">
          <span class="kwrd">public</span>
          <span class="kwrd">class</span> TrueFalseParser
: IValueParser { <span class="rem">/// &lt;summary&gt;</span><span class="rem">///
Returns the Datatype GUID of the true/false Render Control.</span><span class="rem">///
&lt;/summary&gt;</span><span class="kwrd">public</span> Guid DataTypeId { get { <span class="kwrd">return</span><span class="kwrd">new</span> Guid(<span class="str">"38b352c1-e9f8-4fd8-9324-9a2eab06d97a"</span>);
} } <span class="rem">/// &lt;summary&gt;</span><span class="rem">/// Converts the
0/1 to a normal yes/no string.</span><span class="rem">/// &lt;/summary&gt;</span><span class="rem">///
&lt;param name="memberfieldInfo"&gt;The memberfield info.&lt;/param&gt;</span><span class="rem">///
&lt;param name="value"&gt;The value.&lt;/param&gt;</span><span class="rem">///
&lt;returns&gt;The yes/no string&lt;/returns&gt;</span><span class="kwrd">public</span><span class="kwrd">object</span> Parse(Library.Types.MemberField
memberfieldInfo, <span class="kwrd">object</span><span class="kwrd">value</span>)
{ <span class="kwrd">return</span><span class="kwrd">string</span>.Format(<span class="str">"{0}"</span>, <span class="kwrd">value</span>)
== <span class="str">"1"</span> ? <span class="str">"yes"</span> : <span class="str">"no"</span>;
} }</pre>
        <p>
The DataTypeId property needs to return the GUID which is displayed on the datatype
edit screen. 
<br /></p>
        <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/image_2.png">
          <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/image_thumb.png" width="581" height="226" />
        </a>
        <style type="text/css">



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
The Parse method will be called when a true/false property value is exported. In the
above example we transform the value to yes/no. 
<br />
The following information about the exported field is available in the <strong>memberFieldInfo</strong> variable:
</p>
        <ul>
          <li>
DataTypeId. The GUID which is displayed on the datatype edit screen 
</li>
          <li>
DatatypeNodeId. The node id  of the Datatype. 
</li>
          <li>
Alias. The Property alias. 
</li>
          <li>
Text. The Property text. 
</li>
        </ul>
        <p>
To use the Value Parser all we need to compile the project and add the dll to the
bin folder of the Umbraco install. Then it will be picked up automatically and values
will be exported as yes/no. In the example below the Active column is exported as
true/false value using the Value Parser.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/image_4.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Released-MemberExport-2.0_CC61/image_thumb_1.png" width="426" height="68" />
          </a>
        </p>
        <h4>
        </h4>
        <h2>Download and install
</h2>
        <p>
You can download the <a href="http://our.umbraco.org/projects/website-utilities/memberexport" target="_blank">MemberExport
package from the Umbraco Deli</a>. Just install the package, also when you want to
update your current version. When you are a Pro user make sure the license file is
still in your bin folder to unlock the Pro features. 
</p>
        <p>
Happy exporting! 
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=8a19799d-4fc8-4e67-bcb4-37907201cf57" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Quick tip solve date errors in CMSImport</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2011/11/15/QuickTipSolveDateErrorsInCMSImport.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,ffa08bcd-209b-4611-8d6b-cf8fc2542853.aspx</id>
    <published>2011-11-15T17:05:32.2948723+01:00</published>
    <updated>2011-11-15T17:05:56.6229973+01:00</updated>
    <category term="CMSImport" label="CMSImport" scheme="http://www.richardsoeteman.net/CategoryView,category,CMSImport.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
A question I get a lot is how to solve date formatting issues in CMSImport. Unless
you are using SQL Server all imported values are of type string. So when you try to
import date values the data layer will try to convert the value to a DateTime object,
if it can’t parse the string you will see an error. These errors can be solved. Let’s
take the following example from a Wordpress export file that can fail.
</p>
        <pre>
          <pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px">
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #c71585">wp</span>:<span style="color: #800000">post</span><span style="color: #ff0000">_date</span><span style="color: #0000ff">&gt;</span>2011-11-03
17:29:18<span style="color: #0000ff">&lt;/</span><span style="color: #c71585">wp</span>:<span style="color: #800000">post</span>_date<span style="color: #0000ff">&gt;</span></pre>
        </pre>
        <p>
When mapping the value in CMSImport you can select the advanced mapping option, this
will show the following mapping options if you map against a DateTime Property. As
you can see you can specify a date format. Check the <a href="http://idunno.org/archive/2004/07/14/122.aspx" target="_blank">custom
date formatting section</a> for the exact formatting syntax. When you specify a format
that exactly matches the string from your datasource(TIP use the refresh option to
update the preview) CMSImport will use that format to convert the string to the DateTime
object and all will import fine.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Solve-date-formatting-issues-during_EA1E/clip_image002_2.jpg">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Solve-date-formatting-issues-during_EA1E/clip_image002_thumb.jpg" width="594" height="206" />
          </a>
        </p>
        <p>
Hope this helps you!
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ffa08bcd-209b-4611-8d6b-cf8fc2542853" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Integrate your own packages into uGoLive</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2011/11/08/IntegrateYourOwnPackagesIntoUGoLive.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,6ac09de5-3047-477e-8252-73708b97fe36.aspx</id>
    <published>2011-11-08T11:16:29.9936393+01:00</published>
    <updated>2011-11-08T12:20:10.5089993+01:00</updated>
    <category term="Package" label="Package" scheme="http://www.richardsoeteman.net/CategoryView,category,Package.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last week <a href="http://twitter.com/#!/mattbrailsford" target="_blank">Matt Brailsford</a> released
uGoLive. <a href="http://our.umbraco.org/projects/backoffice-extensions/ugolive" target="_blank">uGoLive</a> is
a package with essential checks you need to do before your website goes live.Test
includes checking for debug and trace mode, removing install directory etc. The great
thing about uGoLive is that you can easily integrate checks into uGoLive. In fact
you can already use or extend the <a href="https://bitbucket.org/mattbrailsford/ugolivecontrib" target="_blank">uGoLive
contrib project</a>. But you can also integrate uGoLive into your own package. Extending
uGoLive is <a href="http://our.umbraco.org/FileDownload?id=3275" target="_blank">very
well documented</a>,  I’ve just integrated uGoLive into the SEO Analyzer package
I am working on.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Integrate-uGolive-checks-in-your-own-pac_90B0/SeoAnalyzer%20uGoLive_4.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SeoAnalyzer uGoLive" border="0" alt="SeoAnalyzer uGoLive" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/Integrate-uGolive-checks-in-your-own-pac_90B0/SeoAnalyzer%20uGoLive_thumb_1.png" width="959" height="495" />
          </a>
        </p>
        <h4>
        </h4>
        <h4>It’s all about plugin architecture
</h4>
        <p>
The thing I like most about Umbraco and most of the available packages is that is
uses a plugin architecture. Plugin architecture means that Umbraco or a package defines
an interface, or attribute and when you implement that interface, or decorate your
class with the attribute in your own code it will be picked up automatically by Umbraco
or the package. This also prevents you have a tight coupling with the functionality
you want to implement. In other words when you add a class implementing a certain
interface this will be automatically picked up when the responsible functionality
in this case uGoLive exists in the Umbraco environment. If uGoLive isn’t installed
it’s just a class that does nothing.
</p>
        <p>
To integrate the custom checks as displayed in the above example I only added a reference
to the Our.Umbraco.uGoLive.dll, decorate my class with the Check attribute and implement
a class deriving from AbstractCheck for each check. 
</p>
        <pre class="csharpcode">
          <span class="rem">/// &lt;summary&gt;</span>
          <span class="rem">///
Check the SEO Analyzer table for template issues</span>
          <span class="rem">/// &lt;/summary&gt;</span> [Check(<span class="str">"C4B4D282-12CB-44AC-8263-389D70415895"</span>, <span class="str">"Template
issues"</span>, <span class="str">"Leaving SEO Issues in templates unsolved
can be bad for your ranking"</span>, <span class="str">"SEO Analyzer"</span>)] <span class="kwrd">public</span><span class="kwrd">class</span> SeoAnalyzerTemplateErrorsCheck
: AbstractCheck { <span class="rem">/// &lt;summary&gt;</span><span class="rem">///
Checks the SEO Analyzer error log table</span><span class="rem">/// &lt;/summary&gt;</span><span class="kwrd">public</span><span class="kwrd">override</span> CheckResult
Check() { <span class="kwrd">return</span> TemplateIssues.GetAll().Count == 0 ? PassedResult()
: FailedResult(); } <span class="rem">/// &lt;summary&gt;</span><span class="rem">///Returns
the result object when the check passed</span><span class="rem">/// &lt;/summary&gt;</span><span class="kwrd">private</span> CheckResult
PassedResult() { var result = <span class="kwrd">new</span> CheckResult(); result.Status
= CheckResultStatus.Passed; result.Message = <span class="str">"No template issues
found"</span>; <span class="kwrd">return</span> result; } <span class="rem">///
&lt;summary&gt;</span><span class="rem">///Returns the result object when the check
failed</span><span class="rem">/// &lt;/summary&gt;</span><span class="kwrd">private</span> CheckResult
FailedResult() { var result = <span class="kwrd">new</span> CheckResult(); result.Status
= CheckResultStatus.Failed; result.Message = <span class="str">"Template issues
found, resolve them in the SEO Analyzer section"</span>; <span class="kwrd">return</span> result;
} }</pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
This was very straight forward to implement, a big <a href="http://h5yr.com" target="_blank">#h5yr</a> to
the team who build uGoLive and now I better hurry up finishing SEO Analyzer to prevent
you from having SEO issues in your site.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=6ac09de5-3047-477e-8252-73708b97fe36" />
      </div>
    </content>
  </entry>
  <entry>
    <title>CMSImport 2.1</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/2011/10/25/CMSImport21.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,4d5b3cfd-4fb4-4466-bc60-9f3cf4c1f3e1.aspx</id>
    <published>2011-10-25T14:25:49.9052409+02:00</published>
    <updated>2011-10-25T15:21:04.2289959+02:00</updated>
    <category term="CMSImport" label="CMSImport" scheme="http://www.richardsoeteman.net/CategoryView,category,CMSImport.aspx" />
    <category term="Umbraco" label="Umbraco" scheme="http://www.richardsoeteman.net/CategoryView,category,Umbraco.aspx" />
    <author>
      <name>Richard Soeteman</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
 <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/cmsimport_2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="cmsimport" border="0" alt="cmsimport" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/cmsimport_thumb.png" width="240" height="180" /></a></p>
        <p>
A few weeks back  I’ve released CMSImport 2.1. Apart from the awesome Logo made
by <a href="http://twitter.com/#!/aim24" target="_blank">Arnold Visser</a> I’ve added
some functionality as well. 
<br /></p>
        <h2>
        </h2>
        <h3>Import dashboard for Content Editors
</h3>
        <p>
CMSImport is great for developers. They can create import definitions and execute,
or schedule  them. When you want to allow your content editors uploading new
data and import that data you need to allow them access to the developer section,
or let them upload a file to a specific location and schedule a task that imports
that file very hour or so. Well not anymore. Now  you can use a dashboard control
and allow users to import their data using that dashboard control. The user can select
an import definition, upload a file containing the data to import and optional upload
a zip file containing the media files. Before importing the data will be verified
to ensure all columns still exists in the new uploaded data file. This feature is
a direct request from customers who use CMSImport to update their <a href="http://www.teacommerce.dk/" target="_blank">TeaCommerce</a> or <a href="http://www.uwebshop.com/" target="_blank">uWebshop</a> catalog,
but can also be used for any other import requirement of course.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/importdashboardcontrol_2.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="importdashboardcontrol" border="0" alt="importdashboardcontrol" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/importdashboardcontrol_thumb.png" width="817" height="510" />
          </a>
        </p>
        <p>
As a developer you still have full control what you want your users to import. Using
the ImportDashboard settings page you can enable/disable Import definitions you want
your end users to use. You can only select import definitions that allow upload of
a file such as Excel, Csv, Xml etc. You will also see an xml Snippet you can customize
to your needs and paste into the dashboard.config file. Using the access element you
can also restrict which User types can access the Dashboard control.<a href="http://our.umbraco.org/wiki/reference/files-and-folders/dashboardconfig" target="_blank">Check
out this wiki</a> for more information about configuring Dashboard controls.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/UserImportSettingsDashboard_2.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="UserImportSettingsDashboard" border="0" alt="UserImportSettingsDashboard" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/UserImportSettingsDashboard_thumb.png" width="822" height="553" />
          </a>
        </p>
        <h3>Finally support for Media using MNTP
</h3>
        <p>
With the 2.1 release it’s finally possible to upload media using the <a href="http://ucomponents.codeplex.com/wikipage?title=MultiNodeTreePicker" target="_blank">Ucomponents
Multi Node Tree Picker</a>. When you select advanced mapping options when mapping
against a property based on the MNTP datatype you will see the following options screen.
Set the media location where to store the media and files will be imported automatically.
The benefit MNTP has over normal Media pickers is that you can use a comma separated
string of media files you want to import instead of just one file. When mapping against
a MNTP datatype you can only set media settings if the datatype is configured as a
media picker, otherwise you will get a message that it is not possible to set the
advanced options.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/image_2.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.richardsoeteman.net/content/binary/Windows-Live-Writer/CMSImport-2.1_E885/image_thumb.png" width="609" height="246" />
          </a>
        </p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=4d5b3cfd-4fb4-4466-bc60-9f3cf4c1f3e1" />
      </div>
    </content>
  </entry>
</feed>