Monday 29 October 2018

How to send email programmatically in Drupal 8?

Sometime we need to send email on any events or after creation of blog or article or in any e-commerce site for send confirmation mail after successful completion of order. So In this Blog we are going to explore how to send email programmatically in drupal 8.
We just have to use `hook_mail` function in '.module' file. here two simple steps for send email:

1. Define your properties like Subject, body, headers etc in hook_mail() function.
2. Use Mail Manager to send email.

When we need to send email programmatically, we need to specify the module name that implements hook_mail().
Now have a look of implementation.

<?php

/**
 * Implements hook_mail().
 */

function [module_name]_mail($key, &$message, $params) {
    $options = array(
        'langcode' => $message['langcode'],
    );
    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
    switch ($key) {
        case 'create_event':
            $message['from'] = \Drupal::config('system.site')->get('mail');
            $message['subject'] = t('Notification: @subject', array('@subject' => $params['subject']), $options);
            $message['body'][] = SafeMarkup::checkPlain($params['message']);
            break;
    }
}
?>

Here $key is defines one template identified as test_message.
The two other arguments are $params and $message. here $parms is an array of data that needs to go in the email and that is passed from mail manager.
So here is final step for send mail via `mailManager`.

<?php
/**
* Implements hook_entity_insert().
*/

function [module_name]_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
    if ($entity->getEntityTypeId() !== 'node' || ($entity->getEntityTypeId() === 'node' && $entity->bundle() !== 'event')) {
      return;
    }   
    $user_email = \Drupal::currentUser()->getEmail();
    $key = 'create_event';
    $module = <module_name>;
    // mail sending to reviewer users
    $msg1 = "Hello, <br /><br />";
    $msg1.= "Please check your content item, that is published by publisher.";
    $msg1.= "Kind regards";

    $mailManager = \Drupal::service('plugin.manager.mail');
    $to = $user_email;
    $params['message'] = t($msg1);
    $params['subject'] = "Project name workflow for published Notification.";
    $langcode = \Drupal::currentUser()->getPreferredLangcode();
    $send = true;

    $result = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send);   

    if ($result['result'] !== true) {
      drupal_set_message(t('There was a problem sending your message.'), 'error');
    }
    else {
      drupal_set_message(t('Your message has been sent.'));
    }   
}
?>

By default, PHPMail, which is use for default_mail() function in PHP. So this will triggered whenever any event will be created, here
$send = the boolean value which is indicating whether the email should be actually sent or not.
$key = template id.


Note: If have any suggestions or issue regarding 'How to send email programmatically in Drupal 8?' then you can ask by comments.  
   

Friday 12 October 2018

How to upload file using URL in drupal 8 programmatically?

Here is a simple way to upload file either file or image by URL in drupal 8. We are going to give an example for this query.
Example: First we need an url like..
        $fileurl = $fileurlval->url;             
        $name = str_replace(' ', '-', strtolower($meta_title).'.pdf');   //here meta_title is the name of your pdf or image
       
        //Get the uploaded file from the url.  
        $filedata = file_get_contents($fileurl);
       
        //Saves a file to the specified destination and creates a database entry.
        $file_directory_name = 'images'; // it means  upload folder name  
        $uploaded_file = file_save_data($filedata, "public://".$file_directory_name."/".$name, FILE_EXISTS_RENAME);
       
        // here "public://" means 'sites/default/files/' folder..
        // here $file_directory_name means we can set any folder where we want to upload..
        // here $name is name of file name..
                           
        if (!empty($uploaded_file)) { 
            $file_arr = array(
                "target_id" => $uploaded_file->id(),
                 "alt" => $uploaded_file->getFilename(),
            );       
       
            $node->field_resources_asset_tagging = $file_arr; // here field_resources_asset_tagging is file field..       
        }

So this is the way to upload file/image in drupal 8 programmatically.  


Note: If have any suggestions or issue regarding 'How to upload file using URL in drupal 8 programmatically?' then you can ask by comments.  
   

Thursday 4 October 2018

How to remove or unset META tag from web page?

If we want to hide or unset or remove META Tag from our web page then we have to use `hook_page_attachments_alter` in `.theme` file.
we have to create an array and pass the name of `META name` which we want to remove or unset from web page.
like..
$unset_meta = [
    'title', // Meta name "title"
    'description', // Meta name "description"
    'keywords', // Meta name "keywords"
    'Generator'     // Meta name "Generator"
];

then with the help of $page['#attached']['html_head'], page attachments html_head we have to check that meta name if exist then we have to unset this.
we are giving here an example for this..

Example:
function moldev_page_attachments_alter(array &$page) { // here moldev is my theme name.
 // Define an array of META tags to remove.
   $unset_meta = [
    'title', // Meta name "title" 
    'description', // Meta name "description"
    'keywords', // Meta name "keywords"
    'Generator'     // Meta name "Generator"   
   ];
  // Check values and delete.
   foreach ($page['#attached']['html_head'] as $key => $value) {
     if (in_array($value[1], $unset_meta)) unset($page['#attached']['html_head'][$key]);
   }
}

if you want to delete/remove/unset any link rel="alternate" and hreflang="en" or any language then follow the below given code.
foreach ($page['#attached']['html_head_link'] as $key => $attachment) {   
          if ($attachment[0]['rel'] == 'alternate' && $attachment[0]['hreflang'] == 'en') {
               unset($page['#attached']['html_head_link'][$key]);
          }
}

Note: If have any suggestions or issue regarding 'How to remove or unset META tag from web page?' then you can ask by comments.  

How to resolve max execution time error in drupal ?

When you found error regarding 'max_execution_time' exceed, then you can follow steps for resolve this error: Steps:   You can put t...