Friday 31 August 2012

Garbage Collection in PHP

Today I was reading one article about how garbage collectors works in php and found its very useful.

Click here to read this article and share your experience with us.
  If any one found other good articles, i will be appreciating if you could share with us.


Wednesday 4 July 2012

How to Fetch Taxonomy Term in Drupal 7


Some time we not able to print value of taxonomy in *.tpl.php page. We can easily print value of a field.

Example

 <?php print $node->field_status_icon[$node->language][0]['value']; ?>

When we do same thing for taxonomy, we found blank content. For taxonomy we can fetch data through simple sql code.

Example

 <?php $result = db_query("select * from taxonomy_term_data where tid='".$node->field_type['und'][0]['tid']."'");
foreach($result as $record)
{
 echo $record->name;
}?>

Complete Code: 

Page—<page name> .tpl.php 

<div class="event_page_mid">
<div class="eventext" >
<?php if($node->field_type['und'][0]['tid']): ?>
<div class="field field-type-options-select field-field-type">
 <h3 class="field-label">Type</h3>
 <div class="field-items">
 <div class="field-item"><?php

 $result = db_query("select * from taxonomy_term_data where tid='".$node->field_type['und'][0]['tid']."'");
foreach($result as $record)
{
 echo $record->name;
}


?><?php //print $node->field_type['und'][0]['tid']; ?></div>
  </div>
</div>
<?php endif; ?>

<?php if($node->field_genre['und'][0]['tid']): ?>
<div class="field field-type-options-select field-field-type">
  <h3 class="field-label">Genre</h3>
  <div class="field-items">
      <div class="field-item">
      <?php

 $resultterm = db_query("select * from taxonomy_term_data where tid='".$node->field_genre['und'][0]['tid']."'");
foreach($resultterm  as $recordnew)
{
 echo $recordnew->name;
}


?>
      <?php //print $node->field_genre['und'][0]['tid']; ?></div>
  </div>
</div>
<?php endif; ?>

Monday 2 July 2012

How to Write Doctrine Query OR conditions

 

See how we can write doctrine query  using multiple OR conditions which will prevent you from the special characters.

Example: 
$query = Doctrine_Query::create()
        ->select('u.*, up.*')
        ->from('sfGuardUser u')
        ->leftJoin('u.Profile up');
        $query->where('u.username LIKE ? OR u.first_name LIKE ? OR u.last_name LIKE ? OR up.fullname LIKE ? OR u.email_address LIKE ? OR up.charity_name LIKE ? OR up.advertiser_name LIKE ? OR up.organization_name LIKE ?',
            array('%'.$input.'%', '%'.$input.'%', '%'.$input.'%', '%'.$input.'%', '%'.$input.'%','%'.$input.'%', '%'.$input.'%', '%'.$input.'%'));

Wednesday 13 June 2012

Magento robots.txt

Magento comes without robots.txt functionality. It can be useful to add one yourself to tell the search engines where they are not allowed to index. It will hide your javascript files, hide SID parameters and prevent some duplicate content. It will help your SEO process and reduces resources on your server. In this blogpost explain you how to set your own robots.txt using an existing example and using an extension. Both solutions are easy to handle. 

 Very good explanation :

http://www.byte.nl/blog/2012/06/11/magento-robots-txt/


Wednesday 1 February 2012

Enabling Memcached in Magento



The new local.xml.additional memcached portion that comes standard in Magento now looks like this:

   
<backend></backend><!-- apc / memcached / xcache / empty=file -->
<slow_backend></slow_backend> <!-- database / file (default) - used for 2 levels cache setup, necessary for all shared memory storages -->
<memcached><!-- memcached cache backend related config -->
    <servers><!-- any number of server nodes can be included -->
        <server>
            <host><![CDATA[]]></host>
            <port><![CDATA[]]></port>
            <persistent><![CDATA[]]></persistent>
            <weight><![CDATA[]]></weight>
            <timeout><![CDATA[]]></timeout>
            <retry_interval><![CDATA[]]></retry_interval>
            <status><![CDATA[]]></status>
        </server>
    </servers>
    <compression><![CDATA[0]]></compression>
    <cache_dir><![CDATA[]]></cache_dir>
    <hashed_directory_level><![CDATA[]]></hashed_directory_level>
    <hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
    <file_name_prefix><![CDATA[]]></file_name_prefix>
</memcached>
</cache>




To get memcached up and working, this configuration can be used:
   
<cache>
<slow_backend>File</slow_backend>
<fast_backend>memcached</fast_backend>
<fast_backend_options>
  <servers>
    <server>
      <host>[ip_of_memcache_server]</host>
      <port>11211</port>
      <persistent>1</persistent>
    </server>
  </servers>
</fast_backend_options>

<backend>memcached</backend>
<memcached>
  <servers>
    <server>
      <host>[ip_of_memcache_server]</host>
      <port>11211</port>
      <persistent>1</persistent>
    </server>
  </servers>
</memcached>
</cache>


This new configuration is similar to the old one with some changes. The <slow_backend> option above is set to use files. This acts as a backup mechanism in the event that the primary memcached instance fails. In previous versions of Magento, there was no failover mechanism. If memcached were to die or stop responding, it would result in the entire Magento site to go down.

It is worth noting that the <slow_backend> cache could also be set to use a memcached config, If this were the same ip and port of the <fast_backend> configuration, the configuration will work but any failover would be negated as a memcached failure would still result in the site going down. As an option, a second memcached instance would be setup to listen on a different port than the default 11211 (or use a local unix socket). This would still allow the <slow_backend> to perform “fast” as it is not dependent on file system access. Alternatively you could also use the /dev/shm memory based file system for the <slow_backend> set to “file” so if the fast memcached backend failed you would still have faster failover to memory instead of disk.

To further decrease the chances that Magento would fail as result of a memcached failure, Magento does support multiple distributive memcached servers. You can run multiple memcached instances on the same server on different ports (or unix sockets) or if your store is running on multiple servers in a cluster environment, you can run a separate memcached instance on each server. In both of these cases, a single memcached failure will not result in the site going down. A distributive configuration can be placed with in the <servers></servers> section and looks like the following:

   
<servers>
  <server>
    <host>[ip_of_memcache_server1]</host>
    <port>11211</port>
    <persistent>1</persistent>
  </server>
  <server>
    <host>[ip_of_memcache_server2]</host>
    <port>11211</port>
    <persistent>1</persistent>
  </server>
  <server>
    <host>[ip_of_memcache_server3]</host>
    <port>11211</port>
    <persistent>1</persistent>
  </server>
</servers>


Please remember to always follow good security practices and never run memcached on an external public ip address. Always run memcached on a local unix socket or localhost. If a clustered environment exists with a private internal network that is in no way accessible from the internet, memcached may be set to listen on those private interfaces.

Magento: How to turn on 'Template Path Hints'

When viewing your theme, it’s helpful to see which template file is being used for which part of the page. Magento has an excellent debugging tool called ‘Template Path Hints’.
1. AdminSystemConfiguration.
2. Select your store from the drop-down in the upper-left corner and wait for the page to reload. Note that you have to be on the website level or lower. The ‘Template Path Hints’ option will not be visible if you are at a higher level.
3. AdvancedDeveloper (all the way at the bottom).
4. Template Path HintsYes.
5. Hit the orange Save Config button.
Go to your store and reload. You should see path specs in dashed boxes around all sections of the page. These paths tell you which template .phtml file is responsible for that section.

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