Category Archives: MojoPortal

Phần 1. Cấu hình Hệ thống đào tạo trực tuyến thế hệ mới – ROBUSTA Distance Learning 2015


1. Tổng quan:

Đào tạo từ xa (E-learning) với khả năng cung cấp bài giảng đa phương tiện và hỗ trợ việc dạy và học cho mọi người, ở mọi nơi và mọi lúc , đây là một phương pháp hữu hiệu để hỗ trợ bổ sung hoặc thậm trí thay thế một số bộ môn trong hình thức đào tạo truyền thống.

Mô hình E-learning phổ biến nhất hiện nay là phát triển các hệ thống đào tạo trực tuyến dựa trên nền web (Web-Based Training  “WBT”) cho phép quản lý một số lượng lớn người dùng thuộc 6 nhóm chính:

  1. Quản trị hệ thống mạng và dịch vụ (đảm bảo về kỹ thuật, cấu hình dịch vụ cho hoạt động ổn định của hệ thống).
  2. Quản trị hệ thống nội dung, chương trình đào tạo (Nhóm người quản lý các chức năng đào tạo, theo dõi qui mô, tiến trình, báo cáo và đánh giá chất lượng đào tạo để có thể ra các quyết sách hợp lý).
  3. Giảng viên (nhóm đối tượng khai thác chức năng của cả đào tạo “LMS” và quản lý nội dung giáo trình dạy “LCMS” để xây dựng bài giảng và quản lý việc sử dụng bài giảng).
  4. Trợ giảng, người theo dõi quản lý lớp/ khóa học.
  5. Học viên (nhóm đối tượng sử dụng đông đảo và đa dạng nhất của hệ thống. đối với một hệ WBT cho cộng đồng, học viên có thể là mọi đối tượng trong xã hội. Học viên chủ yếu khai thác trực tiếp các chức năng của phân hệ đào tạo “LMS”).
  6. Phụ huynh / người quản lý trực tiếp nhóm của học viên.

và cung cấp các hình thức tương tác giữa 6 nhóm phong phú như:

  1. Lưu sổ điểm, học bạ,điểm danh, chứng chỉ, theo dõi tình hình học tập, tiến trình ôn tập của từng cá nhân học viên.
  2. Hệ thống tương tác qua email, sms, trao đổi qua văn bản / hình ảnh / âm thanh, streaming media.
  3. Cung cấp các nguồn thư viện điện tử, media, video/audio, giáo trình tham khảo điện tử , trình chiếu powerpoint slides, adobe flash, silverlight …
  4. Hệ thống ôn tập thi chứng chỉ các chuyên ngành học dạng ngân hàng đề thi trắc nghiệm, thi mô hình simulators / hotspot, điều khiển Labs thực hành trên máy tính và mạng ảo, chấm điểm tự động.
  5. Khả năng remote hỗ trợ từ xa các máy desktop của giảng viên, học viên chuyên các bộ môn: ITIL, Helpdesk, chăm sóc khách hàng CRM …
  6. Khả năng học nhóm, họp phòng, hội thảo, triển lãm CNTT từ xa bằng tích hợp các hệ thống điện toán đám mây như: Google App, Office 365 hoặc Lync Conferencing 2010/2013, VMware Virtualization…
  7. Hệ thống thực hành trực tuyến điều khiển từ xa giúp học viên, giảng viên và quản trị hệ thống mạng xây dựng được các bài thực hành : Virtualization Data center, SharePoint, BizTalk, Virtualization System, Hybrid Cloud, Private Cloud…
  8. Tích hợp với các mạng xã hội như: facebook, linkedin, youtube, flickr, google, Microsoft Azure, Moodlenews… giúp việc ad/pr, marketing tin tức hoạt động, chương trình đào tạo của hệ thống hiệu quả cao hơn.

Moodle-social

Chính vì vậy đã có nhiều hệ thống WBT được phát triển và số người tham gia vào các hệ thống này ngày càng tăng.

 

2. Cấu trúc cơ bản của WBT:

Một hệ thống WBT hoàn chỉnh thường bao gồm hai thành phần chính:

  1. Phân hệ quản lý đào tạo (Learning Management System – LMS).
  2. Phân hệ quản lý nội dung đào tạo (Learning Content Management System-LCMS).

image

  • LMS là một hệ thống quản lý các quá trình học tập, bao gồm việc đăng ký khoá học của học viên, phân phối các nội dung học cho học viên, các hoạt động kiểm tra đánh giá, và các hoạt động tương tác trong cộng đồng người sử dụng. Một số LMS còn hỗ trợ nhà quản lý và giảng viên thực hiện giám sát tiến trình học và chất lượng học, hỗ trợ các hình thức tương tác trực tuyến và bài giảng đồng bộ.
  • LCMS là hệ thống hỗ trợ việc xây dựng nội dung học tập bao gồm việc tạo, cập nhật, tìm kiếm và sử dụng lại các module bài giảng. Bài giảng có thể được thể hiện dưới nhiều mức khác nhau từ văn bản cho đến bài giảng đa phương tiện chứa video và bài giảng dạng mô phỏng hỗ trợ tương tác. Hầu hết các hệ LCMS đều tiến tới hỗ trợ việc biểu diễn bài giảng theo các chuẩn thống nhất (ví dụ: SCORM hay XML) để dễ dàng chia sẻ và sử dụng lại.

image

 

3. Công nghệ đáp ứng nền tảng:

  1. Web Server: Apache / IIS 7.5 trở lên.
  2. Hệ quản trị CSDL: MySQL 5.x / MS SQL Server 2008 R2 trở lên.
  3. Directory: AD, LDAP / OpenLDAP.
  4. Ngôn ngữ lập trình: PHP 5.x / ASPX 2 trở lên, XML/XSL/ Notes.js
  5. Trình duyệt web: Internet Explorer 6 trở lên; Chrome; Firefox, Opera, Safari, WAP 1.x; Nescape 5.x trở lên

 

4. mô hình các thành phần của hệ thống đào tạo trực tuyến:

image

5. Cấu trúc các chức năng hệ thống:

image

6. Cấu trúc của một môn học trực tuyến:

image

 

7. Yêu cầu kỹ năng tương tác của giảng viên:

image

8. Triển khai mô hình LMS vs LCMS trong đào tạo trực tuyến:

MOOC

Lưu ý: Trong mô hình trên chúng ta sẽ vướng phải yêu cầu về đăng nhập 1 lần (SSO) sử dụng giao thức LDAP:// 389 hoặc LDAPS để trao đổi thông tin, đăng nhập xác thực 1 lần giữa WBT, web service với email, ftp, portal và LMS – LCMS của các sản phẩm công nghệ quản lý đào tạo sẵn có như: Moodle, Blackboard, SharePoint Learning gateway …

(xin xem phần 2. Triển khai cấu hình đăng nhập 1 lần giữa Moodle và AD server).

9. Triển khai mô hình hệ thống Cân bằng tải:

image

Hết phần 1.

Tổng hợp các kỹ thuật triển khai Mojoportal


Phần 1.:
1. Tạo nhiều Site trên .Net Framework 3.5:
a. Thiết lập web.config : AllowMultipleSites =” true”
b. Trong Web.config, thiết lập UseFoldersInsteadOfHostnamesForMultipleSites = “true”
c. Tới Admin> Cài đặt trang web trong trang web đầu tiên. You should see a dropdown list next to the site name, choose “New Site”, then enter a name for the new site and click Save Bạn sẽ thấy một danh sách xổ xuống bên cạnh tên trang web, chọn “New Site”, sau đó nhập tên cho trang web mới và nhấp vào Lưu.
d. Nếu trang chính là localhost thì Site vừa tạo ra được gọi: localhost/somefolder/default.aspx.

2. Các vấn đề sử dụng nhiều Site:
a. Khi tạo Site có thể cho phép đăng ký trên Site hoặc không
b. Account được tạo trên Site nào chỉ đăng nhập được vào Site đó.
c. Có thể sử dụng lại được các Module của Site chính.
d. Khi vào các trang có Tab Ajax thì bị lỗi.
e. Việc thêm Pages và Modules cũng giống như default Site.

3. Phân Tích:
a. Chúng ta sử dụng Multiple Site cho Site MySchool.
b. Site MySchool sẽ bao gồm nhiều Site, trong đó mỗi Site sẽ là một trường.
c. Khi người dùng đăng ký tại Portal Live thì sẽ cho phép người sử dụng chọn Trường. Sau đó thì sẽ lưu thêm account vào Database với SiteID và SiteGuid là của Site (Trường) đã chọn.
d. Khi viết các Module cần phải kiểm tra dữ liệu được Insert và Select từ Site nào. Vì vậy cần phải có thêm SiteID.
e. Chúng ta có thể cho phép người sử dụng đăng ký được nhiều Trường nhưng khi vào trang MySchool người sử dụng sẽ phải chọn Trường(Stie) cần vào.

Phần 2. Tham khảo Các công cụ soạn bài giảng điện tử eLearning:

1. MS Producer (Miễn phí):
Website: http://www.microsoft.com/downloads/details.aspx?familyid=1B3C76D5-FC75-4F99-9…
Công cụ bổ sung vào bộ MS Office và hoàn toàn miễn phí. Công cụ giúp đưa thêm multimedia (audio và video) vào các bài trình bày PowerPoint, giúp bài trình bày trở nên sống động gấp nhiều lần. Chúng tôi khuyến cáo mọi trường nên dùng công cụ này.

2. LCDS (Miễn phí):
http://www.microsoft.com/learning/tools/lcds/default.mspx
LCDS là công cụ tạo bài giảng E-Learning được phát triển bởi Microsoft. Điểm nổi bật của LCDS là giao diện trực quan, đơn giản; do vậy LCDS rất dễ sử dụng. Hơn nữa, LCDS hỗ trợ Unicode và hoàn toàn miễn phí.
LCDS cho phép xuất bài giảng theo định dạng SCORM 1.2.

3. Adobe Presenter:
Đây là phần mềm chạy bổ sung cho PowerPoint, hỗ trợ thêm Powerpoint, biến Powerpoint trở thành một công cụ soạn bài giảng multimedia, eLearning dưới dạng Flash… rất đơn giản, mạnh mẽ và nhanh chóng. Cụ thể là: Giúp đưa và biên tập video, audio, hoạt hình, thuyết minh, câu hỏi trắc nghiệm, tương tác cũng như các phần mềm mô phỏng vào powerpoint.
With just a few clicks in PowerPoint, you can transform drab presentations into engaging Adobe® Flash® multimedia experiences. Easily add narration, animations, interactivity, quizzes, and software simulations to eLearning courses.
Key capabilities
•Easily create professional Flash presentations and self-paced courses complete with narration and interactivity.
•Import and edit video in any format and export as SWF.
•Record and edit high-quality audio.
•Help ensure consistency with branding and customization.
•Deliver advanced quizzes and surveys with question pooling and randomization.
•Publish content as a PDF file, preserving all of your animations.
•Create AICC- and SCORM-compliant content.
•Integrate with Adobe Acrobat® ConnectTM Pro software to deploy, manage, deliver, and track content.
Thí dụ: Có thể upload bài giảng lên website http://hop.edu.net.vn/hoithao để trình chiếu bài giảng.
Có thể tải bản dùng thử Presenter 7.0 tại
http://www.adobe.com/products/presenter/?promoid=DJDXB

