Magento 2, Magento Development, Customization, Extension Development and Integration, Optimization, SEO and Responsive Design

Magento 2, Magento Development, Customization, Extension Development and Integration, Optimization, SEO and Responsive Design

htaccess Password Protect Folder


If you want to protect you directory using htaccess than follow this post.

Protecting files on your website from unauthorized users can be very important. Even more important is the method by which you accomplish this task. You can use PHP to listen for login authorization information on each page, but that doesn't protect your images, documents, and other media. That's why .htaccess method of protecting files and directories the most reliable.

Step1: Creat one .htaccess file as following
AuthName "Authorisation Required"
AuthUserFile "/home/test/public_html/getfile/.htpasswd"
AuthType Basic
require valid-user
ErrorDocument 401 "Authorisation Required"

Step2: Creat one .htpasswd file as following
username:encryptedpassword

The .htpasswd file contains the usernames and passwords of allowed users. One per line. The passwords are MD5'd for security purposes.
e.g. dave:XO5UAT7ceqPvc

That's it.

PHP script to download multiple files also get all the files from folder

In this post you can get the list of files from your folder and you can download particular file.

For this you need to create two files as following.

Step1: Create one index.php file and add following code.

<?php 
$path = $_SERVER['DOCUMENT_ROOT']."/your_folder/"; 
  
$files = scandir($path);
$count=1;
foreach ($files as $filename)
{
    if($filename=="." || $filename==".." || $filename=="download.php" || $filename=="index.php")
    {
        //this will not display specified files
    }
    else
    {
        echo "<label >".$count.".&nbsp;</label>";
        echo "<a href="download.php/?filename=".$filename."">".$filename."</a><br/>";
        $count++;
    }
}
?>

Step2: Create one download.php file and add following code.

<?php
function output_file($file, $name, $mime_type='')
{
 /*
 This function takes a path to a file to output ($file),  the filename that the browser will see ($name) and  the MIME type of the file ($mime_type, optional).
 */
 
 //Check the file premission
 if(!is_readable($file)) die('File not found or inaccessible!');
 
 $size = filesize($file);
 $name = rawurldecode($name);
 
 /* Figure out the MIME type | Check in array */
 $known_mime_types=array(
  "pdf" => "application/pdf",
  "txt" => "text/plain",
  "html" => "text/html",
  "htm" => "text/html",
 "exe" => "application/octet-stream",
 "zip" => "application/zip",
 "doc" => "application/msword",
 "xls" => "application/vnd.ms-excel",
 "ppt" => "application/vnd.ms-powerpoint",
 "gif" => "image/gif",
 "png" => "image/png",
 "jpeg"=> "image/jpg",
 "jpg" =>  "image/jpg",
 "php" => "text/plain"
 );
 
 if($mime_type==''){
  $file_extension = strtolower(substr(strrchr($file,"."),1));
  if(array_key_exists($file_extension, $known_mime_types)){
  $mime_type=$known_mime_types[$file_extension];
  } else {
  $mime_type="application/force-download";
  };
 };
 
 //turn off output buffering to decrease cpu usage
 @ob_end_clean(); 
 
 // required for IE, otherwise Content-Disposition may be ignored
 if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');
 
 header('Content-Type: ' . $mime_type);
 header('Content-Disposition: attachment; filename="'.$name.'"');
 header("Content-Transfer-Encoding: binary");
 header('Accept-Ranges: bytes');
 
 /* The three lines below basically make the 
    download non-cacheable */
 header("Cache-control: private");
 header('Pragma: private');
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 
 // multipart-download and download resuming support
 if(isset($_SERVER['HTTP_RANGE']))
 {
 list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
 list($range) = explode(",",$range,2);
 list($range, $range_end) = explode("-", $range);
 $range=intval($range);
 if(!$range_end) {
  $range_end=$size-1;
 } else {
  $range_end=intval($range_end);
 }
 
 $new_length = $range_end-$range+1;
 header("HTTP/1.1 206 Partial Content");
 header("Content-Length: $new_length");
 header("Content-Range: bytes $range-$range_end/$size");
 } else {
 $new_length=$size;
 header("Content-Length: ".$size);
 }
 
 /* Will output the file itself */
 $chunksize = 1*(1024*1024); //you may want to change this
 $bytes_send = 0;
 if ($file = fopen($file, 'r'))
 {
 if(isset($_SERVER['HTTP_RANGE']))
 fseek($file, $range);
 
 while(!feof($file) && 
  (!connection_aborted()) && 
  ($bytes_send<$new_length)
       )
 {
  $buffer = fread($file, $chunksize);
  print($buffer); //echo($buffer); // can also possible
  flush();
  $bytes_send += strlen($buffer);
 }
 fclose($file);
 } else
 //If no permissiion
 die('Error - can not open file.');
 //die
die();
}
//Set the time out
set_time_limit(0);

