www.netsi.dk

"The internet is just a layer on the real world" (don't forget that!)

Blog indlæg om opdateret nyhedsmodul i Dynamicweb 8

version 8 er blevet releaset i december 2011 og det indeholder en række forbedringer,
for eksempel er nyhedsmodulet blevet opgraderet. Peter Terkildsen har skrevet et blog indlæg på blog.bleau.dk om det opgraderede i Dynamicweb 8.

Læs blandt andet om:

  • Søgning i nyheder på tværs af alle nyhedskategorier
  • Søgemaskinevenlige URL’er når man ser en enkelt nyhed
  • Nyheder kan indgå i flere kategorier

Læs hele blog indlæget her: http://blog.bleau.dk/2011/nye-muligheder-i-nyhedsmodulet-i-dynamicweb-8/

Share

SQL: Get a list of all tables in a database

Sometimes if you use a system where you do not have a Manager at hand, perhaps only a web based query window you may find it hard to keep track of all defined tables in the system. I for one cannot remember all the tables used in for instance Dynamicweb CMS. Please note that the example query below is for Microsoft SQL server, I am not sure if it works in other SQL server environments.

Being logged in to the system as administrator you can get a SQL Query textarea like this one below. You can then enter:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
order by TABLE_NAME

 

The Query Editor of Dynamicweb CMS - very handy

Links

Share

Dynamicweb CMS: Poll about errors in Dynamicweb…

I am prepearing myself for the upcoming blog with focus on features related to the system and its part. For a starter I will try out some things for now, here on this blog. Here is one such test – a Poll. Feel free to try it out, and if you have any ideas what should be on the www.dwfeatures.com blog, please feel free to write it here, or give me a peep on twitter: http://twitter.com/netsi1964

Share

The getimage.aspx of Dynamicweb CMS finally can crop as I always wanted it to!

Being a heavy user of Dynamicweb CMS I am very happy to discover that the latest version of the software has made the utility for cropping/scaling images work as I (IMHO) always have wished it to do! It is now possibel to specify both with and height and having the image fit inside the area keeping the aspect ratio of the image! Hurra!

You do know , right?

When you have a design to implement using Dynamicweb CMS and you have a list of items with images – say thumb images, Dynamicweb offers a nice utility which can ensure that the thumbs will have a given dimension. The images are cached on the server, so it is not using unnessesary resources of the server if you use the utility.

The getimage.aspx utility of Dynamicweb CMS

The utility can be found on any Dynamicweb soloution here:

http://[hostname]/Admin/Public/getImage.aspx

Enter the URL above and you will get a nice wizard which will dynamically produce what you need inside your . You can see the wizard above.

What makes things work for my needs!

To ensure that an image fits inside a container with known dimentions you need to:

  • Enter the dimensions (width/height)
  • Select the cropping offset: “Keep aspect ratio”

Try the utility by entering a path to an image – you have to start from “/files…”. When that is done, simply press OK and you will get a preview under the “Results” tab, as you can see below.

The Results tab of the getimage.aspx Dynamicweb utility

Using the Image URL in your templates

When you are happy with the results you should copy the “Image URL” path (highlighed with blue in the above image). The URL for my example is:

/admin/public/getimage.aspx?Image=/files/billeder/300×80.jpg&Format=jpg&Width=200&Height=100&Crop=5

If I were to use this path inside a template, I simply would replace the “/files/billeder/300×80.jpg” with a template tag like “<!--@Ecom:Product.ImageLarge.Clean—->”.

I hope this has helped you! I really find this improvement nice!

links

 

Share

“Hvem skal nu betale?”

Jeg arbejder professionelt med implementering af baserede hjemmesider. Det system jeg arbejder klart mest i er Dynamicweb CMS – et system som efter sigende har omkring 4000 fungerende (et korrekt ord?) hjemmesider i hele verden – primært i norden. Som andre systemer så kommer der jævnligt opdateringer – det er jo dejligt med nye up-to-date funktionalitet. Så langt så godt – men jeg vil gerne prøve at sammenligne kort med en anden branche.

Min Toyota kontra CMS

Jeg er den lykkelige ejer af en Toyota. Tidligere ejede jeg en Yaris og da den var ca. 2 år gammel modtog jeg et brev om at man havde konstateret at der kunne opstå et problem med bremserne under visse ekstreme omstændigheder. Jeg skulle bare køre ind til et selvvalgt Toyota værksted og de ville rette fejlen uden beregning. Hverken mig eller værkstedet ville blive lastet for noget i den forbindelse. Det er service!

Og nu til Dynamicweb CMS… Jeg oplever jævnligt at der opdages fejl som opstår på grund af fejl i Dynamicweb CMS. Jeg arbejder jo som sagt professionelt hos en Dynamicweb CMS Partner (Bleau A/S) og det er nok noget der i ovenstående situation med Toyota må være at betragte som at arbejde på et “autoriseret Dynamicweb værksted”. Selv om Dynamicweb CMS også selv finder fejl og retter dem uden beregning gennem hot-fixes, så er situationen fra før med fejlen på bilen i en Dynamicweb CMS verden normalt noget anderledes:

  1. Brugeren (chaufføren) oplever at noget ikke fungerer i hans “bil” (hans hjemme side)
  2. Han kontakter værkstedet
  3. Værkstedet må bruge megen tid på at fejlfinde og bevise overfor Dynamicweb CMS support at fejlen er noget der ligger i selve Dynamicweb
  4. Dynamicweb CMS anerkender måske at der er en fejl, men det medfører ikke at fejlen rettes. Fejl prioriteres naturligvis af Dynamicweb CMS.
  5. Brugeren må så acceptere at der ikke kommer en løsning “sådan lige”

Som professionel konsulent er det svært

  • At forklare overfor kunden at det er kundens problem.
  • At kunden vil blive faktureret den tid som vi har brugt på at finde fejl i det system vi har anbefalet dem.
  • At problemet ikke umiddelbart er blevet løst.
  • At en løsning vil koste yderligere tid (=penge).
  • At løsningen ikke nødvendigvis giver en forbedring.

Intet er fejlfrit! – men hvem skal nu betale?

Der er mange elementer i ovenstående sammenligning der kan anfægtes og en sammenligning mellem en bil og et CMS system er måske unfair. Det som jeg her forsøger at starte en diskussion om og brokker mig over er at det ikke er rimeligt at kunderne alene skal betale for noget som kan påvises er fejl i det produkt de har købt.

  • Jeg ville personligt aldrig betale for reperationen hvis min fladskærm holdte op med at virke indenfor garentiperioden! Det måtte producenten betale for (gennem forhandleren).
  • Jeg mener at det er i alles interesse at fejl rettes, så produktet bliver bedre.

Jeg har ikke en færdig model for hvordan man kunne løse problemet med at få dækket omkostninger ved fejl. Der er tre parter som burde dele omkostningen – brugerne, forhandlerne (partnerne) og Dynamicweb CMS. Idag er det kun de to første der betaler! Jeg tror på sigt at hverken brugere eller forhandlere kan leve med den model!

P.s: Ovenstående står for min egen personlige regning.

Share

Ensure that news items in Dynamicweb CMS are rendered correct

In when you click to a detail view of a item you will by default get a parameter “M=” or “M=NewsV2” depending on the Module version. That parameter will make your details view render incorrect. You can fix it in your template, but if you use the RSS feed of items, you cannot do that.

The javascript below will fix that problem by redirecting the page to an URL without those two parameters. It is a simple javascript, just insert it into the HEAD section.

<script type="text/javascript">

// Dynamicweb CMS fix: Make sure that details view of news item is rendered correct

// Insert in Master page in HEAD section

// Will redirect to same URL but with any "M=News/M=NewsV2" removed

// 2010-06-29: Sten Hougaard, Bleau A/S

var loc = document.location+'';

var newLoc = loc.replace('&M=NewsV2', '').replace('&M=News', '');

if (loc!=newLoc) {

 document.location = newLoc;

}

</script>
Share

Kommentarer til Dynamicweb 7.1 technical realease notes

Jeg var så uheldig at blive forhindret i at deltage i præsentationen af 7.1, men heldigvis har jeg jo # som en search kolonne i min Adobe Air baserede Twitter klient: “TweetDeck” – der kan jeg jo følge med og har da læst mange spændende kommentarer.

Jeg har så valgt at kigge på den dokumentation som man kan finde på “Dynamicweb engage”. Der er flere dokumenter som hver i sær fortæller om ændringer. Jeg vil her gennemgå dem jeg har kigget på.

Bug fixes included in Dynamicweb 7.1

Jeg fandt 49 (dokumenterede) bug fixes, og de fordeler sig jævnt over både Dynamicweb og Dynamicweb . Hvis man har prøvet at indrapportere en case som så er blevet anerkendt som en bug, så vil man faktisk modtage en e-mail i forbindelse med at disse bugs er blevet rettet – så det er lidt ligesom at få skatteopgørelsen fra skat hver år! Har du fået en e-mail er du heldig – din bug er blevet fixet… Har du ikke, nå, du må vente lidt på en hot-fix eller næste release… :-)