4. Adobe Authorware:
Website: http://www.adobe.com hoặc http://www.macromedia.com/
Công cụ tạo nội dung học tập của Macromedia. Đây là công cụ dễ dùng, tạo được nhiều dạng bài học khác nhau, và mạnh nhất hiện nay.

5. Daulsoft Lecture Maker:
Phần mềm soạn bài giảng điện tử eLearning dưới dạng multimedia rất tốt.
Tải bản dùng thử tại http://el.edu.net.vn/tools/daulsoft

6. Toolbook :
Website: http://www.click2learn.com/
ToolBook là công cụ soạn bài rất mạnh, gồm hai sản phẩm ToolBook Assistant, Toolbook Instructor. ToolBook Assistant giúp phát triển các cua học nhanh chóng, không đòi hỏi phải luyện tập, đào tạo nhiều. Trong khi đóToolBook Instructor là công cụ soạn bài toàn diện, dành cho nhiều nhà phát triển nội dung khác nhau. Với ToolBook, bạn có thể các cua học có tính tương tác cao với sự tham gia của nhiều đối tượng thông minh, có hỗ trợ mô phỏng và đánh giá.

7. Mindflash Web-Training Software :
Website: http://www.mindflash.com.
Công cụ soạn bài cho môi trường Web, dựa trên Word, PowerPoint, và Dreamweaver. Hỗ trợ hoàn toàn SCORM. Giúp quản lý tương tác với SME. Có thể tạo, quản lý, và theo dõi được đào tạo phức tạp, chi phí thấp.

8. Reload
Website: http://www.reload.ac.uk/
Dự án Reload là dự án mã nguồn mở, giúp bạn đóng gói và chỉnh sửa gói SCORM và IMS Content Packaging từ các tài nguyên có trước (tạo bằng Dreamweaver, FrontPage, Flash, etc) .

9. Lersus:
Website: http://www.lersus.de/content/enu/product-n-solutions/authoring-system/
Lersus hỗ trợ Unicode hoàn toàn, dễ sử dụng và có tính sư phạm cao. Phần mềm có thể xuất ra nhiều định dạng khác nhau tương thích tốt với các LMS/LCMS.

10. eXe (Mã nguồn mở) :
Website: http://exelearning.org/
Công cụ mã nguồn mở này được phát triển bởi đại học New Auckland – New Zealand. Giáo viên không cần các kiến thức về HTML, XML có thể phát triển các bài giảng điện tử offline (không cần kết nối vào mạng Internet)sau đó xuất ra dưới dạng các trang Web hoặc một gói tuân theo chuẩn SCORM hoặc IMS Content Packaging. Hiện tại, phiên bản mới nhất là 0.15, có thể tải về tại: http://exelearning.org/?q=downloads.

11 Crocodille Clips :
Website: http://www.crocodile-clips.com
Một tập công cụ giúp giáo viên tạo các thí nghiệm mô phỏng các hiện tượng vật lý, hóa học, cũng như các tính chất trong toán học và tin học. Phần mềm được đánh giá rất cao trên thế giới. Các bạn có thể tải các bản thử ngiệm tại website của công ty. Hy vọng phần mềm sẽ giúp các giáo viên thay đổi phương pháp giảng dạy của mình.

12. CabriLog :
Website: http://www.cabri.com/
Phần mềm giúp các giáo viên dạy toán cấp II và III nhanh chóng vẽ và tìm hiểu được các tính chất thú vị của hình học 2 chiều và 3 chiều. Các bạn có thể tải về các bản dùng thử tại website của công ty.

13. CouserLabs:
Website: http://www.courselab.com
Đứng đầu công cụ chuyên nghiệp, dễ sử dụng cho soạn giáo trình, giáo án, bài test, QA và Mô hình mô phỏng, chấm điểm Online / Offline
trong hệ thống các ứng dụng E-Learning, miễn phí / e-commerce đều có khá đẩy đủ tính năng cần thiết để các bạn có thể trải nghiệm.
Xuất ra được hầu hết các chuẩn trên web như SCORM, IMS, CD/ DVD …

Phần 3. Cách đưa thêm công cụ đánh dấu – in – email và chia sẻ với các mạng xã hội trong .NET Framework:

Bước 1. Đăng ký 1 account trên trang http://www.addthis.com
Sau đó vào mục source code để tạo ra các bộ nút hoặc mẫu code hiển thị và các mạng xã hội cần chia sẻ.

Bước 2. Copy code JS vào source của layout.master hoặc trên các trang ascx của Pages để cho phép hiển thị nút “Bookmark and Share” trên trang của tin bạn

Sửa Workflow trong MojoPortal


MojoPortal đã thiết kế sẵn trường “DraftEditOnlyRoles” của bảng Pages và “DraftEditRoles” của bảng Modules. Đây là 2 quyền cho phép User chỉ có quyền được viết Draft và sửa Draft của mình.

– Đầu tiên chúng ta cần sửa lại ModuleTile để cho phép những User có quyền được viết Draft có thể nhìn thấy Link Add/Edit.

– Cấu hình Cho phép người sử dụng vào phần thêm bài mới.

– Cho phép những User có quyền EditDraft được sửa các bài Draft của mình.

1. Cho phép Role Draft thấy link Add/Edit:

Ta sẽ sửa File CS: mojoPortal.Web\Controls\SiteModuleControl.cs .

<những phần màu đỏ là những phần thêm vào trong Code>

namespace mojoPortal.Web

