Mise en place de filtre destinés aux listing du backoffice

Cette note n’est valable que pour les modules de pages exploitant héritant de la class ModTwo.

A ce titre, la plupart de l’implémentation du filtre à lieux  dans la section GetConf de la classes, et dans la définition de l’ensemble des éléments de la variable $InitInfo.

Pour mettre en oeuvre les filtres, le plus simple à mettre en oeuvre consiste à ajouter le choix des colonnes visibles. A cette fin , le gabarit html est déjà conçu. Il suffit donc de l’initialiser, en fournissant l’ensemble des éléments nécessaire à son initialisation correct.

Dans notre exemple, nous partons dans le contexte que l’action courante est : ‘listing’

Section dans la function GetConf

Dans un premier temps, ajouter une variable dans la class

  /**
    @var array info all tabs for filter listings
  */
  public static $allfields = array();

Puis dans la méthode GetConf, apres les section de definition des var static, et constante JSONSTATMENT, placer la definition de l’ensemble des colonne qui seront disponible pour cette selection.
/**
@remarks this define col theader title, and ajust html code
Just for Edit listing
*/

self::$allfields = array(
	'o.orders_id' => array( 
		'sort'=>true, 
		'text'=>__('orders table heading order id'),
		'width'=>'2%', 
		'class'=>'tcenter',
		'default'=>true,
		), 
                ....
             );

Puis construire le début de la structure des theader ou tfooter et ou modele. Dans notre exemple, nous allons définir 3 colonne supplémentairement qui seront affiché systématiquement. C’est le cas pour les 2 première colonnes, fournissant le bouton plie/déplie du détail, et la colonne pour sélectionner cette ligne. Enfin, nous placeront aussi la colonne action.

/**
	@remarks Construct all list , fields , th/td 
*/
self::$InitInfo['theader']['listing']=array(
		0 =>array('width'=>'2%', 'class'=>'tcenter', 'txt'=>' ' ),
		1 =>array('width'=>'2%', 'class'=>'tcenter', 'txt'=>' ' ),
		);
self::$InitInfo['tfooter']['listing']=self::$InitInfo['theader']['listing'];

self::$InitInfo['modele']['listing']=array(
				0 =>false,
				1 =>false,
	);



self::$InitInfo['modele']['listing']['action']=false;
self::$InitInfo['theader']['listing']['action']= array( 'class'=>'row_action', 'txt'=>__('table heading action') );
self::$InitInfo['tfooter']['listing']['action']= array( 'class'=>'row_action', 'txt'=>__('table heading action') );

Pour ce qui est de la boucle dynamique, nous utiliseront le control sur le tableau de filtre de la session utilisateur.
Dans noter contexte, nous utiliserons une boucle comme suit :

// min  fields and not view directly colonne fields
$listfield = 'o.orders_prefix, s.status_color as orders_status_color,';
// put in 
if(isset($_SESSION['filters'][__CLASS__]['allfields']))
	$_SESSION['filters']['allfields'] = $_SESSION['filters'] [__CLASS__]['allfields'];
else
	$_SESSION['filters']['allfields'] = array();

	$in_session = $_SESSION['filters']['allfields'];
// check and appli
foreach(self::$allfields  as $key=>$row){
	$clean = substr($key, (strpos($key, '.')+1));

	if(is_array($row)){
		$txt = $row['text'];
		$alias = (isset($row['alias'])? $row['alias'] : $clean);
		$css = (isset($row['class'])? $row['class'] : 'tcenter');
		$width = (isset($row['width'])? $row['width'] : '5%');
	}
	else{
		$txt = $row;
		$alias = $clean;
		$css = 'tcenter';
		$width = '5%';
	}

        if(
	( isset($in_session[$clean]) &&  (string)$in_session[$clean] == 'on' )
	|| ( count($in_session) <=1  && ( is_array($row) && isset($row['default']) &&  $row['default'] == true) )
	) {
		$_SESSION['filters']['allfields'][$clean] = 'on';
		/**
			@remarks this define col theader title, and ajust html code
		*/
		self::$InitInfo['theader']['listing'][]= array( 'width'=>$width, 'class'=>$css, 'txt'=>$txt);
		self::$InitInfo['tfooter']['listing'][]= array( 'width'=>$width, 'class'=>$css, 'txt'=>$txt );
		/**
			@remarks this define col in table, and if is possible sort
		*/
		self::$InitInfo['modele']['listing'][$alias]=true;

		if($clean !=$alias)
			$listfield .=$key.' as '.$alias.',';
		else
			$listfield .=$key.',';
	}
	}

 

Puis la transmissions du tableau complet des options de filtre disponible

 self::$InitInfo['allfields']['listing'] = self::$allfields ;

Et pour finir l’activation proprement dite des tabs des filtres

/**
 @remarks Active forms filter
*/
self::$InitInfo['tfilter']['listing']=array(
/* Premier filtre spécifique a cette page */
					array(
					'title'=>__('orders filter tab clause'),
					'content'=>tep_get_include_contents(__CLASS__.'/filter.clause'),
                 			),
/* Second filtre utilisant le ModTwo et le choix des colonnes  */
				array(
					'title'=>__('orders filter tab fields'),
					'type'=>'listfield'
				),
			);

Enfin la transmission des champs a utiliser dans la requetes sql

/**
		@remarks Put detail for listing methode 
	*/
	self::$InitInfo['adjust']['listfields'] = substr($listfield, 0,-1);

Section dans la function check_action

La section de prise en charge du formulaire , dans le switch des actions

/**
	@remarks specific save in session value filters 
*/
case 'filters':
	$_SESSION['filters'][__CLASS__]['allfields'] =array();
	foreach($_POST['allfields'] as $key=>$row){
		if( $row =='on' )
			$_SESSION['filters'][__CLASS__]['allfields'][$key] = 'on';
		else
			unset($_SESSION['filters'][__CLASS__]['allfields'][$key]);
	}

	$_SESSION['filters'][__CLASS__]['viewstatus'] =array();
	foreach($_POST['viewstatus'] as $key=>$row){
		if( $row =='on' )
			$_SESSION['filters'][__CLASS__]['viewstatus'][$key] = 'on';
		else
			unset($_SESSION['filters'][__CLASS__]['viewstatus'][$key]);
	}


	tep_redirect(tep_href_link(self::FILENAME));
break;

Section dans la function GetDBValue

Modifier la requêtes produisant le listing, en y portant la var des la liste des champs à extraire de la base.

$adjust=new objectInfo(self::$InitInfo['adjust']);


$query_raw = "select distinct ".$adjust->listfields." from " ....

Tags : , , , ,

Les commentaires sont fermés.