Issue #3067580 by alexpott, andypost, pooja saraah, Niklan, smustgrave: Deprecate the AJAX RenderElement
parent
8a2f6514b7
commit
d4da802f09
|
@ -10,9 +10,22 @@ namespace Drupal\Core\Render\Element;
|
|||
* @ingroup ajax
|
||||
*
|
||||
* @RenderElement("ajax")
|
||||
*
|
||||
* @deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Return an
|
||||
* \Drupal\Core\Ajax\AjaxResponse instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/3068104
|
||||
*/
|
||||
class Ajax extends RenderElement {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||
@trigger_error('\Drupal\Core\Render\Element\Ajax is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Return an \Drupal\Core\Ajax\AjaxResponse instead. See https://www.drupal.org/node/3068104', E_USER_DEPRECATED);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -107,6 +107,16 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana
|
|||
|
||||
// Otherwise, rebuild and cache.
|
||||
$info = [];
|
||||
$previous_error_handler = set_error_handler(function ($severity, $message, $file, $line) use (&$previous_error_handler) {
|
||||
// Ignore deprecations while building element information.
|
||||
if ($severity === E_USER_DEPRECATED) {
|
||||
// Don't execute PHP internal error handler.
|
||||
return TRUE;
|
||||
}
|
||||
if ($previous_error_handler) {
|
||||
return $previous_error_handler($severity, $message, $file, $line);
|
||||
}
|
||||
});
|
||||
foreach ($this->getDefinitions() as $element_type => $definition) {
|
||||
$element = $this->createInstance($element_type);
|
||||
$element_info = $element->getInfo();
|
||||
|
@ -119,6 +129,7 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana
|
|||
}
|
||||
$info[$element_type] = $element_info;
|
||||
}
|
||||
restore_error_handler();
|
||||
|
||||
foreach ($info as $element_type => $element) {
|
||||
$info[$element_type]['#type'] = $element_type;
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\element_info_test\Element;
|
||||
|
||||
use Drupal\Core\Render\Element\RenderElement;
|
||||
|
||||
/**
|
||||
* Provides deprecated render element for testing.
|
||||
*
|
||||
* @RenderElement("deprecated")
|
||||
*/
|
||||
class Deprecated extends RenderElement {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||
@trigger_error(__CLASS__ . ' is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. See https://www.drupal.org/node/3068104', E_USER_DEPRECATED);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getInfo() {
|
||||
return [];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\KernelTests\Core\Render\Element;
|
||||
|
||||
use Drupal\KernelTests\KernelTestBase;
|
||||
|
||||
/**
|
||||
* @group Render
|
||||
*/
|
||||
class DeprecatedElementTest extends KernelTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected static $modules = ['element_info_test'];
|
||||
|
||||
/**
|
||||
* Tests that render elements can trigger deprecations in their constructor.
|
||||
*/
|
||||
public function testBuildInfo() {
|
||||
$info_manager = $this->container->get('plugin.manager.element_info');
|
||||
$this->assertSame([
|
||||
'#type' => 'deprecated',
|
||||
'#defaults_loaded' => TRUE,
|
||||
], $info_manager->getInfo('deprecated'));
|
||||
|
||||
// Ensure the constructor is triggering a deprecation error.
|
||||
$previous_error_handler = set_error_handler(function ($severity, $message, $file, $line) use (&$previous_error_handler) {
|
||||
// Convert deprecation error into a catchable exception.
|
||||
if ($severity === E_USER_DEPRECATED) {
|
||||
throw new \ErrorException($message, 0, $severity, $file, $line);
|
||||
}
|
||||
if ($previous_error_handler) {
|
||||
return $previous_error_handler($severity, $message, $file, $line);
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
$info_manager->createInstance('deprecated');
|
||||
$this->fail('No deprecation error triggered.');
|
||||
}
|
||||
catch (\ErrorException $e) {
|
||||
$this->assertSame('Drupal\element_info_test\Element\Deprecated is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. See https://www.drupal.org/node/3068104', $e->getMessage());
|
||||
}
|
||||
restore_error_handler();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue