Tengo datos que quiero enviar desde una vista a un controlador. Y estoy tratando de usar fetch para enviarlo. Los datos se han enviado correctamente con un estado de 200 y los datos se encuentran en la carga útil de la solicitud en la red. Pero cuando quiero intentar mostrarlo en el controlador de datos, genera un valor nulo. ¿Alguien tiene una solución para que los datos no sean nulos en el controlador?
Este es mi script a la vista:
<?php defined('BASEPATH') or exit('No direct script access allowed'); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Welcome to CodeIgniter</title> </head> <body> <div id="container"> <h1>Welcome to CodeIgniter!</h1> <div id="body"> <button id="kirimkecontroller">Kirim</button> <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo (ENVIRONMENT === 'development') ? 'CodeIgniter Version <strong>' . CI_VERSION . '</strong>' : '' ?></p> </div> <script> // var data = { // 'testing': 'isi testing' // } let formData = new FormData() formData.append('testing', 'isi testing') const button = document.querySelector('#kirimkecontroller') button.addEventListener('click', () => { fetch("<?= base_url(); ?>/welcome/kiriman_dari_fetch", { method: "POST", mode: 'no-cors', headers: { "Content-Type": "application/json" }, body: formData, }).then(res => console.log('sukses ', res.status)) .catch(e => console.log('gagal ', e)); window.open("<?php echo base_url(); ?>welcome/kiriman_dari_fetch", '_blank'); }) </script> </body> </html>Y este es mi script en el controlador:
<?php defined('BASEPATH') or exit('No direct script access allowed'); class Welcome extends CI_Controller { public function index() { $this->load->view('welcome_message'); } public function kiriman_dari_fetch() { $testing = $this->input->post('testing'); echo json_encode($testing); // null } } Y la salida es null
En Inspeccionar elemento > Red:
¿Cómo puedo obtener los datos de allí al controlador?
Según entiendo, su problema es que está tratando de enviar una solicitud POST a ese controlador y desea mostrar los datos de la publicación después de eso en una nueva pestaña, ¿verdad?
Si es así, recuerde que se trata de dos solicitudes separadas: cuando envía una solicitud POST mediante fetch o jquery, el controlador ya recibe sus datos y la respuesta a esa solicitud mediante:
echo json_encode($testing);para que pueda ver la respuesta en Inspeccionar elemento > Red:
Pero cuando abre una nueva ventana en blanco, es una solicitud GET diferente, por lo que hay un valor nulo cuando intenta imprimirlo. Puedes verificar eso usando este fragmento:
public function kiriman_dari_fetch() { if ($_SERVER['REQUEST_METHOD'] === 'POST') { $testing = $this->input->post('testing'); echo json_encode($testing); } else { $data = array(); $data['request_type'] = 'THIS IS GET'; $this->load->view('welcome_message', $data); // change welcome_message to another of your views } }Agregue $request_type a la vista para verificar la solicitud GET o POST:
<body> <div id="container"> <h1>Welcome to CodeIgniter!</h1> <div id="body"> <button id="kirimkecontroller">Kirim</button> <p><?php echo $request_type; ?></p> .... </html>Cuando abra esa URL en un navegador, mostrará "ESTO ES OBTENER"
Volviendo a su problema, puede usar la respuesta de su solicitud de publicación y luego actualizar la vista actual mediante el selector jquery o html.
public function kiriman_dari_fetch() { $testing['status'] = $this->input->post('testing'); echo json_encode($testing); // null }y probarlo usando ajax
$('.kirimkecontroller').click(function(){ $.ajax({ type: 'POST', url: '<?= base_url(); ?>/welcome/kiriman_dari_fetch', dataType: 'json', data: formData, success: function (response) { console.log('sukses ', response.data.status) window.open("<?php echo base_url(); ?>welcome/kiriman_dari_fetch", '_blank'); } }) })pon esto en tu etiqueta principal
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>