Rapidement, un petit tuto, pour voir quoi et comment structurer un petit module d’affichage, (dossier includes/modules/).
Ces modules, sont des modules non typé, donc sont à la racine du répertoire des modules.
Il assure l’affichage sous forme de listing. pour info , il sont pris en charge par la class oscss_modules.
Ces modules, tres simple, ce compose de 2 functions. L’une pour la requêtes sql ou xml , et l’autre pour la mise en object de la dite requête.
La mise en object n’intervient que si le résultat de la requête et différents de null ou zero.
La seul contraintes sur ces fonctions , est leur nommage. elle reprenne toutes les 2, le nom du fichier dans lesquel elle sont definis.
Pour l’exemple, nous allons ajouter un module d’affichage des promotions. le module sera nommé listing_specials. Nous retourverons ainsi nos 2 functions nommé comme suit :
- sql_listing_specials
- in_obj_listing_specials
Nous souhaitons donc lister les promos, et nous recuperons la requete sql, definis dans le fichier includes/content de la page promo (lui aussi listing_specials)
Notre fichier :
}
function in_obj_listing_specials(){
}
Pour la fonction de reuquete, avec la requete de la page special , ca nous donnera
$page=page::getInstance();
$DB=Database::getInstance();
$languages_id=$page->the_var('languages_id');
if(!_test_bool($page->_conf_value('MAX_DISPLAY_LISTING_SPECIALS')))$page->add_var_page('MAX_DISPLAY_LISTING_SPECIALS','3');
$specials_query_raw = "select p.products_id, pd.products_name, p.products_price, p.products_quantity, p.products_tax_class_id, p.products_image, s.specials_new_products_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_SPECIALS . " s where p.products_status = '1' and s.products_id = p.products_id and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and s.status = '1' order by s.specials_date_added DESC limit " . $page->_conf_value('MAX_DISPLAY_LISTING_SPECIALS');
$new_products_query = $DB->query($specials_query_raw);
if ($new_products_query->__get('NumRows') > 0) return $new_products_query;
else return false;
}
Nous prenons soin de retourner soit le resultat de la requte, soit false, en cas d’erreur, ou si le resultat est null.
Nous avons aussi ajouter une limit, via l’appel MAX_DISPLAY_LISTING_SPECIALS. mais cet valeur n’etant pas defini, nous avons ajouter sa definition avant la requete
$page->add_var_page('MAX_DISPLAY_LISTING_SPECIALS','3');
Sous cette forme, un test est effecué, sur la valeur, donc, si elle n’est pas defini, on la precise, ici avec la valeur 3.
L’interet de cet appel , est que vous pouvez ainsi ajouter dans votre template, ou ailleur le nombre de la limit, avec un simple appel de la forme suivante
Pour la fonction de transformation du resultat qui est en tableau vers un object, elle n’est pas obligatoire, toutefois, si vous souhaitez utilisé le template module, qui prend ainsi en charge l’affichage des listing, elle est necessaire.
Cette fonction n’a donc qu’un traitement de remplacement de chaque ligne de resultat en object.
$page=page::getInstance();
$p=array();
if( ($res=$page->oscss_modules->_resultsql('listing_specials')) ==false ) return null;
while ($new_products = $res->fetchAssoc()){
$p[]=new objectInfo($new_products);
}
return new objectInfo(array('title'=>__('table heading specials'), 'content'=>$p ));
}
Toutefois, nous souhaitons aussi ajouter dans le resultat les élémet optionnel installé (description, portfolio, etc.. ) Dans ce cas, nous allons faire appel à la class listing , qui ce charge d’appeler les modules de type listing.
Initialisation de la class
Ajout pour chaque resultat des élement de type listing
Ce qui donne
$page=page::getInstance();
$languages_id=$page->the_var('languages_id');
$currencies=$page->return_object('currencies');
/** init aca module */
$aca_listing=$page->new_class('listing');
$p=array();
if( ($res=$page->oscss_modules->_resultsql('listing_specials')) ==false ) return null;
while ($new_products = $res->fetchAssoc()){
$p[]=array_merge($new_products,array('aca'=>$aca_listing->return_db_min($new_products['products_id'])) ) );
}
return new objectInfo(array('title'=>__('table heading specials'), 'content'=>$p ));
}
Voila , la méthodologie est la même pour tous les modules sans type..