Jump to content

My datatable does not show filtering, pagination and search | Please help me!


Facundo

Recommended Posts

I have this part of code where I show data in the table:

<?php foreach ($pedidos as $dato) { $codigoPedido = $dato['Codigo_pedido']; $razonSocialCliente = $dato['Razon_social']; $tipoPedido = $dato['Tipo_pedido']; $nombreEmpleado = $dato['NombreEmpleado']; $estadoPedido = $dato['Estado_pedido']; $fechaPedido = $dato['Fecha']; $descripcionProductos = explode('<br>', $dato['DescripcionProductos']); $cantidadProductos = explode('
', $dato['CantidadProductos']); $precioTotal = $dato['PrecioTotal']; $numProductos = count($descripcionProductos); if (count($cantidadProductos) !== $numProductos) { continue; } ?>
<tr>
<td rowspan="<?php echo $numProductos ?>"><?php echo $codigoPedido ?></td>
<td rowspan="<?php echo $numProductos ?>"><?php echo $razonSocialCliente ?></td>
<td rowspan="<?php echo $numProductos ?>"><?php echo $tipoPedido ?></td>
<td rowspan="<?php echo $numProductos ?>"><?php echo $nombreEmpleado ?></td>
<td rowspan="<?php echo $numProductos ?>"><?php echo $estadoPedido ?></td>
<td rowspan="<?php echo $numProductos ?>"><?php echo $fechaPedido ?></td>
<td><?php echo $descripcionProductos[0] ?></td>
<td><?php echo $cantidadProductos[0] ?></td>
<?php
$primerProductoPrecio = obtenerPrecioProductoPedido($codigoPedido, $descripcionProductos[0]);
?>
<td><?php echo $primerProductoPrecio ?></td>
<td rowspan="<?php echo $numProductos ?>">
<a href="borrarPedido.php?id=<?php echo $codigoPedido ?>" onclick='return test_click();' class="btn btn-danger"><i class="fas fa-user-minus"></i></a>

        <a href="actualizarPedido.php?id=<?php echo $codigoPedido ?>" class="btn btn-info"><i class="fas fa-pen"></i></a>

        <a href="agregarremito.php?id=<?php echo $codigoPedido ?>" class="btn btn-info"><i class="fas fa-bars"></i></a>

    </td>

    </tr>

<?php for ($i = 1; $i < $numProductos; $i++) { ?>

<tr>

    <td><?php echo $descripcionProductos[$i] ?></td>

    <td><?php echo $cantidadProductos[$i] ?></td>

    <?php

    $productoPrecio = obtenerPrecioProductoPedido($codigoPedido, $descripcionProductos[$i]);

    ?>

    <td><?php echo $productoPrecio ?></td>

</tr>

<?php } ?>

<?php } ?>

</tbody>

I need help because in the part where I add more than one data in a row, it makes the filter, pagination and search disappear

Edited by requinix
please use the Code <> button when posting code
Link to comment
Share on other sites

the links you produce need to start with a copy of any existing $_GET data (so that the original $_GET data is unchanged), set the relevant element(s) in the copy of the data, such as the id element, build the query-string part of the URLs using php's http_build_query(), then produce the link. this will propagate any existing filter, pagination, search, ... terms in the links.

Link to comment
Share on other sites

sorry, I do not understand. I understand that the pagination, filter, and search disappear because I have more than one product in my order (I tried deleting the counter and the pagination, filter, and search appear)

Link to comment
Share on other sites

so, you actually have a jquery dataTable problem?

the dataTable coding assumes that each row has the same significance. any column sorting and pagination is based on the literal rows of data. i suspect that as soon as you put a rowspan with more then one row, that it produces javascript errors. you can check in the browser's developer tools console tab.

the question becomes, what are you trying to accomplish?

if you want to list all the orders, with column sorting, pagination, and searching, you would only output the unique/one-time information about each order. if someone finds an order that they want to see the details of, they would click on a link and, for example, open a dialog popup with the item details in it. you might (untested) be able to use the jquery dataTable show extra/detailed information api - see this link - https://datatables.net/examples/api/row_details.html

If you want to instead be able to do column sorting, pagination, and searching for both order information and item information, forget about the rowspan and just repeat the common information in each row.

 

 

Link to comment
Share on other sites

I've taken the OP's original presentation of his code and made it a bit more readable for those of us who don't see what the attempt here is.  Isn't this below a bit more readable as well as understandable?

foreach ($pedidos as $dato) 
{
	$codigoPedido = $dato['Codigo_pedido']; 
	$razonSocialCliente = $dato['Razon_social']; 
	$tipoPedido = $dato['Tipo_pedido']; 
	$nombreEmpleado = $dato['NombreEmpleado']; 
	$estadoPedido = $dato['Estado_pedido']; 
	$fechaPedido = $dato['Fecha']; 
	$descripcionProductos = explode('<br>', $dato['DescripcionProductos']); 
	$cantidadProductos = explode('', $dato['CantidadProductos']); 
	$precioTotal = $dato['PrecioTotal']; 
	$numProductos = count($descripcionProductos); 
	if (count($cantidadProductos) !== $numProductos) 
		continue;
	echo "
		<tr>
		<td rowspan='$numProductos'>$codigoPedido</td>
		<td rowspan='$numProductos'>$razonSocialCliente</td>
		<td rowspan='$numProductos'>$tipoPedido</td>
		<td rowspan='$numProductos'>$nombreEmpleado</td>
		<td rowspan='$numProductos'>$estadoPedido</td>
		<td rowspan='$numProductos'>$fechaPedido</td>
		<td>{$descripcionProductos[0]}</td>
		<td>{$cantidadProductos[0]}</td>
		";
	$primerProductoPrecio = obtenerPrecioProductoPedido($codigoPedido, $descripcionProductos[0]);
	echo "
		<td>$primerProductoPrecio</td>
		<td rowspan='$numProductos'>
			<a href='borrarPedido.php?id=$codigoPedido' onclick='return test_click();'
				class='btn btn-danger'><i class='fas fa-user-minus'></i></a>
			<a href='actualizarPedido.php?id=$codigoPedido' class='btn btn-info'><i class='fas fa-pen'></i></a>
			<a href='agregarremito.php?id=$codigoPedido' class='btn btn-info'><i class='fas fa-bars'></i></a>
		</td>
		</tr>
		";
	for ($i = 1; $i < $numProductos; $i++) 
	{
		echo "
			<tr>
			<td>{$descripcionProductos[$i]}</td>
			<td>{$cantidadProductos[$i]}</td>
			";
		$productoPrecio = obtenerPrecioProductoPedido($codigoPedido, $descripcionProductos[$i]);
		echo "
			<td>$productoPrecio</td>
			</tr>
			";
	}
}
echo "</tbody>";

Now - what is the problem here?

Link to comment
Share on other sites

hi ginerjm, The problem is that the pagination, search and filter of the datatable disappear, I found that the error is thanks to this:

 

 </tr>
    <?php for ($i = 1; $i < $numProductos; $i++) { ?>
    <tr>
        <td><?php echo $descripcionProductos[$i] ?></td>
        <td><?php echo $cantidadProductos[$i] ?></td>
        <?php
        $productoPrecio = obtenerPrecioProductoPedido($codigoPedido, $descripcionProductos[$i]);
        ?>
        <td><?php echo $productoPrecio ?></td>
    </tr>
    <?php } ?>
    <?php } ?>
