Thứ Sáu, 27 tháng 12, 2013

LESS - suy nghĩ 1 chút

LESS trước đây đọc ở diễn đàn và freelancer chưa hiểu lắm.
Có tìm hiểu thì gần giống CSS nhưng có biến, hàm, và 1 số có phân cấp độ.
Theo suy nghĩ cũng gần giống lập trình.
Ở đây 1 file .js và 1 file .less (thay cho css).
.js có trách nhiệm biên dịch trực tiếp từ file .less ra cấu trúc css
Biên dịch trực tiếp là: thay đổi thì nhận ra ngay.

Điểm mạnh của LESS thì cũng chính là điểm yếu của LESS   
LESS có hàm, và biến, cấp độ như vậy lúc thực hiện thì có thể gọn.
Nhưng lúc debug không còn khả năng trực quan nữa. Vì sẽ tìm bị trí của biến, vị trí của hàm.
Hiện theo tìm hiểu chưa thấy firebug(firefox) chưa thấy hỗ trợ debug LESS. Chrome thì cũng vậy.
Vì ở đây là biến mà lại thông qua file js để biên dịch vậy lại càng tốn thời gian debug sau này.
Mình sẽ suy nghĩ lại vấn đề dùng LESS khi có công cụ debug tốt hơn.

Dù sao cũng đọc được về bài LESS hay.
http://www.thuthuatweb.net/css/less-css-huong-dan-co-ban-cho-nguoi-bat-dau.html

Thứ Tư, 25 tháng 12, 2013

Joomla 3.x - Registration Active types

Joomla 3.x
Đăng ký thành viên có 3 loại kích hoạt
1. None: kích hoạt ngay
2. Self: email gửi đến và người dùng tự kích hoạt.
3. Admin: admin kích hoạt cho tài khoản

Thứ Sáu, 20 tháng 12, 2013

Chrome Perfectpixel hỗ trợ convert chính xác hơn đến từng pixcel

Giới thiệu: Chrome có addon miễn phí. Firefox cũng có nhưng có tính phí. (hơi buồn vì thường dùng firefox)

Tính năng:
Thêm nhiều lớp hình ảnh vào trên cùng browser để so sánh trực tiếp file thiết kế và website đang hoạt động.

Để hỗ trợ điều đó đó : độ trong suốt, mức độ ưu tiên của hình ảnh + vị trí có thể move hình ảnh.
Yêu cầu: hình ảnh và website đều phải đặt ở mức 100% độ chuẩn. Nếu hình ảnh mà đã phóng to thu nhỏ và đưa vào so sánh thì .... pó tay nhé.

Tác dụng:
Cùng lúc nhìn hình ảnh đã thiết kế và website để hiệu chỉnh.

Ý nghĩa: là công cụ hỗ trợ xem trực quan hơn, chứ không có nghĩa công việc giảm đi (vì vậy đừng ảo tưởng ... quá như mình ^.^ lúc đầu).

Bình thường thực hiện thì vẫn đo kích thước nhưng mức độ lệch là vài pixel, kết hợp với phương pháp này là quá tuyệt. Kết hợp với inspect element để chính cho đúng css.

Link download: (chỉ hỗ trợ google )
https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi

Thứ Hai, 16 tháng 12, 2013

Facebook like box IFRAME

Cách của mình làm trực tiếp từ facebook
https://developers.facebook.com/docs/plugins/like-box-for-pages/
Sau đó thực hiện theo hình ảnh.
Lấy iframe đưa vào module custom HTML.



Thứ Bảy, 7 tháng 12, 2013

IE8- CSS Transparent issue solved

Vấn đề IE 8 ko hiển thị được transparent. Lúc nào cũng có 1 hình ảnh mờ phía trên. Vấn đề như hình ảnh.
Cách xử lý trong CSS:
div.title {
  background: none repeat scroll 0 0 transparent;
  -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=1)";

}

Thứ Tư, 4 tháng 12, 2013

Joomla 2.5- Virtue mart Discount single product

Cách giảm giá cho 1 sản phẩm trong virtue mart.
1. Tạo mới category là DiscountCategory
2. Vào Taxes & Calculation Rules
chọn Price modifier for Profit Margin

3. Sản phẩm nào cần giảm giá chỉ cần chọn cateogry là DiscountCategory

Thứ Ba, 3 tháng 12, 2013

Joomla 3.x - contact form capchar

Cách xử dụng form contact capchar của google của joomla 3.x có sẵn
1. Đăng ký key capchar từ google: http://www.google.com/recaptcha
 
2. Bật plugin capchar và điền key

3. Kiểm tra thư viện capchar: 
Thời điểm đầu tháng 12 năm 2013 viết bài này thì link thư viện capchar bị lỗi, vì vậy cần kiểm tra và thay thế đoạn code.
Vị trí file: plugins\captcha\recaptcha\recaptcha.php - line 64

//JHtml::_('script', $server . '/js/recaptcha_ajax.js');
JHtml::_('script', 'http://google.com/recaptcha/api/js/recaptcha_ajax.js');


4. Bật capchar từ global config

5. Kết quả hiển thị

Thứ Bảy, 30 tháng 11, 2013

Joomla 1.5- K2 replace Recapchar comment .js library

K2 Comment joomla 1.5 sử dụng http://api.recaptcha.net/js/recaptcha_ajax.js thư viện này ko còn hỗ trợ nữa. Nên khi sử dụng recapchar ko hiển thị.
Cách thực hiện: replace thư viện vào: components\com_k2\views\item\view.html.php
Thay đoạn  http://api.recaptcha.net/js/recaptcha_ajax.js bằng
http://google.com/recaptcha/api/js/recaptcha_ajax.js

Lưu ý: cần vào http://www.google.com/recaptcha để lấy public key và private key vào Admin: component->k2 chọn option -> comments điền key vào và bật lên.

Joomla 1.5 - k2 comment notify email to admin

K2 component joomla 1.5 không hỗ trợ việc gửi mail báo cho admin khi có comment mới.
Vì vậy cần viết thêm đoạn code này.
File location cần hiệu chỉnh: components\com_k2\models\item.php
Sử dụng thư viện Utilities của joomla: thêm vào đoạn: jimport('joomla.utilities.utility');
Tìm chức năng: function comment()
Thêm đoạn : có thể thêm ở dòng 753 (trong function comment)
//sendmail            $linkitemcomment=JURI::base().$item->link=urldecode(JRoute::_(K2HelperRoute::getItemRoute($item->id.':'.$item->alias,
            $item->catid.':'.urlencode($item->category->alias))));                   
            $emailadmin=$mainframe->getCfg('mailfrom');
            $bodymail='Nội dung bình luận:'.$commentText.'<br/><a href="'.$linkitemcomment.'">'.$linkitemcomment.'</a>';
           
            JUtility::sendMail($commentEmail, $userName, $emailadmin, 'Có bình luận mới',$bodymail,1);


