getEditable('ds.settings') ->set('field_template', TRUE) ->save(); } /** * Tests on field templates. */ public function testDsFieldTemplate() { // Get a node. $node = $this->entitiesTestSetup('hidden'); $body_field = $node->get('body')->value; // Default theming function. $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('above', 'body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'Body'); $elements = $this->xpath('//div[@class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"]/div[@class="field__item"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('above', 'body', 'My body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'My body'); $elements = $this->xpath('//div[@class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"]/div[@class="field__item"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('hidden', 'body', '', 'test_field_class'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="test_field_class clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); } /** * Tests on field templates. */ public function testDsFieldTemplate2() { // Get a node. $node = $this->entitiesTestSetup('hidden'); $body_field = $node->get('body')->value; // Reset theming function. $edit = [ 'fs1[ft_default]' => 'reset', ]; $this->drupalGet('admin/structure/ds/settings'); $this->submitForm($edit, 'Save configuration'); // As long as we don't change anything in the UI, the default template will // be used. $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('above', 'body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $elements = $this->xpath('//div[@class="group-right"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'Body'); $this->entitiesSetLabelClass('inline', 'body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $elements = $this->xpath('//div[@class="group-right"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'Body'); $this->entitiesSetLabelClass('above', 'body', 'My body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $elements = $this->xpath('//div[@class="group-right"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'My body'); $this->entitiesSetLabelClass('inline', 'body', 'My body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $elements = $this->xpath('//div[@class="group-right"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'My body'); $edit = [ 'fs1[ft_show_colon]' => 'reset', ]; $this->drupalGet('admin/structure/ds/settings'); $this->submitForm($edit, 'Save configuration'); // Clear node cache to get the colon. $tags = $node->getCacheTags(); Cache::invalidateTags($tags); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $elements = $this->xpath('//div[@class="group-right"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'My body:'); $this->entitiesSetLabelClass('hidden', 'body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); } /** * Tests on field templates. */ public function testDsFieldTemplate3() { // Get a node. $node = $this->entitiesTestSetup('hidden'); $body_field = $node->get('body')->value; // Custom field function with outer wrapper. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][id]' => 'expert', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); // As long as we don't change anything in the UI, the default template will // be used. $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With outer div wrapper and class. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With outer span wrapper and class. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class-2', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/span[@class="ow-class-2"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); } /** * Tests on field templates. */ public function testDsFieldTemplate4() { // Get a node. $node = $this->entitiesTestSetup('hidden'); $body_field = $node->get('body')->value; // With outer wrapper and field items wrapper. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][id]' => 'expert', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'div', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div/div/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With outer wrapper and field items div wrapper with class. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class', ]; $this->dsEditFormatterSettings($edit); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div/div[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With outer wrapper and field items span wrapper and class. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class', ]; $this->dsEditFormatterSettings($edit); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With outer wrapper class and field items span wrapper and class. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class', ]; $this->dsEditFormatterSettings($edit); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With outer wrapper span class and field items span wrapper and class. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class-2', ]; $this->dsEditFormatterSettings($edit); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/span[@class="ow-class"]/span[@class="fi-class-2"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); } /** * Tests on field templates. */ public function testDsFieldTemplate5() { // Get a node. $node = $this->entitiesTestSetup('hidden'); $body_field = $node->get('body')->value; // With field item div wrapper. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][id]' => 'expert', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With field item span wrapper. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-el]' => 'span', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/span/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With field item span wrapper and class. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-cl]' => 'fi-class', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With fis and fi. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class-2', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-cl]' => 'fi-class', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="fi-class-2"]/div[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With all wrappers. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class-2', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-cl]' => 'fi-class', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // With all wrappers and attributes. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-at]' => 'name="ow-att"', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class-2', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-at]' => 'name="fis-att"', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-cl]' => 'fi-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-at]' => 'name="fi-at"', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class" and @name="ow-att"]/div[@class="fi-class-2" and @name="fis-att"]/span[@class="fi-class" and @name="fi-at"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // Remove attributes. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-at]' => '', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-cl]' => 'fi-class-2', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fis-at]' => '', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-el]' => 'span', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-cl]' => 'fi-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi-at]' => '', ]; $this->dsEditFormatterSettings($edit); // Label tests with custom function. $this->entitiesSetLabelClass('above', 'body'); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'Body'); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('inline', 'body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'Body'); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('above', 'body', 'My body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'My body'); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('inline', 'body', 'My body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'My body'); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('inline', 'body', 'My body', '', TRUE); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="field__label"]'); $this->assertTrimEqual($elements[0]->getText(), 'My body:'); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); $this->entitiesSetLabelClass('hidden', 'body'); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // Test default classes on outer wrapper. // @todo figure out a way to actually test this as the default cases don't // have classes anymore. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-def-cl]' => '1', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]/div[@class="fi-class-2"]/span[@class="fi-class"]/p'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // Test default attributes on field item. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow]' => '1', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-el]' => 'div', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-cl]' => 'ow-class', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][ow-def-at]' => '1', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]/div[@class="ow-class"]'); $this->assertTrimEqual($elements[0]->getText(), $body_field); // Use the test field theming function to test that this function is // registered in the theme registry through ds_extras_theme(). $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][id]' => 'ds_test_template', ]; $this->dsEditFormatterSettings($edit); drupal_flush_all_caches(); $this->drupalGet('node/' . $node->id()); $elements = $this->xpath('//div[@class="group-right"]'); $this->assertTrimEqual($elements[0]->getText(), 'Testing field output through custom function'); } /** * Tests XSS on field templates. */ public function testDsFieldTemplateXss() { // Get a node. $node = $this->entitiesTestSetup('hidden'); $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][id]' => 'expert', 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][fi]' => '1', ]; $this->dsEditFormatterSettings($edit); // Inject XSS everywhere and see if it brakes. $edit = [ 'fields[body][settings_edit_form][third_party_settings][ds][ft][settings][prefix]' => '