From 09a407f49b3177260ae39918e203e7d43a3857ef Mon Sep 17 00:00:00 2001 From: damiankloip <damiankloip@1037976.no-reply.drupal.org> Date: Thu, 27 Sep 2012 10:51:18 +0200 Subject: [PATCH] Issue #1791554 by damiankloip: Added a view element type. --- lib/Drupal/views/Tests/ViewElementTest.php | 117 +++++++++++++++++++ tests/views_test_data/views_test_data.module | 31 +++++ views.module | 28 +++++ 3 files changed, 176 insertions(+) create mode 100644 lib/Drupal/views/Tests/ViewElementTest.php diff --git a/lib/Drupal/views/Tests/ViewElementTest.php b/lib/Drupal/views/Tests/ViewElementTest.php new file mode 100644 index 000000000000..3ea578e84f45 --- /dev/null +++ b/lib/Drupal/views/Tests/ViewElementTest.php @@ -0,0 +1,117 @@ +<?php + +/** + * @file + * Definition of Drupal\views\Tests\ViewElementTest. + */ + +namespace Drupal\views\Tests; + +/** + * Tests the 'view' element type. + */ +class ViewElementTest extends ViewTestBase { + + /** + * The raw render data array to use in tests. + * + * @var array + */ + protected $render; + + public static function getInfo() { + return array( + 'name' => 'View element', + 'description' => 'Tests the view render element.', + 'group' => 'Views' + ); + } + + protected function setUp() { + parent::setUp(); + + $this->enableViewsTestModule(); + + // Set up a render array to use. We need to copy this as drupal_render + // passes by reference. + $this->render = array( + 'view' => array( + '#type' => 'view', + '#name' => 'test_view', + '#display_id' => 'default', + '#arguments' => array(25), + ), + ); + } + + /** + * Tests the rendered output and form output of a view element. + */ + public function testViewElement() { + $view = $this->getBasicView(); + + // Set the content as our rendered array. + $render = $this->render; + $this->drupalSetContent(drupal_render($render)); + + $xpath = $this->xpath('//div[@class="views-element-container"]'); + $this->assertTrue($xpath, 'The view container has been found in the rendered output.'); + + $xpath = $this->xpath('//div[@class="view-content"]'); + $this->assertTrue($xpath, 'The view content has been found in the rendered output.'); + // There should be 5 rows in the results. + $xpath = $this->xpath('//div[@class="view-content"]/div'); + $this->assertEqual(count($xpath), 5); + + // Test a form. + $this->drupalGet('views_test_data_element_form'); + + $xpath = $this->xpath('//div[@class="views-element-container form-wrapper"]'); + $this->assertTrue($xpath, 'The view container has been found on the form.'); + + $xpath = $this->xpath('//div[@class="view-content"]'); + $this->assertTrue($xpath, 'The view content has been found on the form.'); + // There should be 5 rows in the results. + $xpath = $this->xpath('//div[@class="view-content"]/div'); + $this->assertEqual(count($xpath), 5); + + // Add an argument and save the view. + $view->displayHandlers['default']->overrideOption('arguments', array( + 'age' => array( + 'default_action' => 'ignore', + 'style_plugin' => 'default_summary', + 'style_options' => array(), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '', + 'breadcrumb' => '', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate' => array( + 'type' => 'none', + 'fail' => 'not found', + ), + 'break_phrase' => 0, + 'not' => 0, + 'id' => 'age', + 'table' => 'views_test_data', + 'field' => 'age', + 'validate_user_argument_type' => 'uid', + ) + )); + $view->save(); + + // Test the render array again. + $render = $this->render; + $this->drupalSetContent(drupal_render($render)); + // There should be 1 row in the results, 'John' arg 25. + $xpath = $this->xpath('//div[@class="view-content"]/div'); + $this->assertEqual(count($xpath), 1); + + // Test that the form has the same expected result. + $this->drupalGet('views_test_data_element_form'); + $xpath = $this->xpath('//div[@class="view-content"]/div'); + $this->assertEqual(count($xpath), 1); + } + +} diff --git a/tests/views_test_data/views_test_data.module b/tests/views_test_data/views_test_data.module index 1341f46fce07..ef4b86f5a522 100644 --- a/tests/views_test_data/views_test_data.module +++ b/tests/views_test_data/views_test_data.module @@ -124,3 +124,34 @@ function template_preprocess_views_view_mapping_test(&$variables) { function theme_views_view_mapping_test($variables) { return drupal_render($variables['element']); } + +/** + * Implements hook_menu(). + */ +function views_test_data_menu() { + $items = array(); + + $items['views_test_data_element_form'] = array( + 'title' => 'Views test data element form', + 'description' => 'Views test data element form callback', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_test_data_element_form'), + 'access callback' => TRUE, + ); + + return $items; +} + +/** + * Simple form page callback to test the view element. + */ +function views_test_data_element_form() { + $form['view'] = array( + '#type' => 'view', + '#name' => 'test_view', + '#display_id' => 'default', + '#arguments' => array(25), + ); + + return $form; +} diff --git a/views.module b/views.module index cdbc70bbae14..c5e6056cfa92 100644 --- a/views.module +++ b/views.module @@ -144,6 +144,34 @@ function views_api_minimum_version() { return '2'; } +/** + * Implements hook_element_info(). + */ +function views_element_info() { + $types['view'] = array( + '#theme_wrappers' => array('container'), + '#pre_render' => array('views_pre_render_view_element'), + '#name' => NULL, + '#display_id' => 'default', + '#arguments' => array(), + ); + return $types; +} + +/** + * View element pre render callback. + */ +function views_pre_render_view_element($element) { + $element['#attributes']['class'][] = 'views-element-container'; + + $view = views_get_view($element['#name']); + if ($view && $view->access($element['#display_id'])) { + $element['view']['#markup'] = $view->preview($element['#display_id'], $element['#arguments']); + } + + return $element; +} + /** * Implement hook_theme(). Register views theming functions. */ -- GitLab