Jeg så ikke så mange improvements i denne liste – men det har sin naturlige forklaring – forbedringere har fået sine helt egne dokumenter! Dynamicweb 7.1 er jo en stor forbedring af Dynamicweb CMS og eCommerce.

Technical release notes, Dynamicweb 7.1

Jeg går lige i kødet på det jeg har kunne læse mig frem til i denne PDF fil.

2.1.2 Global tags section in navigation XML

Dette er jo bestemt en relevant og god ting når man skal lave navigation på et website, at man har adgang til de globale information der ligger i global tags. At det skulle være noget nyt for Dynamicweb 7.1 – hmm… det er jeg nu ikke så sikker på :-) I de løsninger som kører på 7.0xx er der allerede dette tilgængeligt. Se her – et screenshoot af en del af den XML som er tilgængeligt på Bleau’s hjemmeside:

et screenshoot af en del af den XML som er tilgængeligt på Bleau’s hjemmeside

Men – fedt er det at man har det tilgængeligt i XML’en! Ingen tvivl om det :-) Faktisk tror jeg at en de nævnte forbedringer allerede er blevet frigivet inden 7.1.

2.1.3 Support for relative xsl:import

Min kære kollega Morten Bengtson (Twitter: http://twitter.com/mbengtson) blev takket i forbindelse med denne forbedring. Jeg synes også at det er på sin plads i den forbindelse lige at takke den anden vej: Tak DW for at I lytter når I får velbeskrevne forbedrings ønsker ind!

Inden man kunne anvende relative stier i XSL:import var det praktisk talt urealistisk at lave seriøs anvendelse af biblioteker og delt data på tværs af . Det er nu realtistisk at have XSLT og XML data liggende i biblioteker som man så flere steder kan tilgå i sine . Endnu et argument for at anvende XSLT .

2.1.4 Limiting loops in XSLT

Jeg har tidligere stødt på denne “forbedring”. Lige pludselig var der nogle data i loops der lå “langt nede” i eCommerces relative dybe loop-struktur som var ikke eksisterende. Det er så når man fra Dynamicwebs side har ment at det kunne være smart at man kunne begrænse hvilke loops der blev gennemløbet gennem denne “forbedring”. Men den ryger i kategorien:

Man begår kun fejlen – ikke at forholde sig til hvilke loops der skal med – een gang! :-)

