Thursday, June 8, 2017

Hướng dẫn cách chèn khung theo dõi Blog qua Email từ Mailchimp vào Website / Blog

Trong các bài viết trước, mình đã hướng dẫn các bạn cách đăng ký tài khoản Mailchimp để gửi Mail cho người đăng ký rồi. Trong bài viết này, mình sẽ hướng dẫn các bạn cách chèn khung đăng ký theo dõi qua Email với Mailchimp nhé.

Các bước thực hiện

Bước 1: Đăng nhập vào tài khoản mà bạn đã tạo trước đó. Tiếp đến chuyển tới menu List (quản lý các danh sách người dùng đăng ký).
menu list mailchimp
Bước 2: Bạn hãy chọn danh sách cần tạo khung đăng ký, click vào hình mũi tên chỉ xuống và chọn Signup forms.
signup forms
Bước 3: Bây giờ, chúng ta sẽ có một số lựa chọn cách thức hiển thị khung đăng ký như là: Embedded forms, Subscriber pop-up hay Form integrations.
Ở đây, mình chọn kiểu Embedded forms các kiểu khác thì tương tự nhé. Các bạn hãy click vào tên kiểu hoặc button Select để chọn hình thức.
chon kieu chen khung
Bước 4: Bây giờ, chúng ta sẽ được đưa tới trang thiết kế giao diện của khung theo dõi. Chúng ta sẽ có một vài tùy chọn chính như là: Có hiển thị tên Form không, có hiển thị khung nhập tên không,…
Tùy vào sở thích và mục đích mà các bạn hãy chọn những thứ phù hợp nhé. Sau khi hoàn tất việc thiết kế rồi thì các bạn hãy copy đoạn code trong khung bên dưới phần xem trước và dán vào vị trí muốn hiển thị trên website của mình.
copy code dan vao web
Đã xong, rất đơn giản phải không 

Tổng kết

Trên đây là toàn bộ các bước cần thiết để Chèn khung theo dõi qua Email từ Mailchimp vào Website. Đây chỉ là cách mình giới thiệu chung dành cho mọi loại website thôi 
Còn nếu như bạn sử dụng các mã nguồn mở khác thì sẽ có các plugin riêng để hỗ trợ việc chèn vào rồi. À, suýt quên, các bạn nhớ viết thêm CSS cho nó đẹp đẹp xíu nữa nhé 
Nếu bạn thấy bài viết hữu ích thì hãy chia sẻ nó hoặc theo dõi chúng tôi qua Email để không bỏ lỡ bất kỳ một thủ thuật hay nào nhé! Đừng quên để lại đánh giá của bạn, nó là nguồn động lực vô bờ bến với chúng tôi đấy!

Monday, June 5, 2017

Tìm hiểu Web API 2 trong .Net

1. Web Api là gì

Asp.net Web Api là một framework giúp cho việc xây dựng HTTP service một cách dễ dàng. Chúng có thể phát triển cho nhiều clients khác nhau như trình duyệt, mobile app. Web api là một nền tảng để phát triển các ứng dụng dựa trên Restfull service trong .Net. Các bạn có thể hình dung vị trí của Asp.net Api trong .Net như hình bên dưới:
h68-0.png
Để tìm hiểu sâu hơn về Asp.net Web API các bạn có thể tìm hiểu thêm tại link http://www.asp.net/web-api

2. Ứng dụng demo

Công nghệ sử dụng:
  • Visual studio 2013
  • .Net 4.6
  • Web Api 2.0
  • Entity framework 6.0
  • Knockout js
2.1. Tạo project
  • Mở Visual studio
  • Chọn New project
  • Tại cửa sổ dialog chọn Asp.net web applicaltion
  • Tiếp đến chọn Web API như hình bên dưới
CreateProject.jpg
2.2. Tạo data models
Trong ứng dựng demo này tôi sẽ tạo 2 model category và product. Để tạo một model mới, chúng ta click chuột phải tại thư mục Models chọn "New" sau đó chọn "class" như cách tạo các class thông thường.
CreateProducModels.jpg
- Category class :
using System.ComponentModel.DataAnnotations;

namespace WebAPIDemo.Models
{
    public class Category
    {
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }
    }
}
- Product class:
using System.ComponentModel.DataAnnotations;

namespace WebAPIDemo.Models
{
    public class Product
    {
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        public decimal Price { get; set; }

        public int CategoryId { get; set; }

