DARTHARTH

Function create_function() is deprecated

При обновлении версии php до скажем 7.2 — 7.3, на Drupal 7, периодически могут выскакивать всевозможные ошибки различных доменов. Связано это с тем, что код доменов может в себе иметь устаревшие функции и переменные, которые в более новых версиях php или не уже не работают или же скоро перестанут работать. И даже если код еще работает, но ошибки мазолят глаза пользователям, а отключать их вывод — не хорошее дело. Посему приходится периодически вручную править код. Порой самые простые вещи — замена = »; на = []; или же прописывание названия переменных\массивов в одинарных кавычках, чего ранее не было.

Однако, порой случаются варианты посложнее, как на пример, ошибка «Function create_function() is deprecated», ссылающаяся на файлы модуля views_php.

Благо на друпал.орг подобные вопросы всплывали и нашлось решение, в виде применения патча, конкретно для данного случая (модуль views_php). Ссылка на патч — link.

Для людей не умеющих ставить патчи или извращенцев любящих ковырять ручками выкладываю текст патча, в котором вообщем то всё просто — сначала указывается имея файла в котором идет редактирование\замена, потом где стоит символ минуса — эта строка удаляется, где символ плюса — эта строка наоборот добавляется в файл.

diff -ur /home/rgo_main2013/home/rgo_main2013/patches/views_php/views_php/plugins/views/views_php_handler_area.inc /home/rgo_main2013/public_html/sites/all/modules/contrib/views_php/plugins/views/views_php_handler_area.inc
--- a/plugins/views/views_php_handler_area.inc	2015-11-12 15:51:38.000000000 +0300
+++ b/plugins/views/views_php_handler_area.inc	2018-12-07 14:25:25.151928000 +0300
@@ -34,9 +34,9 @@
    * Implements views_handler_area#render().
    */
   function render($empty = FALSE) {
-    // Ecexute output PHP code.
+    // Execute output PHP code.
     if ((!$empty || !empty($this->options['empty'])) && !empty($this->options['php_output'])) {
-      $function = create_function('$view, $handler, $results', ' ?>' . $this->options['php_output'] . '<?php ');
+      $function = views_php_create_function('$view, $handler, $results', ' ?>' . $this->options['php_output'] . '<?php ');
       ob_start();
       $function($this->view, $this, $this->view->result);
       return ob_get_clean();
diff -ur /home/rgo_main2013/home/rgo_main2013/patches/views_php/views_php/plugins/views/views_php_handler_field.inc /home/rgo_main2013/public_html/sites/all/modules/contrib/views_php/plugins/views/views_php_handler_field.inc
--- a/plugins/views/views_php_handler_field.inc	2015-11-12 15:51:38.000000000 +0300
+++ b/plugins/views/views_php_handler_field.inc	2018-12-07 14:38:47.793261000 +0300
@@ -112,9 +112,9 @@
    * @see self::php_post_execute()
    */
   function php_pre_execute() {
-    // Ecexute static PHP code.
+    // Execute static PHP code.
     if (!empty($this->options['php_setup'])) {
-      $function = create_function('$view, $handler, &$static', $this->options['php_setup'] . ';');
+      $function = views_php_create_function('$view, $handler, &$static', $this->options['php_setup'] . ';');
       ob_start();
       $function($this->view, $this, $this->php_static_variable);
       ob_end_clean();
@@ -126,9 +126,9 @@
    * @see views_php_views_post_execute()
    */
   function php_post_execute() {
-    // Ecexute value PHP code.
+    // Execute value PHP code.
     if (!empty($this->options['php_value'])) {
-      $function = create_function('$view, $handler, &$static, $row, $data', $this->options['php_value'] . ';');
+      $function = views_php_create_function('$view, $handler, &$static, $row, $data', $this->options['php_value'] . ';');
       ob_start();
       foreach ($this->view->result as $i => &$row) {
         $normalized_row = new stdClass;
@@ -144,7 +144,7 @@
     if (!empty($this->options['use_php_click_sortable']) && !empty($this->php_click_sort_order)) {
       if ($this->options['use_php_click_sortable'] == self::CLICK_SORT_PHP) {
         if (!empty($this->options['php_click_sortable'])) {
-          $this->php_click_sort_function = create_function('$view, $handler, &$static, $row1, $row2', $this->options['php_click_sortable'] . ';');
+          $this->php_click_sort_function = views_php_create_function('$view, $handler, &$static, $row1, $row2', $this->options['php_click_sortable'] . ';');
         }
       }
       else {
@@ -160,6 +160,7 @@
 
       if (isset($this->php_click_sort_function)) {
         usort($this->view->result, array($this, 'php_click_sort'));
+        unset($this->php_click_sort_function); /* Closures are not serializable. */
       }
     }
   }
@@ -195,26 +196,17 @@
   }
 
   /**
-   * Implements views_handler_field#pre_render().
-   */
-  function pre_render(&$values) {
-    if (!empty($this->options['php_output'])) {
-      $this->php_output_lamda_function = create_function('$view, $handler, &$static, $row, $data, $value', ' ?>' . $this->options['php_output'] . '<?php ');
-    }
-  }
-
-  /**
    * Implements views_handler_field#render().
    */
   function render($values) {
-    // Ecexute output PHP code.
-    if (!empty($this->options['php_output']) && isset($this->php_output_lamda_function)) {
+    // Execute output PHP code.
+    if (!empty($this->options['php_output'])) {
       $normalized_row = new stdClass;
       foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) {
         $normalized_row->$field = isset($values->{$handler->field_alias}) ? $values->{$handler->field_alias} : NULL;
       }
 
-      $function = $this->php_output_lamda_function;
+      $function = views_php_create_function('$view, $handler, &$static, $row, $data, $value', ' ?>' . $this->options['php_output'] . '<?php ');
       ob_start();
       $function($this->view, $this, $this->php_static_variable, $normalized_row, $values, isset($values->{$this->field_alias}) ? $values->{$this->field_alias} : NULL);
       $value = ob_get_clean();
diff -ur /home/rgo_main2013/home/rgo_main2013/patches/views_php/views_php/plugins/views/views_php_handler_filter.inc /home/rgo_main2013/public_html/sites/all/modules/contrib/views_php/plugins/views/views_php_handler_filter.inc
--- a/plugins/views/views_php_handler_filter.inc	2015-11-12 15:51:38.000000000 +0300
+++ b/plugins/views/views_php_handler_filter.inc	2018-12-07 14:24:50.209215000 +0300
@@ -65,7 +65,7 @@
   function php_pre_execute() {
     // Ecexute static PHP code.
     if (!empty($this->options['php_setup'])) {
-      $function = create_function('$view, $handler, &$static', $this->options['php_setup'] . ';');
+      $function = views_php_create_function('$view, $handler, &$static', $this->options['php_setup'] . ';');
       ob_start();
       $function($this->view, $this, $this->php_static_variable);
       ob_end_clean();
@@ -79,7 +79,7 @@
   function php_post_execute() {
     // Evaluate the PHP code.
     if (!empty($this->options['php_filter'])) {
-      $function = create_function('$view, $handler, &$static, $row, $data', $this->options['php_filter'] . ';');
+      $function = views_php_create_function('$view, $handler, &$static, $row, $data', $this->options['php_filter'] . ';');
       ob_start();
       foreach ($this->view->result as $i => $row) {
         $normalized_row = new stdClass;
diff -ur /home/rgo_main2013/home/rgo_main2013/patches/views_php/views_php/plugins/views/views_php_handler_sort.inc /home/rgo_main2013/public_html/sites/all/modules/contrib/views_php/plugins/views/views_php_handler_sort.inc
--- a/plugins/views/views_php_handler_sort.inc	2015-11-12 15:51:38.000000000 +0300
+++ b/plugins/views/views_php_handler_sort.inc	2018-12-07 14:24:07.931029000 +0300
@@ -57,7 +57,7 @@
   function php_pre_execute() {
     // Ecexute static PHP code.
     if (!empty($this->options['php_setup'])) {
-      $function = create_function('$view, $handler, &$static', $this->options['php_setup'] . ';');
+      $function = views_php_create_function('$view, $handler, &$static', $this->options['php_setup'] . ';');
       ob_start();
       $function($this->view, $this, $this->php_static_variable);
       ob_end_clean();
@@ -70,9 +70,10 @@
    */
   function php_post_execute() {
     if (!empty($this->options['php_sort']) && $this->view->style_plugin->build_sort()) {
-      $this->php_sort_function = create_function('$view, $handler, &$static, $row1, $row2', $this->options['php_sort'] . ';');
+      $this->php_sort_function = views_php_create_function('$view, $handler, &$static, $row1, $row2', $this->options['php_sort'] . ';');
       ob_start();
       usort($this->view->result, array($this, 'php_sort'));
+      unset($this->php_sort_function); /* Closure objects are not serializable. */
       ob_end_clean();
     }
   }
diff -ur /home/rgo_main2013/home/rgo_main2013/patches/views_php/views_php/plugins/views/views_php_plugin_cache.inc /home/rgo_main2013/public_html/sites/all/modules/contrib/views_php/plugins/views/views_php_plugin_cache.inc
--- a/plugins/views/views_php_plugin_cache.inc	2015-11-12 15:51:38.000000000 +0300
+++ b/plugins/views/views_php_plugin_cache.inc	2018-12-07 14:22:43.216475000 +0300
@@ -63,7 +63,7 @@
         $cache = cache_get($this->get_results_key(), $this->table);
         $fresh = !empty($cache);
         if ($fresh && !empty($this->options['php_cache_results'])) {
-          $function = create_function('$view, $plugin, $cache', $this->options['php_cache_results'] . ';');
+          $function = views_php_create_function('$view, $plugin, $cache', $this->options['php_cache_results'] . ';');
           ob_start();
           $fresh = $function($this->view, $this, $cache);
           ob_end_clean();
@@ -84,7 +84,7 @@
         $cache = cache_get($this->get_output_key(), $this->table);
         $fresh = !empty($cache);
         if ($fresh && !empty($this->options['php_cache_output'])) {
-          $function = create_function('$view, $plugin, $cache', $this->options['php_cache_output'] . ';');
+          $function = views_php_create_function('$view, $plugin, $cache', $this->options['php_cache_output'] . ';');
           ob_start();
           $fresh = $function($this->view, $this, $cache);
           ob_end_clean();
--- a/views_php.module	2015-11-12 15:51:38.000000000 +0300
+++ b/views_php.module	2018-12-07 15:25:23.858070000 +0300
@@ -27,7 +27,7 @@
   }
 
   if (!isset($function[$view_name . ':' . $display_id])) {
-    $function[$view_name . ':' . $display_id] = create_function('$view_name, $display_id, $account', $php_access . ';');
+    $function[$view_name . ':' . $display_id] = views_php_create_function('$view_name, $display_id, $account', $php_access . ';');
   }
 
   ob_start();
@@ -158,3 +158,10 @@
     $view->build_info['query']->range();
   }
 }
+
+/**
+ * Internal support: create_function() emulation using anonymous functions.
+ */
+function views_php_create_function($args, $code) {
+  return eval('return function (' . $args . ') {' . $code . '};');
+}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll Up