{

#if !MONO

public abstract class SiteModuleControl : mojoUserControl, IWebPart

#else

public abstract class SiteModuleControl : UserControl

#endif

{

private Module moduleConfiguration;

private bool isEditable = false;

//sử dụng biến isAddNew để kiểm tra xem User có thuộc Roles có quyền //được viết Draft trong Page hoặc Module hay không.

private bool isAddNew = false;

private bool forbidModuleSettings = false;

private int siteID = -1;

private Hashtable settings;

private bool renderInWebPartMode = false;

private string imageSiteRoot = string.Empty;

private bool isSiteEditor = false;

private bool enableWorkflow = false;

private bool IsOnInitExecuted = false;

protected PageSettings currentPage;

protected SiteSettings siteSettings;

protected ScriptManager ScriptController;

protected override void OnInit(EventArgs e)

{

// Alexander Yushchenko: workaround to make old custom modules work

// Before 03.19.2007 this method was “new” and called from descendant classes

// To avoid multiple self-calls a boolean flag is used

if (IsOnInitExecuted) return;

IsOnInitExecuted = true;

base.OnInit(e);

if (HttpContext.Current == null) { return; }

siteSettings = CacheHelper.GetCurrentSiteSettings();

currentPage = CacheHelper.GetCurrentPage();

ScriptController = (ScriptManager)Page.Master.FindControl(“ScriptManager1”);

if (siteSettings != null)

{

this.siteID = siteSettings.SiteId;

if (!WebUser.IsAdminOrContentAdmin)

{

forbidModuleSettings = WebUser.IsInRoles(siteSettings.RolesNotAllowedToEditModuleSettings);

}

}

if (Page.Request.IsAuthenticated)

{

isSiteEditor = SiteUtils.UserIsSiteEditor();

if (WebUser.IsAdminOrContentAdmin || isSiteEditor || WebUser.IsInRoles(currentPage.EditRoles)

|| ((moduleConfiguration != null)

&& (WebUser.IsInRoles(moduleConfiguration.AuthorizedEditRoles))

)

)

{

isEditable = true;

}

// kiểm tra User có quyền được DraftEditRoles trong Page hoặc Module:

if (WebUser.IsInRoles(currentPage.DraftEditOnlyRoles)

|| ((moduleConfiguration != null)

&& (WebUser.IsInRoles(moduleConfiguration.DraftEditRoles))

)

)

{

isAddNew = true;

}

if (WebConfigSettings.EnableContentWorkflow && siteSettings.EnableContentWorkflow && (this is IWorkflow))

{

enableWorkflow = true;

if (!isEditable)

{

if ((WebUser.IsInRoles(currentPage.DraftEditOnlyRoles)) || (WebUser.IsInRoles(moduleConfiguration.DraftEditRoles)))

{

isEditable = true;

}

}

}

if (!isEditable && (moduleConfiguration != null) && (moduleConfiguration.EditUserId > 0))

{

SiteUser siteUser = SiteUtils.GetCurrentSiteUser();

if (

(siteUser != null)

&&(moduleConfiguration.EditUserId == siteUser.UserId)

)

{

isEditable = true;

}

}

}

if (moduleConfiguration != null)

{

this.m_title = moduleConfiguration.ModuleTitle;

this.m_description = moduleConfiguration.FeatureName;

}

}

#if !MONO

[Personalizable(PersonalizationScope.Shared)]

#endif

public bool RenderInWebPartMode

{

get { return renderInWebPartMode; }

set { renderInWebPartMode = value; }

}

#if !MONO

[Personalizable(PersonalizationScope.Shared)]

#endif

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public int ModuleId

{

get { return moduleConfiguration == null ? 0 : moduleConfiguration.ModuleId; }

set

{

if (moduleConfiguration == null) moduleConfiguration = new Module(value);

moduleConfiguration.ModuleId = value;

}

}

public Guid ModuleGuid

{

get { return moduleConfiguration == null ? Guid.Empty : moduleConfiguration.ModuleGuid; }

set

{

if (moduleConfiguration == null) moduleConfiguration = new Module(value);

moduleConfiguration.ModuleGuid = value;

}

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public int PageId

{

get { return moduleConfiguration == null ? 0 : moduleConfiguration.PageId; }

}

public string SiteRoot

{

get

{

if ((siteSettings != null)

&&(siteSettings.SiteFolderName.Length > 0))

{

return siteSettings.SiteRoot;

}

return WebUtils.GetSiteRoot();

}

}

public string ImageSiteRoot

{

get

{

if (imageSiteRoot.Length == 0)

{

imageSiteRoot = WebUtils.GetSiteRoot();

}

return imageSiteRoot;

}

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public int SiteId

{

get { return siteID; }

set { siteID = value; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public bool IsEditable

{

get { return isEditable; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public bool IsAddNew

{

get { return isAddNew; }

}

public bool ForbidModuleSettings

{

get { return forbidModuleSettings; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public bool EnableWorkflow

{

get { return enableWorkflow; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public Module ModuleConfiguration

{

get { return moduleConfiguration; }

set { moduleConfiguration = value; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public Hashtable Settings

{

get

{

if (settings == null) settings = ModuleSettings.GetModuleSettings(ModuleId);

return settings;

}

}

#region IWebPart Members

private string m_title = String.Empty;

private string m_subTitle = String.Empty;

private string m_description = String.Empty;

private string m_titleUrl = String.Empty;

private string m_titleIconImageUrl = String.Empty;

private string m_catalogIconImageUrl = String.Empty;

// Title

public string Title

{

get

{

return m_title;

}

set

{

m_title = value;

}

}

// Subtitle

public string Subtitle

{

get

{

return m_subTitle;

}

set

{

m_subTitle = value;

}

}

// Description

public string Description

{

get

{

return m_description;

}

set

{

m_description = value;

}

}

// TitleUrl

public string TitleUrl

{

get

{

return m_titleUrl;

}

set

{

m_titleUrl = value;

}

}

// TitleIconImageUrl

public string TitleIconImageUrl

{

get

{

return m_titleIconImageUrl;

}

set

{

m_titleIconImageUrl = value;

}

}

// CatalogIconImageUrl

public string CatalogIconImageUrl

{

get

{

return m_catalogIconImageUrl;

}

set

{

m_catalogIconImageUrl = value;

}

}

#endregion

}

}

Sửa file CS: mojoPortal.Web\Controls\ModuleTitleControl.cs

<những phần màu đỏ là những phần thêm vào trong Code>

namespace mojoPortal.Web.UI

{

public class ModuleTitleControl : WebControl, INamingContainer

{

#region Constructors

public ModuleTitleControl()

{

//if (this.Site != null && this.Site.DesignMode)

//{

// this.Visible = false;

// return;

//}

if (HttpContext.Current == null) { return; }

EnsureChildControls();

}

#endregion

#region Control Declarations

protected Literal litModuleTitle;

protected HyperLink lnkModuleSettings;

protected HyperLink lnkModuleEdit;

protected ImageButton ibPostDraftContentForApproval;

protected ImageButton ibApproveContent;

protected HyperLink lnkRejectContent;

protected ImageButton ibCancelChanges;

protected ClueTipHelpLink statusLink;

#endregion

private string literalExtraMarkup = string.Empty;

private bool disabledModuleSettingsLink = false;

private Module module = null;

private string editUrl = string.Empty;

private string editText = string.Empty;

//private bool useHTag = true;

private bool canEdit = false;

//khai báo biến canAdd cho phép hiển thị Link Add/Edit

private bool canAdd = false;

private bool forbidModuleSettings = false;

private bool showEditLinkOverride = false;

private bool enableWorkflow = false;

private SiteModuleControl siteModule = null;

private ContentWorkflowStatus workflowStatus = ContentWorkflowStatus.None;

private string siteRoot = string.Empty;

private bool isAdminEditor = false;

private bool useHeading = true;

private string columnId = UIHelper.CenterColumnId;

private string artHeader = UIHelper.ArtisteerPostMetaHeader;

private string artHeadingCss = UIHelper.ArtPostHeader;

#region Public Properties

public Module ModuleInstance

{

get { return module; }

set { module = value; }

}

public string LiteralExtraMarkup

{

get { return literalExtraMarkup; }

set { literalExtraMarkup = value; }

}

public string EditUrl

{

get { return editUrl; }

set { editUrl = value; }

}

public string EditText

{

get { return editText; }

set { editText = value; }

}

public bool UseHeading

{

get { return useHeading; }

set { useHeading = value; }

}

public bool DisabledModuleSettingsLink

{

get { return disabledModuleSettingsLink; }

set { disabledModuleSettingsLink = value; }

}

public bool CanEdit

{

get { return canEdit; }

set { canEdit = value; }

}

public bool CanAdd

{

get { return canAdd; }

set { canAdd = value; }

}

public bool IsAdminEditor

{

get { return isAdminEditor; }

set { isAdminEditor = value; }

}

public bool ShowEditLinkOverride

{

get { return showEditLinkOverride; }

set { showEditLinkOverride = value; }

}

public ContentWorkflowStatus WorkflowStatus

{

get { return workflowStatus; }

set { workflowStatus = value; }

}

private bool renderArtisteer = false;

public bool RenderArtisteer

{

get { return renderArtisteer; }

set { renderArtisteer = value; }

}

private bool useLowerCaseArtisteerClasses = false;

public bool UseLowerCaseArtisteerClasses

{

get { return useLowerCaseArtisteerClasses; }

set { useLowerCaseArtisteerClasses = value; }

}

#endregion

private SiteModuleControl GetParentAsSiteModelControl(Control child)

{

if (HttpContext.Current == null) { return null; }

if (child.Parent == null)

{

return null;

}

else if (child.Parent is SiteModuleControl)

{

return child.Parent as SiteModuleControl;

}

else

{

return GetParentAsSiteModelControl(child.Parent);

}

}

protected override void Render(HtmlTextWriter writer)

{

if (HttpContext.Current == null)

{

writer.Write(“[” + this.ID + “]”);

return;

}

else

{

if ((useHeading)&&(renderArtisteer))

{

writer.Write(“<div class=\”” + artHeader + “\”>\n”);

if ((artHeader == UIHelper.ArtisteerBlockHeader)||(artHeader == UIHelper.ArtisteerBlockHeaderLower))

{

writer.Write(“<div class=\”l\”></div>”);

writer.Write(“<div class=\”r\”></div>”);

writer.Write(“<div class=\”art-header-tag-icon\”>”);

writer.Write(“<div class=\”t\”>”);

}

}

if (module != null)

{

writer.Write(“<a id=’module” + module.ModuleId.ToString(CultureInfo.InvariantCulture) + “‘></a>”);

}

string headingTag = WebConfigSettings.ModuleTitleTag;

if ((useHeading)&&(headingTag.Length > 0))

{

writer.WriteBeginTag(headingTag);

writer.WriteAttribute(“class”, artHeadingCss + ” moduletitle”);

writer.Write(HtmlTextWriter.TagRightChar);

}

litModuleTitle.RenderControl(writer);

if (CanEdit)

{

if (!forbidModuleSettings)

{

writer.Write(HtmlTextWriter.SpaceChar);

lnkModuleSettings.RenderControl(writer);

}

if (ibCancelChanges != null && ibCancelChanges.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

ibCancelChanges.RenderControl(writer);

}

if (ibPostDraftContentForApproval != null && ibPostDraftContentForApproval.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

ibPostDraftContentForApproval.RenderControl(writer);

}

if (lnkRejectContent != null && lnkRejectContent.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

lnkRejectContent.RenderControl(writer);

}

if (ibApproveContent != null && ibApproveContent.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

ibApproveContent.RenderControl(writer);

}

if (statusLink != null && statusLink.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

statusLink.ToolTip = Resource.WorkflowStatus;

statusLink.RenderControl(writer);

}

}

if (

(lnkModuleEdit != null)

&& (EditUrl != null)

&& (EditText != null)

)

{

writer.Write(HtmlTextWriter.SpaceChar);

lnkModuleEdit.RenderControl(writer);

}

if (literalExtraMarkup.Length > 0)

{

writer.Write(literalExtraMarkup);

}

if ((useHeading)&&(headingTag.Length > 0))

{

writer.WriteEndTag(headingTag);

}

if ((useHeading) && (renderArtisteer))

{

writer.Write(“</div>”);

if ((artHeader == UIHelper.ArtisteerBlockHeader) || (artHeader == UIHelper.ArtisteerBlockHeaderLower))

{

writer.Write(“</div>”);

writer.Write(“</div>”);

}

}

}

}

void ibApproveContent_Click(object sender, ImageClickEventArgs e)

{

SiteModuleControl siteModule = GetParentAsSiteModelControl(this);

if (siteModule == null) { return; }

if (!(siteModule is IWorkflow)) { return; }

IWorkflow workflow = siteModule as IWorkflow;

workflow.Approve();

}

protected void ibPostDraftContentForApproval_Click(object sender, ImageClickEventArgs e)

{

SiteModuleControl siteModule = GetParentAsSiteModelControl(this);

if (siteModule == null) { return; }

if (!(siteModule is IWorkflow)) { return; }

IWorkflow workflow = siteModule as IWorkflow;

workflow.SubmitForApproval();

}

protected void ibCancelChanges_Click(object sender, ImageClickEventArgs e)

{

SiteModuleControl siteModule = GetParentAsSiteModelControl(this);

if (siteModule == null) { return; }

if (!(siteModule is IWorkflow)) { return; }

IWorkflow workflow = siteModule as IWorkflow;

workflow.CancelChanges();

}

protected override void OnPreRender(EventArgs e)

{

base.OnPreRender(e);

if (HttpContext.Current == null) { return; }

if ((useHeading) && (renderArtisteer))

{

columnId = this.GetColumnId();

if (useLowerCaseArtisteerClasses)

{

artHeader = UIHelper.ArtisteerPostMetaHeaderLower;

artHeadingCss = UIHelper.ArtPostHeaderLower;

}

switch (columnId)

{

case UIHelper.LeftColumnId:

case UIHelper.RightColumnId:

if (useLowerCaseArtisteerClasses)

{

if ((artHeader == UIHelper.ArtisteerPostMetaHeader)||(artHeader == UIHelper.ArtisteerPostMetaHeaderLower))

{

artHeader = UIHelper.ArtisteerBlockHeaderLower;

}

}

else

{

if (artHeader == UIHelper.ArtisteerPostMetaHeader)

{

artHeader = UIHelper.ArtisteerBlockHeader;

}

}

artHeadingCss = string.Empty;

break;

case UIHelper.CenterColumnId:

default:

break;

}

}

Initialize();

}

private void Initialize()

{

if (HttpContext.Current == null) { return; }

siteModule = GetParentAsSiteModelControl(this);

bool useTextLinksForFeatureSettings = true;

mojoBasePage basePage = Page as mojoBasePage;

if (basePage != null)

{

useTextLinksForFeatureSettings = basePage.UseTextLinksForFeatureSettings;

}

if (siteModule != null)

{

module = siteModule.ModuleConfiguration;

CanEdit = siteModule.IsEditable;

CanAdd = siteModule.IsAddNew;

enableWorkflow = siteModule.EnableWorkflow;

forbidModuleSettings = siteModule.ForbidModuleSettings;

}

if (module != null)

{

if (module.ShowTitle)

{

litModuleTitle.Text = Page.Server.HtmlEncode(module.ModuleTitle);

}

else

{

useHeading = false;

}

if (CanEdit)

{

if (!disabledModuleSettingsLink)

{

lnkModuleSettings.Visible = true;

lnkModuleSettings.Text = Resource.SettingsLink;

lnkModuleSettings.ToolTip = Resource.ModuleEditSettings;

if (!useTextLinksForFeatureSettings)

{

lnkModuleSettings.ImageUrl = Page.ResolveUrl(“~/Data/SiteImages/” + WebConfigSettings.EditPropertiesImage);

}

else

{

// if its a text link make it small like the edit link

lnkModuleSettings.CssClass = “ModuleEditLink”;

}

siteRoot = SiteUtils.GetNavigationSiteRoot();

lnkModuleSettings.NavigateUrl = siteRoot

+ “/Admin/ModuleSettings.aspx?mid=” + module.ModuleId.ToInvariantString()

+ “&pageid=” + module.PageId.ToInvariantString();

if ((enableWorkflow) && (siteModule != null) && (siteModule is IWorkflow))

{

SetupWorkflowControls();

}

}

}

// thêm CanAdd=true thì sẽ hiện Link Add/Edit

if (

((CanEdit) || (ShowEditLinkOverride) || (CanAdd))

&& ((EditText != null) && (EditUrl != null)))

{

lnkModuleEdit.Text = EditText;

if (this.ToolTip.Length > 0)

{

lnkModuleEdit.ToolTip = this.ToolTip;

}

else

{

lnkModuleEdit.ToolTip = EditText;

}

lnkModuleEdit.NavigateUrl = EditUrl

+ “?mid=” + module.ModuleId.ToInvariantString()

+ “&pageid=” + module.PageId.ToInvariantString();

if (!useTextLinksForFeatureSettings)

{

lnkModuleEdit.ImageUrl = Page.ResolveUrl(“~/Data/SiteImages/” + WebConfigSettings.EditContentImage);

}

}

}

}

private void SetupWorkflowControls()

{

if (HttpContext.Current == null) { return; }

if (siteModule == null) { return; }

if (module == null) { return; }

CmsPage cmsPage = this.Page as CmsPage;

if ((cmsPage != null) && (cmsPage.ViewMode == PageViewMode.WorkInProgress))

{

switch (workflowStatus)

{

case ContentWorkflowStatus.Draft:

ibPostDraftContentForApproval.ImageUrl = Page.ResolveUrl(WebConfigSettings.RequestApprovalImage);

ibPostDraftContentForApproval.ToolTip = Resource.RequestApprovalToolTip;

ibPostDraftContentForApproval.Visible = true;

statusLink.HelpKey = “workflowstatus-draft-help”;

break;

case ContentWorkflowStatus.AwaitingApproval:

//if (WebUser.IsAdminOrContentAdminOrContentPublisher)

if(

(cmsPage.CurrentPage != null)

&&(

(isAdminEditor || WebUser.IsInRoles(cmsPage.CurrentPage.EditRoles)) || (WebUser.IsInRoles(this.module.AuthorizedEditRoles))

)

)

{

//add in the reject and approve links:

ibApproveContent.ImageUrl = Page.ResolveUrl(WebConfigSettings.ApproveContentImage);

ibApproveContent.Visible = true;

ibApproveContent.ToolTip = Resource.ApproveContentToolTip;

lnkRejectContent.NavigateUrl =

siteRoot

+ “/Admin/RejectContent.aspx?mid=” + module.ModuleId.ToInvariantString()

+ “&pageid=” + module.PageId.ToInvariantString();

lnkRejectContent.ImageUrl = Page.ResolveUrl(WebConfigSettings.RejectContentImage);

lnkRejectContent.ToolTip = Resource.RejectContentToolTip;

lnkRejectContent.Visible = true;

}

statusLink.HelpKey = “workflowstatus-awaitingapproval-help”;

break;

case ContentWorkflowStatus.ApprovalRejected:

statusLink.HelpKey = “workflowstatus-rejected-help”;

break;

}

if (

(workflowStatus != ContentWorkflowStatus.Cancelled)

&& (workflowStatus != ContentWorkflowStatus.Approved)

&& (workflowStatus != ContentWorkflowStatus.None)

)

{

//allow changes to be cancelled:

ibCancelChanges.ImageUrl = Page.ResolveUrl(WebConfigSettings.CancelContentChangesImage);

ibCancelChanges.ToolTip = Resource.CancelChangesToolTip;

ibCancelChanges.Visible = true;

}

}

}

protected override void CreateChildControls()

{

if (HttpContext.Current == null) { return; }

litModuleTitle = new Literal();

//this.Controls.Add(litModuleTitle);

lnkModuleSettings = new HyperLink();

lnkModuleSettings.CssClass = “modulesettingslink”;

//this.Controls.Add(lnkModuleSettings);

lnkModuleEdit = new HyperLink();

//this.Controls.Add(lnkModuleEdit);

lnkModuleEdit.CssClass = “ModuleEditLink”;

lnkModuleEdit.SkinID = “plain”;

ibPostDraftContentForApproval = new ImageButton();

ibPostDraftContentForApproval.ID = “lbPostDraftContentForApproval”;

ibPostDraftContentForApproval.CssClass = “ModulePostDraftForApprovalLink”;

ibPostDraftContentForApproval.SkinID = “plain”;

ibPostDraftContentForApproval.Visible = false;

ibPostDraftContentForApproval.Click += new ImageClickEventHandler(ibPostDraftContentForApproval_Click);

this.Controls.Add(ibPostDraftContentForApproval);

ibApproveContent = new ImageButton();

ibApproveContent.ID = “ibApproveContent”;

ibApproveContent.CssClass = “ModuleApproveContentLink”;

ibApproveContent.SkinID = “plain”;

ibApproveContent.Visible = false;

ibApproveContent.Click += new ImageClickEventHandler(ibApproveContent_Click);

this.Controls.Add(ibApproveContent);

lnkRejectContent = new HyperLink();

lnkRejectContent.ID = “ibRejectContent”;

lnkRejectContent.CssClass = “ModuleRejectContentLink”;

lnkRejectContent.SkinID = “plain”;

lnkRejectContent.Visible = false;

ibCancelChanges = new ImageButton();

ibCancelChanges.ID = “ibCancelChanges”;

ibCancelChanges.CssClass = “ModuleCancelChangesLink”;

ibCancelChanges.SkinID = “plain”;

ibCancelChanges.Visible = false;

UIHelper.AddConfirmationDialog(ibCancelChanges, Resource.CancelContentChangesButtonWarning);

ibCancelChanges.Click += new ImageClickEventHandler(ibCancelChanges_Click);

this.Controls.Add(ibCancelChanges);

statusLink = new ClueTipHelpLink();

this.Controls.Add(statusLink);

}

}

}

2. Cho phép những User có quyền Draft được vào thêm và sửa bài:

Sửa File CS: Web\Components\MojoBasePage.cs

<phần màu đỏ là được thêm vào>

//Ta sửa lại Method UserCanEditModule, Method này cho phép những User //có Roles Admin hoặc Edit Page và Mudole sẽ trả về true. Ta thêm những //User có Roles Draft của Page và Module cũng trả vè True.

public bool UserCanEditModule(int moduleId)

{

if(!Request.IsAuthenticated)return false;

if (WebUser.IsAdminOrContentAdmin) return true;

if (SiteUtils.UserIsSiteEditor()) { return true; }

if (CurrentPage == null) return false;

bool moduleFoundOnPage = false;

foreach (Module m in CurrentPage.Modules)

{

if (m.ModuleId == moduleId) moduleFoundOnPage = true;

}

if (!moduleFoundOnPage) return false;

if (WebUser.IsInRoles(CurrentPage.EditRoles)) return true;

//

if (WebUser.IsInRoles(CurrentPage.DraftEditOnlyRoles)) return true;

SiteUser currentUser = SiteUtils.GetCurrentSiteUser();

if (currentUser == null) return false;

foreach (Module m in CurrentPage.Modules)

{

if (m.ModuleId == moduleId)

{

if (m.EditUserId == currentUser.UserId) return true;

if (WebUser.IsInRoles(m.AuthorizedEditRoles)) return true;

if (WebUser.IsInRoles(m.DraftEditRoles)) return true;

}

}

return false;

}

//Thêm Method: kiểm tra xem những User có quyền được vào Thêm và Sửa bài có phải là User có Roles Draft hay không, nếu đúng tra về true.

public bool USerCanpublish(int moduleId)

{

if (WebUser.IsAdminOrContentAdmin) return true;

if (SiteUtils.UserIsSiteEditor()) { return true; }

if (WebUser.IsInRoles(CurrentPage.EditRoles)) return true;

//

if (WebUser.IsInRoles(CurrentPage.DraftEditOnlyRoles)) return false;

SiteUser currentUser = SiteUtils.GetCurrentSiteUser();

foreach (Module m in CurrentPage.Modules)

{

if (m.ModuleId == moduleId)

{

if (m.EditUserId == currentUser.UserId) return true;

if (WebUser.IsInRoles(m.AuthorizedEditRoles)) return true;

if (WebUser.IsInRoles(m.DraftEditRoles)) return false;

}

}

return false;

}

Sửa File : mojoPortal.Features.UI\Blog\EditPost.aspx.cs

<phần màu đỏ là được thêm vào>

//sửa trong Page_Load. Sử dụng USerDraft ở trang MojoBasePage.cs

private void Page_Load(object sender, EventArgs e)

{

if (!Request.IsAuthenticated)

{

SiteUtils.RedirectToLoginPage(this);

return;

}

//nếu những User có Roles Draft thì sẽ ẩn đi các control

if (!USerCanpublish(moduleId))

{

chkIsPublished.Visible = false;

chkIsPublished.Checked = false;

btnAddCategory.Visible = false;

txtCategory.Visible = false;

lnkEditCategories.Visible = false;

}

SecurityHelper.DisableBrowserCache();

LoadParams();

if (!UserCanEditModule(moduleId))

{

SiteUtils.RedirectToEditAccessDeniedPage();

return;

}

if (ScriptController != null)

{

ScriptController.RegisterAsyncPostBackControl(btnAddCategory);

}

else

{

log.Error(“ScriptController was null”);

}

LoadSettings();

PopulateLabels();

SetupScripts();

if ((!Page.IsPostBack) && (!Page.IsCallback))

{

if ((Request.UrlReferrer != null) && (hdnReturnUrl.Value.Length == 0))

{

hdnReturnUrl.Value = Request.UrlReferrer.ToString();

lnkCancel.NavigateUrl = Request.UrlReferrer.ToString();

lnkCancel2.NavigateUrl = lnkCancel.NavigateUrl;

lnkCancel3.NavigateUrl = lnkCancel.NavigateUrl;

}

PopulateControls();

PopulateCategories();

BindMeta();

BindMetaLinks();

}

}

//sửa Method LoadParams: những User chỉ có quyền viết Draft thì //sẽ chỉ sửa được các bài viết Draft của mình khi chưa được //publish. Còn nếu như cố gắng vào thì sẽ vào phần thêm mới chứ //không phải sửa.

private void LoadParams()

{

timeOffset = SiteUtils.GetUserTimeOffset();

pageId = WebUtils.ParseInt32FromQueryString(“pageid”, -1);

moduleId = WebUtils.ParseInt32FromQueryString(“mid”, -1);

itemId = WebUtils.ParseInt32FromQueryString(“ItemID”, -1);

restoreGuid = WebUtils.ParseGuidFromQueryString(“r”, restoreGuid);

cacheDependencyKey = “Module-” + moduleId.ToString(CultureInfo.InvariantCulture);

virtualRoot = WebUtils.GetApplicationRoot();

//txtCategory.Text = itemId.ToString();

if (itemId > -1)

{

blog = new Blog(itemId);

bool ispublish = blog.IsPublished;

Guid userGuidBlog;

Guid userGuidCurrent;

SiteUser siteUserCurrent = SiteUtils.GetCurrentSiteUser();

userGuidBlog = blog.UserGuid;

userGuidCurrent = siteUserCurrent.UserGuid;

if (!USerCanpublish(moduleId))

{

if (!userGuidCurrent.Equals(userGuidBlog) || ispublish)

{

itemId = -1;

blog = null;

}

}

}

if (moduleId > -1)

{

moduleSettings = ModuleSettings.GetModuleSettings(moduleId);

if (moduleSettings.Contains(“OdiogoFeedIDSetting”))

OdiogoFeedIDSetting = moduleSettings[“OdiogoFeedIDSetting”].ToString();

}

}

3. Cho phép những User có Roles Draft thì sẽ hiển thị Link EditDraft ở Module Blog khi có bài Draft của người đó, chỉ nhìn được các bài Draft của mình.

Phần này tôi sửa toàn bộ file Drafts.aspx trong: mojoPortal.Features.UI\Blog.

Bạn chạy file ProcedureDraftBlog.sql trong MSSQL

Import 2 file dll: hungtn.Business.dll và hungtn.Data.dll

Sửa lại code theo 3 file Drafts.aspx

Sửa file mojoPortal.Features.UI\Blog\ BlogModule.ascx.cs

Phần này cho phép hiện thị link EditDraft trong Module Blog.

Nếu những User có quyền Draft sẽ thấy link EditDraft nếu số bài trong Draft của người đó >0.

namespace mojoPortal.Web.BlogUI

{

public partial class BlogModule : SiteModuleControl

{

#region Properties

private static readonly ILog log = LogManager.GetLogger(typeof(BlogModule));

private int countOfDrafts = 0;

//đếm số bài Draft của User đăng nhập

private int countOfDraftsCreateByUser = 0;

private int pageNumber = 1;

private int totalPages = 1;

private int pageSize = 10;

private bool showPager = true;

private string instanceCssClass = string.Empty;

protected string addThisAccountId = string.Empty;

protected bool useAddThisMouseOverWidget = true;

protected string addThisCustomBrand = string.Empty;

protected string addThisButtonImageUrl = “~/Data/SiteImages/addthissharebutton.gif”;

protected string addThisCustomOptions = string.Empty;

protected string addThisCustomLogoUrl = string.Empty;

protected string addThisCustomLogoBackColor = string.Empty;

protected string addThisCustomLogoForeColor = string.Empty;

protected string feedburnerFeedUrl = string.Empty;

protected string EditContentImage = WebConfigSettings.EditContentImage;

protected string EditBlogAltText = “Edit”;

protected string BlogDateTimeFormat;

protected string FeedBackLabel;

protected bool ShowCalendar = false;

protected DateTime CalendarDate;

protected bool ShowCategories = false;

protected bool ShowArchives = false;

protected bool AllowComments = true;

protected bool NavigationOnRight = false;

protected bool ShowStatistics = true;

protected bool ShowFeedLinks = true;

protected bool ShowAddFeedLinks = true;

protected bool BlogUseLinkForHeading = true;

protected Double TimeOffset = 0;

protected string GmapApiKey = string.Empty;

protected int GoogleMapHeightSetting = 300;

protected int GoogleMapWidthSetting = 500;

protected bool GoogleMapEnableMapTypeSetting = false;

protected bool GoogleMapEnableZoomSetting = false;

protected bool GoogleMapShowInfoWindowSetting = false;

protected bool GoogleMapEnableLocalSearchSetting = false;

protected bool GoogleMapEnableDirectionsSetting = false;

protected int GoogleMapInitialZoomSetting = 13;

protected MapType mapType = MapType.G_SATELLITE_MAP;

protected string OdiogoFeedIDSetting = string.Empty;

protected bool UseExcerpt = false;

protected bool TitleOnly = false;

protected bool HideAddThisButton = false;

protected int ExcerptLength = 250;

protected string ExcerptSuffix = “…”;

protected string MoreLinkText = “read more”;

protected bool EnableContentRatingSetting = false;

protected bool EnableRatingCommentsSetting = false;

protected bool ShowPostAuthorSetting = false;

protected bool GoogleMapIncludeWithExcerptSetting = false;

protected bool ShowGoogleMap = true;

protected bool BlogUseTagCloudForCategoriesSetting = false;

protected string blogAuthor = string.Empty;

private string CommentSystem = “internal”;

private string DisqusSiteShortName = string.Empty;

protected string disqusFlag = string.Empty;

protected string IntenseDebateAccountId = string.Empty;

protected bool ShowCommentCounts = true;

protected string EditLinkText = BlogResources.BlogEditEntryLink;

protected string EditLinkTooltip = BlogResources.BlogEditEntryLink;

protected string EditLinkImageUrl = string.Empty;

#endregion

protected override void OnInit(EventArgs e)

{

base.OnInit(e);

this.Load += new EventHandler(Page_Load);

this.calBlogNav.SelectionChanged += new EventHandler(calBlogNav_SelectionChanged);

this.calBlogNav.VisibleMonthChanged += new MonthChangedEventHandler(CalBlogNavVisibleMonthChanged);

pgr.Command += new CommandEventHandler(pgr_Command);

this.EnableViewState = false;

}

protected virtual void Page_Load(object sender, EventArgs e)

{

LoadSettings();

SetupCss();

if (!RenderInWebPartMode)

{

SetupRssLink();

}

PopulateLabels();

if (!Page.IsPostBack)

{

PopulateControls();

}

}

private void PopulateControls()

{

BindBlogs();

PopulateNavigation();

}

private void BindBlogs()

{

using (IDataReader reader = Blog.GetPage(ModuleId, CalendarDate.Date.AddDays(1), pageNumber, pageSize, out totalPages))

{

rptBlogs.DataSource = reader;

rptBlogs.DataBind();

pgr.ShowFirstLast = true;

pgr.PageSize = pageSize;

pgr.PageCount = totalPages;

pgr.Visible = (totalPages > 1) && showPager;

}

}

void pgr_Command(object sender, CommandEventArgs e)

{

pageNumber = Convert.ToInt32(e.CommandArgument);

pgr.CurrentIndex = pageNumber;

PopulateControls();

updBlog.Update();

}

protected virtual void PopulateNavigation()

{

Feeds.ModuleSettings = Settings;

Feeds.PageId = PageId;

Feeds.ModuleId = ModuleId;

Feeds.Visible = ShowFeedLinks;

if(this.ShowCategories)

{

tags.CanEdit = IsEditable;

tags.PageId = PageId;

tags.ModuleId = ModuleId;

tags.SiteRoot = SiteRoot;

tags.RenderAsTagCloud = BlogUseTagCloudForCategoriesSetting;

}

else

{

tags.Visible = false;

this.pnlCategories.Visible = false;

}

if(this.ShowArchives)

{

archive.PageId = PageId;

archive.ModuleId = ModuleId;

archive.SiteRoot = SiteRoot;

}

else

{

archive.Visible = false;

this.pnlArchives.Visible = false;

}

stats.PageId = PageId;

stats.ModuleId = ModuleId;

stats.CountOfDrafts = countOfDrafts;

stats.Visible = ShowStatistics;

}

private void calBlogNav_SelectionChanged(object sender, EventArgs e)

{

System.Web.UI.WebControls.Calendar cal = (System.Web.UI.WebControls.Calendar)sender;

CalendarDate = cal.SelectedDate;

calBlogNav.VisibleDate = CalendarDate;

calBlogNav.SelectedDate = CalendarDate;

PopulateControls();

}

private void CalBlogNavVisibleMonthChanged(object sender, MonthChangedEventArgs e)

{

CalendarDate = e.NewDate;

calBlogNav.VisibleDate = CalendarDate;

calBlogNav.SelectedDate = CalendarDate;

PopulateControls();

}

protected virtual void PopulateLabels()

{

Title1.EditUrl = SiteRoot + “/Blog/EditPost.aspx”;

Title1.EditText = BlogResources.BlogAddPostLabel;

SiteUser siteUser = SiteUtils.GetCurrentSiteUser();

//Title1.EditText = countOfDraftsCreateByUser.ToString();

if ((IsEditable) && (countOfDrafts > 0))

{

//BlogEditCategoriesLabel

Title1.LiteralExtraMarkup =

“&nbsp;<a href='”

+ SiteRoot

+ “/Blog/EditCategory.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogEditCategoriesLabel + “‘>” + BlogResources.BlogEditCategoriesLabel + “</a>”

+ “&nbsp;<a href='”

+ SiteRoot

+ “/Blog/Drafts.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogDraftsLink + “‘>” + BlogResources.BlogDraftsLink + “</a>”;

}

else if (IsEditable)

{

Title1.LiteralExtraMarkup =

“&nbsp;<a href='”

+ SiteRoot

+ “/Blog/EditCategory.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogEditCategoriesLabel + “‘>” + BlogResources.BlogEditCategoriesLabel + “</a>”;

}

//kiểm tra nếu những User có quyền Draft và số bài Draft >0 sẽ hiện Link //EditDraft.

if (IsAddNew && (countOfDraftsCreateByUser>0))

{

Title1.LiteralExtraMarkup =

“&nbsp;<a href='”

+ SiteRoot

+ “/Blog/Drafts.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogDraftsLink + “‘>” + BlogResources.BlogDraftsLink + “</a>”;

}

calBlogNav.UseAccessibleHeader = true;

EditBlogAltText = BlogResources.EditImageAltText;

FeedBackLabel = BlogResources.BlogFeedbackLabel;

mojoBasePage basePage = Page as mojoBasePage;

if (basePage != null)

{

if (!basePage.UseTextLinksForFeatureSettings)

{

EditLinkImageUrl = ImageSiteRoot + “/Data/SiteImages/” + EditContentImage;

}

}

}

protected string FormatPostAuthor(string authorName)

{

if (ShowPostAuthorSetting)

{

if (blogAuthor.Length > 0)

{

return string.Format(CultureInfo.InvariantCulture,

BlogResources.PostAuthorFormat, blogAuthor);

}

return string.Format(CultureInfo.InvariantCulture,

BlogResources.PostAuthorFormat, authorName);

}

return string.Empty;

}

protected string FormatBlogEntry(string blogHtml, string excerpt, string url, int itemId)

{

if (UseExcerpt)

{

if ((excerpt.Length > 0)&&(excerpt != “<p> </p>”))

{

return excerpt + ExcerptSuffix + ” <a href='” + FormatBlogUrl(url, itemId) + “‘>” + MoreLinkText + “</a><div>&nbsp;</div>”;

}

string result = string.Empty;

if ((blogHtml.Length > ExcerptLength)&&(MoreLinkText.Length > 0))

{

result = UIHelper.CreateExcerpt(blogHtml, ExcerptLength, ExcerptSuffix);

result += ” <a href='” + FormatBlogTitleUrl(url, itemId) + “‘>” + MoreLinkText + “</a><div>&nbsp;</div>”;

return result;

}

}

return blogHtml;

}

protected string FormatBlogUrl(string itemUrl, int itemId)

{

if (itemUrl.Length > 0)

return SiteRoot + itemUrl.Replace(“~”, string.Empty) + disqusFlag;

return SiteRoot + “/Blog/ViewPost.aspx?pageid=” + PageId.ToInvariantString()

+ “&ItemID=” + itemId.ToInvariantString()

+ “&mid=” + ModuleId.ToInvariantString()

+ disqusFlag;

}

protected string FormatBlogTitleUrl(string itemUrl, int itemId)

{

if (itemUrl.Length > 0)

return SiteRoot + itemUrl.Replace(“~”, string.Empty);

return SiteRoot + “/Blog/ViewPost.aspx?pageid=” + PageId.ToInvariantString()

+ “&ItemID=” + itemId.ToInvariantString()

+ “&mid=” + ModuleId.ToInvariantString();

}

private string GetRssUrl()

{

if (feedburnerFeedUrl.Length > 0) return feedburnerFeedUrl;

return SiteRoot + “/blog” + ModuleId.ToInvariantString() + “rss.aspx”;

}

protected virtual void SetupRssLink()

{

if (this.ModuleConfiguration != null)

{

if (Page.Master != null)

{

Control head = Page.Master.FindControl(“Head1”);

if (head != null)

{

Literal rssLink = new Literal();

rssLink.Text = “<link rel=\”alternate\” type=\”application/rss+xml\” title=\””

+ this.ModuleConfiguration.ModuleTitle + “\” href=\””

+ GetRssUrl() + “\” />”;

head.Controls.Add(rssLink);

}

}

}

}

protected virtual void SetupCss()

{

// older skins have this

StyleSheet stylesheet = (StyleSheet)Page.Master.FindControl(“StyleSheet”);

if (stylesheet != null)

{

if (stylesheet.FindControl(“blogcss”) == null)

{

Literal cssLink = new Literal();

cssLink.ID = “blogcss”;

cssLink.Text = “\n<link href='”

+ SiteUtils.GetSkinBaseUrl()

+ “blogmodule.css’ type=’text/css’ rel=’stylesheet’ media=’screen’ />”;

stylesheet.Controls.Add(cssLink);

}

if (stylesheet.FindControl(“aspcalendar”) == null)

{

Literal cssLink = new Literal();

cssLink.ID = “aspcalendar”;

cssLink.Text = “\n<link href='”

+ SiteUtils.GetSkinBaseUrl()

+ “aspcalendar.css’ type=’text/css’ rel=’stylesheet’ media=’screen’ />”;

stylesheet.Controls.Add(cssLink);

}

}

}

protected virtual void LoadSettings()

{

TimeOffset = SiteUtils.GetUserTimeOffset();

GmapApiKey = SiteUtils.GetGmapApiKey();

addThisAccountId = siteSettings.AddThisDotComUsername;

try

{

// this keeps the action from changing during ajax postback in folder based sites

SiteUtils.SetFormAction(Page, Request.RawUrl);

}

catch (MissingMethodException)

{

//this method was introduced in .NET 3.5 SP1

}

pnlContainer.ModuleId = this.ModuleId;

if (this.ModuleConfiguration != null)

{

this.Title = this.ModuleConfiguration.ModuleTitle;

this.Description = this.ModuleConfiguration.FeatureName;

}

if (Page.Request.Params.Get(“blogdate”) != null)

{

//calendarDate = DateTime.Parse(Page.Request.Params.Get(“blogdate”));

DateTimeFormatInfo dtfi = CultureInfo.InvariantCulture.DateTimeFormat;

if (!DateTime.TryParse(Page.Request.Params.Get(“blogdate”), dtfi, DateTimeStyles.AdjustToUniversal, out CalendarDate))

{

CalendarDate = DateTime.UtcNow.Date;

}

}

else

{

CalendarDate = DateTime.UtcNow.Date;

}

if (CalendarDate > DateTime.UtcNow.Date)

{

CalendarDate = DateTime.UtcNow.Date;

}

UseExcerpt = WebUtils.ParseBoolFromHashtable(

Settings, “BlogUseExcerptSetting”, UseExcerpt);

TitleOnly = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowTitleOnlySetting”, TitleOnly);

showPager = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowPagerInListSetting”, showPager);

GoogleMapIncludeWithExcerptSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapIncludeWithExcerptSetting”, GoogleMapIncludeWithExcerptSetting);

if ((UseExcerpt) && (!GoogleMapIncludeWithExcerptSetting)) { ShowGoogleMap = false; }

EnableContentRatingSetting = WebUtils.ParseBoolFromHashtable(

Settings, “EnableContentRatingSetting”, EnableContentRatingSetting);

EnableRatingCommentsSetting = WebUtils.ParseBoolFromHashtable(

Settings, “EnableRatingCommentsSetting”, EnableRatingCommentsSetting);

if (UseExcerpt) { EnableContentRatingSetting = false; }

HideAddThisButton = WebUtils.ParseBoolFromHashtable(

Settings, “BlogHideAddThisButtonSetting”, HideAddThisButton);

ExcerptLength = WebUtils.ParseInt32FromHashtable(

Settings, “BlogExcerptLengthSetting”, ExcerptLength);

if (Settings.Contains(“BlogExcerptSuffixSetting”))

{

ExcerptSuffix = Settings[“BlogExcerptSuffixSetting”].ToString();

}

if (Settings.Contains(“BlogMoreLinkText”))

{

MoreLinkText = Settings[“BlogMoreLinkText”].ToString();

}

if (Settings.Contains(“BlogAuthorSetting”))

{

blogAuthor = Settings[“BlogAuthorSetting”].ToString();

}

if (Settings.Contains(“CustomCssClassSetting”))

{

instanceCssClass = Settings[“CustomCssClassSetting”].ToString();

}

if (instanceCssClass.Length > 0) { pnlWrapper.CssClass += ” ” + instanceCssClass; }

BlogDateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern;

if (Settings.Contains(“BlogDateTimeFormat”))

{

BlogDateTimeFormat = Settings[“BlogDateTimeFormat”].ToString().Trim();

if (BlogDateTimeFormat.Length > 0)

{

try

{

string d = DateTime.Now.ToString(BlogDateTimeFormat, CultureInfo.CurrentCulture);

}

catch (FormatException)

{

BlogDateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern;

}

}

else

{

BlogDateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern;

}

}

ShowCalendar = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowCalendarSetting”, false);

ShowCategories = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowCategoriesSetting”, false);

BlogUseTagCloudForCategoriesSetting = WebUtils.ParseBoolFromHashtable(

Settings, “BlogUseTagCloudForCategoriesSetting”, false);

ShowArchives = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowArchiveSetting”, false);

NavigationOnRight = WebUtils.ParseBoolFromHashtable(

Settings, “BlogNavigationOnRightSetting”, false);

ShowStatistics = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowStatisticsSetting”, true);

ShowFeedLinks = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowFeedLinksSetting”, true);

ShowAddFeedLinks = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowAddFeedLinksSetting”, true);

AllowComments = WebUtils.ParseBoolFromHashtable(

Settings, “BlogAllowComments”, true);

BlogUseLinkForHeading = WebUtils.ParseBoolFromHashtable(

Settings, “BlogUseLinkForHeading”, true);

ShowPostAuthorSetting = WebUtils.ParseBoolFromHashtable(

Settings, “ShowPostAuthorSetting”, ShowPostAuthorSetting);

if (Settings.Contains(“GoogleMapInitialMapTypeSetting”))

{

string gmType = Settings[“GoogleMapInitialMapTypeSetting”].ToString();

try

{

mapType = (MapType)Enum.Parse(typeof(MapType), gmType);

}

catch (ArgumentException) { }

}

GoogleMapHeightSetting = WebUtils.ParseInt32FromHashtable(

Settings, “GoogleMapHeightSetting”, GoogleMapHeightSetting);

GoogleMapWidthSetting = WebUtils.ParseInt32FromHashtable(

Settings, “GoogleMapWidthSetting”, GoogleMapWidthSetting);

GoogleMapEnableMapTypeSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableMapTypeSetting”, false);

GoogleMapEnableZoomSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableZoomSetting”, false);

GoogleMapShowInfoWindowSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapShowInfoWindowSetting”, false);

GoogleMapEnableLocalSearchSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableLocalSearchSetting”, false);

GoogleMapEnableDirectionsSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableDirectionsSetting”, false);

GoogleMapInitialZoomSetting = WebUtils.ParseInt32FromHashtable(

Settings, “GoogleMapInitialZoomSetting”, GoogleMapInitialZoomSetting);

pageSize = WebUtils.ParseInt32FromHashtable(

Settings, “BlogEntriesToShowSetting”, pageSize);

if (Settings.Contains(“OdiogoFeedIDSetting”))

OdiogoFeedIDSetting = Settings[“OdiogoFeedIDSetting”].ToString();

string altAddThisAccount = string.Empty;

if (Settings.Contains(“BlogAddThisDotComUsernameSetting”))

altAddThisAccount = Settings[“BlogAddThisDotComUsernameSetting”].ToString().Trim();

if (altAddThisAccount.Length > 0)

addThisAccountId = altAddThisAccount;

useAddThisMouseOverWidget = WebUtils.ParseBoolFromHashtable(

Settings, “BlogAddThisDotComUseMouseOverWidgetSetting”, useAddThisMouseOverWidget);

if (Settings.Contains(“BlogAddThisButtonImageUrlSetting”))

addThisButtonImageUrl = Settings[“BlogAddThisButtonImageUrlSetting”].ToString().Trim();

if (addThisButtonImageUrl.Length == 0)

addThisButtonImageUrl = “~/Data/SiteImages/addthissharebutton.gif”;

if (Settings.Contains(“BlogAddThisCustomBrandSetting”))

addThisCustomBrand = Settings[“BlogAddThisCustomBrandSetting”].ToString().Trim();

if (addThisCustomBrand.Length == 0)

addThisCustomBrand = siteSettings.SiteName;

if (Settings.Contains(“BlogAddThisCustomOptionsSetting”))

addThisCustomOptions = Settings[“BlogAddThisCustomOptionsSetting”].ToString().Trim();

if (Settings.Contains(“BlogAddThisCustomLogoUrlSetting”))

addThisCustomLogoUrl = Settings[“BlogAddThisCustomLogoUrlSetting”].ToString().Trim();

if (Settings.Contains(“BlogAddThisCustomLogoBackColorSetting”))

addThisCustomLogoBackColor = Settings[“BlogAddThisCustomLogoBackColorSetting”].ToString().Trim();

if (Settings.Contains(“BlogAddThisCustomLogoForeColorSetting”))

addThisCustomLogoForeColor = Settings[“BlogAddThisCustomLogoForeColorSetting”].ToString().Trim();

if (Settings.Contains(“BlogFeedburnerFeedUrl”))

feedburnerFeedUrl = Settings[“BlogFeedburnerFeedUrl”].ToString().Trim();

if (Settings.Contains(“DisqusSiteShortName”))

{

DisqusSiteShortName = Settings[“DisqusSiteShortName”].ToString();

}

if (Settings.Contains(“CommentSystemSetting”))

{

CommentSystem = Settings[“CommentSystemSetting”].ToString();

}

if (Settings.Contains(“IntenseDebateAccountId”))

{

IntenseDebateAccountId = Settings[“IntenseDebateAccountId”].ToString();

}

if (AllowComments)

{

if ((DisqusSiteShortName.Length > 0) && (CommentSystem == “disqus”))

{

disqusFlag = “#disqus_thread”;

disqus.SiteShortName = DisqusSiteShortName;

disqus.RenderCommentCountScript = true;

stats.ShowCommentCount = false;

}

if ((IntenseDebateAccountId.Length > 0) && (CommentSystem == “intensedebate”))

{

ShowCommentCounts = false;

stats.ShowCommentCount = false;

}

}

if (!this.NavigationOnRight)

{

this.divNav.CssClass = “blognavleft”;

this.divblog.CssClass = “blogcenter-leftnav”;

}

if (ShowCalendar)

{

this.calBlogNav.Visible = true;

try

{

calBlogNav.FirstDayOfWeek = (FirstDayOfWeek)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;

}

catch (ArgumentNullException) { }

catch (ArgumentOutOfRangeException) { }

catch (InvalidOperationException) { }

catch (InvalidCastException) { }

if (!Page.IsPostBack)

{

this.calBlogNav.SelectedDate = CalendarDate;

this.calBlogNav.VisibleDate = CalendarDate;

}

}

else

{

this.calBlogNav.Visible = false;

}

if (Settings.Contains(“BlogCopyrightSetting”))

{

lblCopyright.Text = Settings[“BlogCopyrightSetting”].ToString();

}

pnlStatistics.Visible = ShowStatistics;

divNav.Visible = false;

if (ShowCalendar

|| ShowArchives

|| ShowAddFeedLinks

|| ShowCategories

|| ShowFeedLinks

|| ShowStatistics)

{

divNav.Visible = true;

}

if (!divNav.Visible)

{

divblog.CssClass = “blogcenter-nonav”;

}

if (IsEditable)

{

countOfDrafts = Blog.CountOfDrafts(ModuleId);

}

//

if (IsAddNew)

{

Guid userGuid;

hnt_Blog htn_blog = new hnt_Blog();

SiteUser siteUser = SiteUtils.GetCurrentSiteUser();

userGuid = siteUser.UserGuid;

countOfDraftsCreateByUser = htn_blog.CountOfDraftsCreateByUser(ModuleId, userGuid);

}

}

}

}