Thứ Năm, 28 tháng 11, 2013

Joomla 15 Media manage not view Browser file selection

Đối với joomla 1.5 - Media manage ko xuất hiện input có browser để chọn file up lên có thể thử cách sau:

Thứ Ba, 26 tháng 11, 2013

SAFARI iframe session issue

Trình duyệt SAFARI không cho load session của IFRAME.
Nguyên nhân: trình duyệt safari chống các tự động popup.
Ảnh hưởng: đây là suy nghĩ tốt của SAFARI nhưng ảnh hưởng đối với website load iframe có sử dụng cần session.
Mục tiêu cần đạt được: Mở được session của host (là link IFRAME).
Muốn mở được session sẽ gặp trở ngại CROSS Browser Session. Theo nguyên tắc bảo mật thì host nào được mở session ở host đó. Không có quyền mở session ở host khác.
Vì vậy: cần phải có quyền truy cập ở cả 2 host. Hoặc 1 số website như facebook có hỗ trợ mở session. (cái này tìm hiểu facebook nhé).

Ví dụ đây: file index.php có chứa iframe
<iframe  id="blockrandom" name="contentframe" src="http://example_target.com" width="100%" height="1850"/>

Cách xử lý 1: Dùng trình duyệt safari mở 1 example_target.com, sau đó load file có chưa iframe. Thì mọi việc sẽ chạy bình thường. Nguyên nhân là session đã mở ít nhất 1 lần, sau đó safari sẽ tự nhận. BAD

Cách xử lý 2: Dùng trình duyệt safari viết thêm vào file index.php để tự động mở 1 new tab hoặc new window. Cách này suy nghĩ thì đúng nhưng ko làm được mặc dù nguyên lý gần giống cách 1 là mở example_target.com, nguyên nhân Safari chặn ko cho tự động popup.SO BAD

Cách xử lý 3: Redirect trực tiếp. GOOD
HOST 1: file index.php kiểm tra là browser safari thì redirect đến HOST 2 và open session.
HOST 2: open session: tạo mới file InitSession.php thì phải dùng PHP để open, sau khi open thì redirect lại HOST 1. (phải làm như vậy thì session mới mở được).
HOST 1 kiểm tra và họat động bình thường.

Chi tiết cách 3:
HOST 1 file index.php
<?php if ( ! count($_COOKIE) > 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')&& $_GET['session']!='open') { ?>
<script type="text/javascript">
    window.top.location.href = 'http://example_target.com/InitSession.php';
</script>
<?php
}
?>
Start iframe<br/>
<iframe  id="blockrandom" name="contentframe" src="http://example_target.com" width="100%" height="600px"/>
End iframe<br/>

HOST 2 file InitSession.php
<?php
//inside setcookie.php
header('P3P: CP="CAO PSA OUR"');
session_start();
echo
'<script>
top.location = "http://host1.com/index.php?session=open";
</script>';
?>


Thứ Sáu, 1 tháng 11, 2013

Xem version PHP và đường dẫn tuyệt đối trên host

Một vài trường hợp cần xem đường dẫn tuyệt đối trên host
Và xem version PHP
Download file sau: phpinfo.php
Link dự phòng:
https://drive.google.com/file/d/0B785Epf6q5XlVENZeFpJTUJIc0k/edit?usp=sharing


Thứ Hai, 21 tháng 10, 2013

Turn on PHP 5.3 by .htacess

In the case Host supported PHP 5.3++ can turn on .htaccess file.
Add follow this code to bottom .htaccess:
Action application/x-hg-php53 /cgi-sys/php53
AddType application/x-httpd-php53 .php

Cách đấu giá lần đầu thành công freelancer.com

Con đường của người thích tự do và biết khả năng.
Đấu giá trên freelancer .com mình tốn hết 2 năm để đấu giá thành công 1 dự án đầu tiên.
Trong những lúc có trở ngại, cần tìm còn đường thì lên đấu giá.
Đấu giá hàng nghìn lần sẽ rút được kinh nghiệm, chắc không cần nhiều đến vậy.
Theo như mình thấy là do mình chậm vì có nhiều người đấu giá thành công rất nhanh thôi.

Cái khó nhất là đấu giá lần đầu tiên, rút kinh nghiệm thì cũng chỉ là vấn đề liên hệ. Chậm hay nhanh do mình có hiểu đối tác không.

Mình cần đặt bản thân mình là người tìm người. Trung bình 30 lượt đấu giá/dự án có tất cả mọi người từ người 0 có review nào đến người có hàng ngàn review (review gọi là đánh giá)..
Vậy làm sao để đấu giá đầu tiên thành công: nên nhớ rằng lần đầu tiên bạn không có gì đáng tin cả. Và điểm mạnh nhất: giá, và cách liên hệ.

Mục đích giá thấp lần đầu: lần đầu tiên chưa có ấn tượng gì và giá là điều cần để ý. Thấp hơn những người khác - giá chỉ 1/3 cho đến 1/2 - mục đích ở đây là sự chú ý.
Mục đích của liên hệ: lúc đấu giá có thời gian, chi phí,đánh giá, mức độ hoàn thành và liên hệ. Phần liên hệ là cả nghệ thuật quyết định gần như toàn bộ thành công. Trong liên hệ cần phải ghi rõ bạn hiểu gì về yêu cầu, lúc thực hiện thì thực hiện như thế nào, cách bàn giao, các xử lý khi có vấn đề xảy ra. Trong liên hệ là quá trình phân tích kỹ lưỡng, khi nhìn liên hệ người ta sẽ hiểu được khả năng của bạn. Nếu mới khởi đầu thì liên hệ này càng phải chi tiết, có cả các link site mẫu đã làm trước.

Có những dự án chỉ cần phần liên hệ, đối tác lập tức chọn bạn. Có những dự án hiệu chỉnh quá dễ thì người ta lại quan tâm đến giá, hoặc thời gian thực hiện. Có dự án quan tâm đến thời gian. Có dự án phức tạp kéo dài hàng tháng. Vì vậy mỗi loại dự án sẽ là thì trường phù hợp với các cá nhân.

Ở đây là hiểu được tâm lý người ra yêu cầu, và biết khả năng của bản thân.

Khả năng thực hiện khi đọc yêu cầu cần hiểu rõ, không mơ hồ vì sẽ có những yêu cầu không rõ ràng.

Cần phải hiểu rằng không phải đối tác nào cũng rõ ràng, thân thiện, chơi đẹp. Vàng thau lẫn lộn. Nhưng có điều vẫn rất lợi thế, nên nhớ rằng đối tác giỏi hay là những đối tác ngay trong yêu cầu thể hiện được tính rõ ràng, bao quát, và có trách nhiệm. Những đối tác không đạt được tính rõ ràng, bao quát, trách nhiệm thì đừng cố gắng đấu giá.
Ý nói là người rõ ràng thì câu viết rõ ràng, yêu cầu rõ ràng. Có những đối tác post dự án cho 1 đối tượng rõ ràng, có những đối tác post thử dự án, có đối tác trong quá trình post dự án đã tìm ra cách xử lý, có đối tác trong quá trình post thì chính những đối tác của họ đã rút lui. Vì vậy có nhiều nguyên nhân dẫn đến dự án closed và cần hiểu điều này.

Tất cả các yếu tố giá, thời gian, liên hệ, các đánh giá, mức độ hoàn thành công việc .... tất cả các yếu tố này đều phải lưu ý góp phần tăng tỉ lệ thành công trong đấu giá dự án.

Thành công đầu tiên có thể ghi nhận không cần phải đấu giá thắng lợi mà là đối tác có liên hệ lại, lúc này chứng tỏ đối tác đã quan tâm đến bạn, và cách trình bày của bạn đã có sự ấn tượng.

Lần đầu đấu giá những dự án nhỏ, chỉnh sửa. Hoặc dự án thuộc thế mạnh của mình, dự án thuộc thế mạnh thì cần trình bày trong phần liên hệ 1 cách chi tiết.

Thứ Sáu, 18 tháng 10, 2013

Turn off fast sh404sef

Change file name or remove file follow location file:
                                       plugins\system\shsef.php

Thứ Hai, 14 tháng 10, 2013

Jquery get parent item latest (the nearest parent)

<ul class="top_navigation">
<li>
       <div class="icon"><img src="images/icon5.png"/></div>
</li>

</ul>
Cách lấy parent item gần nhất bằng Jqueyry
               var parent=jquery1('.top_navigation img').parents('li');

Lưu ý: .parentparents khác nhau.

Thứ Năm, 10 tháng 10, 2013

Vấn đề thường gặp đối với @font-face HTML

Giới thiệu:
Hiển thị font tùy thuộc vào trình duyệt. Hiện chia làm loại chính
Trình duyệt có hỗ trợ sử dụng file TTF: firefox, safari, chrome
Trình duyệt sử dụng file EOT: internet explorer (IE).
Vì vậy cùng 1 lúc phải sử dụng 2 file.
Ngoài ra còn có công cụ CU-FONT convert file font qua js - điểm mạnh hiển thị được tất cả trình duyệt. Điểm yếu của cu-font thêm các tag, copy text không được và khó kiểm soát khi cần nâng cấp. Vì vậy nên sử dụng @font-face.

Chuyển đổi file TTF qua EOT: http://www.kirsle.net/wizards/ttf2eot.cgi
Sử dụng trong CSS

