Module Builder Image Field
I put an image field on my type, and edited the backend list view to show the images in a column.
I then used the code sample to import some data (and images).
...but the backend images in the column are always this
<img src="" />
And if I look at the front-end auto-generated control, in both details and list view the image is showing up perfectly fine.
???
See attached...
It clearly has something to do with my import as if I use the UI to upload it all works fine :/
What am I doing wrong?
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Images.aspx.cs" Inherits="SitefinityWebApp.Sitefinity.Migration.Images" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
<
head
runat
=
"server"
>
<
title
></
title
>
</
head
>
<
body
>
<
form
id
=
"form1"
runat
=
"server"
>
<
div
>
<
h1
>Images</
h1
>
<
asp:TextBox
ID
=
"sourceFolder"
runat
=
"server"
Width
=
"300px"
Text
=
"C:\Dropbox\Projects\GourmetSleuth\Gourmet Sleuth\images"
/>
<
asp:TextBox
ID
=
"migrateFromLetter"
runat
=
"server"
Width
=
"50px"
Text
=
"a"
/>
<
asp:Button
ID
=
"migrateButton"
runat
=
"server"
Text
=
"Migrate Images Items"
OnClick
=
"OnMigrateImages_Click"
/>
<
asp:Button
ID
=
"Button1"
runat
=
"server"
Text
=
"Delete all Images Items"
OnClick
=
"OnDeleteImages_Click"
/>
<
hr
/>
<
asp:Literal
ID
=
"errorsLiteral"
runat
=
"server"
/>
<
asp:Literal
ID
=
"resultLiteral"
runat
=
"server"
/>
</
div
>
</
form
>
</
body
>
</
html
>
using
System;
using
System.Collections.Generic;
using
System.IO;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
Telerik.Sitefinity;
using
Telerik.Sitefinity.Modules.Libraries;
using
Telerik.Web.UI;
namespace
SitefinityWebApp.Sitefinity.Migration
public
partial
class
Images : System.Web.UI.Page
int
_count = 0;
int
_duplicates = 0;
public
void
OnDeleteImages_Click(
object
sender, EventArgs e)
foreach
(var a
in
this
.LibraryManager.GetAlbums())
foreach
(var image
in
a.Images())
LibraryManager.DeleteImage(image);
LibraryManager.SaveChanges();
public
void
OnMigrateImages_Click(
object
sender, EventArgs e)
if
(Directory.Exists(sourceFolder.Text))
ProcessDir(sourceFolder.Text, 0,
"Content"
);
resultLiteral.Text =
"Processed "
+ _count +
" images starting with "
+ migrateFromLetter.Text +
"<br />"
+ _duplicates +
" skipped"
;
int
result = -1;
if
(Int32.TryParse(migrateFromLetter.Text,
out
result))
if
(result < 9)
migrateFromLetter.Text = (result + 1).ToString();
else
migrateFromLetter.Text =
"a"
;
else
if
( migrateFromLetter.Text ==
"a"
)
migrateFromLetter.Text =
"b"
;
else
if
(migrateFromLetter.Text ==
"b"
)
migrateFromLetter.Text =
"c"
;
else
if
(migrateFromLetter.Text ==
"c"
)
migrateFromLetter.Text =
"d"
;
else
if
(migrateFromLetter.Text ==
"d"
)
migrateFromLetter.Text =
"e"
;
else
if
(migrateFromLetter.Text ==
"e"
)
migrateFromLetter.Text =
"f"
;
else
if
(migrateFromLetter.Text ==
"f"
)
migrateFromLetter.Text =
"g"
;
else
if
(migrateFromLetter.Text ==
"g"
)
migrateFromLetter.Text =
"h"
;
else
if
(migrateFromLetter.Text ==
"h"
)
migrateFromLetter.Text =
"i"
;
else
if
(migrateFromLetter.Text ==
"i"
)
migrateFromLetter.Text =
"j"
;
else
if
(migrateFromLetter.Text ==
"j"
)
migrateFromLetter.Text =
"k"
;
else
if
(migrateFromLetter.Text ==
"k"
)
migrateFromLetter.Text =
"l"
;
else
if
(migrateFromLetter.Text ==
"l"
)
migrateFromLetter.Text =
"m"
;
else
if
(migrateFromLetter.Text ==
"m"
)
migrateFromLetter.Text =
"n"
;
else
if
(migrateFromLetter.Text ==
"n"
)
migrateFromLetter.Text =
"o"
;
else
if
(migrateFromLetter.Text ==
"o"
)
migrateFromLetter.Text =
"p"
;
else
if
(migrateFromLetter.Text ==
"p"
)
migrateFromLetter.Text =
"q"
;
else
if
(migrateFromLetter.Text ==
"q"
)
migrateFromLetter.Text =
"r"
;
else
if
(migrateFromLetter.Text ==
"r"
)
migrateFromLetter.Text =
"s"
;
else
if
(migrateFromLetter.Text ==
"s"
)
migrateFromLetter.Text =
"t"
;
else
if
(migrateFromLetter.Text ==
"t"
)
migrateFromLetter.Text =
"u"
;
else
if
(migrateFromLetter.Text ==
"u"
)
migrateFromLetter.Text =
"v"
;
else
if
(migrateFromLetter.Text ==
"v"
)
migrateFromLetter.Text =
"w"
;
else
if
(migrateFromLetter.Text ==
"w"
)
migrateFromLetter.Text =
"x"
;
else
if
(migrateFromLetter.Text ==
"x"
)
migrateFromLetter.Text =
"y"
;
else
if
(migrateFromLetter.Text ==
"y"
)
migrateFromLetter.Text =
"z"
;
migrateButton.Text =
"Migrate Next"
;
private
void
ProcessDir(
string
sourceDir,
int
recursionLvl,
string
libraryName)
string
[] fileEntries = Directory.GetFiles(sourceDir);
foreach
(
string
fileName
in
fileEntries)
FileInfo file =
new
FileInfo(fileName);
if
(file.Name.StartsWith(migrateFromLetter.Text) || migrateFromLetter.Text ==
""
)
using
(FileStream fileStream = File.OpenRead(file.FullName))
MemoryStream memStream =
new
MemoryStream();
memStream.SetLength(fileStream.Length);
fileStream.Read(memStream.GetBuffer(), 0, (
int
)fileStream.Length);
this
.UploadImage(fileStream, file.Name, file.Extension, file.FullName, libraryName);
// Recurse into subdirectories of this directory.
string
[] subdirEntries = Directory.GetDirectories(sourceDir);
foreach
(
string
subdir
in
subdirEntries)
DirectoryInfo dir =
new
DirectoryInfo(subdir);
if
(dir.GetFiles().Count() > 0)
var album = LibraryManager.GetAlbums().ToList().Where(a => a.Title == dir.Name).FirstOrDefault();
if
(album ==
null
)
//Create a new image library
App.WorkWith().Album().CreateNew().Do(
a =>
a.Title = dir.Name;
a.Description =
""
;
a.UrlName = Util.GetUrl(dir.Name);
a.BlobStorageProvider =
"FileSystem"
;
album = a;
).SaveChanges();
// Do not iterate through reparse points
if
((File.GetAttributes(subdir) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
ProcessDir(subdir, recursionLvl + 1, album.Title);
public
void
UploadImage(System.IO.Stream stream,
string
name,
string
extension,
string
fullname,
string
libraryName)
try
this
.LibraryManager.Provider.SuppressSecurityChecks =
true
;
Telerik.Sitefinity.Libraries.Model.Image newImage = LibraryManager.CreateImage();
//Set its album
var album =
this
.LibraryManager.GetAlbums().FirstOrDefault(x => x.Title == libraryName);
if
(album.Images().Count(x => x.Title == name) == 0)
newImage.Parent = album;
newImage.Title = name;
newImage.UrlName = Util.GetUrl(name);
LibraryManager.Upload(newImage, stream, extension);
LibraryManager.RecompileItemUrls<Telerik.Sitefinity.Libraries.Model.Image>(newImage);
LibraryManager.Lifecycle.Publish(newImage);
LibraryManager.SaveChanges();
_count++;
catch
(Exception ex)
errorsLiteral.Text = fullname +
"<br />"
;
private
LibrariesManager _manager =
null
;
public
LibrariesManager LibraryManager
get
if
(_manager ==
null
)
_manager = LibrariesManager.GetManager();
return
_manager;
Hi Steve,
Thank you for sharing with us your experience.
I have tested the provided code and it looks fine, there is only a small inaccuracy with the image publishing. It should look like:
LibraryManager.Upload(newImage, stream, extension);
LibraryManager.RecompileItemUrls<
Telerik.Sitefinity.Libraries.Model.Image
>(newImage);
LibraryManager.SaveChanges();
var bag = new Dictionary<
string
, string>();
bag.Add("ContentType", typeof(Telerik.Sitefinity.Libraries.Model.Image).FullName);
WorkflowManager.MessageWorkflow(newImage.Id, typeof(Telerik.Sitefinity.Libraries.Model.Image), null, "Publish", false, bag);
var contentLinkManager = ContentLinksManager.GetManager();
var dynamicModuleManager = DynamicModuleManager.GetManager();
var propertyName = "Image";
var contentLink = new ContentLink()
ParentItemId = dynamicContent.Id,
ParentItemProviderName = dynamicModuleManager.Provider.Name,
ParentItemType = dynamicContent.GetType().ToString(),
ComponentPropertyName = propertyName,
ChildItemId = image.Id,
ChildItemProviderName = contentLinkManager.Provider.Name,
ChildItemType = "Telerik.Sitefinity.Libraries.Model.Image",
ApplicationName = dynamicModuleManager.Provider.ApplicationName,
ChildItemAdditionalInfo = image.GetThumbnailUrl()
;
dynamicContent.SetValue(propertyName, new[] contentLink );
Hey Georgi...
I'm looking at the DynamicContentExtensions class in the API right now (looking at the AddImage method the code samples tells us to call), and it pretty much mirrors (close to it) the code you pasted in here anyway...am I missing something?
Steve
Hi Steve,
The difference between AddImage method and the provided code is that AddImage method doesn’t set ChildItemAdditionalInfo property which is used for the backend grid. That’s why the images don’t appear in the backend grid, sorry for the inconvenience.
Kind regards,Yeah I updated the ticket on this one thanks :)
...so it's clearly a bug and will be fixed for 5.2 right? (just 1 line of code which you already have I can't see why someone wouldnt just paste it in there now)
Hi Steve,
You are right this is a bug and it will be fixed for 5.2. Once again thank you for pointing this to us and sorry for the inconvenience.
All the best,
Georgi Dimitrov
the Telerik team