//path to the file
$file_path=$_SERVER['DOCUMENT_ROOT'].'/your_folder/'.$_REQUEST['filename'];


//Call the download function with file path,file name and file type
output_file($file_path, ''.$_REQUEST['filename'].'', 'text/plain');

?>

Change 'your_folder' with you folder name in both files.


Display Available Configurable Product Options on Product Listing page in Magento


Using my this post you can add Product Configurable option which are in stock like size, color etc. on your Product listing page.

You can add some simple code to our website, that will show which options are available, so when your customer is looking at your list pages, where you have multiple products being shown, you can clearly show them which sizes or colors are still in stock.

Configurable Product Options

As you can see in the image above, the available shoe sizes are being shown on each product. So your customer can easily find out the product for what they are looking.

To do this, use following code in  app/design/frontend/default/my-theme/template/catalog/product/
<?php
$sizes = array();
if($_product->isConfigurable()){
    $allProducts = $_product->getTypeInstance(true)->getUsedProducts(null, $_product);
    foreach ($allProducts as $subproduct) {
        if ($subproduct->isSaleable() && floor($subproduct->getStockItem()->getQty()) > 0 ) {
            $sizes[] = $subproduct->getAttributeText('config_sizes');
        }
    }
    if(count($sizes)>0) {
        sort($sizes);
        ?>
        <div>
        Sizes: <? echo implode(", ", $sizes); ?>
        </div>
        <?
    }
}
?>

Replace 'config_sizes' with your attribute code.

Hide “Out of Stock” Products in Layered Navigation and Product Filter Magento

If you want to filter your product collection and want to show only in stock product than you can do as following.

You need to change in file Mage/Catalog/Model/Layer.php

Change the following function
public function prepareProductCollection($collection)
{
   $collection
         ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
         ->addMinimalPrice()
         ->addFinalPrice()
         ->addTaxPercents()
         //->addStoreFilter()
         ->addUrlRewrite($this->getCurrentCategory()->getId());
        
    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
     Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
     return $this;
 }

To

public function prepareProductCollection($collection)
{
   $collection
         ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
         ->addMinimalPrice()
         ->addFinalPrice()
         ->addTaxPercents()
         //->addStoreFilter()
         ->addUrlRewrite($this->getCurrentCategory()->getId());
        
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
     Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
     //return $this;
$collection->joinField(
       'stock_status',
       'cataloginventory/stock_status',
       'stock_status',
       'product_id=entity_id', array(
       'stock_status' => Mage_CatalogInventory_Model_Stock_Status::STATUS_IN_STOCK,
       'website_id' => Mage::app()->getWebsite()->getWebsiteId(),
      )
    );
   return $collection;
 }

How to add active class to menu or li after form load using jQuery

If you want to make menu active using jQuery after form load use my following code. You can also use this code if you have ul/ li and want to add active class to selected li.

<ul>
  <li><a href="https://www.blogger.com/page1.php">page 1</a></li>
  <li><a href="https://www.blogger.com/page2.php">page 2</a></li>
</ul>


$('li').each(function(){
    if(window.location.href.indexOf($(this).find('a:first').attr('href'))>-1)
    {
    $(this).addClass('active').siblings().removeClass('active');
    }
});

 

Copyright @ 2017 HKBlog.