[Resuelto] Asignar Resultado En El Producto

Hola, y como siempre pido disculpas por mi espanol.

Tengo un problema. Tengo un form de productos.

En la vista principal (index) ahora quiero poner dos botones para assignarle un resultado a el producto.

Quiero poner un boton "Vendido" y otro boton "Acabado".

Luego quiero que en mi vista index se vean solo los productos "Vendido".

Como puedo hacer?

Esta es mi actionIndex:




public function actionIndex()

	{

              $user = User::model()->findByPK(Yii::app()->user->id);

              $cr = new CDbCriteria();

              $cr->with = array('utenti' => array('condition' => 'utenti.id = :idUtente','params' =>array(':idUtente' => $user->id)));

		 

		$dataProvider=new CActiveDataProvider('Prodotti', array('criteria' => $cr));

		

		$this->render('index',array(

			'dataProvider'=>$dataProvider,

			));

 }



En la vista también que tengo que poner para obtenir lo que deseo?

Gracias a quien pueda ayudarme.

Buenos días.

Para mostrar sólo los productos vendidos tendrías que añadir una condición a tu CDbCriteria:




$cr->addCondition("productos.Vendido = 'Vendido' ");      



Y listo, sólo te mostrará los vendidos.

Para los botones de Vendido o Acabado o bien los utilizas como botones de un formulario haciendo POST al controlador, o haces llamadas AJAX para la actualización, refrescando el CGridView de productos en el Success del AJAX.

Un saludo.

Buenos dias lagogz y gracias por su respuesta.

Yo, del momento, estoy aprendiendo a utilizar yii framework y aun no se como empezar para hacer lo que usted està diciendo con AJAX.

Usted puede escribir un poco de codigo? Asi tambièn voy aprendiendo.

Por los botones solo se hacerlo de esta manera:




<?php echo CHtml::submitButton('Exporta PDF', array('submit' => array( 'export', 'id'=>$data->id))); ?>



Un saludo.

Sin problema, pero antes tienes q mostrarnos el código de tus botones de Vendido/Acabado y el codigo de los datos que quieres actualizar (que según comentas están en la misma vista que los botones).

Pq dependiendo de como muestres tus datos el proceso y el success de AJAX cambiará.

Un saludo.

Hola, los botones aun tengo que crearlos por que no se si de la manera que he dicho antes pueden funcionar.

Los datos que quiero actualizar solo son los de "vendido" o "acabado"

Esto es mi _form:




<?php

/* @var $this ProdottiController */

/* @var $model Prodotti */

/* @var $form CActiveForm */

?>


<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'prodotti-form',

	// Please note: When you enable ajax validation, make sure the corresponding

	// controller action is handling ajax validation correctly.

	// There is a call to performAjaxValidation() commented in generated controller code.

	// See class documentation of CActiveForm for details on this.

	'enableAjaxValidation'=>false,

)); ?>


	<?php echo $form->errorSummary($model); ?>

    <table>

    <tr>

    <td>

		<?php echo $form->labelEx($model,'nome'); ?>

		<?php echo $form->textField($model,'nome',array('size'=>60,'maxlength'=>255)); ?>

		<?php echo $form->error($model,'nome'); ?>

        </td>

      

        <td>

		<?php echo $form->labelEx($model,'descrizione'); ?>

		<?php echo $form->textField($model,'descrizione',array('size'=>60,'maxlength'=>255)); ?>

		<?php echo $form->error($model,'descrizione'); ?>

        </td>

        <td>


		<?php echo $form->labelEx($model,'prezzo'); ?><br  />

		<?php echo $form->textField($model,'prezzo',array('size'=>10,'maxlength'=>10)); ?>

		<?php echo $form->error($model,'prezzo'); ?>

        </td>

        </td>

                <?php echo $form->labelEx($model,'esito'); ?><br  />

		<?php echo $form->textField($model,'esito',array('size'=>10,'maxlength'=>10)); ?>Aqui tiene que actualizar "Vendido" - "Acabado"

		<?php echo $form->error($model,'esito'); ?>

        </td>

         </tr>

         </table>



Esta es mi _view:




<?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id)); ?> 

<?php echo CHtml::encode($data->nome); ?>

<?php echo CHtml::encode($data->descrizione); ?>

<?php echo CHtml::encode($data->prezzo); ?>

<?php echo CHtml::encode($data->esito); ?> Aqui tengo que visualizar "Vendido" - "Acabado"


 <div>

    <?php echo CHtml::submitButton('Exporta PDF', array('submit' => array( 'export', 'id'=>$data->id))); ?>

    </div>

