Jump to content

Questions sur la création de modules MVC !


Recommended Posts

Je suis en train de creer un module et j'ai une question sur la méthode renderform() qui sert a mettre en place le formulaire a l'aide d'un helper...

 

Je ne trouve pas comment affecter une value a un element de formulaire :

 

$this->fields_form = array(
  'tinymce' => true,
  'legend' => array(
   'title' => $this->l('lorem'),
   'image' => '../img/admin/lorem.gif'
  ),
  'input' => array(
   array(
 'type' => 'text',
 'label' => $this->l('lorem:'),
 'name' => 'lorem',
 'size' => 40,
 'value'=> "testtestest"  // ne fonctionne pas
   )
 );

Link to comment
Share on other sites

Bonjour,

Merci pour les réponses, il faut préciser toutefois que les langages ne sont pas activé par défault (va savoir pourquoi).

 

Une autre question :

 

J'aimerai bien gerer l'upload d'image or je ne comprend pas comment est utilisé celui ci dans le cadre de l'utilisation des helpers views

 

Il y a bien la méthode de l'adminController cependant elle ne me renvoi rien

 

protected function postImage($id)
   {
       if (isset($this->fieldImageSettings['name']) && isset($this->fieldImageSettings['dir']))
           return $this->uploadImage($id, $this->fieldImageSettings['name'], $this->fieldImageSettings['dir'].'/');
       elseif (!empty($this->fieldImageSettings))
           foreach ($this->fieldImageSettings as $image)
               if (isset($image['name']) && isset($image['dir']))
                   $this->uploadImage($id, $image['name'], $image['dir'].'/');
       return !count($this->errors) ? true : false;
   }

   protected function uploadImage($id, $name, $dir, $ext = false, $width = null, $height = null)
   {
       if (isset($_FILES[$name]['tmp_name']) && !empty($_FILES[$name]['tmp_name']))
       {
           // Delete old image
           if (Validate::isLoadedObject($object = $this->loadObject()))
               $object->deleteImage();
           else
               return false;

           // Check image validity
           $max_size = isset($this->max_image_size) ? $this->max_image_size : 0;
           if ($error = ImageManager::validateUpload($_FILES[$name], Tools::getMaxUploadSize($max_size)))
               $this->errors[] = $error;

           $tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS');
           if (!$tmp_name)
               return false;

           if (!move_uploaded_file($_FILES[$name]['tmp_name'], $tmp_name))
               return false;

           // Evaluate the memory required to resize the image: if it's too much, you can't resize it.
           if (!ImageManager::checkImageMemoryLimit($tmp_name))
               $this->errors[] = Tools::displayError('This image cannot be loaded due to memory limit restrictions, please increase your memory_limit value on your server configuration.');

           // Copy new image
           if (empty($this->errors) && !ImageManager::resize($tmp_name, _PS_IMG_DIR_.$dir.$id.'.'.$this->imageType, (int)$width, (int)$height, ($ext ? $ext : $this->imageType)))
               $this->errors[] = Tools::displayError('An error occurred while uploading image.');

           if (count($this->errors))
               return false;
           if ($this->afterImageUpload())
           {
               unlink($tmp_name);
               return true;
           }
           return false;
       }
       return true;
   }

Link to comment
Share on other sites

Par défaut, les langages ne sont pas activés pour une simple et bonne raison: si il est utile que le site soit en plusieurs langues, il ne faut pas oublier que cela implique un support client dans ces langues, également... C'est parfois donc préférable, :)

 

Pour l'image, il faut voir le controller "Carrier" de l'admin, par exemple.

 

Au niveau du constructeur, tu as ceci:

$this->fieldImageSettings = array(
  'name' => 'logo',
  'dir' => 's'
 );

 

Au niveau du renderForm(), ceci (dans le tableau d'inputs):

array(
 'type' => 'file',
 'label' => $this->l('Logo:'),
 'name' => 'logo',
 'desc' => $this->l('Upload a logo from your computer').' (.gif, .jpg, .jpeg '.$this->l('or').' .png)'
   ),

 

Et dans le postProcess, ceci:

$this->postImage($new_carrier->id);

 

Et c'est tout.

  • Like 1
Link to comment
Share on other sites

J'ai pris note de ce que je dois encore intégrer dans le modules (dont des commentaires plus éloquent ! ;))

 

Tu veux parler de ceci ?

$this->addRowAction('edit');
$this->addRowAction('delete');

 

Il s'agit des boutons d'actions que tu peux voir en vis-à-vis de chaque ligne lorsque tu regardes la liste. Ça permet par exemple de permettre la duplication d'un objet de la liste.

 

Il existe 4 valeurs:

  • view : donne la possibilité de voir plus de détails sur l'objet
  • edit : donne la possibilité d'éditer l'objet
  • delete ; donne la possibilité de supprimer l'objet
  • duplicate : donne la possibilité de dupliquer l'objet (implémenter les méthodes correspondantes [processDuplicate])

Link to comment
Share on other sites

En faite la ou je n'arrive pas a trouver le bon fonctionnement c'est au test de l'action je m'explique :

 

Pour le delete :

 

if($this->action=='delete')

 

Cela fonctionne...

 

Cependant pour l'édition

 

if ($this->action=='edit')

 

Le code n'est jamais executé a l'interieur j'ai daillé pour etre sur comme ceci :

 


Tools:('toto');

 

Mais rien ne se passe ?

 

Une solution propre sinon je teste dans un champs hidden si il y a un ID déjà présent ...

 

 

++

Link to comment
Share on other sites

Un bout de code est toujours plus évocateur...

 

public function postProcess()
{	
	$languages=Language::getLanguages();

	//add object
	if (Tools::isSubmit('submitAdd'.$this->table) && (Tools::isSubmit('mon_id'))) {

	}

	// Update object
	if (Tools::isSubmit('update'.$this->table) && (Tools::isSubmit('mon_id'))) {

	 // ne passe jamais ici
	}

	//delete object
	if($this->action=='delete'){

	}

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

A première lecture, le submitAdd que tu as là est en réalité un update, en fait. Pourquoi ? Parce qu'il y a un ID dans les values, on dirait.

 

Cela dit, le isSubmit n'est valable que pour les champs Submit. La méthode Tools::getValue() est utilisée, pour les champs.

Link to comment
Share on other sites

En faite, j'ai fait fausse route avec mon id

 

Le test

if (Tools::isSubmit('submitAdd'.$this->table)

 

Suffit a lui seul a gerer ajout et mise a jour de l'objet...

 

PS: Pour ceux qui souhaiterai gerer les activations et les suppression

 

Activation :

if($this->action=='status')

Suppression :

if($this->action=='delete')

 

Merci J.Danse

 

++

  • Like 1
Link to comment
Share on other sites

Bonjour,

 

Moi j'ai une question concernant la pagination de l'affichage dans les modules.

Je n'ai pas trouvé de méthodes génériques pour ça...

 

J'ai regardé le module commentaires sur les produits, il ne gère visiblement pas la pagination... Embêtant car lorsqu'un produit à une cinquantaine de commentaires, c'est loin d'être agréable !

 

Bref je n'ai pas trouvé d'exemple pour faire ça et avant de me lancer dans la création de methodes perso, j'aimerai savoir si quelqu'un utilise la pagination dans ses modules et si oui comment.

 

Cordialement

Link to comment
Share on other sites

Bonjour,

 

Je souhaite afficher le contenu d'une table sur une page dans un module, mais la table étant conséquente, je souhaites pouvoir paginer l'affichage. Je ne trouve pas de méthodes génériques dans les controleurs modules ou front...

Sur les autres CMS on a des méthodes génériques pour la pagination, le tri des résultats etc...

 

Ma question c'est donc comment faites vous de votre côté pour utiliser la pagination ? Avez vous écrit vos propres méthodes ? Ou y a t'il des méthodes que je n'ai pas vu ?

 

Cordialement

Link to comment
Share on other sites

Bonjour,

 

Pas d'autres infos concernant la pagination ? Il faut donc se créer ses propres méthodes ?

Sinon lors de l'installation de mon module, un nouvel onglet est ajouté dans le back office, comment faire pour le créer en prenant en compte la langue ? Car actuellement il faut que je l'édite dans le back office pour le traduire dans chaque langue.

 

Cordialement

Link to comment
Share on other sites

Bonjour as tu regardé comment fonctionné la méthode de pagination pour les catégories comme mentionné plus haut pas J.Danse ?

 

Dans le frontController :

 

public function pagination($nbProducts = 10)
{
 if (!self::$initialized)
  $this->init();
 elseif (!$this->context)
  $this->context = Context::getContext();
 $nArray = (int)Configuration::get('PS_PRODUCTS_PER_PAGE') != 10 ? array((int)Configuration::get('PS_PRODUCTS_PER_PAGE'), 10, 20, 50) : array(10, 20, 50);
 // Clean duplicate values
 $nArray = array_unique($nArray);
 asort($nArray);
 $this->n = abs((int)(Tools::getValue('n', ((isset($this->context->cookie->nb_item_per_page) && $this->context->cookie->nb_item_per_page >= 10) ? $this->context->cookie->nb_item_per_page : (int)Configuration::get('PS_PRODUCTS_PER_PAGE')))));
 $this->p = abs((int)Tools::getValue('p', 1));
 if (!is_numeric(Tools::getValue('p', 1)) || Tools::getValue('p', 1) < 0)
 {
  $this->redirect_after = '404';
  $this->redirect();
 }
 $current_url = tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']);
 //delete parameter page
 $current_url = preg_replace('/(\?)?(&)?p=\d+/', '$1', $current_url);
 $range = 2; /* how many pages around page selected */
 if ($this->p < 0)
  $this->p = 0;
 if (isset($this->context->cookie->nb_item_per_page) && $this->n != $this->context->cookie->nb_item_per_page && in_array($this->n, $nArray))
  $this->context->cookie->nb_item_per_page = $this->n;
 if ($this->p > (($nbProducts / $this->n) + 1))
 {
  $this->redirect_after = preg_replace('/[&?]p=\d+/', '', $_SERVER['REQUEST_URI']);
  $this->redirect();
 }
 $pages_nb = ceil($nbProducts / (int)$this->n);
 $start = (int)($this->p - $range);
 if ($start < 1)
  $start = 1;
 $stop = (int)($this->p + $range);
 if ($stop > $pages_nb)
  $stop = (int)$pages_nb;
 $this->context->smarty->assign('nb_products', $nbProducts);
 $pagination_infos = array(
  'products_per_page' => (int)Configuration::get('PS_PRODUCTS_PER_PAGE'),
  'pages_nb' => $pages_nb,
  'p' => $this->p,
  'n' => $this->n,
  'nArray' => $nArray,
  'range' => $range,
  'start' => $start,
  'stop' => $stop,
  'current_url' => $current_url
 );
 $this->context->smarty->assign($pagination_infos);
}

 

Dans catégory controller :

 

$this->pagination((int)$this->nbProducts); // Pagination must be call after "getProducts"

Link to comment
Share on other sites

De mon coté j'ai une question :

 

Comment peut on assigner un .tpl a un controller d'administration de module ?

 

Le canvas d'utilise que les view helper ...

 

++

 

Probleme résolu :

 

dans fonction ->

 

public function renderList()
{
$lists= "lorem ipsum";
return $lists;
}

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

Salut Belew,

 

J'ai effectivement regardé et vu cette méthode, mais je ne veux pas paginer des produits mais le contenu d'une table.

J'ai finalement écrit mes propres méthodes ;)

 

Par contre je sèche toujours concernant l'ajout d'onglet lors de l'installation d'un module prenant en compte plusieurs langues.

 

Cordialement

Link to comment
Share on other sites

Bonjour,

 

Merci, j'aurais du y penser...

J'ai une nouvelle question, dans un module, je souhaiterai pouvoir afficher les sous-catégories d'une catégorie avec leurs produits.

- Catégorie parent

-- Sous catégorie 1

--- Produit 1 de la Sous catégorie 1

--- Produit 2 de la Sous catégorie 1

--- Produit 3 de la Sous catégorie 1

-- Sous catégorie 2

--- Produit 1 de la Sous catégorie 2

--- Produit 2 de la Sous catégorie 2

--- Produit 3 de la Sous catégorie 2

 

J'ai essayé de faire comme ça dans mon tpl

{foreach from=$subCategories->getProducts(4, 1, 30, $orderby, $orderway) item=product name=products}

 

et dans mon controlleur

$subCategories = $this->category->getSubCategories($this->context->language->id)

 

Malheureusement comme $subCategories ne renvoye pas un objet catégorie mais un tableau je ne peux utiliser cette méthode de la classe category...

 

Est-il possible de faire cela proprement avec les méthodes existantes où dois-je en écrire de nouvelles ?

Link to comment
Share on other sites

Salut et merci pour ton petit module exemple! c'est très utile!

 

Petites remarques sur le controller de BO :

 

Pourquoi ne pas ajouter parent::postprocess; dans ta méthode postprocess du module? de fait la suppression serait directement cablé ainsi que d'autres fonctions de l'admin controller. :)

 

autre remarque mon copain Belew (salut au passage!) pose une question sur les images :

pour que la méthode

$this->postImage($mobObj->id);

fonctionne il faut absolument définir avant : $_POST[$this->identifier]=$monObj->id;

sinon la methode loadobject de l'admincontroller renvoie false et l'upload d'image ne fonctionne pas! une bizarrerie de cette 1.5.

 

dernier point les filtres et le multi boutique ne semble pas fonctionner sur le canvas de module une idée?

 

merci!

 

++

Fab

Link to comment
Share on other sites

Salut fab,

 

Concernant l'image tu peux redéclarer les fonctions uploadImage() et postImage()

 

a la ligne

if (Validate::isLoadedObject($object = $this->loadObject()))

 

Rajoutes :

 

if (Validate::isLoadedObject($object = $this->loadObject($id)))

 

++

Link to comment
Share on other sites

  • 1 year later...

Bonjours aux participants de ce sujet très intéressant.

 

J'essaye actuellement de mettre en application le Canvas de J.Danse (merci à lui) et je ne comprends pas comment s'effectue la mise à jour des données.

Mon but est de mettre en relation les différents magasins avec certains clients dans une table contenant:

id / store_id / customer_id / name / position

il n'est pas utile de mettre en place des traductions.

 

Je sais que le sujet est ancien mais pourriez-vous m'indiquer quelques pistes sur la manière dont sont générés les ajouts/modif/suppression de données?

Merci d'avance de votre aide.

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