Developer
Developer

Reputation: 1

Converting module Drupal7 to Drupal8

I want to convert drupal7 module to drupal8. As I know that drupal8 is object oriented but still there are some issue in my code.

I wrote the code in oop but it cannot run properly and when I run the code it shows error that function is not defined. The function of my module is to redirect folders in root directory. A little help will be appreciated.

<?php

namespace Drupal\afridi\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Database\Database;
use Drupal\Core\Form\FormStateInterface;
use \Drupal\Core\Form\FormValidatorInterface;
use \Drupal\Core\Form\FormSubmitterInterface;
use Drupal\Core\Form\ConfigFormBase;
use Symfony\Component\HttpFoundation\Request;

/**
 * Class DefaultForm.
 */
class DefaultForm extends FormBase {
// public function afridi_trigger_import_redirects($path, $path_to, $exceptions, $folder_scan = NULL);
  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'default_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    $form = array();

    $form['files_autoredirect']['title'] = array(
      '#markup' => t('<h2>Folder Redirect</h2><p>Before moving the media folder from old location to new location, add the folder path & destination path in order to automatically generate <b>301 redirect</b> for all the files in folder. Once the redirects are generated, move the folder from the old location to the new location & verify by visiting old url if it redirects correctly to the new file location.</p>'),
    );
    $form['afridi']['scan_folder'] = array(
      '#type' => 'textfield',
      '#title' => t('Folder to scan'),
      '#default_value' => !empty(\Drupal::state()->get('afridi_scan_folder')) ?  \Drupal::state()->get('afridi_scan_folder') : '',
      '#size' => 60,
      '#maxlength' => 128,
      '#description' => t('This folder must exsist & accessible under the path so all the files inside can be scanned and a redirect rule is added for each file.<br>Example: For <b>root/content</b> folder add <b>content</b>.'),
      '#required' => TRUE,
    );

    $form['afridi']['check'] = array(
      '#title' => t("Same as folder path"),
      '#type' => 'checkbox',
      '#default_value' => !empty(\Drupal::state()->get('afridi_check')) ? \Drupal::state()->get('afridi_check') : '',
      '#description' => t('Uncheck if the <b>redirect from</b> path is different.'),
      '#ajax' => array(
        'callback' => 'testprb_ajaxtest',
        'wrapper' => 'testprb_replace_field_div',
      ),
    );

    $form['afridi']['path_check'] = array(
      '#type' => 'container',
      '#states' => array(
        "visible" => array(
          "input[name='check']" => array("checked" => FALSE),
        ),
      ),
    );
    $form['afridi']['path_check']['path_from'] = array(
      '#type' => 'textfield',
      '#title' => t('Redirect from path'),
      '#default_value' => !empty(\Drupal::state()->get('afridi_from')) ? \Drupal::state()->get('afridi_from') : '',
      '#size' => 60,
      '#maxlength' => 128,
      '#description' => t('Example: For <b>root/content</b> folder add <b>content</b>. If left blank scanned folder will be chosen as base path.'),
    );
    $form['afridi']['path_to'] = array(
      '#type' => 'textfield',
      '#title' => t('Redirect to path'),
      '#default_value' => !empty(\Drupal::state()->get('afridi_to')) ? \Drupal::state()->get('afridi_to') : '',

      '#size' => 60,
      '#maxlength' => 128,
      '#description' => t('Example: <b>sites/default/files/</b> for <b>root/sites/default/files</b> folder. Trailing slash must be provided.'),
      '#required' => TRUE,
    );

    $form['afridi']['exception'] = array(
      '#title' => t('Exceptions'),
      '#type' => 'textarea',
      '#description' => t('Exception rules, files or directories added in the list will be ignored. Add one entry per row.'),
       '#default_value' => !empty(\Drupal::state()->get('afridi_exceptions')) ? implode(\Drupal::state()->get('afridi_exceptions')) : implode(PHP_EOL, array(
         '. ',
         '.. ',
         '.DS_Store ',
       )),

    );

    $form['submit'][] = array(
      '#type' => 'submit',
      '#value' => t('Generate Redirects'),
    );