Style trong file CSS
@font-face
{
font-family: myFirstFont;
src: url('Sansation_Light.ttf'),
     url('Sansation_Light.eot'); /* IE */

Vấn đề thường gặp phải: đ
IE sử dụng chuẩn font khác .EOT để hiển thị. Có nhiều lỗi liên quan đến hiển thị font của IE8.
Các phương pháp thực hiện thử:
1. Đường dẫn chính xác: trường hợp này để thử cách chính xác đường dẫn đúng
 @font-face
{
font-family: myFirstFont;
src: url('
http://mydomain.com/font/myfont.ttf'),
     url('
http://mydomain.com/font/myfont.eot'); /* IE */
}

2. Tách khai báo font face CSS ra thêm 1 file dành cho ie.css
vào file index.php thêm vào cuối cùng của thẻ <head>
  <!--[if IE]>
    <link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/<?php echo $this->template; ?>/css/ie.css" type="text/css" />       
    <![endif]-->   
Trong file ie.css khai báo duy nhất 1 đoạn : file .eot nằm cùng folder với file ie.css
 @font-face
{
font-family: myFirstFont;
src: 
url('myfont.eot'); /* IE */
}

Nguyên nhân : khi khai báo chung có 1 số trường hợp browser không nhận được. Nguyên nhân thì mình không rõ. Nhưng khi tách ra thì IE lại nhận được.

Thứ Sáu, 4 tháng 10, 2013

joomla 3- com_contact add new fields

Joomla 3.1
Com_contact
Contact add new field example is Phone Number view
1. Add new field Phone to form
 components\com_contact\views\contact\tmpl\default_form.php

<div class="control-group">
                <div class="control-label"><?php echo JText::_('COM_CONTACT_EMAIL_LABEL'); ?></div>
                <div class="controls"><?php echo $this->form->getInput('contact_email'); ?></div>
                <div class="clr"></div>
            </div>
            <div class="control-group">
                <div class="control-label"><?php echo JText::_('COM_CONTACT_PHONE_LABEL'); ?></div>
                <div class="controls"><input type="text"  size="60" value="" id="jform_contact_phone" name="jform[contact_phone]" ></div>
                <div class="clr"></div>
            </div>

            <div class="control-group">
                <div class="control-label"><?php echo JText::_('COM_CONTACT_CONTACT_MESSAGE_SUBJECT_LABEL'); ?></div>
                <div class="controls"><?php echo $this->form->getInput('contact_subject'); ?></div>
                <div class="clr"></div>
            </div>

2. Send mail : add new content to mail body
files: components\com_contact\controllers\contact.php at function private function _sendEmail
Replace: line 156-161:
            $phone = 'Phone Number:  '.$data['contact_phone'];
            $body        = $data['contact_message'];

            // Prepare email body
            $prefix = JText::sprintf('COM_CONTACT_ENQUIRY_TEXT', JUri::base());
            $body    = $prefix."\n".$name.' <'.$email.'>'."\r\n\r\n".$phone."\n".stripslashes($body);

Result is:
 

joomla 3. com_contact list with heading Ordering

Joomla 3.1
Component: com_contact
file edit: components\com_contact\views\category\tmpl\default_items.php
Function: Heading view + ordering

<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_contact
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.framework');

$listOrder    = $this->escape($this->state->get('list.ordering'));
$listDirn    = $this->escape($this->state->get('list.direction'));
?>
<?php if (empty($this->items)) : ?>
    <p> <?php echo JText::_('COM_CONTACT_NO_ARTICLES'); ?> </p>
<?php else : ?>

<form action="<?php echo htmlspecialchars(JUri::getInstance()->toString()); ?>" method="post" name="adminForm" id="adminForm">
<?php if ($this->params->get('show_pagination_limit')) : ?>
    <fieldset class="filters">
    <legend class="hidelabeltxt"><?php echo JText::_('JGLOBAL_FILTER_LABEL'); ?></legend>

        <div class="display-limit">
            <?php echo JText::_('JGLOBAL_DISPLAY_NUM'); ?>&#160;
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
    </fieldset>
<?php endif; ?>
    <table class="category">
        <?php if ($this->params->get('show_headings')) : ?>
        <thead><tr>
            <th class="item-title">
                #
            </th>
            <th class="item-title">
                <?php echo JHtml::_('grid.sort', 'COM_CONTACT_NAME_HEADER', 'a.name', $listDirn, $listOrder); ?>
            </th>
            <?php if ($this->params->get('show_position_headings')) : ?>
            <th class="item-position">
                <?php echo JHtml::_('grid.sort', 'COM_CONTACT_POSITION', 'a.con_position', $listDirn, $listOrder); ?>
            </th>
            <?php endif; ?>
            <?php if ($this->params->get('show_email_headings')) : ?>
            <th class="item-email">
                <?php echo JText::_('JGLOBAL_EMAIL'); ?>
            </th>
            <?php endif; ?>
            <?php if ($this->params->get('show_telephone_headings')) : ?>
            <th class="item-phone">
                <?php echo JText::_('COM_CONTACT_TELEPHONE'); ?>
            </th>
            <?php endif; ?>

            <?php if ($this->params->get('show_mobile_headings')) : ?>
            <th class="item-phone">
                <?php echo JText::_('COM_CONTACT_MOBILE'); ?>
            </th>
            <?php endif; ?>

            <?php if ($this->params->get('show_fax_headings')) : ?>
            <th class="item-phone">
                <?php echo JText::_('COM_CONTACT_FAX'); ?>
            </th>
            <?php endif; ?>

            <?php if ($this->params->get('show_suburb_headings')) : ?>
            <th class="item-suburb">
                <?php echo JHtml::_('grid.sort', 'COM_CONTACT_SUBURB', 'a.suburb', $listDirn, $listOrder); ?>
            </th>
            <?php endif; ?>

            <?php if ($this->params->get('show_state_headings')) : ?>
            <th class="item-state">
                <?php echo JHtml::_('grid.sort', 'COM_CONTACT_STATE', 'a.state', $listDirn, $listOrder); ?>
            </th>
            <?php endif; ?>

            <?php if ($this->params->get('show_country_headings')) : ?>
            <th class="item-state">
                <?php echo JHtml::_('grid.sort', 'COM_CONTACT_COUNTRY', 'a.country', $listDirn, $listOrder); ?>
            </th>
            <?php endif; ?>

            </tr>
        </thead>
        <?php endif; ?>

        <tbody>
            <?php foreach ($this->items as $i => $item) : ?>
                <?php if ($this->items[$i]->published == 0) : ?>
                    <tr class="system-unpublished cat-list-row<?php echo $i % 2; ?>">
                <?php else: ?>
                    <tr class="cat-list-row<?php echo $i % 2; ?>" >
                <?php endif; ?>
                    <td class="item-count"><?php echo $i+1;?></div>
                    <td class="item-title">
                        <a href="<?php echo JRoute::_(ContactHelperRoute::getContactRoute($item->slug, $item->catid)); ?>">
                            <?php echo $item->name; ?></a>
                    </td>

                    <?php if ($this->params->get('show_position_headings')) : ?>
                        <td class="item-position">
                            <?php echo $item->con_position; ?>
                        </td>
                    <?php endif; ?>

                    <?php if ($this->params->get('show_email_headings')) : ?>
                        <td class="item-email">
                            <?php echo $item->email_to; ?>
                        </td>
                    <?php endif; ?>

                    <?php if ($this->params->get('show_telephone_headings')) : ?>
                        <td class="item-phone">
                            <?php echo $item->telephone; ?>
                        </td>
                    <?php endif; ?>

                    <?php if ($this->params->get('show_mobile_headings')) : ?>
                        <td class="item-phone">
                            <?php echo $item->mobile; ?>
                        </td>
                    <?php endif; ?>

                    <?php if ($this->params->get('show_fax_headings')) : ?>
                    <td class="item-phone">
                        <?php echo $item->fax; ?>
                    </td>
                    <?php endif; ?>

                    <?php if ($this->params->get('show_suburb_headings')) : ?>
                    <td class="item-suburb">
                        <?php echo $item->suburb; ?>
                    </td>
                    <?php endif; ?>

                    <?php if ($this->params->get('show_state_headings')) : ?>
                    <td class="item-state">
                        <?php echo $item->state; ?>
                    </td>
                    <?php endif; ?>

                    <?php if ($this->params->get('show_country_headings')) : ?>
                    <td class="item-state">
                        <?php echo $item->country; ?>
                    </td>
                    <?php endif; ?>

                </tr>
            <?php endforeach; ?>

        </tbody>
    </table>

    <?php if ($this->params->get('show_pagination')) : ?>
    <div class="pagination">
        <?php if ($this->params->def('show_pagination_results', 1)) : ?>
        <p class="counter">
            <?php echo $this->pagination->getPagesCounter(); ?>
        </p>
        <?php endif; ?>
        <?php echo $this->pagination->getPagesLinks(); ?>
    </div>
    <?php endif; ?>
    <div>
        <input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
        <input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
        <input type="hidden" name="task" value="" />        
         <input type="hidden" name="limitstart" value="" />

    </div>
</form>
<?php endif; ?>

Thứ Ba, 1 tháng 10, 2013

Bảo mật joomla căn bản mà hiệu quả

Thường thị bị hack bởi yếu tố sau: Dựa vào yếu tố sẽ ra cách xử lý
1. Tài khoản + Mật khẩu đơn giản: tài khoản dễ đoán như: admin, admin123, 123456, ....
Các tài khoản và password dễ đoán sẽ được lưu trong 1 danh sách, và sẽ được quét tự động. Nếu tài khoản nào vào được sẽ báo cho hacker.
Như vậy ở đây phải có 2 cách chống:

1 chống tự động : có thể dụng plugin KSECURE plugịn(tự tìm hiểu free), RS Fire wall extension (cái này có phí)
Thêm mật khẩu cấp 2(ý nói là muốn vào administrator thì qua 1 bước nữa). Dùng KSECURE http://diendan.joomlaviet.vn/threads/bao-ve-thu-muc-administrator-voi-ksecure.704/
2 tài khoản mật khẩu phức tạp hơn: cái này hãy đặt cả tài khoản và mật khẩu khác: vd webadmin, pass: Pass%2​
2. Lỗ hổng của Joomla (phiên bản) (không dùng joomla 1.5 nữa, bây giờ sử dụng 2.5, 3.1 - theo kế hoạch joomla năm 2014 thì 2.5 cũng không còn hỗ trợ)
Vd: Lỗ hổng phiên bản có thể hacker đăng ký tài khoản thường user nhưng có thể kèm theo group thuộc nhóm super admin.
.....
----------------------
Lỗi này thì nhiều thể loại nhưng mục đích cuối cùng là chiếm quyền admin.
Mấy lần đầu mình bị hack mình cũng đặt câu hỏi: giả sử là hacker vào được admin rồi thì sẽ làm gì để kiểm soát?
Thật ra thì vào được admin rồi thì hacker sẽ cố cấu hình website cho phép up file php (file php thường là shell, upload manager file php ...) cho phép xem tất cả các file,edit, download giống như FTP vậy.
Và rồi chỉ cần 1 đoạn code hoặc xóa file, redirect link đến site khác, thêm 1 đoạn js thay đổi event ....
Khi làm joomla mình cảm thấy giống như là 1 cuộc chạy đua phiên bản. Có thể 1-2 ngày là ra bản vá lỗi.
Cách ngăn chặn quyết định không cho truy cập admin (mật khẩu 2 cấp, chống tự động .... ) làm rất hiệu quả.

Thứ Bảy, 28 tháng 9, 2013

Firefox User Agent Switcher view iphone device

Firefox User Agent Switcher addon: khi cần view browser ở deveice IPHONE. Có những website thiết kế có đoạn code nhận phân biệt Iphone hoặc web thường. Add on này hiển thị nhanh để debug trên firefox.
Lâu lâu cũng cần cái này để kiểm tra.

Thứ Năm, 26 tháng 9, 2013

disable magic_quotes_gpc joomla 3.

Cách 1: trong file .htaccess
Thêm vào cuối cùng dòng  php_value magic_quotes_gpc off
Up lên host.

Cách 2:
1.Create file php5.ini
2. Add content
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.s
display_errors = Off
error_reporting = Off


Cách 3: Cách thao khảo tại: http://docs.joomla.org/How_to_turn_off_magic_quotes_gpc_for_Joomla_3
Tạo 1 file php5.ini thêm đoạn
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.s
display_errors = Off
error_reporting = Off

Tạo 1 file php.ini thêm đoạn
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off


Mở file .htaccess thêm đoạn code vào đầu file
<IfModule mod_suphp.c>
  suPHP_ConfigPath /home/myusername/public_html/yourJ3folder
  <Files php.ini>
    order allow,deny
    deny from all
  </Files>
</IfModule> 
 /home/myusername/public_html/yourJ3folder là đường dẫn tuyệt đối của host chỉ đến file php5.ini
 

Check url Mobile Joomla extension

Check MOBILE JOOMLA
?device=m
?device=iphone
?device=wap
?device=imode

Jevent change view Nagivation

Giới thiệu: JEVENT quản lý sự kiện theo thời gian, có thể lặp theo các ngày trong tuần.
Giao diện hiển thị theo kiểu năm, tháng, ngày. Chuyển đổi qua lại dễ dàng.

Ở đây hướng dẫn thay đổi pagination JEVENT.
Navigation mặc định JEVENT có hỗ trợ thêm phần view. Yêu cầu cần thay đổi giao diện (có sẵn).


Thứ Ba, 17 tháng 9, 2013

Xem nhanh đường dẫn tuyệt đối joomla 3.

Có nhiều lúc cần cấu hình theo đường dẫn tuyệt đối ví dụ virtuemart safe path, path log, path temp.
Thì có thể dùng cách này để xem nhanh trong joomla 3.
Joomla backend > System > System Information > [Directory Permissions] : xem phần logs hoặc temp (sau đó nhớ bỏ logs )


Thứ Tư, 11 tháng 9, 2013

Hướng dẫn Turn off RSFireWALL

Giới thiệu:
RSFIREWALL là component để bảo mật joomla tốt.
Bảo mật thêm 1 cấp.
Bảo mật Table users
Vì bảo mật tốt nên lúc cần nâng cấp hiệu chỉnh lại không thực hiện được. Vì vậy cần tắt RSFIREWALL

Cách thực hiện::
1. Trường hợp bình thường: Vào databse vào table RSFirwall Config tìm dòng enable: set 0
2. Trường hợp bảo mật cho table USER: cần tắt Plugin/system/rsfirewall.php đổi tên thành rsfirewall.bak khi làm xong thì trả lại như cũ

Cách lưu htaccess.txt thành .htaccess bằng notepad


1. Open htaccess.txt bằng Notepad
2. Save as
3. Chọn All file selection
4. Name file .htaccess


Thứ Ba, 10 tháng 9, 2013

CSVI 5.9.6 - import export virtue mart.

Phiên bản sử dụng CSVI 5.9.6 Pro  : Joomla 2.5, Virtue Mart 2.
Giới thiệu CSVI: Cấu trúc được định nghĩa để export và import. Mỗi exension được định nghĩa khác nhau vì vậy cần tham khảo cấu trúc để can thiệp export import.
Ở đây không chỉ import trên 1 table, ví dụ Virtuemart với 1 CSV Product chuẩn có thể import vào cùng lúc  category, image, cost, parent, prodcuct. (vì vậy cần phải xem hướng dẫn sử dụng).

Link download CSVI 5.9.6 Prohttps://docs.google.com/file/d/0B785Epf6q5XlS2JCX3FndVd5Ylk/edit?usp=sharing
Hướng dẫn sử dụng: http://www.csvimproved.com/overview#more-information

Hướng dẫn setup:
Setup component: setup bình thường.

Sau đó thực hiện theo hình ảnh ví dụ bên dưới:


Chủ Nhật, 8 tháng 9, 2013

10 jQuery CAPTCHA Plugins


Nguồn trích từ : http://www.jquery4u.com/security/10-jquery-captcha-plugins/
1. QapTcha: jQuery captcha system with jQuery & jQuery UI

This is an easy-to-use, simple and intuitive captcha system. It needs human action instead of to read a hard text and it is a very lightweight jQuery plugin.

Source
 


2. jQuery Fancy Draggable Captcha

Here is a jQuery example for a captcha in a registration form. In order to pass the “Are you human” test, the user has to drag the numbers from 1 to 6 into order.

Source


3. reCaptcha style Captcha with JQuery and PHP

This tutorial is about to creating a captcha same as recaptcha. Create your own recaptcha style captcha with PHP and jQuery.

Source



4. jQuery Advanced Ajax validation with CAPTCHA

jQuery offers a plugin called validate which will allow you to create stunningly user friendly sign up forms, login addresses, contact forms and much more. In this tutorial I’m going to teach you how to create a signup form with advanced AJAX validation and CAPTCHA.

Source



5. s3Capcha jQuery plugin

It is an advanced plugin script that asks for choosing the correct image instead of asking to recognize the difficult text.

Source



6. Ajax Stylish Captcha and Contact Form using JQuery and PH

This tutorial is about AJAX based contact form with jQuery validation and AJAX based captcha.

Source



7. Ajax Fancy Captcha

Ajax Fancy Captcha is a jQuery plugin that helps you protect your web pages from bots and spammers.

Source



8. jQuery Real Person

This plugin is designed to help overcome automated form submission by requiring a “real person” to identify text made up of dots. The entered value is compared on the server with the generated value to determine whether processing should continue.

Source



9. jQuery.buttonCaptcha

is a plugin, that protects your site from robots using jQuery. To unlock captcha you need to drag letters into baskets and get some simple word, or site name, which was typed in options.

Source



10. Sexy Captcha – Drag-and-Drop Ajax Captcha

Sexy Captcha is a truly ajaxified, sexy captcha module. It’s visually stimulating, functional and returns immediate feedback on whether the user’s answer was correct.

Source


AUTHOR: Sam Deering. Find out more about jQuery4u author on Google Plus.

Thứ Ba, 3 tháng 9, 2013

LAYER SLIDER JQUERY

LAYER SLIDER JQUERY:
Đối với thời điểm 09 năm 2013 - slider jquery được đánh giá cao và được nhiều người sử dụng.
Với tính năng đặc biệt: mỗi slide có nhiều lớp gọi là layer giống photoshop. Mỗi lớp có thể hình ảnh, text. Và đặc biệt là tính năng trình diễn khá giống với Power Point.

Link demo: http://codecanyon.net/item/layerslider-responsive-wordpress-slider-plugin-/full_screen_preview/1362246
Link download example: https://docs.google.com/file/d/0B785Epf6q5XlLVZRYWRBTlRyRUk/edit?usp=sharing

Thứ Hai, 2 tháng 9, 2013

RSForm!Pro - How to compare two fields using Javascript

The following script will be used to compare the value of these fields so you can get a confirmation that the data inuted by the user is correct.

You can start by creating a new form. In the "Edit form" you can enter these values:


  • Form Title: Compare
  • Form Name: Compare


  • The next step is to populate the form with the following components:
    1. Email field 1 - Textbox
      Name: email1
      Caption: Email1
      Required: Yes
      Validation: Your validation message here

      Click "Save" next to the component's settings
    2. Email field 2 - Textbox
      Name: email2
      Caption: Email2
      Required: Yes
      Validation: email

      Click "Save" next to the component's settings
    3. Submit button
      Name: compare
      Caption: Compare
      Reset: No
      Additional Attributes: onclick="return checkEmail('email1', 'email2');"

      Click "Save" next to the component's settings

    Go to the "CSS and Javascript" tab and paste the following code:


    <script type="text/javascript">
    function checkEmail(theForm) {
    if (document.getElementById('email1').value != document.getElementById('email2').value)
    {
    alert('Those emails don\'t match!');
    return false;
    }
    else {
    return true;
    }
    }
    </script>

    Click "Save" and that's it.

Thứ Năm, 29 tháng 8, 2013

Component UPGRADE joomla 1.5, 2.5 to 3.1.x

SP UPGRADE from joomla 1.5.x, 2.5.x to 3.1.x
Link download component com_spupgrade_joomla3.1.zip

Thứ Tư, 28 tháng 8, 2013

Menu auto WIDTH 100% CSS only

Mô tả: Bình thường menu sử dụng UL LI để tổ chức. Yêu cầu: cần trình bày menu item dàn đều trên 1 hàng và width 100%.
Có thể làm with %, hoặc javascript. Tuy nhiên không lúc nào cũng đạt được.
Cách xử lý:  dùng CSS display: table, display:table cell
Compatiple: Firefox, Chrome, Safary, IE8++, IE7 (need use display-table.htc).

Link example:  https://docs.google.com/file/d/0B785Epf6q5XlOXlkNlFjdzBxWk0/edit?usp=sharing
Source view:
<!DOCTYPE html>
<html>
<style type="text/css">
#footer_menu {
  display: table; text-align: center; width: 100%;
}
#footer_menu  ul {
  display: table-row; list-style: none; margin: 0; padding: 0;
}
#footer_menu li {
  display: table-cell; border:1px solid red;
}
</style>
<!--[if lte IE 7]>
<style>
#footer_menu {
 -dt-display: table;
 behavior: url(display-table.min.htc);
}
#footer_menu li {
  -dt-display: table-cell;
}
</style>
<![endif]-->

<body>
    <div id="footer_menu">
        <ul>
            <li class="nav_l" style="width:80px;border:1px solid blue;background:#000;"><a href="#">Link</a></li>
            <li class="nav_l"><a href="#">Link</a></li>
            <li class="nav_r"><a href="#">Link</a></li>
            <li class="nav_r"><a href="#">Link</a></li>
            <li class="nav_r"><a href="#">Link</a></li>
            <li class="nav_r"><a href="#">Link</a></li>
        </ul>
    </div>
</body>
</html>

Thứ Ba, 27 tháng 8, 2013

php get first image tag from string

<?php 
preg_match('/(<img[^>]+>)/i', $item['content'], $matches);
echo $matches[0]; 
?>

Thứ Hai, 26 tháng 8, 2013

Turn off error PHP - Joomla

Mô tả: một số vấn đề PHP bị lỗi có thể xuất phát từ nhiều nguyên nhân, nhưng mục tiêu cần tắt hiển thị warning không cần thiết.
Phương pháp 1: Tắt trực tiếp trong PHP.ini
display_errors Off
Phương pháp 2: Tắt trong joomla theo hình ảnh
Phương pháp 3: Tắt warning bằng .htaccess
Thêm vào đầu file 
ini_set('display_errors','off');
Phương pháp 4: Tắt wanrning bằng index.php
Trong file index.php thêm dòng:
ini_set('display_errors','off');


