Friday, June 21, 2013

SharePoint 2013 Interview Questions for Developers – Part 2

Q41: Whats are the new Delegate Controls in SharePoint 2013?
Ans: 
In SharePoint 2013, three New Delegate Controls have been Introduced for the purpose of displaying the new Top Suite bar (with links SkyDrive, NewsFeed,Sync,follow). These Controls are -
  • SuiteBarBrandingDelegate delegate Control
  • SuiteLinksDelegate delegate Control
  • PromotedActions Delegate Control
Q42: What is SuiteBarBrandingDelegate delegate Control used for?
Ans:
 SuiteBarBrandingDelegate Delegate Control is responsible for displaying ‘SharePoint’ or ‘Office 365′ text on top left of the new SharePoint 2013 site (in the blue bar). This text can only be replaced by Overriding SuiteBarBrandingDelegate Delegate Control with a custom Custom Control Created using Visual Studio.
Q43: What is SuiteLinksDelegate delegate Control used for?
Ans:
 SuiteLinksDelegate Delegate Control is responsible for displaying Links “NewsFeed, SkyDrive and Sites” in top right of the new SharePoint 2013 site (in the blue bar). These Links can be replaced by Overriding SuiteLinksDelegate Delegate Control using a Custom Control Created using Visual Studio.
Q44: What is PromotedActions delegate Control used for?
Ans:
 PromotedActions Delegate Control is responsible for displaying Links “Share,Follow,SYNC,EDIT” in top right below SuiteLinksDelegate Control. These Links can be replaced by Overriding PromotedActions Delegate Control using a Custom Control Created using Visual Studio.
Q46: What are Callout Popups in SharePoint 2013.
Ans:
 Similar to Dialog framework in SharePoint 2010, Microsoft has added a new Callout Popup framework to Create Hover Popups that you know as Preview Windows as well.These Notification\Tooltip\Help (whatever you call it..) Callout Popups can be fully Customized to add Custom Text & Actions for guiding End-users.
Q47: Is Callout Popups a replacement to Dialogs in SharePoint 2013.
Ans:
 No. Dialog Framework still exists.
Q48: Can we view PDF files in Callout Popups?
Ans:
 Yes. A Custom Result type and Display template would be needed.
Q49: What’s the new “SPField.JSLink” property used for?
Ans:
 New “SPField.JSLink” property has been added to help specify any external JavaScript file Containing any Rendering logic for Out-of-Box or Custom field type.With JSLink developers can now Control the Rendering (the presentation and validation) of any Field (Custom or Out-of-box) on List forms as well as in Views by simply adding a reference to an External or deployed JavaScript file.
Q50: What’s the new SPSecurityEventReceiver?
Ans:
 In SharePoint 2013, MS has added “SPSecurityEventReceiver” class to handle events for SharePoint Groups, Users, Roles and Permission Inheritance.
Q51: Can I turn off Social – Follow & Site Feed in SharePoint 2013?
Ans:
 Yes.You Can de-activiate Follow & Social by disabling “Following Content feature” and “Site Feeds feature” on the Team site(in the written Order).By default, the Site feed feature on a team site is enabled.

Using Content Search In SharePoint 2013

The Content Search Web Part (CSWP) is a new feature in SharePoint 2013. It can be most accurately compared to the Content Query Web Part that we have in previous SharePoint versions. The one striking difference between Content Search and Content Query is that Content Search allows you to query and show information from any site collection. As long as your search is configured to crawl the information it can be pulled into your CSWP!
This blog covers a basic scenario that will show you how easily the CSWP can be configured and ready for use.
Scenario – A research organization is putting together a SharePoint 2013 Community site to enable all of its top scientists to communicate. It would like to have a section on the site that shows all the organization’s scientists in a functional image slider. The problem is that the photos are spread throughout the site collection in different libraries. The one positive is that the organization uses Enterprise Keywords and all the photos have been tagged with the keyword Scientist. (At the end of this blog, I will show how to activate Enterprise Keywords on a library.)
Here are the steps the organization will follow:
1- The first step is to edit my Community site and add my CSWP which can be found in the Content Rollup category.
2- To configure the web part first click anywhere in the web part, then choose the Web Part tab in the ribbon. From that tab click Web Part Properties

