tag:blogger.com,1999:blog-63759027396788814692024-02-20T13:37:32.051-08:00Voodoo EktroneeringAn unofficial Ektron development blog.spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-6375902739678881469.post-48053914743553234852011-06-10T01:38:00.001-07:002012-03-28T19:56:09.592-07:00Being force fed Ektron CSSI am currently working on an Ektron site. We had the home page looking good, but wanted to add a news feed. After being given the required HTML, I created a new blog in the workarea, made the required XSLT (tweaked from a previous project) and dropped a BlogEntries control onto the page. This completely broke the page – the fonts had changed, spacing was completely out.<br />
The culprit was the Ektron blog CSS. Ektron is smart enough to only load the CSS required for a particular page. So when the BlogEntries control was added, the Ektron CSS URL changed from something like-<br />
<span style="font-family: 'Courier New';">workarea/csslib/ektronCss.ashx?id=EkOneCss+EkTwoCss</span><br />
to<br />
<span style="font-family: 'Courier New';"><span style="font-family: 'Courier New';">workarea/csslib/ektronCss.ashx?id=EkOneCss+EkTwoCss</span><u>+EkBlogsCss</u></span><br />
<br />
Whilst it is admirable of Ektron to try to reduce your page load, the problem with this is twofold-<br />
<ul>
<li>Using XSLT, I have no requirement of the Ektron CSS.</li>
<li>The Ektron CSS is at times terrible.</li>
</ul>
<br />
Here, in particular, is the offensive piece of CSS in the \Workarea\csslib\blogs.css<br />
<span style="font-family: 'Courier New';">p, li, div <br /> {<br /> margin:0in;<br /> margin-bottom:.0001pt;<br /> font-size:10.0pt;<br /> font-family:Verdana, Geneva, Arial, Helvetica, sans-serif;<br /> }</span> <br />
Dear CSS designers of the world, imagine for a second that you had the following CSS forced upon you by a developer. You would go spare trying to override it. Maybe you could use “inherit” and “!important” to work around it, but either way it’s a lot of work.<br />
So, we had a previously fine page suddenly rendered ugly by the choice of Ektron server control. Our options to solve this are-<br />
<ul>
<li>Workaround the CSS. As mentioned above, this is quite laborious, and be sure to budget for rehab for your CSS developers.</li>
<li>Delete the offending code. Main problem with this is to remember to re-delete upon upgrading Ektron. If it’s just one bad CSS snippet that’s not too bad. Also, you need to take responsibility for any side-effects of deleting this. For a blog control, this will be minimal, but overriding some of the horrible widget and Page Builder CSS will make the in-page editing ugly or unusable.</li>
<li>Nuke the Ektron CSS via JavaScript.</li>
<li>Rebuild the control without using the blog control. This may mean re-implementing functionality which is normally out-of-the-box from Ektron.</li>
</ul>
Ektron could solve this by-<br />
<ul>
<li>Improving their CSS. Mainly by removing loosely scoped selectors.</li>
<li>Add a DisableCSS property to server controls, effectively giving the developer the chance to say “Leave it Ektron, I’ll take care of the CSS for this control”.</li>
<li>The improved framework API and MVC/MVP style controls would offer viable alternatives, though there is nothing stopping Ektron injecting CSS for these controls.</li>
</ul>
<br />
We’re still weighing up our options, but it looks like we’ll rebuild the control without using the BlogEntries control. A half-hour implementation has become a four-hour implementation, and CSS that I do not want nor need has been force feed to my site visitors.spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com4tag:blogger.com,1999:blog-6375902739678881469.post-23828875488566284082011-05-23T05:57:00.001-07:002011-05-23T05:57:53.823-07:00The Case of the Cold Call AV Expert<p><strong>TL;DR</strong>- Indian scammer showed me an error in my event log, tried to get me to give him remote access.</p> <p> </p> <h2>A call out of the blue…</h2> <p>On Saturday, about noon, I got a phone call at home. Unusually, this is actually quite unusual. Only our parent’s ever call us on our home phone, and since signing up to the Do Not Call register, the telemarketers have stopped.</p> <p>After the familiar delayed “hello”, I was introduced to a polite, if somewhat quick-speaking, Indian named “Roony Takar” from the Windows Support Centre.</p> <p>Oh boy! My very first live scam attempt! My girlfriend had received a similar call a couple of months back, so I was aware of the general outline of the scam. What intrigued me was the strategy. Also, I figured the longer I took up his time, the less oportunity he had to scam others.</p> <p>Roony told me that they had detected a virus on my computer, and that my computer was infected. I expressed my horror at this, and agreed to go to my computer and turn it on. Roony asked me if it was a laptop or desktop. I replied laptop. There was no questions about version of Windows (or even if I had Windows) or brand of computer.</p> <p>I told Roony that I was pleasantly surprised by this amazing level of service from Microsoft. It appeared that he didn’t hear me…</p> <h2>Breaking News: Event Log Has Errors!</h2> <p>I was then laboriously instructed to open the event viewer (“presss window + r, type in e for echo, v for…”). I was then instructed to open the Application log and asked to scroll through and report how many yellow warnings and red errors I saw. For shame, I lied and stated that I had but 7 warnings and no errors out of 2,000 messages. I was intrigued as to their backup plan should my computer have no errors, but I was then instructed to open the System log. It is probably stretching the bounds of credulity to have no errors here, so reported that I had some errors.</p> <p>I was then instructed to open the error. I chose a benign DHCP error, and reported it’s message<sup><a href="#one">[1]</a></sup>, type (error) and category (none). I was told that my computer was infected and that software was causing DHCP server to be blocked, and that the category of none meant that my computer was broken. I asked what my DHCP server thing was, I don’t use any programs called that. I was told that it was a program inside my computer.</p> <h2>Gimme Remote Access</h2> <p>Roony then told me that as my computer was infected, I would need to have it reviewed by a Microsoft certified technician<sup><a href="#oneandahalf">[2]</a></sup>. Now I was asked if I had Windows Internet Explorer, and if so, to open it. I was then painstakingly directed to go to the website “www.logmein.com”<sup><a href="#two">[3]</a></sup>. By coincidence, my internet connection had dropped out at that time, so I was instructed to also try “www.ammyy.com”<sup><a href="#three">[4]</a></sup>.</p> <p>Upon having both these sites unavailable, I was then instructed to restart my modem.</p> <p>With the internet back up, I went to “www.logmein.com”. I noted to Roony the lack of Microsoft logos on the page. “Surely”, I said, “Microsoft would have their logo on this site?”</p> <p>I was then told the scripted disclaimer “We are PC Solutions, I am calling you from the Windows Support Centre, we are contracted to provide software maintenance”.</p> <p>“So Microsoft has contracted you?”</p> <h2>A Bridge Too Far</h2> <p>And with that, *click*, Roony had hung up. I was slightly disappointed to not obtain the log-in details that he was using for “logmein.com” in order to report it to logmein.com, but pleased to at least take up some of his time.</p> <p>Speaking with friends later, it appears I’m not the only one to have gotten one of these phone calls. Most people report that their initial thoughts were that the call came from Microsoft. Some told the scammer “I don’t have a computer” (only to be scolded “But everyone has a computer!”) or “I have an Apple”, which resulted in quick hang-up. Maybe we’ll start seeing fake Apple calls soon.</p> <h2>Reap What You Sow</h2> <p>From research, it appears that there 3 general pay-offs for these scammers, in order of increasing illegality-</p> <p>1) Use the remote admin access to install a useless “anti-virus” program, and charge you either for it or for the heavily promoted upgrade. As a product has been sold, there is little recourse for victims.</p> <p>2) Install a botnet client onto your machine, and use your computer for spam, DDOS, etc.</p> <p>3) Install a keylogger and obtain passwords in order to defraud, blackmail or steal identity.</p> <p> My guess is that the first one is their main M.O. By not directly saying that they are from Microsoft, they merely mislead rather than misrepresent, suggesting a desire to stay within the letter of the law, if not the spirit.</p> <h2>How do we stop this scam?</h2> <p>Looking at the critical points in this attempt-</p> <p><u>The phone call</u> – You could ask for their number and insist on calling back. This is good practise, but not foolproof. You should additionally google the phone number and company name, and still be wary. Ask how did you get my number? Don’t give out any additional personal information.</p> <p><u>Event log</u> – You could lock down the event log, but there are million ways a scammer could convince you that your computer had an error.</p> <p><u>Remote admin tools</u> – Again, there a million different remote access tools, with legitimate purposes. There are even open source options like VNC.</p> <p>The best means of stopping this is to make people aware of it. This scam has been mentioned a couple of times in the news, but is still not listed on <a href="http://www.scamwatch.gov.au">Scam Watch</a>. I recommend letting your friends and family know about this (especially grandparents and those more likely to be scared by shouts of “VIRUSES!!”).</p> <p> </p> <h2>And leave you with a final question…</h2> <p>Why get remote access, when you could get the user to install a virus-ridden program via the browser? </p> <p> </p> <p><u><strong>Footnotes</strong></u></p> <p><a name="one">[1]</a> “The IP address lease 192.168.1.2 for the Network Card with network address XXXXXX has been denied by the DHCP server 0.0.0.0 (The DHCP Server sent a DHCPNACK message).” I took care to spell out DHCPNACK very slowly. <p><a name="oneandahalf">[2]</a> This was the only time he mentioned “Microsoft”. I was specifically listening to see if he would misrepresent, but his script appeared to be big on implication. <p><a name="two">[3]</a> An online remote admin tool, appears legitimate and not directly associated with the scammers. <p><a name="three">[4]</a> A remote admin program, again appears legitimate and not directly associated with the scammers. spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-75345973832285615152011-04-18T02:01:00.001-07:002011-04-18T02:01:47.064-07:00Coding in non-sequential order<p>In the latest episode of <a href="http://www.talkingshopdownunder.com/2011/04/episode-51-xerxes-battiwalla-talks.html">Talking Shop Down Under</a>, Xerxes Battiwalla brings up an interesting tatic he uses when tutoring university students in computer science. Firstly, unsurprisingly, he encourages problem decomposition, walking the students through breaking the problem down into smaller parts. But he then encourages students to complete the problems in a random order.</p> <p>I like this approach for a couple of reasons-</p> <p>Firstly, it weakens the opportunity of making your various inputs/outputs/DTOs too specific. I remember my code becoming more and more interconnected and bespoke, as I resisted refactoring previous code in order to keep soldiering on.</p> <p>Secondly, it gives a leg-up to testing. If you start in the middle of a problem, with no GUI or input, then the value of unit testing becomes obvious.</p> <p>And lastly, it’s a neat piece of reference framing. It shows students that each component in a coding chain has value. It also shows that if they are unsure on one part of the problem that they can still start on a different part.</p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-79056540521104937752011-03-24T17:57:00.000-07:002011-03-24T17:57:41.328-07:00Ektron Groups-au-go-go<a href="http://twitter.com/#!/spongeboy_bw/status/50389388793872384">I asked the Ektron twitter crowd</a> - what's the difference between User Groups, Membership->User Groups and Community Groups? When to use which?<br />
<br />
The replies from <a href="http://twitter.com/#!/billcava/status/50403615046774785">@billcava</a>, <a href="http://twitter.com/#!/ajmarsland/status/50421743789158401">@ajmarsland</a> and <a href="http://twitter.com/#!/egandalf/status/50533829307404289">@gandalf</a> can be summed up in the table below.<br />
<br />
<table border="1" cellpadding="2" cellspacing="0" style="width: 580px;"><tbody>
<tr> <td valign="top" width="102"></td> <td valign="top" width="104"><strong>User Group</strong></td> <td valign="top" width="182"><strong>Membership Group</strong></td> <td valign="top" width="190"><strong>Community Group</strong></td></tr>
<tr> <td valign="top" width="102">Type of members</td> <td valign="top" width="104">CMS users <br />
(content editors)</td> <td valign="top" width="182">Membership users <br />
(site visitors)</td> <td valign="top" width="190">Both CMS users and Membership users</td></tr>
<tr> <td valign="top" width="102">Content / Folder permissions?</td> <td valign="top" width="104">Yes</td> <td valign="top" width="182">Yes</td> <td valign="top" width="190">No</td></tr>
<tr> <td valign="top" width="102">Useful for-</td> <td valign="top" width="104">Workarea authorisation</td> <td valign="top" width="182">Site authorisation</td> <td valign="top" width="190">Blogs, forums, wikis, collaboration.</td></tr>
<tr> <td valign="top" width="102">Where found in workarea</td> <td valign="top" width="104">Settings –> <br />
User Groups</td> <td valign="top" width="182">Settings –> <br />
Community Management -> Memberships –> <br />
User Groups</td> <td valign="top" width="190">Settings –> <br />
Community Management –> <br />
Community Groups</td></tr>
</tbody></table>spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-86510375342493245072011-03-09T02:32:00.001-08:002011-03-24T21:09:46.670-07:00Ektron and Webforms.MVPI am currently in the finishing stages of an Ektron project that utilised the <a href="http://webformsmvp.com/">Webforms.MVP framwork</a>. About 18 months ago, I saw <a href="http://blog.tatham.oddie.com.au/">Tatham Oddie</a> talk at a Redify Developer Day, he introduced Webforms.MVP as a project created by himself and <a href="http://damianedwards.wordpress.com/">Damian Edwards</a>, the culmination of working on several webforms projects.<br />
There have been several other attempts to integrate Webforms.MVP into other CMS’s, including <a href="http://joelabrahamsson.com/entry/introducing-epimvp-a-framework-for-using-web-forms-mvp-with-episerver-cms">EpiServer</a>, <a href="http://www.aaron-powell.com/unit-testing-with-umbraco">Umbraco</a> and <a href="http://www.aaronkjackson.com/2010/03/building-dotnetnuke-modules-using-web-forms-mvp/">DotNetNuke</a>.<br />
We work with complex HTML/JS/CSS, so one of the goals was to have maximum control over markup, traditionally a hard task with both Asp.Net and Ektron controls, whilst still being able to leverage out-of-the-box Ektron controls.<br />
<u>Advantages</u><br />
<ul><li>Testability. Views can be mocked, presenters hit, and the simple models asserted against.</li>
<li>Separation of presentation logic from business logic. The constraint of aiming to keep the code behind spare really helps to achieve simple and pleasant controls. The separation also helped conceptualise and enforce a business logic layer.</li>
<li>Ability to use mix and match any combination of MVP, Asp.Net and Ektron controls within a page.</li>
<li>Simple to use Pub/Sub messaging bus.</li>
<li>Easier to avoid <a href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx">amorphous View State blobs</a>.</li>
</ul><br />
<u>Disadvantages</u><br />
<ul><li>Documentation is a little light There is a couple of good screencasts, and the sample code is great to start with, but a little lightweight (I’m hoping to add some sample code when I get some time).</li>
<li>Development is slower, though I believe this could be mitigated by creating code templates or using a code generator.</li>
<li>Fair bit of left-hand/right-hand code, though this could be mitigated by AutoMapper and refactoring some of the view-models.</li>
<li>Medium learning curve, not a typical Webforms project.</li>
</ul><br />
With regards to testability, unfortunately, the number of tests on this project is one (and that test is nowhere near the MVP stuff). Our dev shop is, like many web forms developers, naively unaware of testing. <a href="http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code">IOC</a> is the group in charge of the Olympics, and <a href="http://martinfowler.com/articles/mocksArentStubs.html">mocking</a> is a type of song bird. Between this and the tight deadline, TDD was abandoned and unit-tests were moved into 2.0. <br />
<br />
Against all the militant cries of “<em>untested code is broken code</em>”, this was the right business decision, and it highlights a common problem faced by one striving to improve coding standards – time. The fresh effort of learning TDD practises would have made an already late project even later, and there is no requirement that you ship perfect code (this isn’t a web interface for a <a href="http://en.wikipedia.org/wiki/Therac-25">Therac-25</a>). I want to strive for quality, but need to either learn to settle for a little less, or improve efficiency. The latter takes time, so I would need to be more efficient at being more efficient. It’s turtles all the way down.<br />
<br />
The messaging system was also a revelation. It is a breeze to pub/sub objects, and makes for simple code. We went with using page presenters that would do authentication and publish a user object. Possibly not the best pattern, but a nice way to avoid setting flags etc. in complicated master pages.<br />
<br />
Probably the biggest mistake of my current project was that we only used Asp.Net and Ektron controls sparingly. This gave us wonderfully bespoke markup, but at the cost of time. For example, our hand-rolled forms meant that we couldn’t easily use server side controls, and therefore we also had to hand-roll our validation. This was also exacerbated as I wasn’t able to get the ‘convention over configuration’ quite working, so each view had to be attribute decorated (on the plus side, this made it easier to jump to the present/model via F12). Maybe some of the smaller pieces could have been done without MVP, but in some ways this is when MVP shines- I really like close-to-the-road feel of <span><%= Model.FirstName %></span>.<br />
<br />
One thing not explored was getting our frontend developers, who usually design in PHP and pure HTML, to directly update templates. The new-found simplicity of the templates makes this possible, but the increased setup time and system load for a local Ektron dev instance rules it out for now.<br />
<br />
When I first mentioned the idea of combining Ektron and Webforms.MVP on Twitter, Martin Jarvis’s <a href="http://twitter.com/#!/martincjarvis/status/7377248390750208">response</a> was “You can certainly use MVP/MVVM/MVC pattern with Ektron API as a repository. I don't know about the UI components.” This was very prescient, apart from occasional ContentBlock controls, all other markup is handmade, with API calls pulling the data. We’ll probably even remove the ContentBlocks in order to add templating functionality for the CMS user. This is partly due to the nature of the project, and partly due to a preference of using MVP over XSLT.<br />
<br />
Martin has a <a href="http://martinondotnet.blogspot.com/2010/03/working-with-ektron-using-web.html">great series of articles on using Web Application Projects with Ektron</a>, which partly inspired this look at MVP. What if we could gain some of the advantages of everyone’s new best friend MVC, whilst still stuck in the webforms world of Ektron (note- the 8.5 release on the horizon appears to offer a lot of overdue goodness which may make Ektron MVP mute. There is talk of a pre-compliable workarea and the tautological MVC controls, which hopefully are actually MVP-ish).<br />
<br />
So, for now, if I had my time over, would I do it the same? Maybe, maybe not. The schedule has gone horribly over time, but the site does look good and functions well. I am hopeful, though not necessarily confident, that future maintenance will be easier (alas, a goal that cannot be measured).<br />
<br />
<br />
Edit 11-Mar- "there is requirement" should be "there is no requirement"spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-50990091745357632011-02-28T23:55:00.001-08:002013-01-13T21:36:18.505-08:00Deploying an Ektron site via the PackageSite utilityThis process was little known to me. Rokib from Ektron support pointed me towards this.<br />
Basic method-<br />
<ol>
<li>On your UAT server, run C:\Program Files\Ektron\CMS400v80\Utilities\PackageSite\PackageSite.exe and follow the instructions</li>
<ul>
<li>When asked to provide a folder to store the package, create a new, empty folder. The package is not zipped, its a collection of folders</li>
<li>The package contains 3 folders – assetlibrary, content, setup</li>
</ul>
<li>Zip up your package and upload to your production server</li>
<li>Run the Ektron setup, but don’t setup a site. Just install the Ektron program files.</li>
<li>Unzip the package into the C:\Program Files\Ektron\CMS400v80\StarterSites</li>
<li>Run site setup and you should be able to select your site from the starter site drop down.</li>
</ol>
Some caveats-<br />
<ul>
<li>The content folder included all the .svn Subversion folders and eSync certificates. So on the plus side it didn’t miss anything.</li>
<li>Any thing you’ve added to web.config will be lost. Consider putting it into Application.config, or add it yourself.</li>
</ul>
<div>
Update 14 Jan 2013 - <a href="http://stackoverflow.com/questions/14265813/move-an-ektron-website-to-a-new-server-without-esync/14271018#comment19839759_14271018">Warning - zkent reports that the package utility has a file size limit, above which files are left out.</a></div>
spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-64726041554385039202011-01-27T20:41:00.001-08:002011-01-27T20:41:33.242-08:00Separating your code from Ektrons’<p>Similar to <a href="http://ektroneering.blogspot.com/2011/01/accessing-ektron-from-dll-or-console.html">my last post</a>, this post is about creating a DLL which will access the Ektron repository. However, this time the DLL will be included as a reference in the website. This allows you to separate out your logic code from the presentation layer.</p> <p>(Initially, I thought I would be restricted to using the Webservice API. However, as the DLL will be run within the context of the Ektron site, you are able to use the framework and controls).</p> <p> </p> <ol> <li>Add a new code project project to your Ektron site solution</li> <li>Add the following references to the code, by browsing to <em>/Path/To/Site</em>/bin-</li> <ol> <li>Ektron.Cms.Common</li> <li>Ektron.Cms.Framework</li> <li>Ektron.Cms.ObjectFactory</li></ol> <li>Add your new project as a reference to the Ektron website.</li></ol> <p> </p> <p>The advantages of this are-</p> <ul> <li>Re-usability – you can create a helper function DLL of common actions, which can be dropped into new projects</li> <li>Testability – You can write and run tests directly against your DLL using nUnit Test Runner or similar. Ektron objects won’t be available, but can be mocked.</li> <li>Reduces JIT-compilation load, though this can be mitigated by pre-compilation. However, this in turn is trumped by the fact that the Ektron workarea does not currently compile (high hopes are held for version 8.5)</li></ul> <p> </p> <p>In the end, I returned to putting all my logic code back in App_Code. The main reason was the tight deadline which was not allowing me the time to get past a couple of problems, namely-</p> <ul> <li>Permissions issue on Logic.DLL. Visual Studio was unable to automatically update the DLL in the website, and i was forced to manually delete it from the bin folder.</li> <li>Dev process is slower as Logic.DLL needs to be recompiled with every change.</li> <li>Our standard helper functions have not yet been moved to a DLL, but have been used and tested in App_Code.</li></ul> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-33422850118991256962011-01-24T18:12:00.001-08:002011-01-26T17:00:00.492-08:00Accessing Ektron from a DLL or console app<p>As part of trying to use Webforms.MVP with Ektron, I have created a DLL that contains my business logic, which is referenced by the Ektron site. However, this DLL needs to access the Ektron webservice, in order to get/update content and members.<br></p> <p>Note: wsdl and csc are part of the .Net SDK. You will need to have this installed. Once installed, you can access them via the SDK Cmd Shell, or, if your path is correctly configured, via cmd.exe.</p> <p> </p> <ol> <li>Create a proxy object for the web service <ol> <li>Run .Net tool wsdl.exe against your webservice address, e.g. http://localhost:/Workarea/webservices/ContentWS.asmx <li>Compile into DLL by running “csc /t:library ContentWS.cs”</li></ol> <li>Add the DLL as a reference to your DLL or console app <ol> <li>Copy the DLL to a Lib folder in your project <li>Right click “Add reference” and browse to your created proxy DLL.</li></ol> <li>Add System.Web.Services as a reference to your DLL or console app <li>Call the proxy DLL from the code <ol> <p><font face="Courier New">ContentWS cApi = new ContentWS();<br>ShowContentResult response = cApi.GetContentBlock(contentId);</font> </p></ol></li></ol> <p> </p> <p>That’s enough if your DLL or console app needs access. However, if, like me, you wish to have your Ektron site reference your DLL (in my case, for testability via Webforms.MVP) then you get a <a href="http://dev.ektron.com/forum.aspx?tid=34932&g=posts&t=34932">DLL conflict</a>. The next post will be on how to overcome this.</p> <p> </p> <p>References-</p> <p><a href="http://www.csharphelp.com/2006/10/consuming-a-web-service-in-c/">Great little tutorial on access web services from a console</a></p> <p><a href="http://msdn.microsoft.com/en-us/library/7h3ystb6(v=vs.71).aspx">MSDN article on Wsdl.exe</a></p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-40563574909195958262011-01-16T22:22:00.001-08:002011-01-16T23:15:38.054-08:00Improving Ektron eSync<p>For a feature with so much upside as eSync, why do I always <u>dread</u> having to use it?</p> <p> </p> <p>I mean, who wouldn’t want an easy way to push your development changes seamlessly into production? Or easily recreate the client’s bug report by pulling down all the production content? </p> <p>In order of priority, I think the following would make eSync better-</p> <ul> <li><strong>Better error messages</strong> – The errors messages are arcane. There seem to be a couple of common causes of problems - license, certificates, web service path - yet there are not standard errors for these causes.</li> <li><strong>Better tooling/support</strong> – The current tooling is sufficient, but could be much, much better. The tools should automate as much of setup process as possible, and do some simple checks of common problems.</li> <li><strong>Support for or integration with source control systems</strong> – <a href="http://dev.ektron.com/forum.aspx?g=posts&t=31500">I’ve learnt the hard way that eSync and Subversion don’t play nicely together</a>. My current method is to keep the two apart as much as possible. There is a lack of documentation on best practises with eSync and source control.</li> <li><strong>More fine-grained control</strong> – The main problem we get is with the users being synchronised. It would be able to bring across the content but keep the users. Or just eSync certain folders (there are filters, which, as mentioned above, I’ve never had much luck with). </li> <li><strong>More than just master/slave</strong> – eSync relationships are limited to two parties, and anything complicated must be modelled as a series of two party relationships. Support for many slaves to one master would be nice for a multi-developer, single UAT server environment.</li> <li><strong>Support for continuous integration</strong> – This is partly mitigated by the ability to set a schedule. It would still be nice to be able to <a href="http://dev.ektron.com/forum.aspx?g=posts&t=34796">kick off an eSync from the command line</a>.</li> <li><strong>Ability to change port used</strong> – I’m a little concerned about this, if a vulnerability is found, then attackers know exactly which port to knock on.</li></ul> <p>Lastly, no eSync blog post is complete without a link to <a href="http://martinondotnet.blogspot.com/2010/03/ektron-esync-error-servicechannel.html">Martin’s eSync Trouble Shooting Guide</a>. Whenever I have to set up eSync, this page gets opened up before I even start, and takes away just a little of that aforementioned dread.</p> <p> </p> <p>(the eSync that prompted this post went rather painlessly, with only 1 (firewall-related) error)</p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-51568985785142787022010-11-23T22:15:00.001-08:002010-11-23T22:15:50.008-08:00Product being added twice<p>I had some code to add a product to a basket like so-<br><br><font face="Courier New">Basket b = basketApi.GetDefaultBasket();<br> b.AddProduct(productId, 1);<br></font> <p>However, it was adding the product twice<br><br><font face="Courier New">result += "Count:" + b.Items.Count.ToString() + "<br />";<br> foreach (BasketItem bi in b.Items)<br> result += "Item " + bi.Id + ":" + bi.Quantity.ToString() + "<br />"; //product is listed twice</font><br> <p>My first thought was that the page was being loaded twice (due to a postback bug or something). This was not the case. <p>The offending party turned out to be Ektron. Going into the Workarea, the product was showing up twice in the catalog (with different prices, but same title and id). Merely editing the product and saving was enough to collapse the waveform and destroy the evil twin. I'm not sure how this occurred - my money would be on eSync and L10n.</p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-23276892662440808162010-11-22T20:22:00.001-08:002010-11-22T22:11:42.891-08:00Guest Checkout Failing in Ektron Checkout: Debugging the Checkout process<p>We’d added some custom logic to the Checkout process (changing order of steps, showing extra information, additional resource strings) but were getting an error with the guest checkout. The order would complete, but user was stuck with the spinning loading image thingy.</p> <p> </p> <p><strong><u>Repro steps</u></strong> <p>1. Add item to your basket and go to page with Checkout control. </p> <blockquote> <p>a. <strong>Expected and actual</strong>: User is shown initial checkout page, with “Returning customer”, “New customer” and “Guest Checkout” options. </p></blockquote> <p>2. Click Guest Checkout – “Checkout without profile”. </p> <blockquote> <p>a. <strong>Expected and actual</strong>: “loading” image appears, then user is taken to Billing details page.</p></blockquote> <p>3. Fill in details and click “Continue” </p> <blockquote> <p>a. <strong>Expected and actual</strong> – “loading” image appears , then User is taken to Payment Details page</p></blockquote> <p>4. Fill in payment details - "Visa", "4444333322221111", "999", "12", "2019" - and click process payment </p> <blockquote> <p>a. <strong>Expected</strong>: loading image appears, then user is taken to order completed page, completed order is listed in Workarea</p></blockquote> <blockquote> <p>b. <strong>Actual</strong>: loading image appears. User is stuck with loading image. Completed order is listed in Workarea.</p></blockquote> <p><u><strong>Network Responses (from Firebug)</strong></u></p> <table border="1" cellspacing="0" cellpadding="2" width="575"> <tbody> <tr> <td valign="top" width="58"><strong>Working</strong></td> <td valign="top" width="515"> <p>0|EKTRON_PACKET_START|1|0|268|#EktronCheckout_Checkout1 <p>0|.EktronCheckout_WizardMode|1|<div class="EktronCheckout_OrderComplete <p>0|EktronCheckout_ProcBlock"><h3>Order Complete</h3><p><b>Thank <p>0|You!</b></p><p><b>Order ID<span <p>0|class="spacingContainer"></span>10034</b></p><p>Your order has been <p>0|approved, you will receive a confirmation email shortly.</p></div></p></td></tr> <tr> <td valign="top" width="58"><strong>Broken</strong></td> <td valign="top" width="515"> <p>0|EKTRON_PACKET_START|1|0|0|#EktronCheckout_Checkout1 <p>0|.EktronCheckout_WizardMode|1|</p></td></tr></tbody></table> <p> </p> <p>The standard control was working, and the problem was narrowed down to the handler for the PreProcessXml event. The offending line is -</p> <p><font face="Courier New">if (<em><strong>Checkout1.CurrentPhase</strong></em> == Checkout.ControlPhase.SubmitOrder)</font></p> <p>This was being used to conditionally alter the XML depending on the phase. The Checkout1.CurrentPhase code is what is causing the problem.</p> <p> </p> <p>I was also intermittently getting the following build error-</p> <p><font face="Courier New">'Checkout' does not contain a definition for 'ControlPhase'</font></p> <p>which seems to be due to an ambiguous class reference that the compiler/intellisense is missing. This was fixed by cleaning up the “using” statements.</p> <p> </p> <p>I tried using the full namespace of Ektron.Cms.Controls.Checkout.ControlPhase, however, the Guest Checkout still did not work. </p> <p>I should be able to get the current phase some other way – possibly via the event args. But for now, I am avoiding the phase checking in the PreProcessXml event handler.</p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-69673978019617713122010-11-18T16:00:00.001-08:002011-02-13T21:45:48.925-08:00Ektron License Modifiers<p>There doesn’t seem to be a list of these around anywhere. Makes it a bit easier than trying to remember if E is Enterprise or eCommerce….</p> <p> </p> <table border="1" cellspacing="0" cellpadding="2" width="528"> <tbody> <tr> <td valign="top" width="97">XML</td> <td valign="top" width="429"><a href="http://dev.ektron.com/kb_article.aspx?id=593">eWebEditPro+XML</a> (addition of XML editing on content editor?)</td></tr> <tr> <td valign="top" width="101">PR</td> <td valign="top" width="429">Professional</td></tr> <tr> <td valign="top" width="105">EN</td> <td valign="top" width="429">Enterprise</td></tr> <tr> <td valign="top" width="108">E</td> <td valign="top" width="429">eCommerce</td></tr> <tr> <td valign="top" width="110">Users-<em>n</em></td> <td valign="top" width="429">Licensed for <em>n</em> number of users</td></tr> <tr> <td valign="top" width="112">flash</td> <td valign="top" width="429"> </td></tr> <tr> <td valign="top" width="112">exp-YYYY-MM-DD</td> <td valign="top" width="429">Expiry date of the license</td></tr> <tr> <td valign="top" width="112">-<em>n</em> at tail of license</td> <td valign="top" width="429">Major version number licensed for, i.e. –8 is for version > 8, –7 for 7 >= version > 8</td></tr></tbody></table> <p> </p> <p>Reference:</p> <p><a href="http://www.nimbleuser.com/blogs/Knowledge_Base/knowledge_base/Ektron_Licensing_101.aspx">http://www.nimbleuser.com/blogs/Knowledge_Base/knowledge_base/Ektron_Licensing_101.aspx</a></p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-26069012208492286002010-11-09T18:02:00.001-08:002010-11-09T18:02:38.741-08:00Setting a Homepage<p>The order of precedence for setting the default page (i.e. where does www.example.com point you to?) is-</p> <ol> <li>URL aliasing <li>Web config - Key <font face="Courier New">ek_DefaultPage</font> <li><strike>IIS default document</strike></li></ol><br>Notes- <ul> <li>You can't use an alias in <font face="Courier New">ek_DefaultPage</font> <li>You can’t use URL parameters with <font face="Courier New">ek_DefaultPage</font> so general Page Layouts are not supported unless you <a href="http://dev.ektron.com/forum.aspx?g=posts&t=28201">set the default content</a>. <li>You can't setup the homepage via Manual Aliasing - it requires text to be entered into the alias field (though it may only be JS validation… but that’s another story) <li>You <u>CAN</u> use regex aliasing- set Expression to "<font face="Courier New">^$</font>" (minus the quotes, this matches an empty string)</li> <li>Ektron grabs the request before IIS has a chance to resolve it, so the IIS default document setting is useless.</li></ul> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-25725872493927235562010-11-07T23:29:00.001-08:002010-11-07T23:40:14.431-08:00Setting Locale via URL – good or bad?<p>One of the lessons of web development is “use GET to retrieve, POST to modify”. Using GET to delete data can lead to <a href="http://thedailywtf.com/Articles/WellIntentioned-Destruction.aspx">being attacked by <strike>vicious black-hat hackers</strike> web crawlers</a>. There are some <a href="http://stackoverflow.com/questions/46585/when-do-you-use-post-and-when-do-you-use-get">solid explanations on StackOverflow</a>, summarized as <a href="http://stackoverflow.com/questions/340704/get-vs-post-in-html-forms/340732#340732">“Use POST to modify data. Use GET to receive data.”</a></p> <p>However, what isn’t really covered, is changing state on the client side. Ektron sets the client locale via URL. Once the new locale is set, nothing is changed on the server – no bits written to disk, no memory changed. The client’s cookie, however, is updated with the new locale and the web server serves up different content now and the user’s experience completely changes, especially if the new locale is not supported.</p> <p>For example, Ektron’s new site in mono-lingual, restricted to en-US (id=1033). However, if you browse to <a href="http://www.ektron.com/?LangType=3081">http://www.ektron.com/?LangType=3081</a> (en-AU = 3081), you will see an error, as the Ektron site does not have any Australian content.</p> <p>This is sort of expected – I’ve asked for an Australian homepage and there is none. (Ideally, your en-AU locale would degrade to a generic en locale, then optionally degrade to a specified default language. Ektron supports neither of these). Where the problem arises is in the relationship between locale and URL/aliasing in Ektron. Now, with your locale set to en-AU, most of the site will be broken. One of the goals (and strengths) of URLs is universality, that links are perpectual. If I tattoo my forehead with <a href="http://www.example.com/EatAtJoes">www.example.com/EatAtJoes</a> , it is entirely within my power as to whether that URL lives or dies (notwithstanding domain name hosting fees, DNS poisioning)</p> <p>So I guess I don’t like the idea of losing control over how my site visitors experience my site. What if one of Ektron’s competitors sent out a newsletter with an obfuscated link like <br><a href="http://www.ektron.com/?AdvancesInIntranets=true&LangType=3081&ImportantWhitepaper=AmazingInsights">www.ektron.com/?AdvancesInIntranets=true&LangType=3081&ImportantWhitepaper=AmazingInsights</a> . <br>“Oh 404, no worries, I’ll find the article from the homepage. Wait, the homepage doesn’t work either?”</p> <p> </p> <p>What are your thoughts on setting locale via GET URL? Personally, I think Ektron should-</p> <ul> <li>Require confirmation to change locale <li>Locale change should be via POST at very least <li>Provide better aliasing support for multilingual sites, such as- <ul> <li>allowing for a locale specifier in the URL, e.g. en.example.com or <a href="http://www.example.com/en">www.example.com/en</a> <li>Show foreign language content for valid URLs in a different language, e.g. if your locale is en-US, www.example.com/Bonjour.aspx should show same or translated content as www.example.com/Hello.aspx .</li></ul> <li>Provide better multilingual support in general, such as- <ul> <li>allow proper language degradation <li>allow generic language content</li></ul></li></ul> <p> </p> <p>What you can do to stop this-</p> <ul> <li>Especially if you’re using a single language, set the locale back to the default on every request. <li>Customise the 404 error page to change the locale back to the default (if it isn’t already) and resubmit the request (watch out for cyclic requests).</li></ul> <p> </p> <p><u>Antidote</u>: If you’ve clicked on any of the links above and wish to get your Ektron site experience back to normal, just browse to <a href="http://www.ektron.com/?LangType=1033">http://www.ektron.com/?LangType=1033</a></p> <p> </p> <p><strong><u>Repro steps</u></strong>-</p> <ol> <li>Browse to <a href="http://www.ektron.com/News-And-Events/">http://www.ektron.com/News-And-Events/</a> and confirm that it works. <li>Browse to <a href="http://www.ektron.com/?LangType=3081">http://www.ektron.com/?LangType=3081</a> , which gives a 404, but sets your locale to en-AU <li>Once again, browse to <a href="http://www.ektron.com/News-And-Events/">http://www.ektron.com/News-And-Events/</a> which now gives you a 404 <li>The majority of the Ektron site is now broken, until either clear your site cookie or browse to <a href="http://www.ektron.com/?LangType=1033">http://www.ektron.com/?LangType=1033</a></li></ol> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-52140962265473096562010-11-01T19:16:00.001-07:002010-11-01T19:16:14.841-07:00Twitter wars over Amplicate and Kentico Trolling<p>The #Ektron tag has been a bit fiery of late.</p> <p> </p> <p>Firstly, this exchange between @robbins and </p> <blockquote> <p><a href="http://twitter.com/trobbins">trobbins</a>: Get started with <a href="http://search.twitter.com/search?q=%23Kentico">#Kentico</a> <a href="http://search.twitter.com/search?q=%23CMS">#CMS</a> webinar - <a href="http://bit.ly/cBJG3R">http://bit.ly/cBJG3R</a> (<a href="http://search.twitter.com/search?max_id=29420778183&page=3&q=%23Ektron#">expand</a>)<a href="http://search.twitter.com/search?q=%23marketing">#marketing</a> <a href="http://search.twitter.com/search?q=%23web">#web</a> <a href="http://search.twitter.com/search?q=%23ektron"><b>#ektron</b></a> <a href="http://search.twitter.com/search?q=%23sitecore">#sitecore</a></p> <p><a href="http://twitter.com/ektrondave">ektrondave</a>: Hey @<a href="http://twitter.com/trobbins">trobbins</a>, Do you really get leads from calling out superior competitors in your Tweets? Just wondering. <a href="http://twitter.com/search?q=%23kentico">#kentico</a> <a href="http://twitter.com/search?q=%23Lame">#Lame</a></p> <p><a href="http://twitter.com/trobbins">trobbins</a>: <a href="http://twitter.com/ektrondave">@ektrondave</a> We get lots of leads from direct conversations. Lame products are an easy target. <a href="http://search.twitter.com/search?q=%23Ektron"><b>#Ektron</b></a> <a href="http://search.twitter.com/search?q=%23Fail">#Fail</a></p> <p><a href="http://twitter.com/trobbins">trobbins</a>: <a href="http://twitter.com/ektrondave">@ektrondave</a> if you believe your products better - how about a CMS bakeoff to see? <a href="http://search.twitter.com/search?q=%23Kentico">#Kentico</a> <a href="http://search.twitter.com/search?q=%23Ektron"><b>#Ektron</b></a> Better than sniping</p> <p><a href="http://twitter.com/trobbins">trobbins</a>: <a href="http://twitter.com/ektrondave">@ektrondave</a> We can if you want. I would be willing to pay for a hotel I know your budget is probably tight <a href="http://search.twitter.com/search?q=%23Kentico">#Kentico</a> <a href="http://search.twitter.com/search?q=%23Ektron"><b>#Ektron</b></a></p> <p><a href="http://twitter.com/twentworth12">twentworth12</a>: <a href="http://twitter.com/trobbins">@trobbins</a> Since you tag <a href="http://search.twitter.com/search?q=%23ektron"><b>#ektron</b></a> so often, I figured you might want some of these <a href="http://bit.ly/9aAlLF">http://bit.ly/9aAlLF</a> (<a href="http://search.twitter.com/search?max_id=29420778183&page=2&q=%23Ektron#">expand</a>) ;) cc <a href="http://twitter.com/ektrondave">@ektrondave</a> <a href="http://twitter.com/DaBigCheeze">@DaBigCheeze</a></p> <p><a href="http://twitter.com/ektrondave">ektrondave</a>: @<a href="http://twitter.com/trobbins">trobbins</a> Can we hold that bakeoff at your US HQ in Nashua, NH?</p></blockquote> <p>Just a bit of a friendly marketing war. Seems that Ektron are a bit thin-skinned here – I guess there are some interesting marketing dynamics at play.</p> <p> </p> <p>Secondly, some two and fro about Amplicate</p> <blockquote> <p><a href="http://twitter.com/DaBigCheeze">DaBigCheeze</a>: I think I just stood up for Ektron - <a href="http://bit.ly/9ITpf0">http://bit.ly/9ITpf0</a> (<a href="http://search.twitter.com/search?q=%23Ektron#">expand</a>) - Search for my post. "DaBigCheeze" or "E-Cubed" <a href="http://search.twitter.com/search?q=%23Ektron"><b>#Ektron</b></a> <a href="http://search.twitter.com/search?q=%23CMS">#CMS</a></p> <p><a href="http://twitter.com/serversideinc">serversideinc</a>: <a href="http://twitter.com/DaBigCheeze">@DaBigCheeze</a> You should stand up for Ektron and against people who create bogus twitter accounts just to bash Ektron on Amplicate. <a href="http://search.twitter.com/search?q=%23ektron"><b>#ektron</b></a></p> <p><a href="http://twitter.com/DaBigCheeze">DaBigCheeze</a>: <a href="http://twitter.com/serversideinc">@serversideinc</a> I don't doubt there are frauds but there is enough bad blood already to justify the overall sentiment. I have talked to many.</p> <p><a href="http://twitter.com/serversideinc">serversideinc</a>: <a href="http://twitter.com/DaBigCheeze">@DaBigCheeze</a> You should stand up for Ektron and against people who create bogus twitter accounts just to bash Ektron on Amplicate.<a href="http://search.twitter.com/search?q=%23ektron">#ektron</a></p> <p><a href="http://twitter.com/serversideinc">serversideinc</a>: <a href="http://twitter.com/DaBigCheeze">@DaBigCheeze</a> Case in point? <a href="http://bit.ly/b5TO7B">http://bit.ly/b5TO7B</a> (<a href="http://search.twitter.com/search?q=%23Ektron#">expand</a>)<a href="http://search.twitter.com/search?q=%23ektron">#ektron</a> <a href="http://search.twitter.com/search?q=%23kentico">#kentico</a></p></blockquote> <p>Some more thin-skins. Instead of “fraud”, how about considering that Ektron has a steep learning curve?</p> <p> </p> <p>What annoys me about these exchanges is that they are fiddling like Nero. Meanwhile, the Ektron forums are overflowing with unanswered questions and the developer community is stagnating. But I guess marketing is more important.</p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-76242009441385509152010-11-01T18:46:00.001-07:002010-11-01T18:46:01.678-07:00Adding Elmah to Ektron<p><a href="http://code.google.com/p/elmah/">Elmah</a> is a great tool to log unhandled exceptions. It’s main advantage is that it is lightweight – you can easily add it to an existing site (and if you’re using <a href="http://nuget.codeplex.com/">NuGet</a>, it’s even easier). Setup is as per the instructions from the <a href="http://code.google.com/p/elmah/wiki/DotNetSlackersArticle">Dot Net Slackers article</a>, however there are a few Ektron specific things to watch out for-</p> <ul> <li>System.websServer –> handlers - Make sure you put the Elmah entry above the wildcard *.axd entries. If you get a 404, try putting this entry just after the <clear /> at the top of the handlers.</li> <li>Securing the log – At this stage I’m just setting allowRemoteAccess to zero (false). I tried changing the path to workarea/elmah.axd to try and limit access to being logged in, but the authorization is happening within Ektron, not at the web server level.</li></ul> <p> </p> <p>Next things to look at are locking it down to allow secure remote viewing and using the database to store the log. I also want to investigate the inbuilt EkDiagnostics and see if Elmah can compliment it.</p> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-90709947707050878102010-10-28T20:26:00.001-07:002010-11-01T16:42:44.270-07:00Payment Gateway Providers in Ektron<p>I’ve found the Ektron documentation around Payment Gateways to be somewhat lacking. Below is what I have ascertained about the various options. I’ll update this as more info comes to hand.</p> <p> </p> <p>Some general notes-</p> <ul> <li>Use Reflector to have a look at the code inside <strong>Ektron.Cms.Commerce.Providers.Payment</strong>. <li>The PayPal/PayFlow/Web Site Payments Pro options are confusing. <a href="http://dev.ektron.com/forum.aspx?tid=32529&g=posts&t=32529">I am still unsure which products are supported by Ektron.</a> <li>“<a href="http://documentation.ektron.com/cms400/v802/webhelp/eCommerce/eCommerce%20payment%20options.htm">The manual gateway accepts all credit cards. In this case, the merchant emails the credit card information to the credit card company</a>.” However, in our test site it appears that payments are approved without manual intervention. <li>It is annoying that the “Custom Values” fields are not labelled. <li>Only the default gateway is used by the checkout process. Additional gateways are unused until they are made the default. <li>Test mode can be enabled by adding the following key to web.config-<br><font face="Courier New"><add key="ek_ecom_TestMode" value="true" /></font></li></ul> <p> </p> <p><u><strong>Feature/Option Matrix</strong></u></p> <table border="1" cellspacing="0" cellpadding="0" width="549"> <tbody> <tr> <td width="191"> </td> <td width="68"><a href="https://cms.paypal.com/us/cgi-bin/?&cmd=_render-content&content_ID=developer/howto_gateway_payflowpro">Payflow</a></td> <td width="99"><a href="http://developer.authorize.net/">Authorize.Net</a></td> <td width="117"><a href="http://www.sagepay.com/">SagePay</a></td> <td width="72"><a href="https://cms.paypal.com/us/cgi-bin/?&cmd=_render-content&content_ID=developer/howto_gateway_payflow_wpp">PayFlow Web Site Payments Pro</a></td></tr> <tr> <td width="191"> </td> <td width="68"> </td> <td width="99"> </td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191">Username</td> <td width="68">Email Address</td> <td width="99">API Login ID</td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191">Password</td> <td width="68">Password</td> <td width="99">Transaction Key</td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191"> </td> <td width="68"> </td> <td width="99"> </td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191">Custom 1</td> <td width="68">VendorId</td> <td width="99">Not used</td> <td width="117">Not used</td> <td width="72">??</td></tr> <tr> <td width="191">Custom 2</td> <td width="68">PartnerId</td> <td width="99">Not used</td> <td width="117">Not used</td> <td width="72">??</td></tr> <tr> <td width="191"> </td> <td width="68"> </td> <td width="99"> </td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191">Supports subscriptions</td> <td width="68">Yes - Recurring Billing Service</td> <td width="99">Yes - Automated Recurring Billing</td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191">Supports subscriptions in Ektron <font size="1">(AuthorizeRecurringPayment function in Provider code)</font></td> <td width="68">Yes</td> <td width="99">Yes</td> <td width="117">No</td> <td width="72">No</td></tr> <tr> <td width="191"> </td> <td width="68"> </td> <td width="99"> </td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191">Based in</td> <td width="68">US</td> <td width="99">US</td> <td width="117">UK/Ireland</td> <td width="72">US</td></tr> <tr> <td width="191"> </td> <td width="68"> </td> <td width="99"> </td> <td width="117"> </td> <td width="72"> </td></tr> <tr> <td width="191">Test gateway available</td> <td width="68">Yes</td> <td width="99">Yes</td> <td width="117">Yes, both Simulator (no account needed) and Test</td> <td width="72">Yes</td></tr> <tr> <td width="191">Test gateway integrated into Ektron</td> <td width="68"><a href="http://dev.ektron.com/forum.aspx?g=posts&t=33138">No</a></td> <td width="99"><a href="http://dev.ektron.com/forum.aspx?g=posts&t=33656">Maybe (This post refers to TestMode in web.config)</a></td> <td width="117">Maybe ("SimulatorMode" in web.config)</td> <td width="72">??</td></tr></tbody></table> <p> </p> <p><strong><u>Web.Config Values</u></strong></p> <table border="1" cellspacing="0" cellpadding="0" width="550"> <tbody> <tr> <td width="149"> </td> <td width="153">Description</td> <td width="136">Data type</td> <td width="110">Example</td></tr> <tr> <td width="149">SagePay</td> <td width="153"> </td> <td width="136"> </td> <td width="110"> </td></tr> <tr> <td width="149">SagePayVersion</td> <td width="153"> </td> <td width="136"> </td> <td width="110">"2.23"</td></tr> <tr> <td width="149">Simulator Mode</td> <td width="153"> </td> <td width="136">Boolean</td> <td width="110">"false"</td></tr> <tr> <td width="149">Description</td> <td width="153"> </td> <td width="136">String</td> <td width="110">"Ekron CMS Order"</td></tr> <tr> <td width="149"> </td> <td width="153"> </td> <td width="136"> </td> <td width="110"> </td></tr> <tr> <td width="149"> </td> <td width="153"> </td> <td width="136"> </td> <td width="110"> </td></tr> <tr> <td width="149">Authorize.Net</td> <td width="153"> </td> <td width="136"> </td> <td width="110"> </td></tr> <tr> <td width="149">TestMode</td> <td width="153"><a href="http://dev.ektron.com/forum.aspx?g=posts&t=33656">??</a></td> <td width="136"> </td> <td width="110"> </td></tr> <tr> <td width="149"> </td> <td width="153"> </td> <td width="136"> </td> <td width="110"> </td></tr> <tr> <td width="149"> </td> <td width="153"> </td> <td width="136"> </td> <td width="110"> </td></tr> <tr> <td width="149">Payflow</td> <td width="164"> </td> <td width="177"> </td> <td width="167"> </td></tr></tbody></table> spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0tag:blogger.com,1999:blog-6375902739678881469.post-4182246099079033202010-10-25T17:42:00.000-07:002010-10-25T22:35:24.182-07:00List Price vs Sale PriceIn Ektron's eCommerce functionality, products can have either a "List Price" or a "Sale Price". I was looking into how to create a product that was not on sale, but the WorkArea would not let me put <i><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">null</span></i> for "Sale Price", instead defaulting it to zero dollars, and making the product free.<br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
I was approaching this from the wrong way - the "Sale Price" is the regular price, and the "List Price" is sort of a anti-sale price, used for display purposes only.<br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<a href="http://www.ektron.com/manuals/cms400/v801/webhelp/eCommerce/eCommerce%20product%20types.htm"><span class="Apple-style-span" style="font-family: inherit;">Ektron's documentation says</span></a><span class="Apple-style-span" style="font-family: inherit;"> -</span><br />
<i><span class="Apple-style-span" style="font-family: inherit;">"</span></i><span class="Apple-style-span" style="border-collapse: collapse; line-height: 13px;"><i><span class="Apple-style-span" style="font-family: inherit;">The list price appears on most eCommerce controls (see examples below) but is</span></i></span><span class="Apple-style-span" style="border-collapse: collapse; line-height: 13px;"><i><span class="Apple-style-span" style="font-family: inherit;"> </span></i></span><span class="Apple-style-span" style="border-collapse: collapse; line-height: 13px;"><span class="Emphasis"><i><span class="Apple-style-span" style="font-family: inherit;">not</span></i></span></span><span class="Apple-style-span" style="border-collapse: collapse; line-height: 13px;"><i><span class="Apple-style-span" style="font-family: inherit;"> </span></i></span><span class="Apple-style-span" style="border-collapse: collapse; line-height: 13px;"><i><span class="Apple-style-span" style="font-family: inherit;">used in any calculations."</span></i></span>spongeboyhttp://www.blogger.com/profile/03458251726124629580noreply@blogger.com0