Sửa file mojoPortal.Business.WebHelpers\ WebUser.cs:

Thêm 1 Method:

//kiem tra quyen được sửa bài nháp

public static bool HasEditDraftPermissions(int siteId, int moduleId, int pageId)

{

if (HttpContext.Current == null || HttpContext.Current.User == null) return false;

if (!HttpContext.Current.Request.IsAuthenticated) return false;

if (IsAdmin || IsContentAdmin) return true;

Module module = new Module(moduleId, pageId);

PageSettings pageSettings = new PageSettings(siteId, module.PageId);

if (pageSettings == null) return false;

if (pageSettings.PageId < 0) return false;

if (IsInRoles(pageSettings.EditRoles) || IsInRoles(module.AuthorizedEditRoles))

{

return true;

}

if (IsInRoles(pageSettings.DraftEditOnlyRoles) || IsInRoles(module.DraftEditRoles))

{

return true;

}

if (module.EditUserId > 0)

{

SiteSettings siteSettings = (SiteSettings)HttpContext.Current.Items[“SiteSettings”];

SiteUser siteUser = new SiteUser(siteSettings, HttpContext.Current.User.Identity.Name);

if (module.EditUserId == siteUser.UserId)

{

return true;

}

}

return false;

}

CÔNG TY TNHH NOVA SỐ – NOVA DIGITAL CO., LTD


