Share Point portalleri bilindiği gibi web part tabanlıdır. İhtiyaçlara göre web partlar yazılıp, implement edilir. İhtiyaçlara göre web partlar arasında data aktarımı söz konusu olabilir. Böyle durumlarda connected web part geliştirilmesi söz konusudur. Connected web partlarda provider-consumer ilişkisi söz konusudur. Web partlardan biri diğerine data sağlar. Data sağlanan web part ise bu datayı kullanarak istenilen sonucu üretir. Data sağlayan web part “provider”, datayı kullanan web part ise “consumer” olarak adlandırılır. Provider-consumer web partlar arasında 1-n ilişkisi vardır. Yani bir provider web partı, birden fazla consumer web part kullanabilir. Provider web partdan alınan datayı consumer web parta iletmek için provider web parta bir interface uygulanır. Bu arayüz consumer web parta provider web partımızın referansını taşıyacaktır. Bu taşımanın yapılması için de ConnectionProviderConnectionConsumer attributeları ile imzalanmış connection point metodları kullanılmaktaır. Bir örnek ile anlattıklarımızı gerçekleştirelim:

Örnek olarak custom bir search web partımız ve search işleminin sonuçlarını göstereceğimiz ikinci bir web partımız olsun. Search web partımız provider, sonuçları göstereceğimiz web part ise consumer web parttır.

Visual Studio’da File –> New –> Project –> ShrePoint –> 2010 altından yeni bir Empty SharePoint Projectoluşturalım.Öncelikle provider web partımıza uygulayacağımız interface’i tanımlamalıyız.

Projemize Add –> New Item –> Code altından ICustomer adında bir interface ekleyelim. Interface’in tanımı aşağıdaki gibi olacaktır:

public interface ICustomer
{
string CustomerName { get;}
}

CustomerName özelliği, sonuçların gösterileceği web parta(consumer) aktarmak için search web partından(provider) girilen datayı taşıyacaktır.

Add –> New Item –> SharePoint –> 2010 altından ProviderWebPart adında bir WebPart ekleyelim.

Öncelikle web partımıza tanımladığımız interface’i uygulayalım:

public class ProviderWebPart : WebPart, ICustomer
{
string customerName = string.Empty;
public string CustomerName
{
get { return customerName; }
}
protected override void CreateChildControls()
{
}
}

Provider web partımızda Label, arama için veri girebileceğimiz bir TextBox ve arama işlemini gerçekleştireceğimiz bir Button kontrolü olacaktır.

Web partımızın CreateChildControls metodunda bu kontrolleri oluşturup, web partımıza ekleyelim. CreateChildControls metodunun içeriği aşağıdaki gibi olacaktır:

protected override void CreateChildControls()
{
HtmlTable table = new HtmlTable();
HtmlTableRow row = new HtmlTableRow();

HtmlTableCell cell_label = new HtmlTableCell();
Label lbl_customer = new Label();
lbl_customer.Text = “Customer Name:”;
cell_label.Controls.Add(lbl_customer);
row.Cells.Add(cell_label);

HtmlTableCell cell_textbox = new HtmlTableCell();
TextBox txt_customer = new TextBox();
txt_customer.Width = 200;
cell_textbox.Controls.Add(txt_customer);
row.Cells.Add(cell_textbox);

HtmlTableCell cell_button = new HtmlTableCell();
Button btn_customer = new Button();
btn_customer.Text = “Search”;
btn_customer.Width = 100;
btn_customer.Click += delegate(object sender, EventArgs e)
{
customerName = txt_customer.Text;
};
cell_button.Controls.Add(btn_customer);
row.Cells.Add(cell_button);

table.Rows.Add(row);

this.Controls.Add(table);
}

Bir HtmlTable içerisinde kontrollerimizi oluşturup web partımıza ekledik. Butonumuzun Click(Anonim metod olarak taımlanmıştır) olayı tetiklendiğinde TextBox’a girilen değer consumer web partımıza aktarılmak üzere CustomerName propertysine set edilir.

Geriye bu aktarımı yapacak ConnectionProvider attribute’u ile imzalanmış connection point metodumuz kaldı. Connection point metodumuz da aşağıdaki gibidir:

[ConnectionProvider(“ProviderConnection”)]
public ICustomer ProviderConnectionPoint()
{
return this;
}

Provider web partımız hazır. Şimdi projemize ConsumerWebPart adında ikinci bir web part ekleyelim. Provider web partımızdan gelen nesne referansını tutacak ICustomer inteface’i türünden bir değişken tanımlayıp, gelen datayı CreateChildControls metodu içerisinde kullanıp istediğimiz sonucu elde edelim. CreateChildControls metodumuz aşağıdaki gibidr:

ICustomer _customer = null;
protected override void CreateChildControls()
{
if (_customer != null)
{
Label label = new Label();
label.Font.Bold = true;
label.Text = _customer.CustomerName;
this.Controls.Add(label);
}
}

Burada sadece provider web partından gelen değeri consumer web partta bir labela yazdırıyoruz. Provider web parttan datayı aldıktan sonra nasıl kullanacağınız ihtiyaçlara kalmış.

Geriye sadece provider web partından gelen nesne referansını alacak ConnectionConsumer attribute’u ile imzalanmış connection point metodumuz kalıyor. Connection point metodumuz aşağıdaki gibidir:

