Just started playing around with Umbraco, and looks like I've managed to pick the right time as everything is moving over to Razor (which makes much more sense to me ;) ). Great product, once you get your head around the concept, loving how open the framework is!
Anyway, I've setup a image gallery (with popup's using Lightbox), and I'm looping through the media structure, first to get the folders and then the child items once a folder has been selected.
Once it get's to the images part, there's a folder with about 100 photo's in, with their respective thumbnails and it's really slow looping through all the nodes, much slower than using IO.Directory.GetFiles methods.
I'm using 4.7.1 with a SQLCE database, running on a dev server (2008 R2 - IIS7.5 ASP.NET 4.0).
What's the best practise? To use the media structure? Or for this, upload to a static folder, and just read that with the File System Object / IO namespace? I'm still not 100% clear of where to write macro's and code and where to just hardcode values into the master pages *confused*
My code is below, anyone feel free to take it and do with it what you will ;) P.S. It's in VB, I'm bilingual but just old habits with VB!
@<a href="@Model.NiceUrl">Return to Gallery listings</a> @<hr />
For Each i In Model.nodeById(Request.QueryString("f")).Children
If Model.NodeById(i.Id).NodeTypeAlias = "Image" Then Dim f as String = Model.MediaById(i.Id).umbracoFile.ToString.Replace(".jpg","_thumb.jpg") Dim l As String = Model.MediaById(i.Id).umbracoFile
Sorry should have said! Node 1147 is a media noe, but type folder.
The children are then folder media nodes as well, and their children a image media nodes... It just seems the database looping is a much slower process than just listing a folders contents with the IO...???
Thanks again for that, just had a reread of the thread and saw the quantum difference! To grab the whole node as a variable in the first instance, and just use that the whole time without any further lookups! Like this it's massively quicker!!
Hopefully the revised code below (in C# this time) will be of some use, and as I add more, I'll update the code to reflect dynamic folder entry points (or a media picker parameter) as I'm sure I'll keep adding to it... But for now, I hope it gives someone a good start!
Cheers, Mark
@using umbraco.MacroEngines; @{
string folder = Request.QueryString["f"]; if (string.IsNullOrWhiteSpace(folder)) { // There's no folder listed in the QueryString so list the sub folders
Very true! Being lazy it's OK as it's just for the folders but as it grows it'll become a problem ;)
Saying that, I think these should have the same performance:
Option 1: var vegetables = 123; // Node Id foreach(var spuds in Model.NodeById(vegetables).Children) { // Do stuff with the var "spuds" - All the children are stored in spuds and the parent "NodeById" will not be reference again? }
Option 2: var vegetables = Model.NodeById(123); foreach(var spuds in vegetables.Children) { // Do stuff with var "spuds" - All the children are stored in spuds and the parent "vegetables" will not be reference again? }
Do you think these would execute ultimately the same? Of couse, happy to be corrected if I'm wrong, but I think they would be the same and only have the one database query, either on line 1 or line 2...???
Cheers, Mark
P.S. Just to say, not being pedantic, just curious as it's nice to keep lines to a minimum and not have a var for every little thing ;)
Very true about what's happening under the hood... High five for that one :D
I'll stick to that idea for all future developments!
I'm just uploading now, so the Umbraco version of http://www.londoneastaikikai.co.uk/ should be online shortly! This is a site I run but not high demand etc so a good one to get to grips with the CMS... I think I'm starting to "get it", so will no doubt revisit this site again in the future ;)
Razor image gallery - Very slow!
Hi all,
Just started playing around with Umbraco, and looks like I've managed to pick the right time as everything is moving over to Razor (which makes much more sense to me ;) ). Great product, once you get your head around the concept, loving how open the framework is!
Anyway, I've setup a image gallery (with popup's using Lightbox), and I'm looping through the media structure, first to get the folders and then the child items once a folder has been selected.
Once it get's to the images part, there's a folder with about 100 photo's in, with their respective thumbnails and it's really slow looping through all the nodes, much slower than using IO.Directory.GetFiles methods.
I'm using 4.7.1 with a SQLCE database, running on a dev server (2008 R2 - IIS7.5 ASP.NET 4.0).
What's the best practise? To use the media structure? Or for this, upload to a static folder, and just read that with the File System Object / IO namespace? I'm still not 100% clear of where to write macro's and code and where to just hardcode values into the master pages *confused*
My code is below, anyone feel free to take it and do with it what you will ;) P.S. It's in VB, I'm bilingual but just old habits with VB!
Cheers,
Mark
========================================================
@imports umbraco.MacroEngines
@Code
If String.IsNullOrWhiteSpace(HttpContext.Current.Request.QueryString("f")) Then
For Each i In Model.NodeById(1147).Children
'@i.Name
'@i.NodeTypeAlias
Dim lnk = Model.NiceUrl & "?f=" & i.Id
@<a href="@lnk" class="lnkShow" style="display:inline-block;border-width:1px;border-style:solid;font-weight:bold;">@i.Name</a>
Next
Else
@<a href="@Model.NiceUrl">Return to Gallery listings</a>
@<hr />
For Each i In Model.nodeById(Request.QueryString("f")).Children
If Model.NodeById(i.Id).NodeTypeAlias = "Image" Then
Dim f as String = Model.MediaById(i.Id).umbracoFile.ToString.Replace(".jpg","_thumb.jpg")
Dim l As String = Model.MediaById(i.Id).umbracoFile
If f.IndexOf("DoF_") > -1 Then
If DoFhr = False Then
@<h4>Dan O'Flynn Photography <span><a class='smallLinksBlack' href=""http://www.danoflynnphotography.com/"" target=""_blank"">http://www.danoflynnphotography.com/</a></span></h4>;
End If
DoFhr = True
Else
If other = False Then
@<h4>Other</h4>
End If
other = True
End If
Dim t = Model.MediaById(i.Id).NodeTypeAlias
@<a class="lnkShow lnkLB" href="@l" style="display:inline-block;border-width:1px;border-style:solid;"><img title="Filename: @f" src="@f" alt="Filename: @f" style="border-width:0px;" /></a>
End If
Next
End If
End Code
Hi Mark,
The folder 1147, is that a media node or a content node ?
Dave
Hi Dave,
Sorry should have said! Node 1147 is a media noe, but type folder.
The children are then folder media nodes as well, and their children a image media nodes... It just seems the database looping is a much slower process than just listing a folders contents with the IO...???
Cheers,
Mark
Hi Mark,
I think this post can help you :
http://our.umbraco.org/forum/core/general/16738-Razor-and-GetMedia-by-folders-id
So that's part of the uComponents package? I'll take a look, thank you.
I'm going to get stuck in today, so should have an update later :)
Hi Mark,
The code snippet is not using uComponents.
Hi Dave,
Thanks again for that, just had a reread of the thread and saw the quantum difference! To grab the whole node as a variable in the first instance, and just use that the whole time without any further lookups! Like this it's massively quicker!!
Hopefully the revised code below (in C# this time) will be of some use, and as I add more, I'll update the code to reflect dynamic folder entry points (or a media picker parameter) as I'm sure I'll keep adding to it... But for now, I hope it gives someone a good start!
Cheers,
Mark
@using umbraco.MacroEngines;
@{
string folder = Request.QueryString["f"];
if (string.IsNullOrWhiteSpace(folder))
{
// There's no folder listed in the QueryString so list the sub folders
foreach (var subFolder in Model.NodeById(1147).Children)
{
string lnk = Model.NiceUrl + "?f=" + subFolder.Id;
<a href="@lnk" class="lnkShow" style="display:inline-block;border-width:1px;border-style:solid;font-weight:bold;">@subFolder.Name</a>
}
} else {
// We have a folder - Let's load the images
// Set the header and page vars
<a href="@Model.NiceUrl">Return to Gallery listings</a>
<hr />
var DoFhr = false;
var other = false;
var galleryImages = Model.NodeById(folder).Children;
foreach(var img in galleryImages) {
if(img.NodeTypeAlias == "Image") {
string f = img.umbracoFile.Replace(".jpg", "_thumb.jpg");
string l = img.umbracoFile;
if(f.IndexOf("DoF_") > -1) {
if(DoFhr == false) {
<h4>Dan O'Flynn Photography <span><a class="smallLinksBlack" href="http://www.danoflynnphotography.com/" target="_blank">http://www.danoflynnphotography.com/</a></span></h4>;
DoFhr = true;
}
} else {
if(other == false) {
<h4>Other</h4>
other = true;
}
}
<a class="lnkShow lnkLB" href="@l" style="display:inline-block;border-width:1px;border-style:solid;"><img title="Filename: @f" src="@f" alt="Filename: @f" style="border-width:0px;" /></a>
}
}
}
}
Hi Mark,
In your if section you still have Model.NodeById(1147).Children in the foreach loop
This can be stored in a variable too.
Dave
Very true! Being lazy it's OK as it's just for the folders but as it grows it'll become a problem ;)
Saying that, I think these should have the same performance:
Option 1:
var vegetables = 123; // Node Id
foreach(var spuds in Model.NodeById(vegetables).Children) {
// Do stuff with the var "spuds" - All the children are stored in spuds and the parent "NodeById" will not be reference again?
}
Option 2:
var vegetables = Model.NodeById(123);
foreach(var spuds in vegetables.Children) {
// Do stuff with var "spuds" - All the children are stored in spuds and the parent "vegetables" will not be reference again?
}
Do you think these would execute ultimately the same? Of couse, happy to be corrected if I'm wrong, but I think they would be the same and only have the one database query, either on line 1 or line 2...???
Cheers,
Mark
P.S. Just to say, not being pedantic, just curious as it's nice to keep lines to a minimum and not have a var for every little thing ;)
I think best practice would even to store the children collection in a variable, because we don't know what's going on under the hood.
So i would go for option 3
var vegetables = Model.NodeById(123).Children
foreach(var spuds in vegetables)
{
}
Very true about what's happening under the hood... High five for that one :D
I'll stick to that idea for all future developments!
I'm just uploading now, so the Umbraco version of http://www.londoneastaikikai.co.uk/ should be online shortly! This is a site I run but not high demand etc so a good one to get to grips with the CMS... I think I'm starting to "get it", so will no doubt revisit this site again in the future ;)
is working on a reply...