        public virtual Category Category { get; set; }
    }
}
Lưu ý với Entity Framework 6.0, nó đã hỗ trợ cơ chế lazy loading. Trong demo này đối tượng Product có khóa ngoại là CategoryId, đồng thời nó có thể truy cập tới Category thông qua thuộc tính Category. Để có lazy loading chúng ta cần thêm keyword vitual cho thuộc tính này. Chúng ta có thể hiểu lazy loading trong trường hợp này như sau:
db.products.ToList() // đối tượng Category sẽ không được load cùng danh sách products
db.products[0].Category // chỉ khi truy suất vào một product cụ thể Category mới được load
2.3. Tạo controller
  • Click chuột phải tại thư mục Controller => chọn "Add" => chọn "Controller"
  • Tại cửa sổ "Add Scaffold" chúng ta chọn "Web API 2 Controller with actions, using Entity Framework".
ef06.png
Tại cửa sổ "Add controller"
  • Tại Model class dropdownlist, chọn Category class.
  • Tích chọn “Use async controller actions”.
  • Trong mục "Controller Name" tên controller tự động được điền vào.
CreateController.jpg
Tiếp đến click (+) button ở mục "Data context Class", tại cửa sổ "New Data Context" gõ tên Data context class theo mong muốn. Ở đây tôi tạo class có tên : WebAPIDemoContext. ProductsController được tạo tương tự như các bước trên.
2.4. Làm việc với Entity framework
Trong demo này tôi sử dụng Code First Migrations để init data và thao tác với Sql server. Trước tiên cần enable migration, để làm điều này chúng ta thực hiện như sau:
Chọn Tool => chọn Nuget Package Manager => Chọn Package Manage Console. Trong cửa sổ Package Manage Console gõ lệnh:
Enable-Migrations
Một thư mục Migrations được tạo ra cùng một file có tên là "Configuration". Tiếp theo chúng ta sẽ update method "Seed trong class này để init data. Đây là method xây dựng sẵn trong class DbContext của Entity Framework và chúng ta hoàn toàn có thể ghi đè theo trường hợp sử dụng
protected override void Seed(WebAPIDemoContext context)
        {
            context.Categories.AddOrUpdate(x => x.Id,
               new Category { Id = 1, Name = "Mobile" },
               new Category { Id = 2, Name = "Tablet" },
               new Category { Id = 3, Name = "Smart watch" }
               );

            context.Products.AddOrUpdate(x => x.Id,
                new Product
                {
                    Id = 1,
                    Name = "Product 1",
                    CategoryId = 1,
                    Price = 9.99M,
                },
                new Product
                {
                    Id = 2,
                    Name = "Product 2",
                    CategoryId = 1,
                    Price = 12.95M,
                },
                new Product
                {
                    Id = 3,
                    Name = "Product 3",
                    CategoryId = 2,
                    Price = 15,
                },
                new Product
                {
                    Id = 4,
                    Name = "Product 4",
                    CategoryId = 3,
                    Price = 10,
                }

                );
        }
Ok, chúng ta đã có một số data test cho demo. Bây giờ chúng ta cần một class để tạo table và insert những bản ghi trên vào sql server, để làm điều đó ta gõ lệnh:
Add-Migration Initial
Update-Database
Một file migarion được tạo ra với code được tự động generate
namespace WebAPIDemo.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class Initial : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Categories",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(nullable: false),
                    })
                .PrimaryKey(t => t.Id);

            CreateTable(
                "dbo.Products",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(nullable: false),
                        Price = c.Decimal(nullable: false, precision: 18, scale: 2),
                        CategoryId = c.Int(nullable: false),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Categories", t => t.CategoryId, cascadeDelete: true)
                .Index(t => t.CategoryId);

        }

        public override void Down()
        {
            DropForeignKey("dbo.Products", "CategoryId", "dbo.Categories");
            DropIndex("dbo.Products", new[] { "CategoryId" });
            DropTable("dbo.Products");
            DropTable("dbo.Categories");
        }
    }
}
Với đoạn code ở trên, Code First sẽ tự động kết nối, tạo database, table và insert data tới sql server trong lần khởi chạy đầu tiền của ứng dụng, những lần sau đó nếu có thay đổi migration DB sẽ được update ngược lại chúng sẽ không tạo lại nữa. Bây giờ chúng ta nhấn F5 để chạy web, sau đó kiểm tra database trong Server Exploer của Visual studio. Nếu có đầy đủ table và dữ liệu như hình bên dưới thì việc khởi tạo DB đã thành công.
sqlServerConnection.jpg
productTableData.jpg
2.5. Xây dựng client với với knockout js
Trong ứng dụng này, tôi sử dụng Knockout js để xây dựng phía client. Knockout js là một thư viện javascript sử dụng mô hình Model-View-ViewModel (MVVM). Các bạn có thể tìm hiểu thêm tại website Knockout. Có thể hình dung mô hình hoạt động của ứng dụng như sau:
ef31.png
Chúng ta sẽ xây dựng 3 chức năng cơ bản cho ứng dụng demo :
  • Show danh sách sản phẩm
  • Show chi tiết sản phẩm
  • Thêm mới sản
Trước tiên, chúng ta add knockout js tới ứng dụng. Trong Package manager console gõ lệnh:
Install-Package knockoutjs
Tạo view model:
Ở đây tôi sẽ tạo một file với tên là app.js trong thư mực Scripts của dự án để viết các hàm thao tác dự liệu với Server thông qua Knockout JS
var ViewModel = function () {
    var self = this;
    self.products = ko.observableArray();
    self.error = ko.observable();

    var productsUri = '/api/products/';

    function ajaxHelper(uri, method, data) {
        self.error(''); // Clear error message
        return $.ajax({
            type: method,
            url: uri,
            dataType: 'json',
            contentType: 'application/json',
            data: data ? JSON.stringify(data) : null
        }).fail(function (jqXHR, textStatus, errorThrown) {
            self.error(errorThrown);
        });
    }

    function getAllProducts() {
        ajaxHelper(productsUri, 'GET').done(function (data) {
            self.products(data);
        });
    }

    // Fetch the initial data.
    getAllProducts();

    self.detail = ko.observable();

    self.getProductDetail = function (item) {
        ajaxHelper(productsUri + item.Id, 'GET').done(function (data) {
            self.detail(data);
        });
    }

    self.categories = ko.observableArray();
    self.newProduct= {
        Category: ko.observable(),
        Name: ko.observable(),
        Price: ko.observable(),
    }

    var categoriesUri = '/api/categories/';

    function getCategories() {
        ajaxHelper(categoriesUri, 'GET').done(function (data) {
            self.categories(data);
        });
    }

    self.addProduct = function (formElement) {
        var product = {
            CategoryId: self.newProduct.Category().Id,
            Name: self.newProduct.Name(),
            Price: self.newProduct.Price(),
        };

        ajaxHelper(productsUri, 'POST', product).done(function (item) {
            self.products.push(item);
        });
    }

    getCategories();
};

ko.applyBindings(new ViewModel());
Binding trên view:
<div class="panel panel-default">
            <div class="panel-heading">
                <h2 class="panel-title">Products</h2>
            </div>
            <div class="panel-body">
                <ul class="list-unstyled" data-bind="foreach: products">
                    <li>
                        <strong><span data-bind="text: CategoryName"></span></strong>: <span data-bind="text: Name"></span>
                        <small><a href="#" data-bind="click: $parent.getProductDetail">Details</a></small>
                    </li>
                </ul>
            </div>
        </div>
Ứng dụng demo sẽ như hình bên dưới:
finalResult.jpg
Trên đây tôi đã tạo một ứng dụng đơn giản dùng Asp.Net WebAPI 2.0, EF 6.0. Hy vọng rằng demo này sẽ giúp các bạn chưa biết có thể bắt đầu làm việc với Asp.net WebApi. Nó là quen thuộc nếu các bạn đã từng làm việc với Asp.Net Mvc, đồng thời nó cũng không quá phức tạp cho những ai mới làm quen. Chúc các bạn thành công.
Link code demo: WebAPIDemo
ViBlo

Wednesday, May 31, 2017

Những lợi thế và điểm yếu khi thiết kế web bằng Bootstrap
Bootstrap ngày càng được sử dụng nhiều trong thiết kế website nhờ những lợi thế mà nó đem lại. Chẳng hạn bạn có thể nhanh chóng tạo giao diện web bằng cách sử dụng các component của bootstrap, điều này giúp bạn loại bỏ được việc lặp đi lặp lại quá trình viết ra các class CSS hay những đoạn mã HTML. Ở bài viết này, các chuyên gia thiết kế website của Bigweb sẽ phân tích những ưu thế, và nhược điểm khi thiết kế web bằng bootstrap để các web designer hiểu rõ hơn về công cụ này.
 
 
Thiết kế website bằng bootstrap

1. Những lợi thế của Bootstrap

Ngoài việc giúp bạn loại bỏ sự lặp lại trong quá trình viết class CSS3 hay những đoạn mã HTML thì bootstrap còn có nhiều ưu điểm nữa.

Nền tảng tối ưu: Trong bootstrap đã tạo sẵn một thư viện để lưu trữ mà các nhà thiết kế có thể sử dụng và tuỳ ý chỉnh sửa theo mục đích cá nhân. Điều này giúp cho việc phát triển website trở nên nhanh chóng bởi vì bạn có thể lựa chọn một mẫu có sẵn phù hợp và thêm màu sắc, hình ảnh, video... là đã có ngay giao diện đẹp. Hơn nữa, bootstrap được viết bởi những người thông mình trên thế giới nên sự tương thích với trình duyệt và thiết bị đã được kiểm tra nhiều lần nên bạn hoàn toàn có thể yên tâm với kết quả mình làm ra, thậm chí bạn còn có thể bỏ qua cả bước kiểm tra lại, và bạn sẽ tiết kiệm được thời gian, tiền bạc cho website của mình.