I toppen af din XSLT skal du bare huske at fortælle DW hvilke loops du vil have med ud:

<xsl:variable name="availableloops" select="'Groups,Products'" />

Men det skal lige nævnes at DW siger at hvis man har fulgt deres anbefalinger om at matche således loop[@name='aLoopName'] så er den hellige grav velforvaret. Åh, og så kan du iøvrigt også være doven og skrive “*” i den variabel “avilableloops” – så får du bare ikke performance forbedring.

2.3.2 Search page

Okay, man har nu tilføjet endnu en templatetag som kan anvendes så man ikke skal hardcode ID’er ind til den side hvor man nu har sit søgeresultat….

<!--@DwAreaSearchPageID-->

Jeg må sige at jo – det kan da være en god ting og er endnu et patch/quick help-fix som gør det nemmere for…? Frontendere? Kunder? Øh… jeg er i tvivl.

Taggets værdi baseres på noget som jeg mener er relativt gaffatape-agtigt:

..It is now possible to retrieve the first created search page in the current area by using this

new template tag.

  1. Så må jeg jo passe på at jeg ikke indsætter searchresult moduler ind for så bliver de jo lige pludselig target for mit søgeresultat!
  2. Hvis jeg har flere søgninger på et site (en der søger generelt i sider, en der søger i HR, en der søger i eCommerce), så kan jeg ikke bruge denne tag til noget…

