Bonjour à tous.<br><br>
Je suis débutant en cakephp et je suis face à un soucis, je n'arrive pas à voir comment m'y prendre pour mettre en place une vue. Voila, je dispose du controlleur sorties qui permet d'identifier un numéro de demande. Ce dernier, enregistre la date et le numéro du demandeur.<br>
Je dispose ensuite d'une table productssorties qui permet d'indiquer le numéro de la demande, le numéro du produit et une quantité.<br>
Un produit appartient à une catégorie.<br>
j'aimerais dans ma vue, afficher la catégorie puis afficher la liste des produits appartenant à cette dite catégorie. Je sais qu'il y a ajax qui rentrera dans ce fonctionnement, par contre, je ne vois pas du tout comment faire.<br>
Voici le schéma de ma base de donnée complète:<br><a href="http://uploads.siteduzero.com/files/399001_400000/399057.png"><img src="http://uploads.siteduzero.com/thb/399001_400000/399057.png" alt="Image utilisateur"></a><br><br>
Et voici ma view actuelle:<br>
sorties/add:<br><pre class="brush: php;"><div class="span12">
<div class="hero-unit">
<?php echo $this->Form->create('Sorty');?>
<fieldset>
<legend>Ajouter une sortie de produits</legend>
<?php
echo $this->Form->input('agent_id',array('label'=>'Sélectionnez l\'agent sortant le ou les produits'));
echo $this->Form->input('Product');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit'));?>
</div>
</div>
</pre><br><br>
et la fonction add du controlleur sorties:<br><pre class="brush: php;"><?php
public function add() {
if ($this->request->is('post')) {
$this->Sorty->create();
if ($this->Sorty->save($this->request->data)) {
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->set(compact('agents', 'products'));
}
?>
</pre>Le 28 août 2012 à 11:57:43
Bonjour à tous.
Je suis débutant en cakephp et je suis face à un soucis, je n'arrive pas à voir comment m'y prendre pour mettre en place une vue. Voila, je dispose du controlleur sorties qui permet d'identifier un numéro de demande. Ce dernier, enregistre la date et le numéro du demandeur.
Je dispose ensuite d'une table productssorties qui permet d'indiquer le numéro de la demande, le numéro du produit et une quantité.
Un produit appartient à une catégorie.
j'aimerais dans ma vue, afficher la catégorie puis afficher la liste des produits appartenant à cette dite catégorie. Je sais qu'il y a ajax qui rentrera dans ce fonctionnement, par contre, je ne vois pas du tout comment faire.
Voici le schéma de ma base de donnée complète:
Et voici ma view actuelle:
sorties/add:
<div class="span12">
<div class="hero-unit">
<?php echo $this->Form->create('Sorty');?>
<fieldset>
<legend>Ajouter une sortie de produits</legend>
<?php
echo $this->Form->input('agent_id',array('label'=>'Sélectionnez l\'agent sortant le ou les produits'));
echo $this->Form->input('Product');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit'));?>
</div>
</div>
et la fonction add du controlleur sorties:
<?php
public function add() {
if ($this->request->is('post')) {
$this->Sorty->create();
if ($this->Sorty->save($this->request->data)) {
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->set(compact('agents', 'products'));
}
?>
Salut, alors tu peux faire un truc du genre:<br><br>
dans le contrôleur Category:<br><pre class="brush: php;"><?php
public function ajax_get()
{
$this->autoRender = false;
if($this->request->is('ajax'))
{
if(!empty($this->request->data['id']))
{
$id = $this->request->data['id'];
$category = $this->Category->findById($id);
if(!empty($category))
echo $category;
}
}
}
?>
</pre><br><br>
Tu renvois category avec ses produits s'il y a. Tu peux faire une vue associée, j'ai préféré renvoyer directement le contenu, c'est toi qui vois.<br><br>
Puis dans ta view. J'utilise JQuery (pense à l'inclure)<br><pre class="brush: jscript;">//class sur chacune des categories de ta liste, à toi de voir ;)
$('.cat').click(function(event)
{
$.post
(
//ici tu peux remplacer la balise php par /categories/ajax_get
//tu modifies le router ou autre tu peux laisser le php
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get")); ?>',
{
id : $(this).val()
},
function(data)
{
//ici tu modifies pour afficher tes produits
$("#result").empty().append(data).css('display', 'block');
}
);
});
</pre><br><br>
P.S : c'est fait un peu à la va vite, mais c'est pour te donner une idée. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 28 août 2012 à 13:21:55
Tu renvois category avec ses produits s'il y a. Tu peux faire une vue associée, j'ai préféré renvoyer directement le contenu, c'est toi qui vois.
Puis dans ta view. J'utilise JQuery (pense à l'inclure)
//class sur chacune des categories de ta liste, à toi de voir
$('.cat').click(function(event)
{
$.post
(
//ici tu peux remplacer la balise php par /categories/ajax_get
//tu modifies le router ou autre tu peux laisser le php
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get")); ?>',
{
id : $(this).val()
},
function(data)
{
//ici tu modifies pour afficher tes produits
$("#result").empty().append(data).css('display', 'block');
}
);
});
P.S : c'est fait un peu à la va vite, mais c'est pour te donner une idée.
J'ai plus ou moins compris ton idée, bon, il fait que j'affiche maintenant les catégories dans ma page add.<br>
Je reviens ici si j'ai des soucis.<br><br>
EDIT:<br><br>
Alors Je rajoute quelques infos.<br><br>
Je souhaiterais obtenir quelque chose dans ce genre:<br><br><br>
Category en select ¡¡¡¡¡¡¡¡¡¡¡ Produits lié à la catégory ¡¡¡¡¡¡¡¡¡¡¡¡¡ Champ input pour la quantité.<br><br><br>
Je tiens à préciser que cette "ligne" sera cloné afin de pouvoir ajouter plusieurs produits différents et des quantités différentes.<br>Le 28 août 2012 à 15:17:56
J'ai plus ou moins compris ton idée, bon, il fait que j'affiche maintenant les catégories dans ma page add.
Je reviens ici si j'ai des soucis.
EDIT:
Alors Je rajoute quelques infos.
Je souhaiterais obtenir quelque chose dans ce genre:
Category en select ¡¡¡¡¡¡¡¡¡¡¡ Produits lié à la catégory ¡¡¡¡¡¡¡¡¡¡¡¡¡ Champ input pour la quantité.
Je tiens à préciser que cette "ligne" sera cloné afin de pouvoir ajouter plusieurs produits différents et des quantités différentes.
Alors ton premier code fonctionne. J'ai fait, à la place d'un echo, un debug($category) pour avoir un retour.<br>
Ce que j'ai fais après c'est afficher un select vide.<br><pre class="brush: php;"><?php echo $this->Form->select('product_id',$options=array(),$attribute=array(),array('label'=>'Selectionner le produit:')); ?>
</pre><br><br>
Puis un traitement jquery:<br><pre class="brush: jscript;">$(document).ready(function()
{
//class sur chacune des categories de ta liste, à toi de voir ;)
$('#SortyProductId').hide();
$('#SortyCategoryId').change(function(event)
{
$.post
(
//ici tu peux remplacer la balise php par /categories/ajax_get
//tu modifies le router ou autre tu peux laisser le php
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get")); ?>',
{
id : $(this).val()
},
function(data)
{
//ici tu modifies pour afficher tes produits
target=$('#SortyProductId').get(0);
target.length=0;
for (var i in data)
{
target.options[i]=new Option(data[i]['name'],data[i]['id'],false,false);
}
},'json'
);
$('#SortyProductId').show();
});
});
</pre><br><br>
Quand pensez-vous?<br><br>
lemirandaisLe 29 août 2012 à 16:04:09
Alors ton premier code fonctionne. J'ai fait, à la place d'un echo, un debug($category) pour avoir un retour.
Ce que j'ai fais après c'est afficher un select vide.
<?php echo $this->Form->select('product_id',$options=array(),$attribute=array(),array('label'=>'Selectionner le produit:')); ?>
Puis un traitement jquery:
$(document).ready(function()
{
//class sur chacune des categories de ta liste, à toi de voir
$('#SortyProductId').hide();
$('#SortyCategoryId').change(function(event)
{
$.post
(
//ici tu peux remplacer la balise php par /categories/ajax_get
//tu modifies le router ou autre tu peux laisser le php
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get")); ?>',
{
id : $(this).val()
},
function(data)
{
//ici tu modifies pour afficher tes produits
target=$('#SortyProductId').get(0);
target.length=0;
for (var i in data)
{
target.options[i]=new Option(data[i]['name'],data[i]['id'],false,false);
}
},'json'
);
$('#SortyProductId').show();
});
});
Salut, je ne crois pas que c'est du json que te renvoi la fonction ajax de ton contrôleur, mis à part si tu l'as changé?<br>
La question est : est-ce que ça répond à ton besoin ton code là?Le 29 août 2012 à 20:14:51
Salut, je ne crois pas que c'est du json que te renvoi la fonction ajax de ton contrôleur, mis à part si tu l'as changé?
La question est : est-ce que ça répond à ton besoin ton code là?
Oui, j'ai légèrement modifier ton ajax_get():<br><pre class="brush: php;">public function ajax_get()
{
$this->autoRender = false;
if($this->request->is('ajax'))
{
if(!empty($this->request->data['id']))
{
$id = $this->request->data['id'];
$category = $this->Category->findById($id);
$retour=array();
if(!empty($category))
{
return json_encode($category['Product']);
}
}
}
}
</pre><br><br>
Ensuite, mon code fonctionne, il manque plus un peu plus d'automatisme, je m'explique.<br>
Cette ligne de select (select category et select products) va être cloné afin de pouvoir faire une sortie d'un ou de plusieurs produits. Donc actuellement, si j'applique un clone() (fonction jquery), mon code jquery inspiré du tiens n'est pas bon.<br>
Enfin, il va encore avoir quelque modification dans le but d'envoyer des erreurs si la requete ajax renvoie rien ou une erreur.<br><br>
lemirandaisLe 29 août 2012 à 21:05:03
Ensuite, mon code fonctionne, il manque plus un peu plus d'automatisme, je m'explique.
Cette ligne de select (select category et select products) va être cloné afin de pouvoir faire une sortie d'un ou de plusieurs produits. Donc actuellement, si j'applique un clone() (fonction jquery), mon code jquery inspiré du tiens n'est pas bon.
Enfin, il va encore avoir quelque modification dans le but d'envoyer des erreurs si la requete ajax renvoie rien ou une erreur.
Oui mais tu peux modifier ça <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"><br>
Tu écris en "mode tableau cakePHP" dans ta vue.<br>
<input type="text" name ="data[Category][name]"/><br>
Par exemple. Et dans ton contrôleur tu récupereras $this->request->data['Category']['name']Le 29 août 2012 à 22:12:01
Oui mais tu peux modifier ça
Tu écris en "mode tableau cakePHP" dans ta vue.
<input type="text" name ="data[Category][name]"/>
Par exemple. Et dans ton contrôleur tu récupereras $this->request->data['Category']['name']
Salut <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"><br>
ahhhh mes yeux !<br><pre class="brush: php;"><?php echo "\n"; ?>
<?php echo "\n"; ?>
<?php echo "\n"; ?>
</pre><br><br>
Utilise le css, j'espère c'est pour tes tests que tu fais ça.<br>
Sinon dans l'ensemble ça parait viable, le mieux serait d'exporter ton js dans un fichier, puis de l'insérer par $this->Html->script('blabla'); mais ton problème vient de l'url que tu génères. Comme je te disais si ton url est toujours la même tu peux l'écrire en dure pour garder ta view plus "claire".Le 30 août 2012 à 13:25:17
Utilise le css, j'espère c'est pour tes tests que tu fais ça.
Sinon dans l'ensemble ça parait viable, le mieux serait d'exporter ton js dans un fichier, puis de l'insérer par $this->Html->script('blabla'); mais ton problème vient de l'url que tu génères. Comme je te disais si ton url est toujours la même tu peux l'écrire en dure pour garder ta view plus "claire".
Je supprimerais les echo "\n"; après, c'est pour avoir un meilleur affichage.<br>
J'ai encore un soucis, mais c'est lié à jquery et non à cakephp.<br>
Après, vu que l'url est toujours la même, je pense que $this->Html->script('blabla') serait beaucoup plus propre.<br><br>
lemirandaisLe 30 août 2012 à 13:29:29
Je supprimerais les echo "\n"; après, c'est pour avoir un meilleur affichage.
J'ai encore un soucis, mais c'est lié à jquery et non à cakephp.
Après, vu que l'url est toujours la même, je pense que $this->Html->script('blabla') serait beaucoup plus propre.
Bonjour<br><br>
Je reviens par ici car, après que jour sur un autre projet, je m'attaque maintenant à la sauvegarde.<br>
Alors, je suis encore bloqué. J'arrive à cloner et à modifier mes selects en fonction de choix réaliser par l'utilisation. Voici mon fichier view presque fini:<br><pre class="brush: php;"><div class="span12">
<div class="hero-unit">
<?php echo $this->Form->create('Sorty');?>
<fieldset>
<legend>Ajouter une sortie de produits</legend>
<?php echo "\n"; ?>
<?php echo "\n"; ?>
<?php echo "\n"; ?>
<?php echo $this->Form->input('agent_id',
array(
'label'=>
array(
'text'=>'Sélectionnez l\'agent sortant le ou les produits'
),
'div' => false
)
); ?>
<?php echo "\n"; ?>
<div class="copy" id="copy-1">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="25%">
<?php echo $this->Form->input('category_id',
array(
'label'=>'Sélectionnez la salle où récupérer les produits désirés',
'empty' => '-- Sélectionner la salle --',
'div'=>false
));
?>
</td>
<?php
echo "\n";
?>
<td width="25%">
<?php
echo $this->Form->label('product_id','Liste des produits disponibles');
?><br />
<?php
echo $this->Form->select('product_id',$options=array());
?>
</td>
<?php
echo "\n";
?>
<td width="25%">
<?php
echo $this->Form->input('nb_sorty',
array(
'label'=>'Indiquez la quantité à sortir</br /><br />',
'div'=>false
));
?>
</td>
<td width="20%">
Sur <span class="restant">0</span> produits restants en stock.
</td>
<td width="5%">
<a href="#" class="del_sup">Supprimer cette ligne</a>
</td>
</tr>
<?php echo "\n"; ?>
<?php echo "\n"; ?>
</table>
</div>
<p id="clone">Ajouter un produit dans cette sortie.</p>
</fieldset>
<?php echo $this->Form->end('Enregistrer cette sortie');?>
</div>
</div>
<script type="text/javascript">
$(document).ready(function()
{
$('#SortyProductId').hide();
$('#SortyNbSorty').hide();
//select des lieux
$("#SortyCategoryId").on('change',function(){
var currentid=$(this).parents('div').attr('id');
var target=$('#'+currentid+' table select#SortyProductId').get(0);
target.length=0;
$('#'+currentid+' table select#SortyProductId').show();
$.post
(
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get_product_by_lieu")); ?>',
{
id : $(this).val()
},
function(data)
{
var v=0;
target.options[0]=new Option('-- Sélectionner un des produits ci-dessous --','0',false,false);
for (var i in data)
{
v=parseInt(i)+parseInt(1);
target.options[v]=new Option(data[i]['name'],data[i]['id'],false,false);
}
},'json'
);
});
//select des produits
$("#SortyProductId").on('change',function(){
var currentid=$(this).parents('div').attr('id');
$('#'+currentid+' #SortyNbSorty').show();
$.post
(
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get_quantity_by_id")); ?>',
{
id : $(this).val()
},
function(data)
{
if(data==null)
{
$("#"+currentid+' span.restant').text('0');
}
else
{
$("#"+currentid+' span.restant').text(data['quantity']);
}
},'json'
);
});
//Suppression des lignes inutile
$("a.del_sup").click(function(){
var currentid=$(this).parents('div').attr('id');
$("#"+currentid).remove();
});
//initialise
var nb_copy_initial=1;
$('#clone').on('click',function()
{
nb_copy_initial++;
$(this).before( $(".copy:first").clone(true,true).removeAttr('id').attr('id', 'copy-'+nb_copy_initial) );
//on vide le nb_copy select
$('#copy-'+nb_copy_initial+' #SortyProductId').get(0).length=0;
$('#copy-'+nb_copy_initial+' #SortyProductId').hide();
$('#copy-'+nb_copy_initial+' span.restant').html('0');
$('#copy-'+nb_copy_initial+' #SortyNbSorty').val('').hide();
});
});
</script>
</pre><br>
Alors que je fais un :<br><pre class="brush: php;"><?php
debug($this->request->data);
die();
?>
Afin de voir ce que me récupère mon formulaire, bien il me retourne pas grand chose. En fait, mes inputs se clonent, mais ne stocke qu'une seule des valeurs, à savoir la dernière. Logique puisque que chaque input stocke une et une seule valeur.
En gros, en regardant le code source, j'ai ceci (version simple):
<code type="html">
<input name="cequejeveux" />
<input name="cequejeveux" />
<input name="cequejeveux" />
</pre><br>
Donc quand je valide le formulaire, c'est le dernier input qui "envoie" sont contenu dans le post pour faire simple.<br>
En fait, il faudrait que j'obtienne ceci dans le code source afin de pouvoir traiter mon formulaire:<br><pre class="brush: html;"><input name="cequejeveux[]" />
<input name="cequejeveux[]" />
<input name="cequejeveux[]" />
</pre><br><br>
Mon soucis est comment faire ceci dans cakePhp, des idées?<br><br>
lemirandaisLe 7 septembre 2012 à 11:52:35
Bonjour
Je reviens par ici car, après que jour sur un autre projet, je m'attaque maintenant à la sauvegarde.
Alors, je suis encore bloqué. J'arrive à cloner et à modifier mes selects en fonction de choix réaliser par l'utilisation. Voici mon fichier view presque fini:
<div class="span12">
<div class="hero-unit">
<?php echo $this->Form->create('Sorty');?>
<fieldset>
<legend>Ajouter une sortie de produits</legend>
<?php echo "\n"; ?>
<?php echo "\n"; ?>
<?php echo "\n"; ?>
<?php echo $this->Form->input('agent_id',
array(
'label'=>
array(
'text'=>'Sélectionnez l\'agent sortant le ou les produits'
),
'div' => false
)
); ?>
<?php echo "\n"; ?>
<div class="copy" id="copy-1">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="25%">
<?php echo $this->Form->input('category_id',
array(
'label'=>'Sélectionnez la salle où récupérer les produits désirés',
'empty' => '-- Sélectionner la salle --',
'div'=>false
));
?>
</td>
<?php
echo "\n";
?>
<td width="25%">
<?php
echo $this->Form->label('product_id','Liste des produits disponibles');
?><br />
<?php
echo $this->Form->select('product_id',$options=array());
?>
</td>
<?php
echo "\n";
?>
<td width="25%">
<?php
echo $this->Form->input('nb_sorty',
array(
'label'=>'Indiquez la quantité à sortir</br /><br />',
'div'=>false
));
?>
</td>
<td width="20%">
Sur <span class="restant">0</span> produits restants en stock.
</td>
<td width="5%">
<a href="#" class="del_sup">Supprimer cette ligne</a>
</td>
</tr>
<?php echo "\n"; ?>
<?php echo "\n"; ?>
</table>
</div>
<p id="clone">Ajouter un produit dans cette sortie.</p>
</fieldset>
<?php echo $this->Form->end('Enregistrer cette sortie');?>
</div>
</div>
<script type="text/javascript">
$(document).ready(function()
{
$('#SortyProductId').hide();
$('#SortyNbSorty').hide();
//select des lieux
$("#SortyCategoryId").on('change',function(){
var currentid=$(this).parents('div').attr('id');
var target=$('#'+currentid+' table select#SortyProductId').get(0);
target.length=0;
$('#'+currentid+' table select#SortyProductId').show();
$.post
(
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get_product_by_lieu")); ?>',
{
id : $(this).val()
},
function(data)
{
var v=0;
target.options[0]=new Option('-- Sélectionner un des produits ci-dessous --','0',false,false);
for (var i in data)
{
v=parseInt(i)+parseInt(1);
target.options[v]=new Option(data[i]['name'],data[i]['id'],false,false);
}
},'json'
);
});
//select des produits
$("#SortyProductId").on('change',function(){
var currentid=$(this).parents('div').attr('id');
$('#'+currentid+' #SortyNbSorty').show();
$.post
(
'<?php echo $this->Html->url(array("controller" => "categories", "action" => "ajax_get_quantity_by_id")); ?>',
{
id : $(this).val()
},
function(data)
{
if(data==null)
{
$("#"+currentid+' span.restant').text('0');
}
else
{
$("#"+currentid+' span.restant').text(data['quantity']);
}
},'json'
);
});
//Suppression des lignes inutile
$("a.del_sup").click(function(){
var currentid=$(this).parents('div').attr('id');
$("#"+currentid).remove();
});
//initialise
var nb_copy_initial=1;
$('#clone').on('click',function()
{
nb_copy_initial++;
$(this).before( $(".copy:first").clone(true,true).removeAttr('id').attr('id', 'copy-'+nb_copy_initial) );
//on vide le nb_copy select
$('#copy-'+nb_copy_initial+' #SortyProductId').get(0).length=0;
$('#copy-'+nb_copy_initial+' #SortyProductId').hide();
$('#copy-'+nb_copy_initial+' span.restant').html('0');
$('#copy-'+nb_copy_initial+' #SortyNbSorty').val('').hide();
});
});
</script>
Alors que je fais un :
<?php
debug($this->request->data);
die();
?>
Afin de voir ce que me récupère mon formulaire, bien il me retourne pas grand chose. En fait, mes inputs se clonent, mais ne stocke qu'une seule des valeurs, à savoir la dernière. Logique puisque que chaque input stocke une et une seule valeur.
En gros, en regardant le code source, j'ai ceci (version simple):
<code type="html">
<input name="cequejeveux" />
<input name="cequejeveux" />
<input name="cequejeveux" />
Donc quand je valide le formulaire, c'est le dernier input qui "envoie" sont contenu dans le post pour faire simple.
En fait, il faudrait que j'obtienne ceci dans le code source afin de pouvoir traiter mon formulaire:
Salut, j'ai pas trop le temps là mais comme exemple je peux te donner ça.<br>
Si tu veux enregistrer plusieurs Post en même temps, tu peux faire ça :<br><pre class="brush: php;"><input name="data[Post][0][titre]"/>
<input name="data[Post][1][titre]"/>
</pre><br><br>
ou en utilisant le formhelper<br><pre class="brush: php;"><?php
echo $this->Form->input('Post.0.titre');
echo $this->Form->input('Post.1.titre');
?>
</pre><br><br>
ça te renverra donc un tableau multidimensionnel avec dedans chacun de tes posts séparés. Toi si je me souviens c'est pour des products donc tu peux utiliser ce système pour envoyer plusieurs products. Si ç peux t'aider <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 7 septembre 2012 à 13:19:01
Salut, j'ai pas trop le temps là mais comme exemple je peux te donner ça.
Si tu veux enregistrer plusieurs Post en même temps, tu peux faire ça :
ça te renverra donc un tableau multidimensionnel avec dedans chacun de tes posts séparés. Toi si je me souviens c'est pour des products donc tu peux utiliser ce système pour envoyer plusieurs products. Si ç peux t'aider
Bonjour,<br><br>
Je suis arrivé à obtenir ce que je voulais en affichage, maintenant, mon problème est l'enregistrement. J'obtiens ceci lors d'un débug de $this->data->request: (j'ai fait un beforeSave pour générer le mon résultat)<br><pre class="brush: php;"><?php
array(
'agent_id' => '1',
'date' => '2012-09-10 13:36:00',
'ProductsSorty' => array(
(int) 1 => array(
'product_id' => '1',
'nb_sorty' => '2'
),
(int) 2 => array(
'product_id' => '3',
'nb_sorty' => '5'
)
)
)
?>
</pre><br><br>
J'enregistre donc mes champs agent_id et date dans une table grace à un save.<br>
Le soucis est que je n'arrive pas à enregistrer le ProductsSorty. Voici mon code:<br><pre class="brush: php;"><?php
if ($this->request->is('post')) {
$this->Sorty->create();
if ($this->Sorty->save($this->request->data)) {
$this->loadModel('ProductsSorty');
$this->ProductsSorty->create();
$this->ProductsSorty->save($this->request->data);
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
?>
</pre><br>
Le premier save fonctionne mais pas le suivant.<br>
J'ai ensuite tester avec un saveall, l'enregistrement de sorty marche mais pas productsSorty.<br><br>
Avez vous des idées de la provenance de mon problème? Le plus génant dans ce projet en cours et que le plus gros problème est arrivé à la dernière action. Celle ci <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"> .<br><br>
Merci pour l'aide que vous m'apporterez.<br><br>
lemirandais<br><br><br>
EDIT: Je pense que cela vient peut être d'un soucis au niveau de la relation entre sorty et productssortyLe 10 septembre 2012 à 16:24:37
Bonjour,
Je suis arrivé à obtenir ce que je voulais en affichage, maintenant, mon problème est l'enregistrement. J'obtiens ceci lors d'un débug de $this->data->request: (j'ai fait un beforeSave pour générer le mon résultat)
J'enregistre donc mes champs agent_id et date dans une table grace à un save.
Le soucis est que je n'arrive pas à enregistrer le ProductsSorty. Voici mon code:
<?php
if ($this->request->is('post')) {
$this->Sorty->create();
if ($this->Sorty->save($this->request->data)) {
$this->loadModel('ProductsSorty');
$this->ProductsSorty->create();
$this->ProductsSorty->save($this->request->data);
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
?>
Le premier save fonctionne mais pas le suivant.
J'ai ensuite tester avec un saveall, l'enregistrement de sorty marche mais pas productsSorty.
Avez vous des idées de la provenance de mon problème? Le plus génant dans ce projet en cours et que le plus gros problème est arrivé à la dernière action. Celle ci .
Merci pour l'aide que vous m'apporterez.
lemirandais
EDIT: Je pense que cela vient peut être d'un soucis au niveau de la relation entre sorty et productssorty
Salut,<br>
il me semble que tu n'as pas besoin de faire un loadModel, car tu devrais avoir un accès comme çà $this->Sorty->ProductsSorty, en fonction de ton association. Tu peux faire un truc du genre $this->Sorty->ProductsSorty->saveMany($this->request->data);<br>
Un peu la flemme de vérifier, regarde par là : <a href="http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options-array">http://book.cakephp.org/2.0/en/models/ [...] options-array</a><br>
Il me semble aussi que tu dois avoir un tableau indicé et non avec le nom de ton modèle. A vérifier <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 10 septembre 2012 à 17:32:38
Salut,
il me semble que tu n'as pas besoin de faire un loadModel, car tu devrais avoir un accès comme çà $this->Sorty->ProductsSorty, en fonction de ton association. Tu peux faire un truc du genre $this->Sorty->ProductsSorty->saveMany($this->request->data);
Un peu la flemme de vérifier, regarde par là : http://book.cakephp.org/2.0/en/models/ [...] options-array
Il me semble aussi que tu dois avoir un tableau indicé et non avec le nom de ton modèle. A vérifier
<p><strong>Citation : floyd_1</strong></p><blockquote>Salut,<br>
il me semble que tu n'as pas besoin de faire un loadModel, car tu devrais avoir un accès comme çà $this->Sorty->ProductsSorty, en fonction de ton association. Tu peux faire un truc du genre $this->Sorty->ProductsSorty->saveMany($this->request->data);<br>
Un peu la flemme de vérifier, regarde par là : <a href="http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options-array">http://book.cakephp.org/2.0/en/models/ [...] options-array</a><br>
Il me semble aussi que tu dois avoir un tableau indicé et non avec le nom de ton modèle. A vérifier <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">
</blockquote><br><br>
C'est vrai que j'ai faire un beforesave pour réorganiser mon tableau car je pensais que cela allait m'aider.<br>
J'ai essayé sur une action de faire un find('all') en mettant le récursive à 1 puis à 2, et sorty n'a pas l'air d'être relié à productssorty.<br>
Des idées pour vérifier?<br><br><br>
Voici mon $this->request sans le beforesave qui modifier cette variable:<br><pre class="brush: php;">array(
'agent_id' => '1',
'category_id' => '1',
(int) 1 => array(
'product_id' => '5',
'nb_sorty' => '3'
),
(int) 2 => array(
'product_id' => '1',
'nb_sorty' => '1'
),
'date' => '2012-09-10 17:55:01'
)
</pre>Le 10 septembre 2012 à 17:53:53
Citation : floyd_1
Salut,
il me semble que tu n'as pas besoin de faire un loadModel, car tu devrais avoir un accès comme çà $this->Sorty->ProductsSorty, en fonction de ton association. Tu peux faire un truc du genre $this->Sorty->ProductsSorty->saveMany($this->request->data);
Un peu la flemme de vérifier, regarde par là : http://book.cakephp.org/2.0/en/models/ [...] options-array
Il me semble aussi que tu dois avoir un tableau indicé et non avec le nom de ton modèle. A vérifier
C'est vrai que j'ai faire un beforesave pour réorganiser mon tableau car je pensais que cela allait m'aider.
J'ai essayé sur une action de faire un find('all') en mettant le récursive à 1 puis à 2, et sorty n'a pas l'air d'être relié à productssorty.
Des idées pour vérifier?
Voici mon $this->request sans le beforesave qui modifier cette variable:
hmm products_sorties c'est ta table de liaison donc théoriquement tu as un accès depuis l'un des deux modèles. Regarde du côté de saveAssociated sinon. Tu enregistres tout d'un bloc avec. Par ailleurs il faut que tu donnes l'id du Sorty pour la sauvegarde des ProductsSorty, $this->ProductsSorty->id = $this->Sorty->id; une fois la sauvegarde de Sorty faite.Le 10 septembre 2012 à 18:05:53
hmm products_sorties c'est ta table de liaison donc théoriquement tu as un accès depuis l'un des deux modèles. Regarde du côté de saveAssociated sinon. Tu enregistres tout d'un bloc avec. Par ailleurs il faut que tu donnes l'id du Sorty pour la sauvegarde des ProductsSorty, $this->ProductsSorty->id = $this->Sorty->id; une fois la sauvegarde de Sorty faite.
Merci, voici ce que j'ai fait mais cela n'a pas l'air de vouloir marché.<br><br><pre class="brush: php;"><?php
public function add() {
if ($this->request->is('post')) {
$this->Sorty->create();
if ($this->Sorty->save($this->request->data))
{
$this->loadModel('ProductsSorty');
$this->ProductsSorty->create();
$this->ProductsSorty->id = $this->Sorty->id;
$this->ProductsSorty->save($this->request->data);
/*$this->loadModel('ProductsSorty');
$this->ProductsSorty->create();
$this->ProductsSorty->save($this->request->data);*/
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->loadModel('Category');
$categories=$this->Category->find('list');
$this->set(compact('agents', 'products','categories'));
}
?>
</pre><br><br>
lemirandaisLe 10 septembre 2012 à 18:18:03
Merci, voici ce que j'ai fait mais cela n'a pas l'air de vouloir marché.
<?php
public function add() {
if ($this->request->is('post')) {
$this->Sorty->create();
if ($this->Sorty->save($this->request->data))
{
$this->loadModel('ProductsSorty');
$this->ProductsSorty->create();
$this->ProductsSorty->id = $this->Sorty->id;
$this->ProductsSorty->save($this->request->data);
/*$this->loadModel('ProductsSorty');
$this->ProductsSorty->create();
$this->ProductsSorty->save($this->request->data);*/
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->loadModel('Category');
$categories=$this->Category->find('list');
$this->set(compact('agents', 'products','categories'));
}
?>
saveMany plutôt que saveAssociated je dirais, comme tu veux "sauver" plusieurs productssorty. Fais voir ton modèle sorty sinon, il y a peut être un truc.<br><br>
EDIT : pour tester, tu peux faire un save d'un productssorty, tu utilise pas $this->request->data, tu lui balance un array que tu fais toi même.<br><br>
EDIT 2 : en lui envoyant ça par exemple $data = array('Product' => array('product_id' => 1), 'Sorty' => array('sorty_id' => 1)); sois sûr que les id existent.Le 10 septembre 2012 à 19:50:34
saveMany plutôt que saveAssociated je dirais, comme tu veux "sauver" plusieurs productssorty. Fais voir ton modèle sorty sinon, il y a peut être un truc.
EDIT : pour tester, tu peux faire un save d'un productssorty, tu utilise pas $this->request->data, tu lui balance un array que tu fais toi même.
EDIT 2 : en lui envoyant ça par exemple $data = array('Product' => array('product_id' => 1), 'Sorty' => array('sorty_id' => 1)); sois sûr que les id existent.
Merci floyd_1, je viens de résoudre mon problème, en fait, je pense de la mauvaise manière.<br>
Voici ce que j'ai fait, suite à tes idées très bonne:<br><br><pre class="brush: php;"><?php
public function add() {
if ($this->request->is('post')) {
$this->Sorty->create();
//enregistrement dans la table sorty
if ($this->Sorty->save($this->request->data))
{
//enregistrement dans la table ProductsSorty
$this->loadModel('ProductsSorty');
$variable=$this->request->data['ProductsSorty'];
foreach($variable as $v)
{
$this->ProductsSorty->create();
$t=array('sorty_id'=>$this->Sorty->id);
$v=array_merge($t,$v);
$this->ProductsSorty->save($v);
}
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->loadModel('Category');
$categories=$this->Category->find('list');
$this->set(compact('agents', 'products','categories'));
}
?>
</pre><br><br>
Je pensais qu'il y aurait une méthode un peu plus automatique. Bon maintenant, il faut que je soustrais en fonction du nb_sorty et du type de produit, la quantité, en gros faire;<br>
quantité initial - nb_sorty = nouvelle quantité<br><br>
Mais bon, je pense que cela ne devra pas être trop dur.<br><br>
Je pense que j'ai dû faire une erreur quelque part car cette partie a vraiment merdé.<br><br>
lemirandaisLe 11 septembre 2012 à 14:56:50
Merci floyd_1, je viens de résoudre mon problème, en fait, je pense de la mauvaise manière.
Voici ce que j'ai fait, suite à tes idées très bonne:
<?php
public function add() {
if ($this->request->is('post')) {
$this->Sorty->create();
//enregistrement dans la table sorty
if ($this->Sorty->save($this->request->data))
{
//enregistrement dans la table ProductsSorty
$this->loadModel('ProductsSorty');
$variable=$this->request->data['ProductsSorty'];
foreach($variable as $v)
{
$this->ProductsSorty->create();
$t=array('sorty_id'=>$this->Sorty->id);
$v=array_merge($t,$v);
$this->ProductsSorty->save($v);
}
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The sorty could not be saved. Please, try again.'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->loadModel('Category');
$categories=$this->Category->find('list');
$this->set(compact('agents', 'products','categories'));
}
?>
Je pensais qu'il y aurait une méthode un peu plus automatique. Bon maintenant, il faut que je soustrais en fonction du nb_sorty et du type de produit, la quantité, en gros faire;
quantité initial - nb_sorty = nouvelle quantité
Mais bon, je pense que cela ne devra pas être trop dur.
Je pense que j'ai dû faire une erreur quelque part car cette partie a vraiment merdé.
C'est la structure de ton array qui n'était pas la bonne, donc je pense que tu peux toujours utiliser le saveMany en lui envoyant le bon array, je te renvoi à la doc si besoin <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"><br>
Pour ta sauvegarde de quantité tu peux faire un saveField, et oui, ça devrait pas être trop dur.<br>
Bon courage <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 11 septembre 2012 à 15:59:37
C'est la structure de ton array qui n'était pas la bonne, donc je pense que tu peux toujours utiliser le saveMany en lui envoyant le bon array, je te renvoi à la doc si besoin
Pour ta sauvegarde de quantité tu peux faire un saveField, et oui, ça devrait pas être trop dur.
Bon courage
Je cherche comment faire car dans mon idée, vu que je ne sais pas la quantité initiale restante, j'ai pas envie de faire "une requete pour récupérer, puis une requete de mise à jour". Y a t-il un moyen direct?<br><br>
Sinon, ce que j'ai fait (dernier code source afficher) cela marche très bien.<br>
lemirandais<br><br>
EDIT: Code fini<br><br><pre class="brush: php;"><?php
public function add()
{
if ($this->request->is('post'))
{
$this->Sorty->create();
//enregistrement dans la table sorty
if ($this->Sorty->save($this->request->data))
{
//enregistrement dans la table ProductsSorty
$this->loadModel('ProductsSorty');
$variable=$this->request->data['ProductsSorty'];
foreach($variable as $v)
{
$this->ProductsSorty->create();
$t=array('sorty_id'=>$this->Sorty->id);
$v=array_merge($t,$v);
$this->ProductsSorty->save($v);
$id=current(current($this->Sorty->Product->read('quantity',$v['product_id'])))-$v['nb_sorty'];
$this->Sorty->Product->id=$v['product_id'];
$this->Sorty->Product->savefield('quantity',$id);
}
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->loadModel('Category');
$categories=$this->Category->find('list');
$this->set(compact('agents', 'products','categories'));
}
?>
</pre>Le 11 septembre 2012 à 16:07:47
Je cherche comment faire car dans mon idée, vu que je ne sais pas la quantité initiale restante, j'ai pas envie de faire "une requete pour récupérer, puis une requete de mise à jour". Y a t-il un moyen direct?
Sinon, ce que j'ai fait (dernier code source afficher) cela marche très bien.
lemirandais
EDIT: Code fini
<?php
public function add()
{
if ($this->request->is('post'))
{
$this->Sorty->create();
//enregistrement dans la table sorty
if ($this->Sorty->save($this->request->data))
{
//enregistrement dans la table ProductsSorty
$this->loadModel('ProductsSorty');
$variable=$this->request->data['ProductsSorty'];
foreach($variable as $v)
{
$this->ProductsSorty->create();
$t=array('sorty_id'=>$this->Sorty->id);
$v=array_merge($t,$v);
$this->ProductsSorty->save($v);
$id=current(current($this->Sorty->Product->read('quantity',$v['product_id'])))-$v['nb_sorty'];
$this->Sorty->Product->id=$v['product_id'];
$this->Sorty->Product->savefield('quantity',$id);
}
$this->Session->setFlash(__('The sorty has been saved'));
$this->redirect(array('action' => 'index'));
}
}
$agents = $this->Sorty->Agent->find('list');
$products = $this->Sorty->Product->find('list');
$this->loadModel('Category');
$categories=$this->Category->find('list');
$this->set(compact('agents', 'products','categories'));
}
?>
[CakePhp] Conception d'une view et de son traitement
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.