Wednesday 25 January 2012

Magento: Form validation

Magento uses Prototype as javascript library.  It provides a easy way to validate form values in html.

Below is the example:


<form name="myfrm" id="myfrm" method="post">
<label for="firstname">
< ?php echo $this->__('First name') ?> <span>*</span></label><br />
<input  id="firstname" name="firstname" class="input-text  required-entry"/>

<label  for="lastname">
< ?php echo $this->__('Last name') ?>  <span>*</span></label><br />
<input  id="lastname" name="lastname" class="input-text   required-entry"/>

</form>

<script type="text/javascript">

var customForm = new VarienForm('myfrm');

</script>
 
Remember to pass form id into the new VarienForm object.

In the form above you can see each input field has its own class name and these classes will be used to validate field’s value. There are many predefined classes like that in prototype lib.

Validate Class Meaning
validate-select Please select an option.
required-entry This is a required field.
validate-number Please enter a valid number in this field.
validate-digits Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.
validate-alpha Please use letters only (a-z or A-Z) in this field.
validate-code Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.
validate-alphanum Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.
validate-street Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.
validate-phoneStrict Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.
validate-phoneLax Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.
validate-fax Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.
validate-date Please enter a valid date.
validate-email Please enter a valid email address. For example johndoe@domain.com.
validate-emailSender Please use only letters (a-z or A-Z), numbers (0-9) , underscore(_) or spaces in this field.
validate-password Please enter 6 or more characters. Leading or trailing spaces will be ignored.
validate-admin-password Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.
validate-cpassword Please make sure your passwords match.
validate-url Please enter a valid URL. http:// is required
validate-clean-url Please enter a valid URL. For example http://www.example.com or www.example.com
validate-identifier Please enter a valid Identifier. For example example-page, example-page.html or anotherlevel/example-page
validate-xml-identifier Please enter a valid XML-identifier. For example something_1, block5, id-4
validate-ssn Please enter a valid social security number. For example 123-45-6789.
validate-zip Please enter a valid zip code. For example 90602 or 90602-1234.
validate-date-au Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.
validate-currency-dollar Please enter a valid $ amount. For example $100.00.
validate-one-required Please select one of the above options.
validate-one-required-by-name Please select one of the options.
validate-not-negative-number Please enter a valid number in this field.
validate-state Please select State/Province.
validate-new-password Please enter 6 or more characters. Leading or trailing spaces will be ignored.
validate-greater-than-zero Please enter a number greater than 0 in this field.
validate-zero-or-greater Please enter a number 0 or greater in this field.
validate-cc-number Please enter a valid credit card number.
validate-cc-type Credit card number doesn\’t match credit card type
validate-cc-type-select Card type doesn\’t match credit card number
validate-cc-exp Incorrect credit card expiration date
validate-cc-cvn Please enter a valid credit card verification number.
validate-data Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.
validate-css-length Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%
validate-length Maximum length exceeded.





Monday 23 January 2012

Generate PDF files in CakePHP using TCPDF

What is TCPDF?
TCPDF is an Open Source PHP class for generating PDF documents.

Its a best way to generate PDF in CakePHP, comparatively any other available  helper i ever used.

How to use ?
Below are the steps.

Step: 1 Download and Configure

  1. Go to http://www.tcpdf.org and download the latest version of TCPDF.
  2. Extract to one of your vendors folders, such as app/vendors. It will create a directory tcpdf there with tcpdf.php and more in it. You need at least the folders tcpdf/config and tcpdf/fonts in your application.
  3. Configure TCPDF, see its documentation. You want at least to have a look at tcpdf/config/tcpdf_config.php
Step 2: Extend TCPDF to customize your header and footer

There is a default header and footer in TCPDF, defined in a header() and a footer() method, which is supposed to be overwritten by you, if needed. This can be done by extending TCPDF and then calling this extended TCPDF class from your application.

In app/vendors create the file xtcpdf.php with this content:

  <?php

App::import('Vendor', 'tcpdf/tcpdf');

class XTCPDF extends TCPDF {

    var $xheadertext = 'Heading';
    var $xheadercolor = array(0, 0, 200);
    var $xfootertext = 'Footer';
    var $xfooterfont = 'times';
    var $xfooterfontsize = 12;