4.2

Der er nogle forbedringer, jeg havde en dialog med Nicolai Petersen (twitter: http://twitter.com/nicped) hvor jeg forsøgte at argumentere for at man kunne få Getimage.aspx til at indpasse et billede til både højde og bredde. Jeg har ikke kunne læse mig til det – men afventer svar fra http://twitter.com/nicped.

Hvis man f.eks. satte både højde og bredde til 100 ville man med henholdsvis et bredformat og højformat billede automatisk få en indpasning af hele billedet i både bredde og højde som vist her:

GetImage.aspx som den kan tage sig ud - her er valgt både højde og bredde på 100px

Resultatet:

 

image

4.3 404 on area

Det er rigtig godt – nu kan man have en “404 not found” side pr. sproglag! Cool når man anvender Dynamicweb med sproglag som ikke nødvendigvis er samme firma! :-)

4.5 Google JS API includes

Det er spændende – det er en måde at få ensartet anvendelse af frontend javascript implemtering metoder. Jeg har så stor forventning i forhold til om der også er lavet en generisk måde at inkludere javascript og CSS på i forhold til enkelte moduler på afsnit. Et rygte (og et screenshoot jeg har set) viser at man for alle moduler ovenover settings har settings: en til valg af javascript fil og en til valg af stylesheet. Dette gør at man kan nøjes med at hente f.eks. jQuery plugins ind når de skal bruges. Om det så er kommet med i 7.1 kan jeg ikke læse mig til ud af dokumentationen – jeg må vente jeg får fingerne i en live version – eller en eller anden der har prøvet det eller bare ved det kommenterer på denne blog post :-)

Konklussion

Jeg har været kritisk her i denne post – indrømmet. Jeg er ikke i tvivl om at jeg senere vil skrive et andet indlæg hvor jeg kan fortælle om alle de rare forbedringer som er med i DW 7.1! Men jeg mener også at det er vores sure pligt som brugere af systemet at markere når der er noget man ikke synes er helt forståeligt eller optimalt. Generelt synes jeg at det jeg har hørt og læst om DW 7.1 er positivt og det tyder på at man forsøger at streamline produktet, at gøre det nemmere at anvende det og forbedre faciliteterne. Udfra Dynamicweb 7.1 technical release notes har jeg kunne skrive ovenstående – det er derfor vigtigt at have det i baghovedet: Jeg har skrevet om det dokument – ikke en anmeldelse af DW 7.1! Den kommer senere! :-)

Share

Dynamicweb eCommerce: How to redirect to basket after user have added something to the basket

When using the system in you can add a param to the form which will then send the user to the basket after he/she have added an item to the basket. That is sometimes a logical step for some types. The soloution is simpel, just add a param called redirect as a hidden input field like this:

<input type="hidden" name="redirect" id="redirect" value="/default.aspx?id=156" />

In this example Dynamicweb will send the user to the page with the ID 156 when the form is submitted.

Share

Using C# in XSLT – part 2: A remoteHTTP request