</tbody>

I'm going to see what mac_gyver said maybe you have a solution

Link to comment
Share on other sites

I see no effort in this piece code that does any of that.  Care to enlighten me as to how that is being accomplished?

And please stop writing code like this.  Way too complicated and completely unnecessary.  Please look at how I rewrote your post to be clearer and it does not unnecessarily switch in and out of php mode.  

If you don't wish to do that then I will bow out now and let you continue

Link to comment
Share on other sites

That sure seems like a strange way in doing pagination. In my opinion the data should be come from a database table and broken down to something like the following ->

// Grab the current page the user is on
if (isset($_GET['page']) && !empty($_GET['page'])) {
    $current_page = urldecode($_GET['page']);
} else {
    $current_page = 1;
}

$per_page = 2; // Total number of records to be displayed:


// Grab Total Pages
$total_pages = $cms->total_pages($total_count, $per_page);


/* Grab the offset (page) location from using the offset method */
/* $per_page * ($current_page - 1) */
$offset = $cms->offset($per_page, $current_page);

// Figure out the Links that you want the display to look like
$links = new Links($current_page, $per_page, $total_count, $category);

// Finally grab the records that are actually going to be displayed on the page
$records = $cms->page($per_page, $offset, 'cms', $category);

that way all you have to do is format. the HTML using CSS ->

<main class="main_container" itemprop="mainContentOfPage">
    <?php
    foreach ($records as $record) {
        $imagePath = htmlspecialchars($record['image_path'], ENT_QUOTES, 'UTF-8');
        $heading = htmlspecialchars($record['heading'], ENT_QUOTES, 'UTF-8');
        $content = htmlspecialchars($record['content'], ENT_QUOTES, 'UTF-8');

        echo '<div class="image-header">';
        echo '<img src="' . $imagePath . '" title="' . $heading . '" alt="' . $heading . '">';
        echo '</div>';
        echo '<h1>' . $heading . '</h1>';
        echo '<p>' . nl2br($content) . '</p>';
        echo '<br><hr><br>';
    }
    ?>
</main>

The above is just an example, but if you breakdown the HTML/Code in smaller sections it's easier to read & debug. There are a lot of good pagination tutorials online.

Link to comment
Share on other sites

the basic jquery dataTable coding is only usable up to a few hundred rows of data, because of the time it takes to send that much data/markup to the client and how much time it takes to manipulate that much data in the client. once you have a lot of real-world data, you need to switch to use server-side processing, where the dataTable is just the User Interface (UI) and the actual work of column sorting, pagination, and searching is done on the server. only the data needed to 'draw' the current page is output to the client. see this link - https://datatables.net/examples/server_side/index.html

in any case, if you want to do something like search and find all the orders that use an item, you will need to list all the items in the orders, repeating the common order data in the columns without using rowspans.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.