What is Patch and How to create a patch in Drupal

A patch is a software update comprised code inserted (or patched) into the code of an executable program. Typically, a patch is installed into an existing software program. Patches are often temporary fixes between full releases of a software package.

Patch is a file that consists of a list of differences and is usually created with the help of the git diff command. In the Drupal community, developers make use of this patch file as a contribution to fix an issue or enhance a feature in a module, theme, or even for Drupal core.

Below are the step for creating a patch

1 - Create and set up a repository on GitHub specifically for creating patch files. It is best to maintain a single git repository for the patch files that you will be applying to your drupal project.

2 - Move the module/theme or core files that you need to generate patches to the newly created git repository

3 - Make the necessary changes to a file on your local

4 - Verify that the “git status” command shows the file that you have modified.

5 - To generate the patch, use the following command:
      
        git diff --no-prefix [file-name] > ./file-name.patch
 

drupal 8 how i create a custom form to programmatically created block and assign to it in variable in preprocess

Preprocess page assign a custom block to variables code

$customblock = \Drupal::service('plugin.manager.block')-  >createInstance('custom_block_id', []);

 $variables['home_meal_plan'] = $customblock->build(); 

*******************************************************************************

1 - Creating custom form

goto - custom_module\src\Form and create a customform.php

<?php

namespace Drupal\meal_plan\Form;

use Drupal\Core\Form\FormBase;

use Drupal\Core\Form\FormStateInterface;

use Symfony\Component\HttpFoundation\RedirectResponse;

use Drupal\cms_pages\Controller\CommonFunc;

/**

 * Provides meal plan form.

 *

 * @internal

 */

class HomeMealForm extends FormBase {

  /**

   * {@inheritdoc}

   */

  public function getFormId() {

    return 'home_meal_form';

  }

  /**

   * {@inheritdoc}

   */

  public function buildForm(array $form, FormStateInterface $form_state) {

    global $base_url;

    $hindi = CommonFunc::isHindi();

    if (\Drupal::currentUser()->isAnonymous()) {

      $footer_content = CommonFunc::getCmsContent('field_meal_plan_footer_content');

      $meal_plan_heading = CommonFunc::getCmsContent('field_meal_plan_heading');

        $form['age'] = [

          '#type' => 'textfield',

  '#attributes' => array('class' => array('inptFld'), 'id' => array('home-meal-age') ,'autocomplete' => array('off')),

          '#default_value' => '',

          '#placeholder' => 'Eg. 7',

          '#required' =>TRUE

        ];

      $query = \Drupal::entityQuery('taxonomy_term');

      $query->condition('vid', 'food_type');

      $query->sort('name');

      $tids = $query->execute();

      $options = [];

      $options = [

    'Vegan' => t('Vegan'),

        'Veg' => t('Veg'),

'Eggetarian' => t('Eggetarian'),

'Pescatarian' => t('Pescatarian'),

        'Nonveg' => t('Non-Veg'),

      ];

  $options1 = [

    '2-12' => t('2-12'),

        '13-17' => t('13-17'),

'18-25' => t('18-25'),

'25-50' => t('25-50'),

      ];


      $form['food_type'] = [

        '#type' => 'radios',

        '#options' => $options,

        '#default_value' => 'Vegan',

        '#required' => TRUE,

      ];

  

  $form['age_range'] = [

        '#type' => 'radios',

        '#options' => $options1,

        '#default_value' => '2-12',

        '#required' => TRUE,

      ];  

      $form['footer_content'] =[

        '#markup' => $footer_content,

      ];

      $form['submit'] = [

        '#type' => 'submit',

        '#value' => t("Apply"),

'#attributes' => array('class' => array('primary-button hvr-ripple-out')),

        '#validate' => ['::submitValidateMeal'],

      ];

      $form['#theme'] = 'HomeMealForm';

      $form['#meal_plan_heading'] = $meal_plan_heading;

      $form['#attached']['library'][] = 'meal_plan/meal_style';

      return $form;

    }

  }

  /**

   * {@inheritdoc}

   */

  public function submitValidateMeal(array &$form, FormStateInterface $form_state) {

    if ($form_state->getValue('age') == '') {

        $form_state->setErrorByName('age', 'Please select date of birth');

    } 

    elseif ($form_state->getValue('age') < 1) {

      $form_state->setErrorByName('age', 'Minimum required age is 1 year.');

    } 

    elseif ($form_state->getValue('age') > 12) {

      $form_state->setErrorByName('age', 'The recommendations are for healthy children between 1 year to 12 years of age. Please enter appropriate age.');

    }

  }

  /**

   * {@inheritdoc}

   */

  public function submitForm(array &$form, FormStateInterface $form_state) {

    global $base_url;

    $age = $form_state->getValue('age');

    $food_type = $form_state->getValue('food_type');

   $age_range = $form_state->getValue('age_range');

    $meal_data = ['age' => $age, 'food_preference' => $food_type];

    $session = \Drupal::request()->getSession();

    $session->set('meal_data', $meal_data);

    $form_state->setRedirect('meal_plan.unreg_routine');

  }

}

2- creating a custom block

Goto - custom_module\src\Plugin\Block

create a php file customblock.php

<?php

namespace Drupal\meal_plan\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * @Block(
 *   id = "home_custom_meal_form_block",
 *   admin_label = @Translation("Custom Meal Plan Block"),
 *   category = @Translation("Custom Meal Plan Block")
 * )
 */
 
class customblock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    $form = \Drupal::formBuilder()->getForm('Drupal\meal_plan\Form\HomeMealForm');
    return $form;

  }
}

3- assign custom create Block to a variable in preprocess : in theme.theme file

/**

 * Implements hook_preprocess().

 */

function theme_new_preprocess(array &$variables, $hook) {

$variables['base_path'] = base_path();

$variables['is_front'] = \Drupal::service('path.matcher')->isFrontPage();

$current_path = \Drupal::service('path.current')->getPath();

$variables['current_path'] = $current_path;

$alised_path = \Drupal::service('path_alias.manager')->getAliasByPath($current_path);

$alised_path = ltrim($alised_path, '/');

$variables['alised_path'] = $alised_path;

$current_url = explode("/", $alised_path);

if($variables['is_front']) {

$customblock = \Drupal::service('plugin.manager.block')->createInstance('home_custom_meal_form_block', []);

        $variables['home_meal_plan'] = $customblock->build();

}

}


Drupal 8 and Drupal 9 set and get COOKIE example with symphony HttpFoundation Component

Setting Cookies

The response cookies can be implemented through the headers public attribute:

use Symfony\Component\HttpFoundation\Cookie;

$response->headers->setCookie(Cookie::create('foo', 'bar'));

The setCookie() method takes an instance of Cookie as an argument.

You can clear a cookie via the clearCookie() method.

In addition to the Cookie::create() method, you can create a Cookie object from a raw header value using fromString() method. You can also use the with*() methods to change some Cookie property (or to build the entire Cookie using a fluent interface). Each with*() method returns a new object with the modified property:

$cookie = Cookie::create('foo')
    ->withValue('bar')
    ->withExpires(strtotime('Fri, 20-May-2011 15:25:52 GMT'))
    ->withDomain('.example.com')
    ->withSecure(true);
n addition to the Cookie::create() method, you can create a Cookie object from a raw header value using fromString() method. You can also use the with*() methods to change

Drupal 8 cookies can be set using ResponseHeaderBag from the Symfony\Component\HttpFoundation\Response object.
Set new cookie value 
 use Symfony\Component\HttpFoundation\Cookie; 
 $cookie = new use Cookie('cookie_name', TRUE); 
$response->headers->setCookie($cookie); 
return $response; 
Get cookies value 
 $request->cookies->get('cookie_name');

Pathauto Module functionalities and usage

The Pathauto module automatically generates URL/path aliases for various kinds of content (nodes, taxonomy terms, users) without requiring the user to manually specify the path alias. This allows you to have URL aliases like /category/my-node-title instead of /node/123. The aliases are based upon a "pattern" system that uses tokens which the administrator can change.

Write a program in PHP to reverse a number

A number can be written in reverse order. For example 12345 = 54321 <?php   $ num = 23456;   $ revnum = 0;   while ($ num > 1)   {   $...