Chủ Nhật, 25 tháng 8, 2013

Bảo mật JOOMLA

1. Mật khẩu phức tạp: ko đặt admin, admin123, 123456, ... những tên dễ đoán - những mật khẩu dễ đoán đều nằm trong danh sách quét tự động của hacker.
2. Cập nhật phiên bản mới nhất- tránh lỗ hổng do chính bản thân joomla gây ra.
3. Thêm mật khẩu cấp 2(ý nói là muốn vào administrator thì qua 1 bước nữa). Dùng KSECURE http://diendan.joomlaviet.vn/threads/bao-ve-thu-muc-administrator-voi-ksecure.704/

QapTcha : jQuery captcha giới thiệu

Giới thiệu:
Bình thường capchar thì rất quen thuộc dùng để chống spam tự động đối với các form.
Theo công nghệ các thiết bị cầm tay cảm ứng, thì capchar có thay đổi 1 chút để phù hợp. Thay vì gõ chữ đó là ... kéo rê để khởi động hoặc xác nhận là có người sử dụng - gọi là QAPTCHAR.
Yêu cầu hệ thống: PHP
Giao diện hiển thị:


Link trang chủ (demo, linkdownload): http://www.myjqueryplugins.com/jquery-plugin/qaptcha
Cách thực hiện: 
1. Load  css + script
<link rel="stylesheet" type="text/css" href="QapTcha.jquery.css" media="screen" />
 
<!-- jQuery files -->
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery-ui.js"></script>
<script type="text/javascript" src="jquery.ui.touch.js"></script>
<script type="text/javascript" src="QapTcha.jquery.js"></script> 
2. Run script
<script type="text/javascript">
  $(document).ready(function(){
    // Simple call
    $('.QapTcha').QapTcha();
    
    // More complex call
    $('.QapTcha').QapTcha({
      autoSubmit : true,
      autoRevert : true,
      PHPfile : 'path_to_my_php_file/Qaptcha.jquery.php'
    });
  });
</script>

3. Thêm đoạn html vào Form.
<form method="post" action="">
  <fieldset>
    <label>First Name</label> <input type="text" name="firstname" />
    <label>Last Name</label> <input type="text" name="lastname" />
    <div class="clr"></div>
 
    <!-- Add this line in your form -->
    <div class="QapTcha"></div>
 
    <input type="submit" name="submit" value="Submit form" />
  </fieldset>
</form>

Chú ý: cần giữ folder file Root/PHP

Thứ Bảy, 24 tháng 8, 2013

Thêm module JModuleHepler

Mô tả:
Bình thường xử lý Joomla tự động tạo <jdoc:include type="modules" name="left" style="xhtml" />, cấu trúc này không phải lúc nào cũng hoạt động đặc biệt là lúc cần thêm module vào 1 component.
Cách sử dụng:
Sử dụng đoạn code trong mã PHP của component, index.php, module  ... bất cứ ở đâu trong PHP
<?php
    //Module position VM-Category-Top
    jimport( 'joomla.application.module.helper' );
    $module = JModuleHelper::getModules( 'VM-Category-Top' );
    if(count($module)){?>
    <div id="ja-VM-Category-Top">
        <?php
        $attribs['style'] = 'xhtml';
        foreach ($module as $new_module){
            echo JModuleHelper::renderModule($new_module, $attribs);
        }?>      
        <div class="clr"></div>
    </div>
<?php } ?>

Thứ Năm, 22 tháng 8, 2013

HTML Custom Scroll Bar

Mô tả:
Nhiều dự án đối tác yêu cầu custom thanh scroll, mặc định mỗi trình duyệt có scroll riêng và không custom được.
Cách xử lý:   http://baijs.nl/tinyscrollbar/

Hướng dẫn sử dụng: 3 bước
1. Load file script  +
$('#scrollbar').tinyscrollbar({ sizethumb: 15 }); 
2. Cấu trúc content
3. CSS scroll (đây là phần quan trọng để scroll hiển thị có thể dùng hình ảnh hoặc màu sắc để thay đổi).
Download ví dụ: http://baijs.nl/tinyscrollbar/example.zip 
Hình ảnh mẫu: 


Solved: #1146 - Table 'phpmyadmin.pma_recent'

Mô tả:
Khi run phpmyadmin xuất hiện lỗi  #1146 - Table 'phpmyadmin.pma_recent' doesn't exist

Cách xử lý:
Vẫn vào phpmyadmin > import > Browser> choose phpmyadmin\examples\create_tables.sql >open>DO



Joomla body page class, check Homepage

Joomla2.5.x và 3.x
Lấy pageclass theo menu page class để thực hiện style
<?php
  $itemid = JRequest::getVar('Itemid');
  $menu = &JSite::getMenu();
  $active = $menu->getItem($itemid);
  $params = $menu->getParams( $active->id );
  $pageclass = $params->get( 'pageclass_sfx' );
?>
<body id="bd" class="<?php echo $pageclass; ?>">



Check Homepage
<?php
$app = JFactory::getApplication();
$menu = $app->getMenu();
if ($menu->getActive() == $menu->getDefault()) {
        echo 'This is the front page';
}
?>

Thứ Tư, 21 tháng 8, 2013

PHP tự động Redirect URL

Trong file index.php thêm đoạn code
<?php
header("Location: http://joomla.org/");
exit;
?>

Thứ Ba, 20 tháng 8, 2013

MySQL DUMPER backup và restore dung lượng lớn

Mô tả:
Vấn đề gặp phải khi database lớn, trong quá trình backup và restore vượt quá time out cho phép.
Ảnh hưởng:
Khó khăn trong việc export .sql, và import. Tốn thời gian thực hiện bằng tay.
Giải quyết vấn đề SQL DUMPER được viết bằng PHP: link trang chủ  http://www.mysqldumper.net/ tìm download


Cách Backup
1. Up lên ROOT host
2. Run http://yourdomain.com/mysqldumper (folder đã up lên)
3. Tài khoản đăng nhập vào database (host, user, và password)
4. Run Backup (ở đây được chia làm từng page với timeout cho phép).

Cách Restore
1. Lấy tất cả dữ liệu MysqlDumper đem qua host mới
2. Vào http://yourdomain.com/mysqldumper
3. Đăng nhập tài khoản
4. Restore tự động retore toàn bộ dữ liệu.

Thứ Bảy, 17 tháng 8, 2013

