Validar Arreglo De Modelos

Alguien se topó con esto?

Necesito validar un arreglo de modelos, estuve viendo que "performAjaxValidation" recibe una instancia o un arreglo de modelos, pero no consigo que valide los modelos correctamente, alguien tiene alguna idea??

La función performAjaxValidation tiene un bug, que no ha sido corregido al día de hoy (hasta donde sé), por lo cual tengo una modificación a esa función que resuelve ese problema:





    public static function validate($models, $attributes = null, $loadInput = true)

    {

        $result = array();

        if (!is_array($models)) {

            $models = array($models);

        }

        foreach ($models as $model) {

            if (is_array($model)) {

                foreach ($model as $key => $submodel) {

                    if ($loadInput && isset($_POST[get_class($submodel)][$key])) {

                        $submodel->attributes = $_POST[get_class($submodel)][$key];

                    }

                    $submodel->validate($attributes);

                    foreach ($submodel->getErrors() as $attribute => $errors) {

                        $result[CHtml::activeId($submodel, '[' . $key . ']' . $attribute)] = $errors;

                    }

                }

            } else {

                if ($loadInput && isset($_POST[get_class($model)])) {

                    $model->attributes = $_POST[get_class($model)];

                }

                $model->validate($attributes);

                foreach ($model->getErrors() as $attribute => $errors) {

                    $result[CHtml::activeId($model, $attribute)] = $errors;

                }

            }

        }

        if (Yii::app()->getRequest()->getIsAjaxRequest()) {

            return function_exists('json_encode') ? json_encode($result) : CJSON::encode($result);

        } else {

            return $result;

        }

    }




    /**

     * Performs the AJAX validation.

     * #MethodTracker

     * This method is based on the gii generated method controller::performAjaxValidation, from version 1.1.7 (r3135). Changes:

     * <ul>

     * <li>Supports multiple models.</li>

     * </ul>

     * @param CModel|array $model The model or array of models to be validated.

     * @param string $form The name of the form. Optional.

     */

    protected function performAjaxValidation($model, $form = null)

    {

        if (Yii::app()->getRequest()->getIsAjaxRequest() && (($form === null) || ($_POST['ajax'] == $form))) {

            echo self::validate($model);

            Yii::app()->end();

        }

    }



Este código tendría que estar en el archivo components/Controller.php

Espero le sirva.

Saludos

Cabe adicionar que hay una extensión de generación de código en la qu, esta corrección ya está incluída (adicionalmente que genera el código de más calidad y totalmente compatible con el framework CSS Bootstrap): AweCrudAsí que eventualmente podría ayudarle más en el desarrollo de su aplicación.

Saludos.

Esto es una especie de "Postdata":

Si esos múltiples modelos son relaciones del modelo principal no está de más probar extensiones como:

  • activerecord-relation-behavior
  • WithRelatedBehavior

Saludos

Te agradezco la respuesta.

Estoy probando el código que mencionaste, pero creo que mi problema va por guardar modelos relacionados, probaré tb con las extensiones y te comento.

Gracias.

Creo que mi problema está en el diseño, como modelarian esto.

El contacto que un usuario es escencial, contacto puede ser un celular, telefono fijo, correo electronico, facebook, etc. Cada

usuario puede tener mas de un telefono, celular, etc. Ademas de ello como la tecnología es tan cambiante, tiene que poder agregarse

nuevas formas de comunicacion.

pensé en dos modelos:

El modelo1 Usuario(nombre,etc), Medio_Comunicacion(nombre_medio_comunicacion) y Contacto_Usuario(usuario,medio,valor).

Usuario:

1,pepe, aguilar

Medio_comunicacion:

1,celular


2,telefono


3,correo_electronico

Contacto_usuario:

1,1,1,76765652


2,1,2,4565432	


3,1,3,&quot;pepe@gmail.com&quot;

Este modelo es el que actualmente implementé, el principal problema es la validación pues "valor" puede contener numeros de 7 u 8 digitos,

un correo electronico, una cuenta de facebook, etc. Actualmente estoy validando con javascript pues no encontré como hacerlo

con el framework.

El modelo2 lo como se ve en la imagen es tener una tabla para cada medio de comunicacion, lo cuál descarte porque éste no puede crecer. Cuál

es la mejor alternativa? o existe otra mejor que no contenple? opinen por favor.

Gracias.