[ConnectionConsumer(“ConsumerConnection”)]
public void ConsumerConnectionPoint(ICustomer providerInterface)
{
_customer = providerInterface;
}

Provider ve consumer web partlarımız hazır. Provider ve consumer web partları arasındaki bağlantıyı tanımladığımızda connected web partlarımız kullanıma hazır olacaktır.

Web partları sitenize deploy ettikten sonra kullanmak istediğiniz sayfaya ekleyin. Provider web partında sağ üst köşedeki oku tıkladığınızda açılan menüden Connections’ı seçin. Aşağıda görüldüğü gibi provider web partı kullanacak consumer web partı seçiyoruz:

Provider - Consumer Connection
Provider - Consumer Connection

Sayfamızı check in’leyerek edit mode’dan çıkalım. Provider web partta TextBox’a veri girip Search butonuna tıkladığımızda, girdiğimiz verinin consumer web parta yazıldığını göreceksiniz:

Connected Web Parts Test
Connected Web Parts Test

WebPart kontrollerin bir tasarım arayüzü olmadığı için kullanımı zor gelebilir. SharePoint 2010 ile birlikte Visual Web Part kavramı gelmiştir. İçinde barındırdığı web user control ile görsel tasarım yapabilir ve bunu web part olarak portallerde kullanabiliriz. Geliştirdiğimiz visual web partları da connected olarak geliştirebiliriz. Yukarıdaki senaryoyu visual web part kullanarak gerçekleştirelim. Projenize ProviderVisualWebPart adında bir visual web part ekleyin. Visual Web Part altındaki user controle yukarıdaki tasarıma uygun Label, TextBox ve Button ekleyin. Tasarımımız hazır.

Butona tıkladığımızda textboxa girilen veriyi taşımak için bir property tanımlıyor ve butonun Click olayını işliyoruz:

string customerName = string.Empty;
public string CustomerName { get { return customerName; } }
protected void btn_customer_Click(object sender, EventArgs e)
{
customerName = txt_customer.Text;
}

Butona tıkladığımızda textboxa girilen veri CustomerName propertysine aktarılıyor. ProviderVisualWebPart.cs dosyasını açıp web partımızı provider web part olacak hale getirelim. Yukarıda yaptığımız gibi web partımıza öncelikle arayüzü uyguluyoruz. CustomerName propertysini aşağıdaki gibi tanımlıyoruz:

public string CustomerName
{
get
{
return ((ProviderVisualWebPartUserControl)control).CustomerName;
}
}

User controlde butona tıkladığımızda textboxa girilen veri, user controlün CustomerName propertysine aktarılıyordu. Burada da user controlün CustomerName propertysini consumer web parta aktarıyoruz. Connection point metodumuz önceki ile aynıdır. Son durumda ProviderVisualWebPart.cs dosyasının içeriği aşağıdaki gibi olmalıdır:

Control control;
protected override void CreateChildControls()
{
control = Page.LoadControl(_ascxPath);
Controls.Add(control);
}
public string CustomerName
{
get
{
return ((ProviderVisualWebPartUserControl)control).CustomerName;
}
}
[ConnectionProvider(“VisualProviderConnection”)]
public ICustomer VisualProviderConnectionPoint()
{
return this;
}

Projenize ConsumerVisualWebPart adında ikinci bir visual web part ekleyin. Web part altındaki user controle provider web parttan gelecek veriyi yazdıracağımız bir label ekleyin. User controle provider web parttan gelecek veriyi alacak CustomerName adında bir property ekleyin:

public string CustomerName
{
set
{
lbl_customer.Text = value;
}
}

Provider web parttan gelen veriyi web part render edilirken user controle aktarıyoruz. Connection point metodumuz yine değişmeyecektir. ConsumerVisualWebPart.cs dosyamızın içeirği aşağıdaki gibi olacaktır:

ICustomer _customer;
Control control;
protected override void CreateChildControls()
{
control = Page.LoadControl(_ascxPath);
Controls.Add(control);
}
protected override void RenderContents(HtmlTextWriter writer)
{
if (_customer != null)
{
((ConsumerVisualWebPartUserControl)control).CustomerName = _customer.CustomerName;
}
base.RenderContents(writer);
}
[ConnectionConsumer(“VisualConsumerConnection”)]
public void VisualConsumerConnectionPoint(ICustomer providerInterface)
{
_customer = providerInterface;
}

Visual web partları portalimize deploy edip, sayfamıza eklediğimizde ve yukarıda olduğu gibi provider-consumer connection tanımını yaptığımızda visual web partlarımız connected hale gelecektir.

Son olarak bir provider web partı birden fazla consumer web partın kullanabileceğini belirtmiştik. Şu anda iki provider iki consumer web partımız var. Provider web partlarımızdan birinin connected olduğu consumer web part ile bağlantısını koparalım. Bu işlem connection kurarken listelenen consumer web part listesinden seçili olan consumer web partın seçiminin kaldırılması ile yapılır. İstediğimiz provider web parta, başka bir provider web parta bağlı olmayan consumer web partları bağlayabiliriz.

1-n Provider - Consumer Web Parts
1-n Provider - Consumer Web Parts

TextBox’a veri girip butona tıkladığımızda provider web parttaki veri, bağlı olduğu bütün consumer web partlara aktarılacaktır.

Sonraki yazıda görüşmek üzere.

Reklamlar