Tijdens het surfen en lezen van RSS posts kwam ik een interessant artikel tegen over het migreren van data tussen een eigen (third-party) CMS naar Sharepoint. Blijkbaar hoeft dit helemaal niet zo moeilijk te zijn, zo laat Pranab Paul zien.
Je kunt gewoon een web part maken met een knop en daar de migratie code onder plaatsen. Het code snippet hieronder is een ordinaire copy-paste van Pranab Paul z’n weblog, dat hij hier heeft gepost: https://blogs.msdn.com/pranab/archive/2008/05/20/moss-2007-migrating-content-from-3rd-party-content-management-solution-to-moss-publishing-collaboration-portal.aspx
using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.Publishing;
using System.Data;
using System.Data.SqlClient;
namespace WPContentCreator
{
[Guid("b771c700-889b-4cc1-bd36-fe4abac02183")]
public class WPContentCreator : System.Web.UI.WebControls.WebParts.WebPart
{
Button myBtn;
string SqlQuery = "Select contentid,title,contentbody,contentdate,author from dbo.ContentTable";
public WPContentCreator()
{
}
protected override void CreateChildControls()
{
myBtn = new Button();
myBtn.Text = "Submit";
myBtn.Click += new EventHandler(myBtn_Click);
Controls.Add(myBtn);
}
protected override void Render(HtmlTextWriter writer)
{
myBtn.RenderControl(writer);
}
void myBtn_Click(object sender, EventArgs e)
{
SPSite site = SPContext.Current.Site;
SPWeb web = site.OpenWeb();
PublishingSite publishingSite = new PublishingSite(site);
PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(web);
SPContentTypeId articleContentTypeID = new SPContentTypeId("0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D0091053586ECA36C43BD6FD6B1B28A2071");
PageLayout[] layouts = publishingWeb.GetAvailablePageLayouts(articleContentTypeID);
PageLayout articlePageLayout = layouts[0];
SqlConnection newSqlConnection = new SqlConnection();
SqlCommand newSqlCommand = new SqlCommand(this.SqlQuery, newSqlConnection);
newSqlCommand.CommandType = System.Data.CommandType.Text;
newSqlConnection.ConnectionString = "Integrated Security=True; Initial Catalog = test; Data Source = pranab - sec";
newSqlConnection.Open();
IDataReader rdr = newSqlCommand.ExecuteReader();
bool more;
int results = 0;
do
{
results++;
while (rdr.Read())
{
string pageName = rdr[0].ToString();
PublishingPage newPage = publishingWeb.GetPublishingPages().Add(string.Format("{0}_article_{1}.aspx", pageName, results), articlePageLayout);
newPage.Title = rdr[1].ToString();
newPage.ListItem["Page Content"] = rdr[2].ToString();
newPage.ListItem["Article Date"] = DateTime.Parse(rdr[3].ToString());
newPage.ListItem["Byline"] = rdr[4].ToString();
newPage.Update();
newPage.CheckIn("");
}
more = rdr.NextResult();
} while (more);
newSqlConnection.Close();
}
}
}
Ja, de opmaak van mijn code is niet zo mooi als die van hem, maar het idee mag duidelijk zijn. Toch handig, want ik denk dat het steeds vaker voor zal komen dat Sharepoint een reeds bestaande omgeving moet gaan vervangen.
Read more →Vandaag kwam ik toevallig terecht op het weblog van Michael Greth. Hij heeft namelijk een lijst gemaakt met handige en nuttige add-ons/web parts voor Sharepoint. In de lijst staan onder andere add-ons voor het plaatsen van tag clouds, betere wiki’s, facebook extenties, een social netwerk installeren, een Xobni plug-in en nog veel meer. Uiteraard kan ik zijn hele post kopieren en hier neer zetten, maar het is makkelijker om gewoon even een link te plaatsen, de link is https://weblogs.mysharepoint.de/mgreth/archive/2008/05/22/ultimatelistsharepointenterprise20.aspx Of ik me ga abonneren op z’n RSS feeds, dat denk ik (nog) niet. Momenteel heb ik daar wel genoeg van, maar het kan misschien geen kwaad om zo nu en dan even op z’n website te kijken.
Read more →Sinds kort ben ik me ook een beetje aan het verdiepen in Sharepoint (MOSS en WSS), dit moet ook wel, omdat we op het werk hier veel mee te maken hebben.
Vandaag was ik bezig om een kleine testsite in elkaar te zetten met wat CMS functionaliteit. Dit lukte redelijk toen ik eenmaal het juiste template had gevonden en de site had klaar gezet. Nadat ik dat had gedaan wilde ik graag inhoud wijzigen en plaatsen op de website.
De inhoud wijzigen was niet zo’n groot probleem, maar het plaatsen gaf een foutmeling. De foutmelding die ik kreeg te zien was
An unexpected error has occured
maar dan in het Nederlands, omdat ik met een Nederlands-talige MOSS installatie bezig was.
Het was iets als Een onbekende fout is opgetreden of iets in die richting. Daar kun je natuurlijk niet zoveel mee. Ook kon ik geen log terug vinden met de exacte foutmelding. Vervelende was ook dat gelijk de hele portal het niet meer deed en ik de browser opnieuw moest opstarten om de portal weer te kunnen zien.
Als ontwikkelaar zie ik graag altijd gedetailleerde foutmeldingen, vandaar dat ik op zoek ben gegaan hoe ik die kon krijgen te zien. Wat blijkt, je kunt dit gewoon in de web.config van website doen. Open het betreffende web.config bestand en wijzig de volgende regels. Ten eerste moet worden vertaald naar En de custom errors moeten ook uitgeschakeld worden Nadat je dit hebt gedaan krijg je de juiste foutmelding te zien. De foutmelding die ik kreeg ging over de connectiestring naar de database. Het was iets als
Read more →In de data access laag van m’n projecten werd het nu toch wel een drukke boel met verschillende LINQ to SQL queries. Aangezien je namelijk niet goed dynamische LINQ-queries kunt maken, moet je eigenlijk voor iedere ‘uitzondering’ een aparte query maken. Je krijgt dan zoiets als dit:
if (criteria.PeriodeVan != null && criteria.PeriodeTot != null)
{
var query = (from post in dataContext.GetTable()
where post.Item.CreatieDD >= criteria.PeriodeVan &&
post.Item.CreatieDD <= criteria.PeriodeTot
orderby post.Item.CreatieDD descending
select post)
.ToArray();
if (criteria.TopList > 0)
{
return query.Take(criteria.TopList);
}
else
{
return query;
}
}
else
{
var query = from post in dataContext.GetTable()
orderby post.Item.CreatieDD descending
select post;
if (criteria.TopList > 0)
{
return query.Take(criteria.TopList);
}
else
{
return query;
}
}
Dit is een hele lap code voor eigenlijk maar 2 acties, namelijk een periode kiezen en een selectie van de bovenste items. Voor mijn relatief kleine projecten is dat wel te doen, maar bij grotere projecten zeker niet. Zelfs dit vind ik al lastig qua onderhoud. Nu ben ik vandaag op zoek gegaan naar een goed alternatief.
Als vrij snel kwam ik op een Chris Rock z’n weblog waar hij dit probleem ook beschrijft in de post die hier is te vinden: https://www.rocksthoughts.com/blog/archive/2008/01/24/linq-to-sql-dynamic-queries.aspx Eerst komt hij met het voorstel om de Dynamic LINQ Query Library te gebruiken. Deze had ik zelf ook al een keer gezien, maar dat is eigenlijk iets wat je totaal niet wilt gaan gebruiken. Je krijgt dan gewoon tekst queries in je code welke niet meer door je compiler worden gecontroleerd. Dit haalt Chris ook al aan. Daarna begint hij over de LINQ Predicate Builder.
Read more →Hoe vaak gebeurd het wel niet dat je je pc wilt opruimen, maar je geen idee hebt welke mappen nou zoveel data bevatten. Het gebeurd mij regelmatig. Natuurlijk heb ik wel een redelijk idee van hoe groot een map ongeveer is, maar zeker weten doe ik het nooit. Het vervelende is dat mappen vaak ook weer submappen hebben en die zelf ook weer submappen hebben. Zo kun je dus een behoorlijke tijd zoet zijn met het zoeken naar grote mappen/bestanden.
Blijkbaar ben ik niet de enige geweest met dit probleem en is er iemand geweest die er een kleine Windows Verkenner add-in voor heeft geschreven, genaamd Folder Size, hoe origineel. Deze applicatie zorgt er voor dat er een kolom bij kan worden gemaakt in je Windows Verkenner met daarin de informatie over de totale grootte van de mappen. De applicatie/plug-in is op SourceForge te downloaden via deze link: https://foldersize.sourceforge.net/
Nog een probleem dat je vaak hebt bij het verwijderen van bestanden en mappen is dat je een melding krijgt die verdacht veel op deze lijkt: 
Iets heeft dan nog een koppeling met dat bestand, maar zelfs wanneer je alle applicaties afsluit dan krijg je alsnog deze melding. Ook hier is een applicatie voor gemaakt, namelijk Unlocker. Met behulp van deze applicatie kun je bestanden vrijgeven, waardoor je ze kunt verwijderen.
De applicatie is te downloaden op https://ccollomb.free.fr/unlocker/ en is volledig gratis.
Read more →Zoals misschien wel is te zien in de adresbalk en in de titel van de pagina, is de term Freezco.com nu helemaal vervallen. Onlangs heb ik besloten om niet meer verder te gaan met dat domein, mede omdat ik het niet (meer) bedrijfsmatig kan gaan gebruiken in de toekomst. Tevens past Jan-V beter bij de content die op deze pagina staat. Eigenlijk post ik alleen maar dingen die ik zelf leuk danwel interessant vind, dus gaat het mij aan, Jan V. Dit maal was de update behoorlijk eenvoudig. Gewoon de nieuwste code op het Jan-V.nl domein plaatsen en de database heen en weer ‘slepen’. De database kon ik via vergelijken van de ene en de andere database behoorlijk snel doen. Volgens mij is alles nog intact. Ook heb ik al een leuke feature toegevoegd in deze nieuwste code, namelijk de mogelijkheid om eKudo’s en Stumble Upon te ondersteunen bij bepaalde posts. Ik weet niet zeker of het allemaal goed werkt, maar als ik de theorie goed heb begrepen zou dat wel het geval moeten zijn. Er zitten nog enkele andere updates aan te komen, maar daar moet ik nog aan beginnen met ontwikkelen.
Read more →Vandaag werd er weer een mailtje van de SEAT Club bezorgd. Soms staan er wel leuke aanbiedingen in, dus keek ik maar even. In de header van de mail stond een leuke aankondiging (voor mij dan), er komt een nieuw model van de Ibiza in 2008. De echte auto-spotter zal dit waarschijnlijk al lang weten, maar voor mij is het dus echt nieuws. Hij ziet er ook behoorlijk vet uit. De nieuwe Leon was even wennen, maar na verloop van tijd begint die toch wel mooi te worden, hoewel ik de vorige Leon mooiere kont vind hebben. De nieuwe Ibiza is echter een stuk vetter dan de huidige. Ok, het zijn dan nog wel renders, maar ik vind hem super vet.
Toen ik nog m’n Ibiza had vond ik die ook wel mooi, maar nu vind ik hem toch wel saai en oudbollig worden in de standaard vorm. Deze nieuwe ziet er echter behoorlijk flitsend uit. Jammer dat ik nog even moet wachten op een nieuwe auto. Anders had ik het wel geweten. Ach, hij is er ook nog wel zodra ik aan een nieuwe auto toe ben, maar dan zijn er misschien wel weer andere mooie auto’s. Ik zat te twijfelen om een Ford Focus te nemen als volgende auto, aangezien die goed geluid uit de speakers hebben (wat ik er van heb kunnen horen tenminste). Nu denk ik echter dat het toch maar een SEAT Ibiza wordt. Hopelijk heeft deze auto het A-label, zodat die niet zo enorm duur is in de lease.
Read more →Vorige week wilde ik graag een Rich text editor in m’n Weblog project slepen, dit omdat het een stuk mooier is om in zo’n editor teksten te schrijven dan in een ’normale’ textarea.
Nu bestond de editor in mijn geval uit enkele tientallen mapjes met ieder hun eigen submapjes en bestanden. Ik dus proberen om de gehele hoofdmap te slepen in m’n project in VS2008.
Dit mocht niet echt baten. Iedere keer wanneer ik een map naar m’n Solution Explorer sleepte kon ik de map niet toevoegen. Heel raar, aangezien dit wel gewoon in VS2005 kon worden gedaan.
Het lukte trouwens wel om alleen bestanden in je project te slepen, maar om nou handmatig al die mappen in je project aan te maken gaat zelfs mij wel iets te ver. Na enig onderzoek en navraag kwam iemand met een goede oplossing voor m’n probleem. Ik draaide VS2008 namelijk met elevated privileges, dus als Administrator. De rest van m’n systeem draait gewoon onder m’n ’normale’ account. Waarschijnlijk wordt het slepen van spullen naar applicaties met een ander autorisatie niveau geblokkeerd door Windows Vista. Toen ik m’n VS2008 zonder elevated privileges had opgestart kon ik gewoon vanuit de Windows Verkenner mappen slepen naar m’n Weblog project, precies wat ik wilde dus. Het vervelende is dat wanneer je VS2008 niet als Administrator opstart, is dat je dan geen web applicaties meer kunt opstarten, website projecten daarentegen wel.
Read more →Vorige week kwam ik achter een leuk feitje, tenminste ik denk dat het een feitje is. Ik was bezig om een chatmodule te maken in een website en de gebruikers daar wilden ook ieder hun eigen kleurtje kunnen selecteren. Op zich geen probleem natuurlijk, dan kun je gewoon een span maken en daar een kleur aan geven.
Aangezien de tekst via AJAX werd ingeladen, moest ik de kleur ook via Javascript er in voegen. Niet zo heel erg lastig, toch ben ik er een behoorlijke tijd mee bezig geweest vind ik zelf. Wat was het (nou ja, een van de) probleem nou?
Blijkbaar sluit de innerHTML van Javascript je HTML tags in je tekst als je dit niet zelf doet in dezelfde regel als ze worden aangemaakt. Ik had dus code wat hier op lijkt:
if( kleur_node[0].firstChild != null) { chat_div.innerHTML += '<span>' chat_div.innerHTML += user_node[0].firstChild.nodeValue + ':' chat_div.innerHTML += text_node[0].firstChild.nodeValue + ''; }
De tekst bleef echter z’n normale kleur houden en niet de kleur die ik wilde. Uiteindelijk heb ik de code kleur_node[0].firstChild.nodeValue maar vervongen door Red, zodat ik zeker wist dat er een kleur werd geplaatst. Dit mocht echter niet baten. Hierna heb ik er maar een collega bij geroepen om mee te kijken, het zou kunnen dat ik iets over het hoofd zou hebben gezien. Samen hebben we er dit van gemaakt:
Read more →Met de nieuwe stijl om m’n blog heb ik ook in m’n CSS het een en ander aangepast. Een van die dingen is
display: inline-block; width: 200px;
Dit werkt perfect in IE en aangezien het inline-block toch redelijk standaard is (dacht ik) heb ik het niet eens in FireFox getest. Nu zag ik zojuist dat deze optie niet werkt in FireFox, tenminste niet in mijn versie. Uiteraard is er een slimme kop bij Mozilla geweest die heeft bedacht dat het toch nodig zou zijn om deze optie toch beschikbaar te hebben.
In plaats van gewoon de inline-block te implementeren, hebben ze iets anders bedacht, namelijk -moz-inline-box.
Jazeker, een Mozilla variant op de ‘standaard’. Ok, vanaf CSS3 zit inline-block niet meer in het standaard pakket, maar daar heb ik momenteel nog weinig mee te maken. Nu heb ik m’n CSS weer aan moeten passen, wat er niet mooier op wordt.
width: 200px; display: inline-block; display: -moz-inline-box;
Bovenstaande code werkt zowel in IE als FF. Of het best-practice is durf ik te betwijfelen, maar het gaat uiteindelijk om het resultaat.
Read more →