Sửa lỗi Auto Readmore khi xem Page trong Blogger

Blogger mới bổ sung tính năng viết Page, cho phép chúng ta viết các trang tĩnh và quan trọng trong blog như About, Contact Us, ... Tính năng này khá giống với WordPress, và cũng là 1 cải tiến đáng kể của Blogger. Tuy vậy chúng lại không tương thích với hack Auto Readmore nổi tiếng mà cộng đồng Blogger hay dùng. Hack Auto Readmore này được AnhVo ở VietWebGuide.com phát triển (domain này hiện không còn hoạt động) và được tôi cải tiến thêm chút ít. Bài viết này sẽ tìm hiểu nguyên nhân và đưa ra cách khắc phục để chúng tương thích với tính năng Page của Blogger.


Nguyên nhân gây lỗi


Trước tiên, chúng ta cùng coi lại đoạn code cài đặt Auto Readmore, nó có dạng như sau:

<b:if cond='data:blog.pageType != "item"'>
 <span expr:id='"p" + data:post.id'><data:post.body/></span>
 <script type='text/javascript'>createSummary("p<data:post.id/>")</script>
 <a expr:href='data:post.url' title='Read more' rel="nofollow">Read more &rarr;</a>
<b:else/>
 <data:post.body/>
</b:if>

Đoạn code này có ý nghĩa như sau: Nếu trang đang xem không phải là bài viết thì tạo auto readmore cho nó, còn nếu là bài viết thì hiển thị đầy đủ.

Ở đây, để nhận dạng bài viết, chúng ta sử dụng 1 biến pageType. Biến này có 3 giá trị, đó là 'index' (dành cho trang chủ và các trang label), 'archive' (dành cho các trang lưu trữ theo ngày tháng năm) và 'item' (dành cho các trang bài viết). Khi chức năng viết Page ra đời, thì các trang dạng Page này lại không được gắn 1 kiểu nào đó cho biến pageType. Cho nên khi xem 1 Page (biến pageType có giá trị khác 'item') thì nó sẽ thực hiện script auto readmore khiến cho chúng ta mãi mãi không đọc được đầy đủ nội dung.

Cách sửa lỗi


Dựa trên phân tích trên, ta thấy cách sửa lỗi cũng sẽ phụ thuộc vào giá trị của biến pageType. Tuy nhiên, do biến này không có giá trị xác định khi xem các Page, nên chúng ta phải lọc các trường hợp khác, nghĩa là xét xem nó có phải là 'index' không, là 'archive' không, là 'item' không, ...

Để sửa lại hack này, các bạn chỉ cần thay đoạn code trên bằng đoạn code dưới đây:

<b:if cond='data:blog.pageType == "index"'>
 <span expr:id='"p" + data:post.id'><data:post.body/></span>
 <script type='text/javascript'>createSummary("p<data:post.id/>")</script>
 <a expr:href='data:post.url' title='Read more' rel="nofollow">Read more &rarr;</a>
<b:else/>
 <b:if cond='data:blog.pageType == "archive"'>
  <span expr:id='"p" + data:post.id'><data:post.body/></span>
  <script type='text/javascript'>createSummary("p<data:post.id/>")</script>
  <a expr:href='data:post.url' title='Read more' rel="nofollow">Read more &rarr;</a>
 <b:else/>
  <data:post.body/>
 </b:if>
</b:if>

Hôm qua, tôi viết thử 1 Page cho Hỗn tạp thì mới nhận ra lỗi này, nên viết bài này chia sẻ cùng các bạn. Hy vọng không ai còn gặp lỗi này nữa :)