3- We first need to setup the query. To do so click Change query from the web part properties box.
4- A Build Your Query dialog box will open. There are four tabs available Basics, Refiners, Settings and Test. From the Basics tab you should see Switch to Advanced Mode in the upper right corner. If you see Switch to Quick Mode click it. We will start this query from the Quick mode.


5- From the Select a query menu I have several options. In this situation I could either choose Items matching a tag (System) orPictures (System).  I also have the option of just querying documents, items matching a specific content type, popular items, etc.
6- Under Restrict by app I can decide to query the Current Site Collection, Current Site, Specific URL, or I can choose Don’t restrict results by app and query everything that I am currently crawling.
7- If you remember, in my test scenario I am looking for items that have a specific keyword of Scientist. So here I will choose Restrict on this tag: and enter Scientist.
8- You can add additional filters here or Switch to Advanced Mode for even more options. On the right hand side you can see what your query is currently returning to the web part.
9- The Refiners tab will allow you to filter your query even further. Currently, my query is returning any item that has been tagged with the keyword Scientist, but let’s say in my results I am finding that some documents had also been tagged with that keyword. I only want images to display so I can use this tab to add the ContentType of Picture to my refiners.
10- The Settings tab has a few additional options including the use of Query rules and the loading behavior of your query. For this example I will leave everything at the default.
11- The tab Test gives you your final query text for testing purposes. When finished simply click OKat the bottom of the Build Your Query dialog box.
12- The final step is to setup how results will display. From the Web Part Properties box you have the following options (the settings I choose for this solution can be seen in the image below.)
  • Number of items to show
  • Under Display Templates: Control (List, List with Paging or Slideshow)
  • Under Display Templates: Item (determines how the image and text will display, if you are just listing documents “two lines” would be the best option)
  • Under Display Templates: Don’t show anything when there are no results (leave this checked to avoid blank space, especially when using the slideshow control.)
**Note- If you want to get your hands on the code behind these display templates they can be found under Site Settings > Web Designer Galleries > Master pages > Display Templates > Content Web Parts
When your settings are right click OK to close your web part and you’re done!


Thursday, May 30, 2013

Deploying SharePoint 2010 Solution on SharePoint 2013

As you know, in SharePoint 2010 there was 14 hive where you deploy your files. And then you reference them like below:

Physical Path: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS
Virtual Path: “/_layouts/<your folder>/<your files>”

In SharePoint 2013, there is new 15 hive
Physical Path: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\LAYOUTS
Virtual Path: “/_layouts/15/<your folder>/<your files>”

If you have SharePoint 2010 solution (.wsp file) and you need to deploy it on SharePoint 2013, then you have the following options:
First, you have to add the solution to your farm using PowerShell as following:
  • Add-SPSolution C:\SP2010Project.wsp

Now,
  • Deploy to 14 hive è
    Install-SPSolution sp2010project.wsp
  • Deploy to 15 hive è Install-SPSolution sp2010project.wsp -CompatibilityLevel 15

Friday, May 10, 2013

Split CSV file based on content using PowerShell


You have a CSV file that contains department employees in a format like this:
Department,Employee
Sales,emp1
HR,emp2
Sales,emp3
Finance,emp4
Finance,emp5
Security,emp6
Security,emp7
Security,emp8
HR,emp9
And you need to split the contents of this file to separate files based on department name. So for the above example, we should get four files, Sales.csvHR.csvFinance.csv, and Security.csv. Each file contains only its employees.
And the solution really shows the power of PowerShell pipelining:
Import-Csv file.csv | Group-Object -Property "department" | 
 Foreach-Object {$path=$_.name+".csv" ; $_.group | 
 Export-Csv -Path $path -NoTypeInformation}
Dissecting the above commands:
  • Import-Csv file.csv: Parses the CSV file and returns an array of objects.
  • | Group-Object -Property "department": Since we need to split by department, it makes sense to group objects by the department property.
  • | Foreach-Object {...}: We need to apply an action for each group (department). So we pipeline the resulted groups to Foreach-Object.
  • $path=$_.name+".csv": Within the foreach, we need to create a temporary variable ($path) to be passed to the next pipeline responsible for the actual saving. Note that I use the semicolon ";" to separate this part from the next. And I used the name property of the group (which maps to department name in our case) to format the file name.
  • $_.group | Export-Csv -Path $path -NoTypeInformation: Then for each group we have, we need to export its contents (CSV file rows) to the file path created in the past step. So we again pipeline the group property of the group item (which is an ArrayList of original objects) to the Export-CSV Cmdlt.