    return $form;

  }

  /**
   * {@inheritdoc}
   */

function submitForm(array &$form, FormStateInterface $form_state) {
         if ($form_state->hasValue(array('exception'))) {
         $exceptions = explode(PHP_EOL, trim($form_state->getValues('exception')));
         \Drupal::state()->set('folder_redirect_exceptions', $exceptions);
       }
       \Drupal::state()->set('folder_redirect_check', $form_state->getValues('check'));
       \Drupal::state()->set('folder_redirect_scan_folder', $form_state->getValues('scan_folder'));
       \Drupal::state()->set('folder_redirect_from', $form_state->getValues('path_from'));
       \Drupal::state()->set('folder_redirect_to', $form_state->getValues('path_to'));

      if (!empty(\Drupal::state()->get('folder_redirect_scan_folder', '')) && !empty(\Drupal::state()->get('folder_redirect_to'))) {
        if (\Drupal::state()->get('folder_redirect_check','')) {
          \Drupal::state()->delete('folder_redirect_from');
          if (afridi_trigger_import_redirects(\Drupal::state()->get('folder_redirect_scan_folder' , ''), \Drupal::state()->get('folder_redirect_to', ''), \Drupal::state()->get('folder_redirect_exceptions', ''))) {

            drupal_set_message(t('Url redirects generated, <a href=" @base-url ">Redirects List</a>', array('@base-url' => url('/admin/config/search/redirect'))), 'status', TRUE);
          }
          else {
            drupal_set_message(t('Looks like "<i> %dir </i>" doesn\'t exsist or inaccessible, please check the permission if exsists', array('%dir' => \Drupal::state()->get('folder_redirect_scan_folder') )), 'error', TRUE);

          }
        }
        else {

          if (afridi_trigger_import_redirects(\Drupal::state()->get('folder_redirect_from', ''), \Drupal::state()->get('folder_redirect_to', ''), \Drupal::state()->get('folder_redirect_exceptions', ''), \Drupal::state()->get('folder_redirect_scan_folder','')))
          {
            drupal_set_message(t('Url redirects generated, <a href=" @base-url ">Redirects List</a>', array('@base-url' => url('/admin/config/search/redirect'))), 'status', TRUE);
          }
          else {
            drupal_set_message(t('Looks like "<i> %dir </i>" doesn\'t exsist or inaccessible, please check the permission if exsists', array('%dir' => variable_get('folder_redirect_scan_folder'))), 'error', TRUE);
          }
        }
      }

      else {
        drupal_set_message(t('Invalid configurations, please try again'), 'error', TRUE);
      }
    }


    /**
     * Helper function to set important variables.
     */

     function afridi_trigger_import_redirects($path, $path_to, $exceptions, $folder_scan = NULL) {
        $root = DRUPAL_ROOT . "/";
        $root_preg = preg_replace("/([\/]+)/", "\\/", $root);
        $path_from_preg = preg_replace("/([\/]+)/", "\\/", $path);
        if ($folder_scan) {
          $scan_folder = $root . $folder_scan;
          if (is_dir($scan_folder)) {
            afridi_list_all_files($scan_folder, $path_from_preg, $path_to, $root, $root_preg, $exceptions, $path);
            return TRUE;
          }
          else {
            return FALSE;
          }
        }
        else {
          $path = $root . $path;
          if (is_dir($path)) {
            afridi_list_all_files($path, $path_from_preg, $path_to, $root, $root_preg, $exceptions);
            return TRUE;
          }
          else {
            return FALSE;
          }
        }
      }
          /**
           * Helper function to scan the dir and its sub-dir.
           */
           function afridi_list_all_files($path, $path_from_preg, $path_to, $root, $root_preg, $exceptions, $different_path_from = '') {
            if (!isset($redirects)) {
              $redirects = array();
            }
            $files = array_diff(scandir($path), array_map('trim', $exceptions));
            foreach ($files as $file) {
              if (is_dir($path . "/{$file}")) {
                if (!empty($different_path_from)) {
                  afridi_list_all_files($path . "/{$file}", $path_from_preg, $path_to, $root, $root_preg, $exceptions, $different_path_from);
                }
                else {
                  afridi_list_all_files($path . "/{$file}", $path_from_preg, $path_to, $root, $root_preg, $exceptions);
                }
              }
              else {
                if (!empty($different_path_from)) {
                  preg_match("/" . $root_preg . "(...+)/", $path . "/{$file}", $out);
                  preg_match("/([a-zA-Z0-9-_]+)([\/])([.a-zA-Z0-9-_\/]+)/", $out[1], $out1);
                  $redirect_from = $different_path_from . '/' . $out1[3];
                  $redirect_to = $path_to . $out1[3];;
                }
                else {
                  preg_match("/" . $root_preg . "(...+)/", $path . "/{$file}", $out);
                  $redirect_from = $out[1];
                  preg_match("/" . $path_from_preg . "\/(...+)/", $redirect_from, $out1);
                  $redirect_to = $path_to . $out1[1];
                }
                $redirects[$redirect_from] = $redirect_to;
              }
            }
              afridi_import_redirects($redirects);
          }

          /**
           * Helper function to import redirects.
           */
        function afridi_import_redirect($redirect_from, $redirect_to) {
            $redirect = new stdClass();
            module_invoke(
              'redirect',
              'object_prepare',
              $redirect,
              array(
                'source' => $redirect_from,
                'source_options' => array(),
                'redirect' => $redirect_to,
                'redirect_options' => array(),
                'language' => LANGUAGE_NONE,
              )
            );
            module_invoke('redirect', 'save', $redirect);
          }

          /**
           * Helper function to import bulk redirects.
           */
       function afridi_import_redirects($redirects) {
            foreach ($redirects as $from_url => $to_url) {
              if (!redirect_load_by_source($from_url)) {
                $redirect = new stdClass();
                redirect_object_prepare(
                  $redirect,
                  array(
                    'source' => $from_url,
                    'source_options' => array(),
                    'redirect' => $to_url,
                    'redirect_options' => array(),
                    'language' => LANGUAGE_NONE,
                  )
                );
                redirect_save($redirect);
              }
              else {
                drupal_set_message(t('Redirect already exsists for path<i> "@path" </i>', array('@path' => $from_url)), 'warning', TRUE);
              }
            }
          }

    }

