PEAR is discontinued

This is a static archive preserving historical releases and metadata. No new packages or updates will be published. For updates to existing packages, or to publish new packages, please use Composer and Packagist.

Home » Structures » Structures_DataGrid » Bug #2125

GET parameters are intrusive and forbid using several DataGrids

Details

Submitted2004-08-15 12:52 UTC
Fromylf at xung dot org
Assignedasnagy
StatusClosed
PackageStructures_DataGrid
PHP Version4.3.4
OSLinux Debian (testing)
Roadmaps(Not assigned)

Comments

[2004-08-15 12:52 UTC] ylf at xung dot org

Description:
------------
As it has been mentioned on the pear-dev mailing list, there's a need for namespacing the orderBy, direction and page GET parameters.

About this issue, Jackson Miller stated :

<jackson>
I am not so sure this is a good thing. If SDG not only displays the UI but
also processes incoming requests ($_GET['page'], $_GET['orderBy']) then we
have to do something to make the SDG request vars not so global. Mybe
something like this:
$_GET['sdg[page]']
$_GET['sdg[orderBy]']
$_GET['sdg[direction]']
(order by and direction should probably be arrays themselves but...)
</jackson>

So, for sure, a prefix is needed. But there's another problem : if several grids are displayed on the same page, an arbitrary 'sdg' prefix will turn into a conflict.

This means the prefix must be customizable.

Side note : I don't think orderBy and direction should be arrays themselves. I don't see how the DataGrid would render that.

[2004-10-02 15:31 UTC] joern_h at gmx dot net

Here is a patch for using multiple datagrids on one page. It adds methods for setting a "namespace" to Core.php which is then used by HTMLTable.php. I have also added code for indicating the current sort order with arrows in the table header.

diff -r -d -U 4 c:\temp\Structures_DataGrid-0.5.3\DataGrid/Core.php structures\datagrid/Core.php
--- c:\temp\Structures_DataGrid-0.5.3\DataGrid/Core.php Tue Aug 10 13:17:32 2004
+++ structures\datagrid/Core.php Sat Oct 2 15:26:45 2004
@@ -79,8 +79,14 @@
*/
var $pager;

/**
+ * The namespace for GET parameters
+ * @var string
+ */
+ var $namespace = '_sdg';
+
+ /**
* Constructor
*
* Creates default table style settings
*
@@ -94,8 +100,45 @@
$this->page = $page;
}

/**
+ * Sets the namepace for GET parameters
+ *
+ * @param string $ns The new namespace
+ * @access public
+ */
+ function setNamespace($ns)
+ {
+ $this->namespace = $ns;
+ }
+
+ /**
+ * Retrieves the current namespace for GET parameters
+ * @return string The current namespace
+ * @access public
+ */
+ function getNamespace()
+ {
+ return $this->namespace;
+ }
+
+ /**
+ * Sets the sort order, direction and page number from the GET parameters
+ * without actually sorting. Useful if sorting is done by a database.
+ *
+ * @access public
+ */
+ function setRequestParams()
+ {
+ if (isset($_GET[$this->namespace . '_orderBy']))
+ $this->sortArray[0] = $_GET[$this->namespace . '_orderBy'];
+ if (isset($_GET[$this->namespace . '_direction']))
+ $this->sortArray[1] = $_GET[$this->namespace . '_direction'];
+ if (isset($_GET[$this->namespace . '_page']))
+ $this->page = $_GET[$this->namespace . '_page'];
+ }
+
+ /**
* Retrieves the current page number when paging is implemented
*
* @return string the current page number
* @access public
@@ -226,9 +269,9 @@
function buildPaging($options)
{
$defaults = array('totalItems' => count($this->recordSet),
'perPage' => $this->rowLimit,
- 'urlVar' => 'page');
+ 'urlVar' => $this->namespace . '_page');
$options = array_merge($defaults, $options);
$this->pager =& Pager::factory($options);
}

diff -r -d -U 4 c:\temp\Structures_DataGrid-0.5.3\DataGrid/Renderer/HTMLTable.php structures\datagrid/Renderer/HTMLTable.php
--- c:\temp\Structures_DataGrid-0.5.3\DataGrid/Renderer/HTMLTable.php Tue Aug 10 15:54:44 2004
+++ structures\datagrid/Renderer/HTMLTable.php Sat Oct 2 15:21:54 2004
@@ -271,33 +271,35 @@
*/
function _buildHTMLTableHeader()
{
$cnt = 0;
+ $directionstr = $this->_dg->namespace . '_direction=';
+ $orderbystr = $this->_dg->namespace . '_orderBy=';
foreach ($this->_dg->columnSet as $column) {
//Define Content
if ($column->orderBy != null) {
// Determine Direction
if ($this->_dg->sortArray[1] == 'ASC') {
- $direction = 'direction=DESC';
+ $direction = $directionstr . 'DESC';
} else {
- $direction = 'direction=ASC';
+ $direction = $directionstr . 'ASC';
}

// Build URL -- This needs much refinement :)
if (isset($this->path)) {
$url = $this->path . '?';
} else {
$url = $_SERVER['PHP_SELF'] . '?';
}
- if (isset($_SERVER['QUERY_STRING'])) {
+ if (!empty($_SERVER['QUERY_STRING'])) {
$qString = explode('&', $_SERVER['QUERY_STRING']);
$i = 0;
foreach($qString as $element) {
if ($element != '') {
- if (stristr($element, 'orderBy')) {
- $url .= 'orderBy=' . $column->orderBy;
+ if (stristr($element, $orderbystr)) {
+ $url .= $orderbystr . $column->orderBy;
$orderByExists = true;
- } elseif (stristr($element, 'direction')) {
+ } elseif (stristr($element, $directionstr)) {
$url .= $direction;
} else {
$url .= $element;
}
@@ -308,16 +310,24 @@
}
}

if (!isset($orderByExists)) {
- $url .= '&orderBy=' . $column->orderBy . '&' .
+ $url .= '&' . $orderbystr . $column->orderBy . '&' .
$direction;
}
} else {
- $url .= 'orderBy=' . $column->orderBy . '&' . $direction;
+ $url .= $orderbystr . $column->orderBy . '&' . $direction;
}

- $str = '<a href="' . $url . '"><b>' . $column->columnName .
+ $name = $column->columnName;
+ // if sorted by this column display an arrow indicating the order
+ if ($this->_dg->sortArray[0] == $name) {
+ if ($this->_dg->sortArray[1] == 'ASC')
+ $name .= ' ↓';
+ elseif ($this->_dg->sortArray[1] == 'DESC')
+ $name .= ' ↑';
+ }
+ $str = '<a href="' . $url . '"><b>' . $name .
'</b></a>';
} else {
$str = '<b>' . $column->columnName . '</b>';
}

[2004-10-20 21:05 UTC] asnagy at webitecture dot org

This bug has been fixed in CVS.

In case this was a documentation problem, the fix will show up at the
end of next Sunday (CET) on pear.php.net.

In case this was a pear.php.net website problem, the change will show
up on the website in short time.

Thank you for the report, and for helping us make PEAR better.