In this part of my in series of posts, I will show an example of making a basic remoteHTTP request from some inline C# code embedded inside a stylesheet. We will fetch a RSS feed from CNET.com and display it in a simpel UL list. The post transformations have been done using Microsoft .

A remoteHTTP request

You probertly know what a remoteHTTP request is, even if you have never heard about by that name. Every time you enter an URL you actually do a HTTP request. You point to an URL and get “something” back. In this post we will do just that, but from within some C# code being executed in the context of a XSLT transformation.

The result – effect – is that we can expand the XML which the XSLT can transform! Actually we only need a basic XML document to start up with – the actual XML is fetched from a remote site using the remoteHTTP request. So imagine that you have some XML which comes from a system – say – you then need to fetch a RSS feed containing from CNET.com and output an UL list with the items on the webpage. We need some C# method to do the job for us…

The C# remoteHTTP method

Below you can see a screenshoot of the C# remoteHTTP method (you will find a link to a ZIP file containing the source code of this and the other files at the bottom of this page).

C# remoteHTTP method

I will not say more about this code, other than I have added som basic Exception handling, returning a DOM tree with exception details (StackTrace, Message, Source, URL).

Here are some things I suggest when coding your C# code for use in XSLT:

a) In Visual Studio create a C# web project. In a “dummy” class add create the methodes and thereby getting intellicense and syntax check of the C# code.

b) Surround your code with try-catch error handling, things will go wrong at some time, so why not be prepared for it to happen?

c) Adding your XSLT file to the same project, you in practice have one structured container for both the syntax-validated methodes (classes at a later time!) and your XSLT stylesheets!

Preparing the XSLT stylesheet for inline C# code

To be able to make use of C# methodes from XSLT you need to do three things other than coding your C# code:

1) Add the namespaces and references making it possibel to execute C# code

The start of the XSLT template

We  need to declare two namespaces for “urn:scemas-microsoft-com:xslt” and “urn:custom-cs”. At the same time I do not wish to return any elements with that namespace, so I add it to the “exclude-result-prefixes” of the stylesheet element.

2) Insert the C# code with the needed C# namespaces and assemblies

The XML element containing the C# code
Within the msxsl namespace the “script” element is used. As you might guess C# is not the only supported language. I am not sure exactly which languages are supported, but jscript.net is supported. Normally I prefer javascript, but in this case I think that C# is best, as there are more help when doing the coding i the web project class. Actually I think that Microsoft is doing very little to support jscript.net.

3) Executing the C# and recieving the result

Calling the C# methode from XSLT Above you see in line 60 how I call the remoteHTTP C# method:
cs:remoteHTTP('http://news.cnet.com/2547-1_3-0-20.xml')

In our example we define a variable called “feed”, and it will contain the XMLDocument which is located at the URL at http://news.cnet.com/2547-1_3-0-20.xml. It is a valid RSS 2.0 news feed, and the result will be a 100% valid XML DOM tree. With that we can do any kind of normal XSLT transformation – as you can see in line 75. Here I select the child element “rss” of within the variable ($feed). We have succeded in fetching an external RSS feed from within a XSLT stylesheet – allowing us in a very dynamic web to execute .NET code based on dynamic values!

As I mentioned in the first post “Using C# in XSLT transformations – Very strong tool!” I will be writing about the pros and cons when using this approach, so far I have been very positive, but ofcause nothing comes from free! There is a price to pay – more about that in a later post. For now: Enjoy this “new” way to enrich and add power to XSLT! I do!

 

You may download ZIP file using the link below, it contains a visual studio project which contains all the files you need, and a SIMPEL how-to page:

  • testXML.xml
    Basic XML file which you can point to as your source XML file from Mictosoft Visual Studio when doing the transformation.
  • remoteHTTP.xslt
    The XSLT stylesheet containing the C# code
  • remoteHTTP.htm
    An example output of a transformation done in Mictosoft Visual Studio
  • remoteHTTP.cs
    A C# class which I used for coding the C# code

Source files from this post

Share