LỊCH SỬ HÌNH THÀNH.

Cty TNHH NOVA DIGITAL được thành lập dưới sự tham gia cố vấn và đầu tư từ những chuyên gia công nghệ cao Microsoft, VMware, IBM, EMC với định hướng phát triển trở thành một trong những đơn vị hàng đầu về Sản xuất phần mềm Giải pháp, Tư vấn giải pháp, Dịch vụ Triển khai các Giải pháp phần mềm CNTT trong Quản lý Doanh nghiệp và Điều hành các hệ thống giải pháp Điện toán đám mây.

Đội ngũ nhân sự có năng lực, kinh nghiệm trên 10 năm về triển khai và đào tạo công nghệ, sở hữu nhiều chứng chỉ Quốc tế quan trọng đảm bảo khả năng cạnh tranh trong việc phát triển dịch vụ Đào tạo và triển khai giải pháp CNTT tại Việt Nam và các nước ĐNÁ.

LĨNH VỰC HOẠT ĐỘNG

Công ty TNHH NOVA DIGITAL hoạt động trong lĩnh vực Sản xuất phẩm mềm Quản lý bằng CNTT, Dịch vụ triển khai và Đào tạo CNTT với thế mạnh nhiều năm kinh nghiệm:

  • Phát triển dịch vụ đào tạo chuyên ngành Công nghệ thông tin – Kinh tế và Viễn thông.
  • Đối tác Hợp tác cung cấp các giải pháp CNTT cho 3 Hiệp hội chuyên ngành:
    • Hiệp hội Chế biến và Xuất khẩu Thuỷ sản Việt Nam – VASEP (hơn 500 Doanh nghiệp thành viên trong các lĩnh vực XNK, Chế biến, Sản xuất, Ngân hàng, Thương mại Thuỷ sản).  website: http://www.vasep.com.vn/ 
    • Hiệp hội Gỗ và Lâm sản Việt Nam (hơn 300 Doanh nghiệp thành viên trong các lĩnh vực XNK, chế biến, sản xuất, Ngân hàng, Thương mại Gỗ – nội thất). website:  http://vietfores.org/
    • Hiệp hội Chế biến và xuất khẩu Chè Việt Nam – VITAS ( hơn 80 Doanh nghiệp thành viên trong các lĩnh vực XNK, chế biến, sản xuất, Ngân hàng, Thương mại Chè – ẩm thực Việt Nam).  Website: http://www.vitas.org.vn
  • Các giải pháp phần mềm tin học vào ứng dụng cho doanh nghiệp vừa và nhỏ như:
    • Office 365 Cloud.
    • Cung cấp các phần mềm bản quyền của Microsoft, VMware, Lạc Việt cho Doanh nghiệp Việt Nam.
    • Chứng thư số của Viettel ISP cho khai báo thuế Việt Nam.
    • Hệ thống SMS của Viettel Telecom cho Quản lý sản xuất – Kinh tế.
  • Cung cấp giải phải pháp phần mềm tin học ứng dụng trong trường học Phổ thông và Đại học.
    • Hệ thống SMS của Viettel Telecom cho Quản lý Trường Đại học.
    • Hệ thống SMS Học bạ cho Quản lý Trường Phổ thông.
  • Đối tác triển khai giải pháp duy nhất của Microsoft Live@edu tại Việt Nam.
    • Triển khai hệ thống Exchange Online, SharePoint Online, Forefront Protection for Exchange Online, Skydrive.
    • Tích hợp hệ thống ADSync với Windows Live ID và SSO.
    • Triển khai các giải pháp SSO giữa Moodle hoặc SharePoint On-premise với Outlook Live.
    • Dịch vụ Đào tạo Live@edu for Administrators và Giáo viên các Trường Phổ thông – Đại học.
  • Đối tác duy nhất triển khai nâng cấp Office365 Education của Microsoft tại Việt Nam.
    • Nâng cấp từ Microsoft Live@edu sang Office 365 cho 300 trường PTCS, 128 trường PTTH, 40 Trường CĐ- Trung học chuyên nghiệp, 37 Trường Đại học,  20 Viện và Sau Đại học tại 39 tỉnh thành Việt Nam.
    • Cung cấp phần mềm và triển khai các giải pháp tích hợp, khai thác Office 365 cho toàn bộ các Trường tại Việt Nam.
    • Dịch vụ đào tạo Office 365 gồm 3 môn chuẩn của Microsoft:
      • Course 70-321 Deploying Office 365.
      • Course 70-323 Administering Office 365 for SMB.
      • Course 74-324 End User Office365 training.
  • Đại lý chính thức AER và LAR của Microsoft cung cấp phần mềm giáo dục tại Việt Nam.
  • Đối tác đạo tạo University và Triển khai giải pháp Ảo hoá Chuyên nghiệp của VMware tại Việt Nam.
    • Đại lý sản phẩm phần mềm ảo hoá VMware.
    • Đối tác đào tạo uỷ quyền của VMware tại Việt Nam.
    • Đối tác triển khai Service Solution IT Professional of VMware.
  • Trung tâm thi chứng chỉ Công nghệ Thông tin Quốc tế Prometric, Pearson Vue.
  • Xây dựng trang web điện tử, xây dựng cổng thông tin Doanh nghiệp.

 