<div>

Aqui quiero poner los botones "Vendido" - "Acabado"

</div>



En el index tengo que mostrar solo los que se han Vendido.

Gracias por su ayuda :)

Entondes es bastante más simple de lo que esperaba. Simplemente o en tu vista _view insertas un formulario y creas 2 submitButton (uno para vendido y otro para acabado), o te ceras 2 ajaxButton para lo mismo. Como la primera forma ya la sabrás hacer, te escribiré la manera AJAX.

En este caso yo lo haría de la primera forma, tú eliges.

En tu _view:




$idBoton = uniqid(); 


echo CHtml::ajaxSubmitButton(

                        'Vendido',

                        CHtml::normalizeUrl(array('prodotti/ajaxVendido', 'idProdotti' => $data->id, 'estado' => 'Vendido')),

                        array( 

                            'success'=>"function(data){

                                            if(data == 'Vendido' || data == 'Acabado')

                                            {

                                                $('#nombreEsito').val(data);

                                                

                                            }

                                            else

                                                alert(data); // O escribes el error en una etiqueta.

                                 }"

                         ),

                        array(

                            'id'=>'ajaxVendido' . $idBoton,

                            'name'=>'ajaxVendido' . $idBoton,

                        )); 



Tienes que crear otro botón para "Acabado".

Este botón lo que hace es enviar una petición a la action ajaxVendido(que tenemos q crear) del controlador prodotti. Esta action devolverá “Vendido”, “Acabado” o un error. $(’#nombreEsito’) será una etiqueta (o control que desees) con id nombreEsito donde mostraremos el estado del producto, por lo tanto al finalizar la acción actualizamos este valor en el success del AJAX o mostramos una alerta en caso de error.

En nuestro controlador prodotti:




public function action AjaxVendido($idProdotti, $estado)

{

     // Actualizamos el registro del modelo prodotti respecto al id 

     // de prodotti y el estado enviados. Esto ya lo escribes tú.


     // Si tiene éxito, devolvemos el estado, y sino un error.

     echo($estado); // O el error. Este código también lo haces tú, 

                    // condicionales, try...catch...

}



Y en las rules del controlador añadimos esta acción para que los usuarios adecuados tengan acceso a ella.

Y en principio listo, creo q no se me pasa nada.

Un saludo.

Buenos dias.

Lo he implementado todo però cuando ago click en el boton no pasa nada.

Me falta implementar esto verdad?




// Actualizamos el registro del modelo prodotti respecto al id 

// de prodotti y el estado enviados. Esto ya lo escribes tú.



Como actualizo en el registro de modelo respecto al id?

Desculpa si aun no entiendo … pero hace dos meses que empezee a aprender con yii.

Tengo tambièn que insertar un nuevo campo (estado) en la tabla prodotti para que tome el estado al click en el boton?

Lo siento lagogz…ya se que tengo mucho que aprender.

Un Saludo y como siempre Gracias por su ayuda.

Uff…no llego a crear mi action !!! Puedo utilizar Insert Into … como se hace en php? Alguien puede ayudarme?

Vamos a ver Giannix, claro que tienes que escribir el código en tu action, pero supuse que lo sabrías hacer pq es básico de Yii el trabajo con modelos.

Sería algo así:




public function action AjaxVendido($idProdotti, $estado)

{

     $model = Prodotti::model()->findByPk($idProdotti);// Cargamos el modelo.


     $model->esito = $estado;                          // Cambiamos el estado del modelo.


     if($model->save())                                // Lo actualizamos.

          echo($estado);                               // Si no hay error devolvemos el estado.

     else                                              // Si hay error.

          echo('Error actualizando estado.');          // Si hay error devolvemos un aviso de error.

}



Un saludo.

Gracias lagogz ,

ya lo he resuelto (sin utilizar AJAX) con esto en el controlador:





	public function actionVendido($id)

	{


        $model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Prodotti']))

		{

			$model->attributes=$_POST['Prodotti'];

			if($model->save())

				$this->redirect(array('index'));

		}


		$this->render('vedido',array(

			'model'=>$model,

		));

	

	}



Luego he creado mi _form y mi vista. Lo mismo he echo por Acabado.

Muchisimas Gracias por tus consejos. Cuando llegare a un nivel mas avanzado de aprendimiento ententarè utilizar AJAX también.

Lo has hecho de la primera forma que te dije, mediante un formulario y POST.

La otra forma que te detallé es mediante AJAX.

Las 2 son válidas.

Un saludo.