Thứ Ba, 28 tháng 10, 2014

jQuery - Quản lí cookie bằng jQuery

Quản lí cookie bằng jQuery


---o0o---


Mình quên mất link bài viết gốc rồi ;(

Mục đích của việc quản lí cookie bằng jQuery là từ một task khách hàng yêu cầu trong việc xử lí Subscrible text box

Mô tả task:


    Thành phần tác động tới: Text [Subscrible] và Textbox [Subscrible], Button [X] tương đương với close
    - Lần đầu tiên vào site: Text có màu hồng, Textbox show ra. Khi F5 hay sang trang khác Text vẫn hồng,
      chỉ khi ấn vào Button làm Textbox ẩn thì chữ mới màu đen. Sau đó chữ luôn là màu đen. Giống như các thẻ <a> khác
    - Nếu click vào Button [X] thì Textbox ẩn, Text có màu đen. Khi F5 hay sang trang khác Textbox vẫn ẩn
    - Nếu click vào Text thì Textbox lại hiện ra. Khi F5 hay sang trang khác Textbox vẫn hiện
    - Nếu đã sign up thì Textbox ẩn. Khi F5 hay sang trang khác Textbox vẫn ẩn (Phần này sẽ nhắc tới sau do liện quan tới ajax subscrible)
    

Để giải quyết 3 gạch đầu dòng đầu tiên, mình sử dụng 2 cookie là [hide] và [show] để quản lí trạng thái của Textbox

Lần đầu tiên vào site: Text có màu hồng, Textbox show ra => cả 2 cookie chưa tồn tại

Nếu click vào Button [X] thì Textbox ẩn => tạo cookie hide. Nếu tồn tại cookie show thì xóa nó đi

Nếu click vào Text thì Textbox lại hiện ra => tạo cookie show. Nếu tồn tại cookie hide thì xóa nó đi

Ok. Trên đây là solution. Ta sẽ có đoạn code như sau

<script>

    //Khởi tạo cookie
    function createCookie(name,value,days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }
        else var expires = "";
        document.cookie = name+"="+value+expires+"; path=/";
    }

    //Đọc cookie
    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
    }

    //hàm xóa cookie
    function eraseCookie(name) {
        createCookie(name,"",-1);
    }

    // Xử lí cookie
    $(document).ready(function () {
        var x = readCookie('hide');
        var y = readCookie('show');
        if(x == 1){
            $('.form').hide();
            //alert (x);
        }
        if(y == 1){
            $('.form').show();
            //alert (y);
        }
        $('.click-to-show').click(function(){
            $('.form').show();
            createCookie('show','1');
            if(x){
                eraseCookie('hide');
            }
        });
        $('.click-to-close').click(function(){
            $('.form').hide();
            createCookie('hide','1');
            if(y){
                eraseCookie('show');
            }
        });
    });
</script>

    //Cấu trúc html

    <a class="click-to-show">Subscrible</a>;
    <div class="form">
        <input type="text">
        <span class="click-to-close">X</span>;
    </div>
    

Note: Vì là jQuery nên nhớ gọi thư viện jQuery ;)


        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    

Kết quả thu được như sau

Subscrible
X

Việc để text ban đầu có màu hồng, chỉ cần làm như sau

Tạo 1 class riêng là: textbox-first có style với color: pink. check nếu x < 1 && y < 1 thì addClass vào cho Text

Vì Text có thêm class textbox-first nên khi click vào Button cần check nếu có class textbox-first thì phải removeClass đó đi

    <style>
        .textbox-first{
            color: #fd008a !important;
        }
    </style>

    if(x < 1 && y < 1){
        $('.click-to-show').addClass('textbox-first');
    }
    

Thứ Năm, 2 tháng 10, 2014

Pinterest: Rich Pins for Products

Pinterest: Rich Pins for Products


---o0o---


Link bài viết gốc

Rich Pin là gì?

Khi pin 1 ảnh từ web lên, pinterest sẽ tự động lấy tên và mô tả của sản phẩm. Vậy làm thế nào để lấy được giá của sản phẩm, thậm chí là trạng thái của sản phẩm. Khi đó chúng ta cần tới Rich Pin

Để trang web có Rich Pin, cần làm 2 bước:

  • Thêm các thẻ meta vào theo yêu cầu của Pinterest
  • Validate trang sản phẩm với Pinterest.

Note: Sau khi validate thành công, sau 24h trang web mới có Rich Pin

Có nhiều loại Rich Pin, nhưng ở đây ta chỉ quan tâm tới Rich Pin cho product

Để trang web có thể validate được, ta nhất thiết phải có các thẻ meta sau


    <head>
        <meta property="og:url" content="url của trang" />
        <meta property="og:title" content="Title của trang" />
        <meta property="og:price:amount" content="Giá sản phẩm" />
        <meta property="og:price:currency" content="Loại tiền tệ" />
        <meta property="og::price:currency_code" content="Loại tiền tệ" />
    <head>

        

Và những thẻ thêm thông tin


    <head>
        <meta property=content="og:type" content="product" />
        <meta property="og:image" content="url ảnh" />
        <meta property="og:availability" content="trạng thái của sản phẩm" />
        <meta property="og:brand" content="Jeweliq" />
        <meta property="og:description" content="Mô tả sản phẩm" />
        <meta property="og:site_name" content="Tên web" />
    <head>

        

