Articles avec le tag ‘colonne’

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

dimanche 29 avril 2012

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 " ....