Tương tác tốt với smartphone: Nếu như trước đây khi truy cập website bằng điện thoại di động bạn thường nhận được result từ trang tìm kiếm như mobile.trangweb.com, tức là trang web này được lập trình cho cả 2 phiên bản, nhưng với bootstrap có sử dụng grid system nên bootstrap mặc định hỗ trợ responsive và viết theo xu hướng mobile first ưu tiên giao diện mobile trước, điều này cải thiện đáng kể hiệu suất trang web khi có người dùng truy cập bằng mobile. Khách hàng thiết kế web của bạn không còn nỗi lo trang web của mình có thể chạy trên nền tảng di động hay không. 

Giao diện đầy đủ, sang trọng: Giao diện của bootstrap có màu xám bạc rất sang trọng và hỗ trợ gần như đầy đủ các thành phần mà một website hiện đại cần có. Cầu trúc HTML rõ ràng giúp bạn nhanh chóng nắm bắt được cách sử dụng và phát triển. Không những vậy, bootstrap còn giúp website hiển thị tốt khi chúng ta co dãn màn hình windows.

Dễ dàng tuỳ biến: Để phù hợp cho nhiều loại website, bootstrap cũng hỗ trợ thêm tính năng customizer, bạn có thể thay đổi gần như tất cả những thuộc tính của nó để phù hợp với chương trình của bạn. Nếu những tuỳ chình này vẫn không đáp ứng được yêu cầu của bạn, bạn hoàn toàn có thể chỉnh sửa trực tiếp trên mã nguồn của bootstrap.


Boostrap tương thích rất tốt với HTML5

Tips: Bootstrap rất thân thiện với google nên đây là lợi thế lớn để các SEOer web phát triển và đưa trang web của mình gần hơn với người dùng.

2. Điểm yếu của Bootstrap.

Với những ưu thế nổi bật trên thì Bootstrap cũng có những hạn chế nhất định.
Tính kém phổ biến: Bootstrap không phải là ứng dụng web phổ biến nên để tìm được một tổ chức, cá nhân thành thạo bootstrap để có thể sử dụng với nền tảng lập trình web không nhiều.

Sản phẩm nặng, tốc độ tối ưu chưa cao: nên nếu dự án của bạn đòi hỏi sản phẩm nhẹ thì việc sử dụng bootstrap sẽ là cả một gánh nặng cho web. 
​
Chưa hoàn thiện: Bootstrap chưa đầy đủ các thư viện cần thiết. Các phát triển chưa thể tạo ra một framework riêng hoàn hảo, do đó một số trang web vẫn phải dùng phiên bản dành riêng cho mobile

Quá nhiều code thừa: Không thể phủ nhận rằng Bootstrap có rất nhiều ưu điểm khi nó cũng cấp gần như đầy đủ những tính năng cơ bản của một trang web responsive hiện đại. Tuy nhiên, mặt trái của việc này là website của bạn sẽ phải tải thêm rất nhiều dòng code không cần thiết khi mà bạn chỉ cần chưa đến 10% những gì Bootstrap cung caaps.
 
Bootstrap không khuyến khích sáng tạo: Chỉ cần nhét Bootstrap vào themes sẵn có, gọi ra cái .class từ stylesheet và thế là bạn đã có một trang web responsive trông cũng ổn ổn. Sự tiện dụng và dễ dàng của Bootstrap nhiều khi sẽ khuyễn khích tính lười sáng tạo, vốn luôn thường trực trong mỗi chúng ta. Kết quả là, chúng ta thướng thoả hiệp những gì mình thực sự muốn cho website để đổi lấy sự tiện dụng và tiết kiệm thời gian mà Bootstrap mang lại.
 
Tóm lại
 
Tất nhiên là Bootstrap có những ưu điểm không thể chối cãi. Nếu bạn cần một trang website mobile-first, clean và không quá cầu kỳ về layout, Bootstrap có thể giúp bạn tiết kiệm được rất nhiều thời gian dev.
 
Tuy nhiên, để có thể làm chủ được Bootstrap, thời gian bỏ ra để làm chủ được nó cũng không phải là một sớm một chiều. Có quá nhiều thứ phải nhớ, bạn sẽ thường xuyên chuyển qua lại phần document để kiểm tra xem việc mình định làm theo cách của Bootstrap thế nào.

Saturday, May 6, 2017