Sau khi đã có đầy đủ thẻ meta, chỉ cần validate web tại

Chờ 24h sau là ok :)

PHP - Chỉnh sửa lại tiêu đề và nội dung khi share facebook

How to Configure Facebook Share (fb-sahre) Thumbnail & Texts?


---o0o---


Link bài viết gốc

Trong bài viết này, tôi sẽ giới thiệu cách chúng ta chỉnh sửa lại tiêu đề và nội dung khi share facebook

Trước hết, ta hãy nhìn ảnh sau

Từ ảnh trên có thể thấy để có share được nội dung như mong muốn, ta phải chỉnh lại các thẻ meta tương ứng


    <head>
        <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>
        <script src="http://static.ak.fbcdn.net/connect.php/js/FB.Share" type="text/javascript"></script>

        <meta property="og:title" content="Your Title" />
        <meta property="og:type" content="website" />
        <meta property="og:image" content="Your Thumbnail Image Link" />
        <meta property="og:url" content="Your URL" />
        <meta name="description" content="Your Description" />
    <head>

    <a name="fb_share" type="button_count" href="http://www.facebook.com/sharer.php">Share</a>
        

Note: Không được để thiếu các thẻ meta trên

http://developers.facebook.com/tools/lint

Thứ Tư, 1 tháng 10, 2014

Bài 1: Zend1 - Hướng dẫn cài đặt và chạy ứng dụng đầu tiên

Bài 1: Zend1 - Hướng dẫn cài đặt và chạy ứng dụng đầu tiên


---o0o---


Link bài viết gốc

Xây dựng mô hình các thư mục sau


        www/zfexam/application

        www/zfexam/public/

        www/zfexam/library
        

Trong thư mục public tạo 2 file .htaccess và index.php

Nội dung đầy đủ của file index.php:


        <?php
        defined('APPLICATION_PATH')|| defined('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
        defined('APPLICATION_ENV') || defined('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
        set_include_path(implode(PATH_SEPARATOR, array(
            dirname(dirname(__FILE__)) . '/library',
            get_include_path(),
        )));
        require_once 'Zend/Application.php';
        $application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
        $application->bootstrap()->run();
        

Cùng phân tích các câu lệnh trong file index.php

Dòng đầu tiên


        defined('APPLICATION_PATH')|| defined('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
        

Chạy câu lệnh:

echo APPLICATION_PATH;

Kết quả thu được là: D:\Ampps\www\zfexam\application, đây chính là vị trí của thư mục application


Câu lệnh:

echo (__FILE__);

Ta thu được đường dẫn: D:\Ampps\www\zfexam\public\index.php. Đây chính là đường dẫn của file đang chạy

Thêm dirname vào:

echo dirname(__FILE__);

Kết quả lại là: D:\Ampps\www\zfexam\public. Tức là trả về thư mục chứa file đang chạy

Tiếp tục thêm realpath vào:

echo realpath(dirname(__FILE__));

Kết quả thu được vẫn là: D:\Ampps\www\zfexam\public. Nhưng nếu thêm đầy đủ như ở dòng 1 thì kết quả lại là: D:\Ampps\www\zfexam\application

Vì 2 thư mục public và application là ngang hàng nhau nên để từ thư mục public (thư mục chứa file index.php đang chạy) chuyển sang thư mục application ta cần phải chạy câu lệnh trên


Xét tiếp dòng thứ 2


        defined('APPLICATION_ENV') || defined('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
        

Hàm getenv() dùng để set giá trị cho biến môi trường. Trả về giá trị TRUE hoặc FALSE. Ở đây hàm trả về FALSE nên hằng APPLICATION_ENV có giá trị là production. Hằng này lưu thông tin của production ở file application.ini

Xét tiếp dòng thứ 3


        set_include_path(implode(PATH_SEPARATOR, array(
            dirname(dirname(__FILE__)) . '/library',
            get_include_path(),
        )));
        

Hàm get_include_path() trả về giá trị mới của include_path: D:\Ampps\www\zfexam/library;.;C:\php\pear.

Hàm set_include_path() trả lại giá trị của include_path

Hằng PATH_SEPARATOR đã được định nghĩa là dấu :

Dòng này làm nhiệm vụ load nội dung của library, nơi chứa thư viện của zend. Nôm na có thể hiểu là, nếu bạn sử dụng dòng này, thay vì bạn phải gõ: require_once 'Library/Zend/Application.php' Thì giờ bạn chỉ cần gõ: require_once 'Zend/Application.php' . Vì mặc định thư viện đã được nạp vào rồi.

Dòng tiếp theo là nạp nội dung trang Application.php

Tiếp đó gọi trang application.ini ở thư mục config


        $application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
        

Cuối cùng là việc thực thi lệnh bằng hàm run().

2. application.ini


        [production]
        phpSettings.display_startup_errors = 1
        phpSettings.display_errors = 1
        bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
        bootstrap.class = "Bootstrap"
        resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
        

Dòng đầu tiên khởi tạo phân đoạn có giá trị [production]

Dòng 2 và 3 cho phép bật tính năng báo lỗi của Zend

Dòng 4, 5 cho phép tìm tới file Bootstrap.php để thông qua nó tương tác các thư viện hàm trong Zend. Đồng thời chỉ định tên gọi của class là Bootstrap.

Dòng cuối cùng chỉ ra đường dẫn tới thư mục controller trong apptication