php-cli-tools icon indicating copy to clipboard operation
php-cli-tools copied to clipboard

Add ability to add row in a loop to existing already-rendered table

Open slaFFik opened this issue 2 years ago • 3 comments

Feature Request

Describe your use case and the problem you are facing

I want to "register" an empty table, and then later in a loop using table reference ($table) add rows.

Right now if I register a table, call the display() method to render it, and then later call the

$table->addRow(); 
$table->display();

it will render the whole table again - with headers and previously added rows.

Describe the solution you'd like

I think separating resetTable() method into individual methods for header, rows, footer is needed.

So I should be able to either do this:

$table->setHeaders();
$table->display();

foreach ($rows as $row) {
	$table->resetRows();
	$table->addRow($row);
	$table->display();
}

or something like this:

$table->setHeaders();
$table->display();

foreach ($rows as $row) {
	$table->displayRow($row);
}

Also, because header is a mandatory table data, displaying a new row should not render the top border but render the bottom row.

slaFFik avatar Sep 28 '23 21:09 slaFFik

My dumb proof of concept (just to continue working on my package):

use cli\Streams;
use cli\Table;

class DynamicTable extends Table {

	public function displayRow( $row ) {

		$this->_renderer->setWidths( $this->_width, $fallback = true );
		$border = $this->_renderer->border();

		$out = [];

		$row = $this->_renderer->row( $row );
		$row = explode( PHP_EOL, $row );
		$out = array_merge( $out, $row );

		if ( isset( $border ) ) {
			$out[] = $border;
		}

		foreach ( $out as $line ) {
			Streams::line( $line );
		}
	}
}

slaFFik avatar Sep 28 '23 23:09 slaFFik

Seems fine to me, as long as there aren't any backcompat breaks. Feel free to submit a PR if you'd like.

danielbachhuber avatar Sep 29 '23 14:09 danielbachhuber

Awesome, @danielbachhuber. I will do that later today.

slaFFik avatar Sep 29 '23 16:09 slaFFik