CƠ CẤU TỔ CHỨC & NHÂN SỰ

Để thực hiện các chức năng nhiệm vụ phát triển dịch vụ Đào tạo, định hướng kinh doanh, cung cấp các giải pháp ứng dụng CNTT, đảm bảo dịch vụ hỗ trợ khách hàng và duy trì hoạt động của Trung tâm một cách hiệu quả, NOVA Digital đã xây dựng một cơ cấu tổ chức một cách chặt chẽ, hợp lý bao gồm các phòng ban có mối quan hệ hỗ trợ và phối hợp đồng bộ tạo nên một sức mạnh tập thể. Đáp ứng và cung cấp các dịch vụ phục vụ khách hàng Doanh nghiệp một cách toàn diện, chu đáo.

image

CEO: Giám đốc điều hành

CIO: Giám đốc kỹ thuật.

CMO: Giám đốc quản lý đối tác.

CFO: Trưởng quản lý tài chính kế toán.

AM: Quản lý khách hàng.

CCO: Trưởng quản lý chăm sóc khách hàng.

CTO: Trưởng quản lý kỹ thuật và triển khai hỗ trợ kỹ thuật Khách hàng.

 

NỀN TẢNG CÔNG NGHỆ – CHỨNG CHỈ NĂNG LỰC

