Issue #1996378 by Wim Leers: Edit broken because of #1043198 and routing system bug + missing test coverage.

8.0.x
Alex Pott 2013-05-16 20:03:37 -05:00
parent ff6e1eea6e
commit 3076bee4cc
3 changed files with 61 additions and 17 deletions

View File

@ -6,7 +6,7 @@ edit_metadata:
_permission: 'access in-place editing' _permission: 'access in-place editing'
edit_field_form: edit_field_form:
pattern: '/edit/form/{entity_type}/{entity}/{field_name}/{langcode}/{view_mode}' pattern: '/edit/form/{entity_type}/{entity}/{field_name}/{langcode}/{view_mode_id}'
defaults: defaults:
_controller: '\Drupal\edit\EditController::fieldForm' _controller: '\Drupal\edit\EditController::fieldForm'
requirements: requirements:

View File

@ -91,12 +91,12 @@ class EditController extends ContainerAware {
* The name of the field that is being edited. * The name of the field that is being edited.
* @param string $langcode * @param string $langcode
* The name of the language for which the field is being edited. * The name of the language for which the field is being edited.
* @param string $view_mode * @param string $view_mode_id
* The view mode the field should be rerendered in. * The view mode the field should be rerendered in.
* @return \Drupal\Core\Ajax\AjaxResponse * @return \Drupal\Core\Ajax\AjaxResponse
* The Ajax response. * The Ajax response.
*/ */
public function fieldForm(EntityInterface $entity, $field_name, $langcode, $view_mode) { public function fieldForm(EntityInterface $entity, $field_name, $langcode, $view_mode_id) {
$response = new AjaxResponse(); $response = new AjaxResponse();
$form_state = array( $form_state = array(
@ -112,7 +112,7 @@ class EditController extends ContainerAware {
$entity = entity_load($form_state['entity']->entityType(), $form_state['entity']->id(), TRUE); $entity = entity_load($form_state['entity']->entityType(), $form_state['entity']->id(), TRUE);
// @todo Remove when http://drupal.org/node/1346214 is complete. // @todo Remove when http://drupal.org/node/1346214 is complete.
$entity = $entity->getBCEntity(); $entity = $entity->getBCEntity();
$output = field_view_field($entity, $field_name, $view_mode, $langcode); $output = field_view_field($entity, $field_name, $view_mode_id, $langcode);
$response->addCommand(new FieldFormSavedCommand(drupal_render($output))); $response->addCommand(new FieldFormSavedCommand(drupal_render($output)));
} }

View File

@ -10,6 +10,7 @@ namespace Drupal\edit\Tests;
use Drupal\simpletest\WebTestBase; use Drupal\simpletest\WebTestBase;
use Drupal\edit\Ajax\MetadataCommand; use Drupal\edit\Ajax\MetadataCommand;
use Drupal\Core\Ajax\AppendCommand; use Drupal\Core\Ajax\AppendCommand;
use Drupal\Component\Utility\Unicode;
/** /**
* Tests loading of Edit and lazy-loading of in-place editors. * Tests loading of Edit and lazy-loading of in-place editors.
@ -137,6 +138,15 @@ class EditLoadingTest extends WebTestBase {
) )
)); ));
$this->assertIdentical($command->render(), $ajax_commands[2], 'The Edit metadata command contains the expected metadata.'); $this->assertIdentical($command->render(), $ajax_commands[2], 'The Edit metadata command contains the expected metadata.');
// Retrieving the form for this field should result in a 200 response,
// containing only an editFieldForm command.
$response = $this->retrieveFieldForm('node/1/body/und/full');
$this->assertResponse(200);
$ajax_commands = drupal_json_decode($response);
$this->assertIdentical(1, count($ajax_commands), 'The field form HTTP request results in three AJAX commands.');
$this->assertIdentical('editFieldForm', $ajax_commands[0]['command'], 'The first AJAX command is an editFieldForm command.');
$this->assertIdentical('<form ', Unicode::substr($ajax_commands[0]['data'], 0, 6), 'The editFieldForm command contains a form.');
} }
/** /**
@ -165,7 +175,51 @@ class EditLoadingTest extends WebTestBase {
} }
$post = implode('&', $post); $post = implode('&', $post);
// Add extra information to the POST data as ajax.js does. // Perform HTTP request.
return $this->curlExec(array(
CURLOPT_URL => url('edit/metadata', array('absolute' => TRUE)),
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $post . $this->getAjaxPageStatePostData(),
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
'Content-Type: application/x-www-form-urlencoded',
),
));
}
/**
* Retrieve field form from the server. May also result in additional
* JavaScript settings and CSS/JS being loaded.
*
* @param string $field_id
* An Edit field ID.
*
* @return string
* The response body.
*/
protected function retrieveFieldForm($field_id) {
// Build & serialize POST value.
$post = urlencode('nocssjs') . '=' . urlencode('true');
// Perform HTTP request.
return $this->curlExec(array(
CURLOPT_URL => url('edit/form/' . $field_id, array('absolute' => TRUE)),
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $post . $this->getAjaxPageStatePostData(),
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
'Content-Type: application/x-www-form-urlencoded',
),
));
}
/**
* Get extra information to the POST data as ajax.js does.
*
* @return string
* Additional post data.
*/
protected function getAjaxPageStatePostData() {
$extra_post = ''; $extra_post = '';
$drupal_settings = $this->drupalSettings; $drupal_settings = $this->drupalSettings;
if (isset($drupal_settings['ajaxPageState'])) { if (isset($drupal_settings['ajaxPageState'])) {
@ -178,16 +232,6 @@ class EditLoadingTest extends WebTestBase {
$extra_post .= '&' . urlencode("ajax_page_state[js][$key]") . '=1'; $extra_post .= '&' . urlencode("ajax_page_state[js][$key]") . '=1';
} }
} }
return $extra_post;
// Perform HTTP request. }
return $this->curlExec(array(
CURLOPT_URL => url('edit/metadata', array('absolute' => TRUE)),
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $post . $extra_post,
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
'Content-Type: application/x-www-form-urlencoded',
),
));
}
} }