I want to redirect the folder path in this section but there are some issues. It show error that function is undefined.

Upvotes: 0

Views: 125

Answers (1)

Koala Yeung
Koala Yeung

Reputation: 7873

In PHP, method calls always need to provide the object instance ($this), or the class name if it is a static method call. So for your case, you cannot directly call afridi_trigger_import_redirects, or afridi_list_all_files as they were ordinary functions.

The quick fix would be to call them with the $this instance. For example, this:

          if (afridi_trigger_import_redirects(\Drupal::state()->get('folder_redirect_scan_folder' , ''), \Drupal::state()->get('folder_redirect_to', ''), \Drupal::state()->get('folder_redirect_exceptions', ''))) {

            drupal_set_message(t('Url redirects generated, <a href=" @base-url ">Redirects List</a>', array('@base-url' => url('/admin/config/search/redirect'))), 'status', TRUE);
          }

Should be rewritten into this:

          if ($this->afridi_trigger_import_redirects(\Drupal::state()->get('folder_redirect_scan_folder' , ''), \Drupal::state()->get('folder_redirect_to', ''), \Drupal::state()->get('folder_redirect_exceptions', ''))) {

            drupal_set_message(t('Url redirects generated, <a href=" @base-url ">Redirects List</a>', array('@base-url' => url('/admin/config/search/redirect'))), 'status', TRUE);
          }

A more elegant way is to rewrite all methods that do not reference instance attributes as static methods. For example, this:

          function ($path, $path_to, $exceptions, $folder_scan = NULL) {

should be rewritten as this:

          public static function ($path, $path_to, $exceptions, $folder_scan = NULL) {

And all afridi_trigger_import_redirects calls should be rewritten in DefaultForm::afridi_trigger_import_redirects format.

Upvotes: 1

Related Questions