Chứng chỉ công nghệ Microsoft MCP:

          Chứng chỉ chuyên ngành cao cấp về hệ thống mạng (MCITP)

          Chứng chỉ chuyên gia CNTT về SharePoint 2010 (MCM).

          Chứng chỉ chuyên gia CNTT về Dynamic CRM.

          Chứng chỉ chuyên gia về Đào tạo CNTT của Microsoft (MCT)

Partner Microsoft Live@edu

image

Đối tác duy nhất triển khai Microsoft Live@edu tại Việt Nam.

Microsoft Licensing Sales Specialist LAR & AER

Chứng chỉ cấp phép bán hàng chuyên khối Doanh nghiệp, chính phủ và Giáo dục.

 

Microsoft Office Specialist

Chứng chỉ chuyên ngành về hoạt động nghiệp vụ văn phòng

Microsoft Learning Solution

Ủy quyền của Microsoft về cung cấp các giải pháp cho Giáo dục và Đào tạo

Microsoft SharePoint Platform

          Cung cấp giải pháp Cổng thông tin điện tử và Microsoft Learning Gateway theo nền tảng SharePoint.

          Gia công phần mềm, triển khai dịch vụ hỗ trợ kỹ thuật cho các Trường Quốc tế và Đại học như: Hanoi University of Pharmacy – http://www.hup.edu.vn , UNISHANOI: http://portal.unishanoi.org

Microsoft Dynamic CRM

Giải pháp triển khai hệ thống Chăm sóc khách hàng

Microsoft Business Intelligence

          Giải pháp Doanh nghiệp thông minh chuyên cung cấp giải pháp BI 2008, BI 2012 trên nền Windows Server 2008 R2, Windows Server 2012 cho Hải Quan Việt Nam và Hiệp hội CBXN TS VASEP, Hiệp hội Chè VITAS.

Đối tác của SourceCode

image

Chuyên triển khai giải pháp “Business Process Management Solution” cho Doanh nghiệp Viễn thông Viettel Telecom tại 64 tỉnh thành.

Khảo thí thi chứng chỉ Quốc tế

image

          Chuyên tổ chức thi chứng chỉ CNTT của Microsoft, IBM, WMware.


SẢN PHẨM, GIẢI PHÁP & DỊCH VỤ

1.      Chương trình Microsoft Partner Program

          Đối tác của Microsoft phát triển mạng lưới và đánh giá, xác thực năng lực đối tác tại Việt Nam.

          Phát triển các gói sản phẩm, giải pháp cho các doanh nghiệp, đối tác.

          Đại lý chính thức cung cấp các phần mềm có bản quyền tại Việt Nam.

2.      Chương trình Microsoft LAR & AER (Microsoft Authorized Education Resller)

Tư vấn, cung cấp và đào tạo khai thác các phần mềm có bản quyền của Microsoft cho các đơn vị là Trường Đại học, Cao đẳng, THPT…

3.      Chương trình Live@edu và Office365 Cloud

Đối tác độc quyền triển khai cung cấp gói dịch vụ Microsoft Cloud miễn phí cho khối Giáo dục tại Việt Nam, Lào, Campuchia bao gồm:

          Hệ thống Email trực tuyến.

          Hệ thống cổng thông tin giáo dục trực tuyến.

          Hệ thống hội thảo trực tuyến.

          Hệ thống Microsoft Office trực tuyến.

          Hệ thống Dynamic CRM trực tuyến.

          Dịch vụ hỗ trợ, tư vấn và triển khai kỹ thuật Microsoft Cloud.

