Jump to content

Mon premier formulaire perso dans le back-office


Recommended Posts

Bonsoir à Tous,

 

Après bien des galères pour créer mon 1er module admin, j'ai pu, grâce à la généreuse aide de membres de ce forum, afficher mon premier "hello world". Yeah !

 

J'ai donc mon module "Renaud', et dans ce module un dossier controllers/admin qui contient le fichier AdminRenaudController.php.

Dans ce fichier la classe class AdminRenaudController extends ModuleAdminController

 

Mon but est de créer un petit formulaire qui permet de sélectionner une semaine N° X. Si on sélectionne la semaine N° 22, par exemple, et qu'on le poste, alors je vais chercher les ventes de produits pour la semaine demandée.

 

J'ai lu des tonnes de tutoriels et je m'y perds un peu.

1ère question: est ce que tout se passe dans AdminRenaudController.php ou dans le fichier du module renaud.php ?

 

Voila ce que j'ai fait dans le contrôleur :

public function renderForm(){

		$options = array(
		  array(
			'id_option' => 1,       
			'name' => 'Renaud'    
		  ),
		  array(
			'id_option' => 2,
			'name' => 'Marco'
		  ),
		);		
		$this->fields_form = array(
		  'legend' => array(       
			'title' => $this->l('Choose a week to see the sales'),       
			
		  ),   
		  'input' => array(       
			array(           
			  'type' => 'select',  
			  'label' => $this->l('Select a week:'),
			  'name' => 'invoice',
			  'required' => true,
			  'options' => array(
				'query' => $options,                           
				'id' => 'id_option',                         
				'name' => 'name',                            
			  ),	
			 ),
		  ),
		  'submit' => array(
			'title' => $this->l('See the results'),       
			'class' => 'btn btn-default pull-right'   
		  )
		);		
		return parent::renderForm();
    }



Bien sûr les option du select ne sont qu'un test (en réalité j'ai réussi à créer un sélecteur de semaine).

 

Mais 2ème question: dans le array options, comment pré-sélectionner une option ?

Et surtout: quelle fonction native de PS je dois utiliser pour interroger la BDD et restituer les résultats sous forme d'un tableau HTML avec totaux ? 

Je suppose que c'est postProcess mais j'ai essayé :

	public function postProcess(){
	 	
		$MaValeur = Tools::getValue("invoice");
		echo $MaValeur;
		parent::postProcess();
	}

Mais il semble que le echo ne soit pas le bienvenue ici. Il me retourne bien la valeur de l'option, mais pas sur la page.

C'est beaucoup de demande, mais déjà je voudrais savoir quelle fonction utiliser pour afficher les résultats du POST.

Dois-je utiliser un template ? Pour le formulaire ? Pour les résultats ?

Bien humblement, merci.

Link to comment
Share on other sites

Le Tools::getValue('invoice'); est fonctionnel dans ton cas, il retournera bien la valeur de ton select mais je n'ai pas l'impression que ton select soit créer de la bonne manière,

Essaye de t'inspirer du code ci-dessous pour ton select, il y a de grande change que sa marche :)

array(
                        'type' => 'select',
                        'label' => $this->l('Enable search by date in front office :'),
                        'name' => 'search_by_date',
                        'values' => array(
                            array(
                                'value' => 1,
                                'label' => $this->l('Yes')
                            ),
                            array(
                                'value' => 0,
                                'label' => $this->l('No'),
                                'checked' => 'checked'
                            )
                        ),
                    ),
Link to comment
Share on other sites

Bonjour,

 

Pour le select et le pré-selected, j'ai trouvé ceci qui fonctionne :

$this->fields_value['invoice'] = 1

