Я работаю над проектом с использованием Symfony 2, я создал пакет для обработки всех моих служб баз данных, которые передают данные JSON назад и вперед.
Моя проблема / вопрос:
Можно ли разместить прямо вверх объект JSON? В настоящее время я подменяю обычное сообщение формы для своих вызовов ajax, предоставляя объекту имя json={"key":"value"}
если я не даю ему имя. Я не могу получить данные из Объект запроса Symfony $JSON = $request->request->get('json');
Я хочу иметь возможность использовать один сервисный пакет для обработки как данных, поступающих из вызовов AJAX, так и обычной формы Symfony. В настоящее время я беру представленную форму Symfony, получая данные с помощью JSON_ENCODE, я просто не могу понять, как отправлять данные через мой диспетчер служб, который ожидает данные запроса.
Обобщить:
Я хочу, чтобы Symfony принимал объект сообщения JSON вместо формы.
Я хочу передать объект JSON между контроллерами, используя Request / Response
Если я все это сделаю неправильно, не стесняйтесь говорить мне об этом!
Если вы хотите получить данные в своем контроллере, которые были отправлены в качестве стандартного JSON в тело запроса, вы можете сделать что-то похожее на следующее:
public function yourAction() { $params = array(); $content = $this->get("request")->getContent(); if (!empty($content)) { $params = json_decode($content, true); // 2nd param to get as array } }
Теперь $params
будет массивом, полным ваших данных JSON. Удалите true
значение параметра в json_decode()
чтобы получить объект stdClass
.
Я написал метод для получения содержимого в виде массива
protected function getContentAsArray(Request $request){ $content = $request->getContent(); if(empty($content)){ throw new BadRequestHttpException("Content is empty"); } if(!Validator::isValidJsonString($content)){ throw new BadRequestHttpException("Content is not a valid json"); } return new ArrayCollection(json_decode($content, true)); }
И я использую этот метод, как показано ниже
$content = $this->getContentAsArray($request); $category = new Category(); $category->setTitle($content->get('title')); $category->setMetaTitle($content->get('meta_title'));
javascript на странице:
function submitPostForm(url, data) { var form = document.createElement("form"); form.action = url; form.method = 'POST'; form.style.display = 'none'; //if (typeof data === 'object') {} for (var attr in data) { var param = document.createElement("input"); param.name = attr; param.value = data[attr]; param.type = 'hidden'; form.appendChild(param); } document.body.appendChild(form); form.submit(); }
после некоторого события (например, щелчок на «submit»):
// products is now filled with a json array var products = jQuery('#spreadSheetWidget').spreadsheet('getProducts'); var postData = { 'action': action, 'products': products } submitPostForm(jQuery('#submitURLcreateorder').val(), postData);
в контроллере:
/** * @Route("/varelager/bestilling", name="_varelager_bestilling") * @Template() */ public function bestillingAction(Request $request) { $products = $request->request->get('products', null); // json-string $action = $request->request->get('action', null); return $this->render( 'VarelagerBundle:Varelager:bestilling.html.twig', array( 'postAction' => $action, 'products' => $products ) ); }
в шаблоне (bestilling.html.twig в моем случае):
{% block resources %} {{ parent() }} <script type="text/javascript"> jQuery(function(){ //jQuery('#placeDateWidget').placedate(); {% autoescape false %} {% if products %} jQuery('#spreadSheetWidget').spreadsheet({ enable_listitem_amount: 1, products: {{products}} }); jQuery('#spreadSheetWidget').spreadsheet('sumQuantities'); {% endif %} {% endautoescape %} }); </script> {% endblock %}
с{% block resources %} {{ parent() }} <script type="text/javascript"> jQuery(function(){ //jQuery('#placeDateWidget').placedate(); {% autoescape false %} {% if products %} jQuery('#spreadSheetWidget').spreadsheet({ enable_listitem_amount: 1, products: {{products}} }); jQuery('#spreadSheetWidget').spreadsheet('sumQuantities'); {% endif %} {% endautoescape %} }); </script> {% endblock %}
Alrite, я думаю, это то, что вы хотели 🙂
EDIT Чтобы отправить что-то без симуляции формы, вы можете использовать jQuery.ajax (). Вот пример в том же духе, что и выше, что не приведет к обновлению страницы.
jQuery.ajax({ url: jQuery('#submitURLsaveorder').val(), data: postData, success: function(returnedData, textStatus, jqXHR ){ jQuery('#spreadSheetWidget').spreadsheet('clear'); window.alert("Bestillingen ble lagret"); // consume returnedData here }, error: jQuery.varelager.ajaxError, // a method dataType: 'text', type: 'POST' });