4.      Giải pháp phần mềm dựa trên nền tảng hạ tầng SharePoint và .Net Framework

          Cung cấp giải pháp cổng thông tin quản lý nội dung giáo trình, giáo án, trắc nghiệm cho khối giáo dục.

          Cung cấp giải pháp cổng thông tin quản lý nội dung giáo trình, giáo án, trắc nghiệm cho khối doanh nghiệp quản trị nhân sự.

5.      Giải pháp dịch vụ gia tăng trên di động (SMS Mobile)

Cung cấp giải pháp quản lý học sinh, sinh viên và phản hồi thông tin qua tổng đài nhắn tin thuê bao điện thoại di động.

6.      Phòng thi chứng chỉ Quốc tế được khảo thí ủy quyền của Prometric và Pearson Vue

Phòng thi đạt tiêu chuẩn Quốc tế được Prometric ủy quyền cho phép học viên thi và nhận các chứng chỉ chuyên ngành CNTT đạt chuẩn Quốc tế tại Việt Nam.

7.      Giải pháp ảo hóa hệ thống VMware

Đối tác độc quyền của VMware tại Việt Nam

          Tư vấn giải pháp.

          Triển khai hạ tầng.

          Đào tạo và chuyển giao công nghệ.

8.      Giải pháp phát triển dịch vụ trực tuyến trên nền Microsoft Cloud computing

Đối tác duy nhất tại Việt nam tư vấn, triển khai, đào tạo và chuyển giao công nghệ về các giải pháp trên nền Microsoft Cloud Apps.

KHÁCH HÀNG TIÊU BIỂU

Các thành viên xây dựng NOVA DIGITAL đều là những người có từ 10 – 16 năm kinh nghiệm triển khai trong các lĩnh vực:

1.      Dầu khí: PVOL

2.      Ngân hàng: Vietin Bank, VP Bank

3.      Bảo hiểm: Prudential, Manulife

4.      Vinamilk

5.      Đào tạo: RMIT University, de Heus, HUP, HUBT, HCMUT, NEU, HLU, Nhất Nghệ, DNU, HUESTAR.

6.      Hải Quan: Hải Quan Việt nam, FAO – FIIU – WCOO.

7.      Viễn Thông: Viettel Telecom.

8.      Truyền hình: VTC, Viettel Media, Mobiphone Media, PGM Senvang, HTC

 

CÁC DỰ ÁN TIÊU BIỂU ĐÃ THỰC HIỆN

Khách hàng Doanh nghiệp

Thời gian

Sản phẩm và dịch vụ cung cấp

Viettel Telecom

(64 tỉnh thành, 6000 người dùng).

2007

Giải pháp Quản lý Quy trình về Hợp đồng Mua Bán

của  K2Workflow SourceCode trên nền SharePoint Office 2007 Server

Microsoft

2008

Mô hình giải pháp SMS Mobile ứng dụng cho Nông thôn

VASEP

2011

Cổng thông tin chuyên ngành Thủy sản

http://www.vasep.com.vn

VITAS

2010

Công thông tin nội bộ Hiệp hội Chè

http://portal.vitas.org.vn

Microsoft for Education

Từ 2008 đến nay

Chương trình Live@edu triển khai tại Việt Nam cho:

– 300 trường PTCS

– 128 trường PTTH

– 40 Trường CĐ- Trung học chuyên nghiệp

– 37 Trường Đại học

– 20 Viện và Sau Đại học tại 39 tỉnh thành Việt Nam.

– 15 Trường Quốc tế.

VISC

2012

Trang học bạ trực tuyến Hocba.vn

http://hocba.vn

Viettel CA

2010

Cung cấp chữ ký số cho các ngành Thuế, Hải quan điện tử và các Doanh nghiệp thuê Hosting máy chủ.

NAT&L

2009

Tư vấn và triển khai giải pháp Mobile SMS Gateway của Microsoft UPG tại nhà máy mía đường Nghệ An.

Bộ Nông nghiệp (MART)

2009

Triển khai giải pháp thống kê giá nông nghiệp qua Mobile (Microsoft Project MIDAS)

Khách hàng GIÁO DỤC

Thời gian

Sản phẩm và dịch vụ cung cấp

Đại học Dược HN (Hanoi University of Pharmacy)

11.000 người dùng

2010

Triển khai giải pháp hạ tầng Web hosting, Sharepoint portal, Learning Geatway, hội thảo trực tuyến bằng Microsoft Lync Online.

Website: http://www.hup.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Văn Lang

25.000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, Moodle tích hợp Windows Live ID.

Website: http://www.vanlanguni.edu.vn/

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Bách Khoa TP.HCM

35.000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, PSA tích hợp Windows Live ID.

Website: http://www.hcmut.edu.vn/en

Kiểu dự án: Cloud and On-Premise

Đại học Tôn Đức Thắng

45.000 người dùng

2010

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Website: http://english.tdt.edu.vn/ 

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Đà nẵng

32.000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Moodle Learning với Windows Live ID.

Website: http://www.dnu.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Đại Học Dân lập Thăng Long

9000 người dùng

2008

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Joomla với Windows Live ID.

Website: http://thanglong.edu.vn/

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Đông Đô

5000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin ASP.Net với Windows Live ID.

Website: http://www.dongdo.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Quản trị Kinh Doanh Công nghệ HUBT

25.000 người dùng

2010

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Moodle Learning với Windows Live ID.

Website: http://www.hubt.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Khách hàng GIÁO DỤC QUỐC TẾ

Thời gian

Sản phẩm và dịch vụ cung cấp

Australian International School – Vietnam

 

1000 người dùng

2012 đến nay

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin SharePoint 2010 với Windows Live ID và SSO.

Website: http://www.aisvietnam.com

Kiểu dự án: Lai ghép điện toán đám mây

Kinder World Group

2000 người dùng

2010

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Joomla với Windows Live ID và SSO.

Website: http://kinderworld.net/

Kiểu dự án: Lai ghép điện toán đám mây

the International School Ho Chi Minh City (ISHCMC)

3000 người dùng

2011

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Joomla với Windows Live ID và SSO.

http://www.ishcmc.com/

UnisHanoi

1000 người dùng

2012 đến nay

Tư vấn giải pháp SharePoint, Exchange và triển khai Hạ dịch vụ quản lý hệ thống trọn gói

http://portal.unishanoi.org

 

ĐỐI TÁC CHIẾN LƯỢC CỦA NOVA DIGITAL

Doanh nghiệp mạnh về cung cấp giải pháp, thiết bị, dịch vụ  và phần mềm CNTT

image

Microsoft Small Business Specialist

Đối tác triển khai dịch vụ Office 365 cho Trường CĐ, ĐH và Doanh nghiệp

Đối tác chuyên triển khai và đào tạo các giải pháp Cổng thông tin SharePoint, BizTalk, SQL, Lync và Office Online.

image

Solution Service IT Professional

Đối tác chuyên triển khai giải pháp Ảo hoá vCenter & vCloud mạng Doanh nghiệp cho các Trường CĐ, ĐH và Doanh nghiệp.

image

Solution Service NAS Professional

Đối tác chuyên triển khai giải pháp Lưu trữ mạng nội bộ và Điện toán đám mây NAS to LAN & vCloud cho các Trường CĐ, ĐH và Doanh nghiệp.

image

 Service Provider SERVER & SAN Professional

Đối tác chuyên triển khai giải pháp Máy chủ Server & SAN cho các Trường CĐ, ĐH và Doanh nghiệp.

 

image

          Đối tác tư vấn và triển khai hệ thống phần mềm giải pháp dịch vụ khai báo Hải quan “E-Manifest Vietnam Customs”.

          Đối tác tư vấn và triển khai hệ thống Quản lý Nội dung số Truyền hình Viễn thông Viettel Media.

image

          Đối tác tư vấn và triển khai sản phẩm phần mềm Quản lý tài chính Khách hàng Doanh nghiệp ERP.

image

          Đối tác tư vấn và triển khai hệ thống Quản lý Nội dung số Truyền hình Tin tức VTC Media.

          Đối tác tư vấn và triển khai hạ tầng ảo hoá trong Đào tạo CNTT VTC Labs Management.

image

          Đối tác tư vấn và triển khai hệ thống Quản lý dịch vụ Ảo hoá Điện toán đám mây vCloud CMC IDC HCMC.

 

Doanh nghiệp tiên phong trong lĩnh vực Đào tạo CNTT

image

image

1.      Viện Đào tạo Công nghệ và Quản trị Robusta

2.      IPMAC.

3.      IT Academic Thang Long.

4.      NetPro IT Academic.

5.      Trung tâm CNTT Đại học Kinh doanh và Công nghệ Hà nội.

6.      Viện đào tạo CNTT & Viễn thông – Đại Học Mở Hà Nội.

7.      Viện Đào tạo Công nghệ sau đại học – Đại Học Bách Khoa Hà nội.

8.      Học viện CNTT – Kinh tế Quốc Dân.

9.      Trường Cao đẳng Công nghiệp Huế.

10.  Nhất Nghệ.

 

Đối tác Hiệp hội Doanh nghiệp Thông tấn

image

          14 năm Đối tác tư vấn và triển khai hỗ trợ nâng cao năng lực CNTT tại Hiệp hội Doanh nghiệp thủy sản Việt Nam (VASEP)

image

          4 năm Đối tác tư vấn và triển khai xây dựng, đào tạo năng lực quản lý nghiệp vụ văn phòng tại Hiệp hội Chè Việt Nam (VITAS)

 

image

          14 năm làm Đối tác tư vấn và hỗ trợ kỹ thuật  CNTT tại Doanh nghiệp sản xuất và chế biến đồ Gỗ nội thất trực thuộc Hội Gỗ Việt Nam

ĐỊNH HƯỚNG PHÁT TRIỂN TRONG TƯƠNG LAI

Chúng tôi cam kết

          Chất lượng dịch vụ là kim chỉ nam cho mọi hoạt động của chúng tôi do đó chúng tôi luôn tập trung để thỏa mãn yêu cầu của khách hàng với tinh thần phục vụ tận tụy và sự hiểu biết sâu sắc về nhu cầu đề ra.

          Cùng với đó chúng tôi không ngừng nâng cao năng lực công nghệ và cải tiến quy trình chất lượng nhằm cung cấp những sản phẩm và dịch vụ có chất lượng tốt nhất.

          Chân thành, chủ động trong việc xây dựng quan hệ đối tác để cùng phát triển.

          Đoàn kết nội bộ, nỗ lực phấn đấu vì một sự nghiệp Giáo dục tiến bộ.

          Tái đầu tư xã hội thông qua các hoạt động Giáo dục cộng đồng.

Chiến lược phát triển

          Chúng tôi không ngừng đầu tư để đảm bảo luôn đi trước và đón đầu công nghệ tiên tiến dựa trên những đối tác chiến lược lâu năm.

          Không ngừng mở rộng quan hệ đối tác tạo cơ hội phát triển lớn mạnh.

          Xây dựng mạng lưới khách hàng sâu rộng và bền vững.

          Đẩy mạnh công tác đào tạo, chuyển giao công nghệ với các hãng đối tác.

          Xây dựng chiến lược nhân sự ổn định dựa trên triết lý nhân bản sâu sắc.

          Hướng tới mục tiêu trở một trong những đơn vị tiên phong về cung cấp dịch vụ đào tạo và giải pháp công nghệ tại khu vực Châu Á Thái Bình Dương.

 

%d bloggers like this: