[Solucionado] Un Action Para Obtener Id A Traves De La Cedula Ingresada

Hola tengo un form donde ingreso la cédula y al hacer el submit me envié los datos a un action en el controlador llamado obtener id, para que luego en el actionCreate me guarde los datos según si consiguió el id o no, publicare los códigos, si alguien pudiese decirme el error y ayudarme a corregirlos porfavor

el código del actionCreate es este




public function actionCreate()

	{

		$a=new SolicitudesSocial;

		$b=new Solicitantes;

		$this->performAjaxValidation(array($a,$<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' />);

		if(isset($_POST['SolicitudesSocial'],$_POST['Solicitantes']))

		{

			$a->attributes=$_POST['SolicitudesSocial'];

			$b->attributes=$_POST['Solicitantes'];

			

			$cedula = $b->cedula;

			$id = $this->obtenerId($cedula);

			if($id == 0)

			{

				$fechaNacimiento = $b->nacimiento;

				$edad = $this->calcularEdad($fechaNacimiento);

				$b->edad = $edad;

				$b->usuarios_id = Yii::app()->user->id;

				$a->fecha = date ("Y-m-d");

			}

			else

			{

				$b->usuarios_id = Yii::app()->user->id;

				$a->fecha = date ("Y-m-d");

				$a->solicitantes_id = $id;

			}

			

			$valid=$a->validate();

			$valid=$b->validate() && $valid;

			

			if($valid)

			{

				$a->save(false);

				$b->save(false);

			}

			$this->redirect(array('view','id'=>$a->id));

		}

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

	'a'=>$a,

	'b'=>$b

	));

	}



y el código de obtenerId es este




	public function obtenerId($cedula)

	{

		$datos = Yii::app()->db->createCommand("SELECT id FROM solicitantes WHERE cedula = ".$cedula)->queryRow();

		return ($datos['id']);

	}



Ya logre solucionarlo por mi cuenta el error estaba en el actionCreate, dejo la respuesta por si alguien llegase a necesitarla




public function actionCreate()

	{

		$a=new SolicitudesSocial;

		$b=new Solicitantes;

		$this->performAjaxValidation(array($a,$<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' />);

		if(isset($_POST['SolicitudesSocial'],$_POST['Solicitantes']))

		{

			$a->attributes=$_POST['SolicitudesSocial'];

			$b->attributes=$_POST['Solicitantes'];

			

			$cedula = $b->cedula;

			$id = $this->obtenerId($cedula);

			if($id == 0)

			{

				$fechaNacimiento = $b->nacimiento;

				$edad = $this->calcularEdad($fechaNacimiento);

				$b->edad = $edad;

				$b->usuarios_id = Yii::app()->user->id;

				$a->fecha = date ("Y-m-d");

				$valid=$a->validate();

				$valid=$b->validate() && $valid;

				

				if($valid)

				{

					

					$b->save(false);

					$datos = Yii::app()->db->createCommand("SELECT id FROM solicitantes WHERE cedula = ".$cedula)->queryRow();

					$id2 = $datos['id'];

					$a->solicitantes_id = $id2;

					$a->save(false);

				}

				

			}

			elseif ($id != 0)

			{

				$a->fecha = date ("Y-m-d");

				$a->solicitantes_id = $id;

				

				$valid=$a->validate();

			

				if($valid)

				{

					$a->save(false);

				}

			}

			

			

			$this->redirect(array('view','id'=>$a->id));

		}

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

	'a'=>$a,

	'b'=>$b

	));

	}



Hola, sin animo de molestar no entiendo un par de cosas, debajo pongo la función actionCreate un poco modificada.




public function actionCreate()

        {

                $a=new SolicitudesSocial;

                $b=new Solicitantes;

//                $this->performAjaxValidation(array($a,$<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' />);	//<-- sin ajax no es necesario

                if(isset($_POST['SolicitudesSocial'],$_POST['Solicitantes']))

                {

                        $a->attributes=$_POST['SolicitudesSocial'];

                        $b->attributes=$_POST['Solicitantes'];

                        

                        $cedula = $b->cedula;

                        $id = $this->obtenerId($cedula);

                        $a->fecha = date ("Y-m-d");

			$a->solicitantes_id = $id;

			$valid = false;

                        if($id == 0)

                        {

                                $fechaNacimiento = $b->nacimiento;

                                $edad = $this->calcularEdad($fechaNacimiento);

                                $b->edad = $edad;

                                $b->usuarios_id = Yii::app()->user->id;

                                $valid=$a->validate();

                                $valid=$b->validate() && $valid;

                                

                                if($valid)

                                {

                                        $b->save(false);                                        

                                        $a->save(false);

                                }

                                

                        }

                        elseif ($id != 0)

                        {

				$valid = $a->save();

                        }

                        

                        if($valid)

	                        $this->redirect(array('view','id'=>$a->id));

                }

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

        'a'=>$a,

        'b'=>$b

        ));

        }



Quizá yo meta algún error, pero básicamente lo que quiero comentar son 2 cosas:

  • $id, $id2 para mi son iguales, no necesitas volver a calcularlo.

  • Solo hacer redirect si el modelo $a se ha grabado si no te va a dar un error en la vista porque $a->id no existirá.

un saludo

No lo que pasa es que es un formulario para 2 controladores por eso el id si existe, es decir yo en el formulario ingreso la cedula y si ya existe me trae el id de la tabla solicitante, y ese id lo guardare en solicitantes_id en la tabla solicitudes, en cuanto a $id e $id2 estas en lo correcto :P

Ok, entonces entiendo que no te de error el redirect.

Pero sigo sin entender porque lo haces siempre que recibes un POST, yo viendo formularios siempre hago los redirect solo si validan todas las reglas, me explico:

  • usuario A introduce el formulario y mete mal un dato.

  • el programa lo valida y ve un error.

  • Como hay error no hace redirect y muestra de nuevo el mismo formulario con el error.

En tu caso si hay un error en la introducción de datos se hace el redirect y se va a la vista directamente, el usuario no se entera de que hubo un error y se creerá que los datos han sido grabados y no es así.

Haz la prueba metiendo un dato que no valide las rules, verás como hace el redirect y no te vas a enterar del error.

tengo todos los campos en el rules por eso no me genera error

Bueno pues si no hay ningún error, felicidades por resolver el problema y a por el siguiente.