And the result should be files like:
Finance.csv:
"Department","Employee"
"Finance","emp4"
"Finance","emp5"

List Google Docs using PowerShell


Are you looking for a quick and easy way to access your Google Docs from PowerShell? The Google Data Providerprovides an easy-to-use ADO.NET interface that you can take advantage of with your PowerShell Scripts. Simply use the included SQL like .NET objects (GoogleConnectionGoogleCommandGoogleDataAdapter, etc.) in your PowerShell scripts to connect to your Google Apps accounts and synchronize, automate, download, and more!

Using the Google Data Provider in PowerShell to List Google Docs:

# Load the Google Data Provider assembly 
[Reflection.Assembly]::LoadFile("C:\Program Files\RSSBus\RSSBus 
        Google Data Provider\lib\System.Data.RSSBus.Google.dll")

# Connect to Google 
$constr = "User=[username];Password=[password]"
$conn= New-Object System.Data.RSSBus.Google.GoogleConnection($constr)
$conn.Open()

$sql="SELECT Name, AuthorName, Type, Updated, Weblink from Documents"

$da= New-Object System.Data.RSSBus.Google.GoogleDataAdapter($sql, $conn)
$dt= New-Object System.Data.DataTable
$da.Fill($dt)

$dt.Rows | foreach {
 Write-Host $_.updated $_.name
}
Listing is only the first step. With full CRUD support, you can use the Google Data Provider to easily upload and download documents as well. The following bit of PowerShell code downloads one of the documents listed above:

Download a file from Google Docs:

$cmd= New-Object System.Data.RSSBus.Google.GoogleCommand("DownloadDocument", $conn)
$cmd.CommandType= [System.Data.CommandType]'StoredProcedure'
$cmd.Parameters.Add( (New-Object System.Data.RSSBus.Google.GoogleParameter("@Type", "TXT")) ) 
$cmd.Parameters.Add( (New-Object System.Data.RSSBus.Google.GoogleParameter("@Name", "myfile")) ) 
$cmd.Parameters.Add( (New-Object System.Data.RSSBus.Google.GoogleParameter("@LocalFile", "d:\myfile.txt")) ) 
$reader = $cmd.ExecuteReader()
Likewise, calling the UploadDocument Stored Procedure allows your scripts to upload documents directly to Google Docs.

As you can see, the Google Data Provider provides a hassle-free way to access the features of Google Apps directly from PowerShell script, and eliminates the headache involved with authentication, security, etc. 

Happy scripting!

Partial page load issue with ASP.NET MVC and head.js


I've been working with a small team over the past year or so on a large-scale web application built in ASP.NET MVC 3. We're using some of the best new client-side technologies with it as well - jQuery,Bootstrap and head.js to name a few. Overall, the project has gone very smoothly, with only a few minor hiccups or delays.
Well, except for one lingering issue.
We began experiencing intermittent partial page loads almost as soon as the first draft of the UI was released to our testing servers. The following behaviors were exhibited:
  • This issue could happen on any page in the application when it loaded.
  • 65-70% of the time a page would load correctly.
  • Pressing F5 (refresh) would reload the page and always fixed the issue.
  • Generally, either part of the main menu bar wouldn't load, or our datagrid wouldn't load. Both controls could have a problem on a given page if you reloaded it multiple times.
Perplexing and frustrating to say the least. First, we thought it was a problem with the tiny VMs we had in our testing environment. Then we guessed it might be a packet delivery issue with the VPN tunnel between the testing network and the office network. Then we supposed maybe our self-hosted CDN wasn't set up correctly, and switched to using Amazon S3 (which we were planning on doing anyway).
Each of these theories (and others) were tested and debunked. No love. There's no way it could be in our code, right??
What ended up working for us was moving our "core" libraries outside of head.js and using their "execute in-order" method for the rest of our libraries. Our _Layout.cshtml page looks like this:
<!doctype html>
<html lang="en">
<head>

(... stylesheets and other head content ...)

<script type="text/javascript" src="http://cdn.company.com/JS/head.min.js" />
<script type="text/javascript" src="http://cdn.company.com/JS/jquery-1.7.1.min.js" />
<script type="text/javascript" src="http://cdn.company.com/JS/jquery-ui-1.8.18.min.js" />
<script type="text/javascript" src="http://cdn.company.com/JS/modernizr-2.5.3.min.js" />
<script type="text/javascript" src="http://cdn.company.com/JS/bootstrap-2.1.0.min.js" />
<script type="text/javascript" src="http://cdn.company.com/JS/flexigrid.pack.js" />

<script type="text/javascript">
    head.js(
        "http://cdn.company.com/JS/jquery.validate.min.js",
        "http://cdn.company.com/JS/another.script.js",
        (... other javascript files ...),
    );
</script>

(... other code / markup ...)

</html>
We implemented this change about a week ago, and have yet to experience the issue once since then. Couple of additional notes / comments to share about the change:
  • This seems to work because generally all of the other javascript files you'll want to load probably depend on one or more of these "core" files to work properly. Letting head.js handle this becomes even more delicate when you consider the fact that ASP.NET is trying to load multiple Partial Views per page, many of which contain controls that need the "core" in place to be built properly. Any interruption of loading a "core" file before a control needs it may break part of the page.
  • While the head.js usage documentation lists what we have here as a correct way of using the library, this is not how their demo is built ('View Source' to check it out).
  • The most similar issue we could find was here on the head.js GitHub project site. This is where we got the idea to try an alternate implementation.
  • Since the purpose of head.js is to improve page load times, you may be wondering if this change hurt our delivery speed. Unfortunately, because pages weren't reliably loading for a number of months, it was hard to measure where we were at before the change, so I'm unable to determine a speed difference.

I decided to document this because we weren't able to find any instances online of someone else having the problem; hoping this post will save a few other teams some time and headaches.

Clean up old files using PowerShell


Doing a quick Google search (which may be what brought you here) will show you a number of variations on PowerShell scripts for deleting files. I'm sure many of them are perfectly adequate for the task, and in some cases, have features that mine doesn't. My solution excels at code readability and control, the latter of which I feel is fairly important when deleting files in bulk.
Not much else to say about it I guess; the purpose and uses of this script are pretty straightforward.
Here's the code:
# |Info|
# Written by Bryan O'Connell, February 2013
# Purpose: Delete files from a folder haven't been modified for the
# specified number of days.
#
# Sample: DeleteOldFiles.ps1 -folder "C:\test" -days_old 7 [-only_this_type ".xls"]
#
# Params:
#   -folder: The place to search for old files.
#
#  -days_old: Age threshold. Any file that hasn't been modified for more than
#  this number of days will be deleted.
#
#  -only_this_type: This is an optional parameter. Use it to specify that you
#  just want to delete files with a specific file extension. Be sure to
#  include the '.' with the file extension.
#
# |Info|

[CmdletBinding()]
Param (
  [Parameter(Mandatory=$true,Position=0)]
  [string]$folder,

  [Parameter(Mandatory=$true,Position=1)]
  [int]$days_old,

  [Parameter(Mandatory=$false,Position=2)]
  [string]$only_this_type
)

#-----------------------------------------------------------------------------#

# Determines whether or not it's ok to delete the specified file. If no type
# is specified, all files are ok to delete. If a type IS specified, only files
# of that type are ok to delete.

Function TypeOkToDelete($FileToCheck)
{
  $OkToDelete = $False;

  if ($only_this_type -eq $null) {
    $OkToDelete = $True;
  }
  else {
    if ( ($FileToCheck.Extension) -ieq $only_this_type ) {
      $OkToDelete = $True;
    }
  }

  return $OkToDelete;
}

#-----------------------------------------------------------------------------#

$FileList = [IO.Directory]::GetFiles($folder);
$Threshold = (Get-Date).AddDays(-$days_old);

foreach($FileToDelete in $FileList)
{
  $CurrentFile = Get-Item $FileToDelete;
  $WasLastModified = $CurrentFile.LastWriteTime;
  $FileOkToDelete = TypeOkToDelete($CurrentFile);

  if ( ($WasLastModified -lt $Threshold) -and ($FileOkToDelete) )
  {
    $CurrentFile.IsReadOnly = $false;
    Remove-Item $CurrentFile;
    write-Output "Deleted $CurrentFile";
  }
}

write-Output "Press any key to quit ...";
$quit = $host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown");


NOTE: If you run into problems getting the script to run on your machine, there are a few troubleshooting tips in my original article.