    /**
     * Overwrites the default header
     * set the text in the view using
     *    $fpdf->xheadertext = 'YOUR ORGANIZATION';
     * set the fill color in the view using
     *    $fpdf->xheadercolor = array(0,0,100); (r, g, b)
     * set the font in the view using
     *    $fpdf->setHeaderFont(array('YourFont','',fontsize));
     */
    function Header() {

        list($r, $b, $g) = $this->xheadercolor;
        $this->SetY(-290);
        $this->SetFillColor($r, $b, $g);
        $this->SetTextColor(0, 0, 0);
       $this->SetFont('times', '', 14);
       $this->writeHTMLCell(-250, '', '', '', $this->xheadertext, 0, 0, false, true, 'C');
       $this->SetY(-280);
       $this->Cell(0,8, '','T',1,'C');
    }

    /**
     * Overwrites the default footer
     * set the text in the view using
     * $fpdf->xfootertext = 'Copyright © %d YOUR ORGANIZATION. All rights reserved.';
     */
    function Footer() {
        $footertext = sprintf($this->xfootertext, $year);
        $this->SetY(-20);
        $this->SetTextColor(0, 0, 0);
        $this->SetFont($this->xfooterfont,'',$this->xfooterfontsize);
        $this->Cell(0,8, '','T',1,'C');
         $this->SetY(-18);
        // write the second column
        $this->writeHTMLCell(180, '', '', '', $this->xfootertext, 0, 0, false, true, 'C');
      }

}

?>  

   
Step 3: Create your layout for PDF

You cannot use your default layout, as it would wrap the PDF file in your HTML page code. You need a layout such as this one, save it as app/views/layouts/pdf.ctp :

<?php
header("Content-type: application/pdf");
echo $content_for_layout;
?>

Step 4: For your Controller

    function downloadPdf() {
        $this->layout = 'pdf';
       
        Configure::write('debug', 0);
        $tcpdf = new XTCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
        $some_filed = $_REQUEST['some_filed'];
        $some_filed = $_REQUEST['some_filed'];
        $some_filed = $_REQUEST['some_filed'];
        $obj = new SomeHelper();
        $Somefiled = ucwords($obj->getSomefiled($brand));
        $rowsArray = $obj->SomeFunction($some_filed, $some_filed, $some_filed);
        $this->set('tcpdf', $tcpdf);
        $this->set('some_filed', $some_filed);
        $this->set('rowsArray', $rowsArray[);
        $this->render('/reports/procurement/download_pdf');
    }
Step 5: For your View

View Template:
 

<?php
$html='';
$slno=1;
$textfont = 'times'; // looks better, finer, and more condensed than 'dejavusans'
//set margins
$tcpdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$tcpdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$tcpdf->SetFooterMargin(PDF_MARGIN_FOOTER);
//set auto page breaks
$tcpdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$tcpdf->setHeaderFont(array($textfont, '', 18));
$tcpdf->xheadercolor = array(255, 255, 255);
$tcpdf->xheadertext = "<p style='text-align: center;'> <b> Header of the page </b> </p>";
$tcpdf->xfootertext = "<b><i>Copy Right Message</i></b></p>";

// add a page (required with recent versions of tcpdf)
$tcpdf->AddPage(); // Front Page

$html_1 = "<p style='text-align: center;'> $supplier </p>";

$tcpdf->SetY(-270);
$tcpdf->SetTextColor(0, 0, 0);
$tcpdf->SetFont('times', '', 12);
$tcpdf->writeHTMLCell(-250, '', '', '', $html_1, 0, 0, false, true, 'C');

$curNtDateTime = explode(' ', Date('d-m-Y H:i:s'));
$curDate = $curNtDateTime[0];
$curTime = $curNtDateTime[1];



$lefthtml = "<b>Date: </b>$curDate";

$tcpdf->SetY(-260);
$tcpdf->SetTextColor(0, 0, 0);
$tcpdf->SetFont('times', '', 12);
$tcpdf->writeHTMLCell(-250, '', '', '', $lefthtml, 0, 0, false, true, 'L');


$righthtml = "<b>Time: </b>$curTime";

$tcpdf->SetY(-260);
$tcpdf->SetTextColor(0, 0, 0);
$tcpdf->SetFont('times', '', 12);
$tcpdf->writeHTMLCell(-250, '', '', '', $righthtml, 0, 0, false, true, 'R');

$html = "<style>
    table
    {
        border-collapse:collapse;
    }
    table,th, td
    {
        border: 1px solid black;
    }
   </style>

    <table  cellspacing='0' cellpadding='20'>
        <tr>
            <td >S. No</td>
            <td >some_filed</td>
            <td >some_filed</td>
            <td >some_filed</td>
            <td >some_filed</td>
            <td >some_filed</td>
        </tr>";
foreach ($rowsArray as $row) {

    $html.= '<tr>';
    $html.= '<td>' . $slno++ . '</td><td>' . $row['some_filed'] . '</td>';
    $html.= '<td>' . $row['some_filed'] . '</td><td>' . (int) $row['some_filed'] . '</td>';
    $html.= '<td>' . $row['some_filed'] . '</td>';
    $html.= '<td>' . $row['mrp'] . '</td>';
    $html.= '</tr>';
}

$html.="</table>";


$tcpdf->setY(-240);
$tcpdf->SetTextColor(0, 0, 0);
$tcpdf->SetFont($textfont, '', 12);

// output the HTML content
$tcpdf->writeHTML($html, true, false, true, false, '');

// reset pointer to the last page
$tcpdf->lastPage();

echo $tcpdf->Output('File_Name.pdf', 'D');
?>


So is it done? 
Yeah.. Now you are done ;)
  Enjoy!!