Par contre, là où je galère vraiment c'est pour la fonction qui reçoit le POST - je pense que c'est postProcess() - et qui affiche les résultats (en l'occurrence, pour moi un tableau HTML issu de données de la BDD). Quand je fais un :

	public function postProcess(){
	 	$MaValeur = Tools::getValue("invoice");
		echo $MaValeur;
		parent::postProcess();
	}

La valeur s'affiche mais en dessus du header PS. Je ne sais pas si je dois utiliser un template, mais j'aimerais bien afficher le résultat sur la page...

Link to comment
Share on other sites

En gros je veux, dans mon controler:

1- Afficher un formulaire avec un select

2- Recevoir les données, interroger la BDD et afficher le résultat.

 

Tout se passe dans le BO où j'ai crée un module, avec lien menu.

 

Hors Prestashop, il me faut 10mn, mais là....je patauge.

Tout echo produit une erreur de header already sent....

Edited by renaud2263 (see edit history)
Link to comment
Share on other sites

Après bien des errances, voici ce que j'ai fait dans le controller admin de mon module :

public function renderForm()
    {
		$debut_sem = $this->dateFromWeek($this->date_debut);
		//echo $debut_sem;
		$year = date('Y');
		$sem = date('W');
		for($i=$debut_sem;$i<=date('W');$i++){
			$sem_liste = $this->get_lundi_samedi_from_week($i,$year);
			($sem == $i) ? $this->fields_value['invoice'] = $i : $this->fields_value['invoice'] = ''; ; 
			$options[] = array('id_option'=>$i, 'name'=>'Week N° '.$i.' (from '.$sem_liste[0].' to '.$sem_liste[1].')');
		}
		
		$this->fields_form = array(
		  	'legend' => array(       
			'title' => $this->l('Choose a week to see the sales'),       
			/*'image' => ''  */
		  ),   
		  'input' => array(       
			array(           
			  'type' => 'select',  
			  'label' => $this->l('Select a week:'),
			  'name' => 'invoice',
			  'required' => true,
			  'options' => array(
				'query' => $options,                           
				'id' => 'id_option',                         
				'name' => 'name',                            
			  ),	
			),
		  ),
		  'submit' => array(
			'title' => $this->l('See the results'),       
			'class' => 'btn btn-default pull-right'   
		  )
		);		
		return parent::renderForm();
    }
	
	public function postProcess()
	{
       
        if (Tools::isSubmit('invoice')) {
        $sem = Tools::getValue("invoice");
		
		
		$sql = "SELECT ca.product_id, ca.product_name, ca.product_supplier_reference, SUM(ca.product_quantity) AS qte, purchase_supplier_price,
		(ca.purchase_supplier_price * qte) AS tot_line
		FROM "._DB_PREFIX_."order_detail ca LEFT JOIN "._DB_PREFIX_."orders c ON ca.id_order = c.id_order
		
		WHERE (YEAR(DATE(c.delivery_date)) = '".$this->year."' AND WEEK(DATE(c.delivery_date)) = '".$sem."') 
		GROUP BY ca.product_id ORDER BY ca.product_supplier_reference";
		$tab_data = '';
		if ($res = Db::getInstance()->ExecuteS($sql)){
			foreach ($res as $row){
				//$output .= $row['product_name'].' :: '.$row['qte'].'<br />';	OUTPUT EST OK LA REQ EST OK
				$tab_data .= '<tr><td>'.$row['product_id'].'</td><td>'.$row['product_supplier_reference'].'</td><td>'.$row['product_name'].'</td>
				<td>'.$row['qte'].'</td><td>'.$row['purchase_supplier_price'].'</td><td>'.$row['tot_line'].'</td></tr>'; 
			}
		}
		
        $this->context->smarty->assign('tab_data', $tab_data);
		
        return parent::postProcess();
	   }
	}
		
 	public function getTemplatePath()
    {
		return _PS_MODULE_DIR_.$this->module->name.'/views/templates/admin/';
    }   
	
	public function createTemplate($tpl_name) {
        if (file_exists($this->getTemplatePath() . $tpl_name) && $this->viewAccess())
            return $this->context->smarty->createTemplate($this->getTemplatePath() . $tpl_name, $this->context->smarty);
			
        return parent::createTemplate($tpl_name);
    }
}

Puis dans mon template "content.tpl", pour test, j'ai mis :

<table>
 
    <tr><td>Les résultats:</td></tr>
    {$tab_data|default:' '}
</table>


Mais cela ne fonctionne pas: quand je charge ma page, c'est le contenu du template "Les résultats :" sans les variables, qui s'affiche à la place du formulaire.

Et si je supprime la fonction "createTemplate" le formulaire s'affiche bien avec le select, mais, évidemment, quand je le poste, aucun résultat ne s'affiche

Edited by renaud2263 (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...