Split file database .sql dung lượng lớn

Nhiều trường hợp website hoạt động dung lượng lớn >100MB, >500MB, >1GB
Quá trình xử lý gặp timeout rất phiền phức
Cách thực hiện split fie .sql thành các file nhỏ và run từng file 1.
Làm bằng tay rất cực, rất may tìm thấy SQLDumpSplitter link download http://www.sqldumpsplitter.com/

Các bước thực hiện:
1. Chọn file .sql
2. Tùy chọn kích cỡ file split
3. Chọn folder chưa các file sau split

Lưu ý: lúc import dữ liệu cần import file database struct .sql trước rồi mới import các file khác.
Quá trình split nếu gặp record lớn thì dung lượng >4MB là chuyện bình thường

Thứ Sáu, 16 tháng 8, 2013

Bảo mật administrator bằng plugin KSECURE

So với nhiều cách bảo mật khác KSECURE đơn giản và gọn nhẹ nhất
Hiện hỗ trợ phiên bản: 2.5 và 3.
Link download http://www.kareebu.com/downloads
Cần đăng ký tài khoản - ko cần kích hoạt, đăng ký xong sẽ download được

DOWNLOAD Phiên bản hỗ trợ joomla 1.5 
https://drive.google.com/file/d/0B785Epf6q5XlRWNXOHNGejhpckE/edit?usp=sharing

Cách thực hiện:
1. Download
2. Setup plugin
3. Vào và bật Plugin
4. Cấu hình Plugin theo 2 cách (HTTP, Compatible)
Enable: Yes
Đặt password: ví dụ 123
HTTP Authentication and (old) : sẽ sử 1 form của APACHE bắt đăng nhập bằng user name và password, user có thể bỏ trống chỉ cần đăng nhập password, sau khi đăng nhập đúng sẽ vào vùng đăng nhập của joomla.
Compatibility mode (nên sử dụng): link vào administrator là: http://your_domain/administrator/?password (http://your_domain/administrator/?123)

Trường hợp quên password (joomla 2.5 trở lên)
Vào phpadmin run query:
SELECT params FROM `jos_extensions` WHERE `type`='plugin' AND `element`='ksecure'
Thì sẽ hiển thị password, lưu ý suffix jos_ có thể chỉnh lại đúng của bạn
 
Trường hợp tắt Plugin (ko vào được administrator joomla 2.5++)
Vào phpadmin run quyery 
UPDATE `jos_extensions` SET  published='0' WHERE `type`='plugin' AND `element`='ksecure'
Chạy query này sẽ tắt plugin và mọi việc trở lại bình thường. 

Thứ Hai, 12 tháng 8, 2013

Test Speed site


1.  http://tools.pingdom.com/fpt/ 

Đây là tool có hiển thị hình ảnh, giao diện dễ nhìn. Thích phần này.
2. http://developers.google.com/speed/pagespeed/insights/
Ưu điểm:  có phần đề nghị cách xử lý.
Giao diện đơn giản - ko trực quan.

Thứ Sáu, 9 tháng 8, 2013

CHMOD trên host bằng FileZilla

Trong trường hợp ko setup được ở server có báo lỗi: ko tạo được file hoặc không di chuyển được file
Link download FTP FileZilla http://sourceforge.net/projects/filezilla/
Thực hiện:
           Chuyển CHMODE 777
Chú ý: Trong trường hợp chuyển qua 777 mà website không hoạt động tiến hành chuyển lại 755 (nguyên nhân host giới hạn phân quyền), tiến hành chụp ảnh màn hình hoặc câu thông báo liên hệ với ISP (nhà cung cấp) kiểm tra.
Thực hiện như hình ảnh:

Thứ Năm, 8 tháng 8, 2013

Nên sử dụng DIV hay Table

Hiện giờ thì chia làm 2 hướng

Đối với website thì dùng div :

Khi thực hiện các đối tác đều yêu cầu như vậy- vì mang tính rõ ràng và dễ hiệu chỉnh trong css.
Yếu tố kế tiếp khi load dữ liệu div load đến đâu hiển thị đến đó ( table thì load hết dữ liệu-> hiển thị).​

Hiện table vẫn được sử dụng đối với Mail template:
Bạn sẽ để ý 1 số mail nhận được có cấu trúc trình bày có hình ảnh, text, image, bên trái phải, footer - đối với mail template phải định hình bằng table (div ko giữ được style trong trường hợp này). Lần đầu đối tác đặt mình làm cái này mình làm div với style inline, và thế là ... được làm lại từ đầu.​

Table vẫn được sử dụng trong nội dung bài viết article content(ko phải template)- ví dụ hình ảnh và nội dung, hiển thị dữ liệu nhiều cột và row như excel thì vẫn sử dụng.​

Đây là điều mình rút được từ làm việc và yêu cầu của đối tác.

Thứ Tư, 7 tháng 8, 2013

Leverage browser caching - Expires


Ngày 07 tháng 08 năm 2013
Khi làm việc với đối tác Switzeland gặp gấn đề  Leverage browser caching
link kiểm tra từ google http://developers.google.com/speed/pagespeed/insights/?url=mydomain.com
Khi nanazy view  Leverage browser caching

Mô tả: cache lưu trữ ở Browser có hạn sử dụng gọi là Expire
Các file sẽ lưu trữ ở Cach Browser có nội dung thuộc loại STATIC (CSS, javascript, media, image, pdf .....)
Yêu cầu của đối tác: các loại này đều phải có thời gian hết hạn EXPIRE.

Cách thực hiện:
Mở file .htaccess (hoặc htaccess.txt) thêm đoạn sau :
Sau khi thêm kiểm tra lại từ link developer google để xem kết quả

# Enable expirations
ExpiresActive On

# Default directive
ExpiresDefault "access plus 1 month"

# My favicon
ExpiresByType image/x-icon "access plus 1 year”

# Images
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"

# CSS
ExpiresByType text/css "access 1 month”

# Javascript
ExpiresByType application/javascript "access plus 1 year"

Thứ Sáu, 2 tháng 8, 2013

mysqlnd cannot connect to MySQL 4.1+ using the old

Lỗi này ghi nhận ngày 02 tháng 08 năm 2013
Khi kết nỗi remote MYSQL Server.
Joomla ko kết nối được - báo liên tục lỗi. Khi sử dụng phpminiadmin.php hiển thị lỗi
Cannot connect to the database because: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file

Cách xử lý:
Run QUERY
SET SESSION old_passwords=FALSE; 
SET PASSWORD = PASSWORD('password');