References:
http://bakery.cakephp.org/articles/kalileo/2010/06/08/creating-pdf-files-with-cakephp-and-tcpdf

Friday 20 January 2012

Send Custom Email In Magento

 Below is the example how to send custom email in magento.


/**
   * Send email Magento
   */
  function sendEmail() {
    if ($this->getRequest()->getPost()) {
      /**
       * $templateId can be set to numeric or string type value.
       * You can use Id of transactional emails (found in
       * "System->Trasactional Emails").
       */
      $collection = Mage::getResourceSingleton('core/email_template_collection')
              ->addFieldToFilter('template_code', array('any_templae_code'));
      foreach ($collection as $value) {
        $templateId = $value->getTemplateId();
      }
      $name = 'Ajit';
      $email = 'ajit@test.com';
      $comment = 'seems working send email';

      $mailSubject = 'Subject Any;

      /**
       * $sender can be of type string or array. You can set identity of
       * diffrent Store emails (like 'support', 'sales', etc.) found
       * in "System->Configuration->General->Store Email Addresses"
       */
      $sender = array('name' => $name,
          'email' => $email);


      /**
       * For multiple recipient use array here.
       */
      $email = Mage::getStoreConfig('trans_email/ident_custom1/email');

    
      $name = 'Admin';

      $vars = Array('comment' => $comment);
     

      /*  optional */
      $storeId = Mage::app()->getStore()->getId();

      $translate = Mage::getSingleton('core/translate');
      Mage::getModel('core/email_template')
              ->setTemplateSubject($mailSubject)
              ->sendTransactional($templateId, $sender, $email, $name, $vars, $storeId);
      $translate->setTranslateInline(true);
      $this->_getSession()->addSuccess('Email Sent);
      $this->_redirect('any_url');
    } else {
      $this->_getSession()->addError('Invalid access');
      $this->_redirect('any_url');
    }
  }


Happy coding ;)

Magento 1.5: Keep out of stock product always at last in the product listing page

Not a good habit  of changing in the core files, first keep in side local folder if any changes required in core files.
You will get less pain during magento version up gradation.

Below code will help you to keep out of stock products in magento always at  last in the product listing page .

First copy Collection.php file from /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php  to /app/code/local/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php folder structure .

Put below code:

$this->getSelect()->joinLeft(
            array('_inventory_table' => $this->getTable('cataloginventory/stock_status')), "_inventory_table.product_id = e.entity_id", array('stock_status'));

    $this->getSelect()->order('stock_status DESC');

Beginning of the function addAttributeToSort(). See below how it will look like


 public function addAttributeToSort($attribute, $dir='asc') {

 
    $this->getSelect()->joinLeft(
            array('_inventory_table' => $this->getTable('cataloginventory/stock_status')), "_inventory_table.product_id = e.entity_id", array('stock_status'));

    $this->getSelect()->order('stock_status DESC');


Now you are done.

Good luck

Iframe dynamic Height and src url using jquery

Below jquery code will help you to  generate dynamic height without scroll bar in iframe and also you can change src url dynamically. 

$(document)
    .ready(
        function() {
                  var newurl = 'any_url';
            $('#iframe_id').attr('src', newurl);

            // For other good browsers.
            $('iframe')
            .load(
                function() {
                    this.style.height = 0;

                    this.style.height = this.contentWindow.document.body.scrollHeight
                    + 500 + 'px';
                // this.style.width =
                // this.contentWindow.document.body.offsetWidth
                // + 100 + 'px';

                });

        });

Hope this will help :)

Cheers