Blog posts by Ben Edwards
2010-04-01T17:50:46.0000000Z
/blogs/Ben-Edwards/
Optimizely World
EPiServer 6 – It’s 2010 and we can check our spelling… with a bit of configuration
/blogs/Ben-Edwards/Dates/2010/4/EPiServer-6--Its-2010-and-we-can-check-our-spelling-with-a-bit-of-configuration/
2010-04-01T17:50:46.0000000Z
<p>Further to my previous post, and thank you all for so many views, I now have a solution for enabling the Google spell checker on the tinyMCE editor:</p> <ol> <li>Add the two dlls in the zip below to your project </li> <li>Copy the required lines from the web.config in the zip to your project’s web.config </li> </ol> <p><a href="http://www.mediafire.com/?35hzno2gnhy" target="_blank">Download EPi.Framework.Common.zip from MediaFire</a></p> <p>Drop me a comment if your having any trouble and I’ll try to help</p> <p>Dev’s if you interested in the source I can fire that your way too!</p> <p>[EDIT: It’s Easter weekend here in the UK so sorry if I don’t respond quickly before Tuesday]</p>
EPiServer 6 – It’s 2010 and I can’t check my spelling!
/blogs/Ben-Edwards/Dates/2010/3/EPiServer-6--Its-2010-and-I-cant-check-my-spelling/
2010-03-31T12:45:18.0000000Z
<p>So with the release of EPiServer 6 and all it’s advancements comes the news that spell checking is handled by your browser, great news if your using Firefox, a shambles if your not.</p> <p>How did the decision to disable spell checking for IE ever get out into the wild? And how are we supposed to explain this away to our clients?</p> <p>Looks like I’ll be spending the day adding it back into the tinyMCE editor and working how to get the spell checking service up and running.</p> <p>Cheers EPiServer 6 developers!</p>
Displaying plugins dynamically
/blogs/Ben-Edwards/Dates/2008/11/Displaying-plugins-dynamically/
2008-11-20T16:38:11.8200000Z
<p>I recently found the need to display a plugin dynamically, in a very similar way to the ‘Form Data’ plugin, in a certain PropertyData type existed within a page type. After reflecting the code for the form data plugin I was able to duplicate the functionality:</p> <p>Firstly the plugin class needs to inherit from ICustomPlugInLoader, which exposes the method List()</p> <pre class="language-csharp"><code><span class="kwrd">public</span> PlugInDescriptor[] List()
{
<span class="kwrd">if</span> (PageAllowsComments())
{
<span class="rem">// Show plugin if comments allowed</span>
PlugInDescriptor descriptor = PlugInDescriptor.Load(GetType());
<span class="kwrd">return</span> <span class="kwrd">new</span> PlugInDescriptor[] { descriptor };
}
<span class="rem">// Hide plugin if comments not allowed</span>
<span class="kwrd">return</span> <span class="kwrd">new</span> PlugInDescriptor[0];
}
<span class="kwrd">private</span> <span class="kwrd">bool</span> PageAllowsComments()
{
PageData page = GetCurrentPage();
<span class="kwrd">if</span> (page != <span class="kwrd">null</span>)
{
<span class="kwrd">foreach</span> (PropertyData propertyData <span class="kwrd">in</span> page.Property)
{
<span class="kwrd">if</span> (propertyData <span class="kwrd">is</span> CommentsXForm) <span class="kwrd">return</span> <span class="kwrd">true</span>;
}
}
<span class="kwrd">return</span> <span class="kwrd">false</span>;
}
<span class="kwrd">private</span> PageData GetCurrentPage()
{
PageData currentPage;
<span class="kwrd">if</span> (PageReference.IsNullOrEmpty(<span class="kwrd">base</span>.CurrentPage.PageLink))
{
<span class="kwrd">return</span> <span class="kwrd">null</span>;
}
<span class="kwrd">try</span>
{
currentPage = <span class="kwrd">base</span>.CurrentPage;
}
<span class="kwrd">catch</span> (EPiServerException)
{
<span class="kwrd">return</span> <span class="kwrd">null</span>;
}
<span class="kwrd">return</span> currentPage;
}</code></pre>
<style type="text/css"><![CDATA[
<![cdata[
.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>
PropertyVPPDirectorySelector
/blogs/Ben-Edwards/Dates/2008/11/PropertyVPPDirectorySelector/
2008-11-18T13:19:08.7730000Z
<p>After noticing that the <a href="https://www.coderesort.com/p/epicode/wiki/FolderBrowserProperty/" target="_blank">Folder Browser Property had been release on EPiCode</a>. I though I would share my alternative property type for rendering the list in a drop down menu, that I initially developed when CMS 5 was released.</p> <h2>Custom property:</h2> <pre class="language-csharp"><code><span class="kwrd">public</span> <span class="kwrd">class</span> PropertyVPPDirectorySelector : PropertyString
{
<span class="preproc">#region</span> Methods
<span class="kwrd">public</span> <span class="kwrd">override</span> IPropertyControl CreatePropertyControl()
{
<span class="kwrd">return</span> <span class="kwrd">new</span> PropertyVPPDirectorySelectorControl();
}
<span class="preproc">#endregion</span>
}</code></pre>
<style type="text/css"><![CDATA[
<![cdata[
.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>Property control:</h2>
<p>The code below reflect amendments I made after the release of R2. R2 brought with it VPP entries for ‘Themes’, ‘UI’, ‘Util’ and ‘WebServices’ so I amended the control to only display those VPPs marked to show in the File Manager by default. setting ‘DisplayAll’ to true will return all VPP entries from the web.config. settings ‘DisplayPageFolders’ to true will include the page folders VPP as this is set to not display in the File Manager by default</p>
<pre class="language-csharp"><code><span class="kwrd">public</span> <span class="kwrd">class</span> PropertyVPPDirectorySelectorControl : PropertySelectControlBase
{
<span class="preproc">#region</span> Member Variables
<span class="kwrd">private</span> List<VirtualDirectory> _directories;
<span class="preproc">#endregion</span>
<span class="preproc">#region</span> Properties
<span class="kwrd">public</span> List<VirtualDirectory> Directories
{
get
{
<span class="kwrd">if</span> (_directories == <span class="kwrd">null</span>)
{
_directories = <span class="kwrd">new</span> List<VirtualDirectory>();
VirtualPathElement element = <br /> EPiServerSection.Instance.VirtualPathSettings;
<span class="kwrd">foreach</span> (ProviderSettings provider <span class="kwrd">in</span> element.Providers)
{
<span class="kwrd">bool</span> visible = <span class="kwrd">false</span>;
<span class="kwrd">if</span> (provider.Name.Equals(<br /> Settings.Instance.PageFolderVirtualPathProviderName,
StringComparison.InvariantCultureIgnoreCase))
{
visible = DisplayPageFolders;
}
<span class="kwrd">else</span>
{
<span class="kwrd">if</span> (DisplayAll)
{
visible = <span class="kwrd">true</span>;
}
<span class="kwrd">else</span>
{
<span class="kwrd">bool</span>.TryParse(<br /> provider.Parameters[<span class="str">"showInFileManager"</span>],<br /> <span class="kwrd">out</span> visible);
}
}
<span class="kwrd">if</span> (visible)
{
<span class="kwrd">string</span> path = provider.Parameters[<span class="str">"virtualPath"</span>];
VirtualDirectory directory = <br /> HostingEnvironment.VirtualPathProvider.GetDirectory(path);
GetDirectories(_directories, directory);
}
}
_directories.Sort(<span class="kwrd">delegate</span>(VirtualDirectory v1,<br /> VirtualDirectory v2) { <br /> <span class="kwrd">return</span> v1.VirtualPath.CompareTo(v2.VirtualPath); });
}
<span class="kwrd">return</span> _directories;
}
}
<span class="kwrd">public</span> <span class="kwrd">bool</span> DisplayAll { get; set; }
<span class="kwrd">public</span> <span class="kwrd">bool</span> DisplayPageFolders { get; set; }
<span class="preproc">#endregion</span>
<span class="preproc">#region</span> Constructors
<span class="kwrd">public</span> PropertyVPPDirectorySelectorControl()
{
DisplayAll = <span class="kwrd">false</span>;
DisplayPageFolders = <span class="kwrd">false</span>;
}
<span class="kwrd">public</span> PropertyVPPDirectorySelectorControl(<span class="kwrd">bool</span> displayPageFolders)
{
DisplayAll = <span class="kwrd">false</span>;
DisplayPageFolders = displayPageFolders;
}
<span class="kwrd">public</span> PropertyVPPDirectorySelectorControl(<span class="kwrd">bool</span> displayAll,<br /> <span class="kwrd">bool</span> displayPageFolders)
{
DisplayAll = displayAll;
DisplayPageFolders = displayPageFolders;
}
<span class="preproc">#endregion</span>
<span class="preproc">#region</span> Methods
<span class="kwrd">protected</span> <span class="kwrd">void</span> GetDirectories(List<VirtualDirectory> directories,<br /> VirtualDirectory directory)
{
<span class="kwrd">if</span> (!directories.Contains(directory))
{
directories.Add(directory);
<span class="kwrd">foreach</span> (VirtualDirectory subdirectory <span class="kwrd">in</span> directory.Directories)
{
GetDirectories(directories, subdirectory);
}
}
}
<span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> SetupEditControls()
{
DropDownList dropDownListDirectories = EditControl;
dropDownListDirectories.Items.Add(<span class="kwrd">string</span>.Empty);
<span class="kwrd">foreach</span> (VirtualDirectory directory <span class="kwrd">in</span> Directories)
{
dropDownListDirectories.Items.Add(directory.VirtualPath);
}
<span class="kwrd">if</span> (PropertyData != <span class="kwrd">null</span> && !PropertyData.IsNull)
{
<span class="kwrd">try</span>
{
dropDownListDirectories.SelectedValue =
dropDownListDirectories.Items.FindByValue(<br /> PropertyData.Value.ToString()).Value;
}</code></pre>
<pre class="language-csharp"><code> <span class="kwrd">catch</span> { <span class="rem">/* Do nothing */</span> }
}
}
<span class="preproc">#endregion</span>
}</code></pre>
<style type="text/css"><![CDATA[
<![cdata[
.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><style type="text/css"><![CDATA[
<![cdata[
.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><style type="text/css"><![CDATA[
<![cdata[
.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><style type="text/css"><![CDATA[
<![cdata[
.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><style type="text/css"><![CDATA[
<![cdata[
.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>