Yii Framework Forum: Problema Con 'copia' Degli Attributi - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Problema Con 'copia' Degli Attributi Rate Topic: -----

#1 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 831
  • Joined: 03-October 12
  • Location:Ferrara

Posted 30 August 2013 - 01:44 PM

Ho la variabile $a che è di tipo MioOggetto

Devo copiarlo dentro una variaible $b

$a->loadModel($a_id);
$b = new MioOggetto;
$b->attributes = $a->attributes;


C'è un problema
[warning] [application] Failed to set unsafe attribute "id" of "MioOggetto".


Va tutto a buon fine, ma mi sporco l'application.log e io lo pretendo pulito in produzione

Ho controllato le rules e IN NESSUNA di esse compare il campo id.

Qual cosa basilare di Yii mi sfugge dopo ben 8 mesi di uso full-time?
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 2,006
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 30 August 2013 - 03:31 PM

Permettimi di correggere quello che hai scritto

View Postrealtebo, on 30 August 2013 - 01:44 PM, said:

Ho la variabile $a che è di tipo MioOggetto

$a->loadModel($a_id);
$b = new MioOggetto;
$b->attributes = $a->attributes;



in

View Postrealtebo, on 30 August 2013 - 01:44 PM, said:

Ho l'oggetto $a che è di tipo MioOggetto

$a->loadModel($a_id);
$b = new MiaClasse;
$b->attributes = $a->attributes;



A me sembra che tu voglia clonare un oggetto, ed il modo di clonare oggetti in php è:

$obj = new MiaClasse();
$obj->password = "asdsadas";
$obj->username = "sensorario"

$obj2 = clone $obj;

0

#3 User is offline   Leonardo Rossi 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 3
  • Joined: 31-May 12

Posted 09 September 2013 - 05:49 AM

Hai provato a mettere una rule dentro rules() del tipo

array('id', 'safe')


Probabilmente quel messaggio di warning ti viene dato perchè ID è settato come primary key della tabella.errore
0

#4 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 831
  • Joined: 03-October 12
  • Location:Ferrara

Posted 09 September 2013 - 06:03 AM

@Leonardo Rossi: benvenuto tra noi !

1. Si, id è la chiave primaria, ma
2. dato che dopo la copia devo salvare il record, NON posso ovviamente portarmi a dietro come safe l'attributo id.

La domanda rimane: come mai cerca di settare anche l'id durante l'attribuzione massiva dei valori ?

Questo è il codice della setAttributes, che viene eseguito automaticamente usandola come
$model->attributes = $altro_model->attributes;

Guida ufficiale

public function setAttributes($values,$safeOnly=true)
{
    if(!is_array($values))
        return;
    $attributes=array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames());
    foreach($values as $name=>$value)
    {
        if(isset($attributes[$name]))
            $this->$name=$value;
        elseif($safeOnly)
            $this->onUnsafeAttribute($name,$value);
    }
}


quello che segue invece è il codice della getSafeAttributeNames

public function getSafeAttributeNames()
{
    $attributes=array();
    $unsafe=array();
    foreach($this->getValidators() as $validator)
    {
        if(!$validator->safe)
        {
            foreach($validator->attributes as $name)
                $unsafe[]=$name;
        }
        else
        {
            foreach($validator->attributes as $name)
                $attributes[$name]=true;
        }
    }

    foreach($unsafe as $name)
        unset($attributes[$name]);
    return array_keys($attributes);
}


Da questo capisco il problema è semplicemente che nell'espressione

$model_a->attributes = $model_b->attributes


nella parte DESTRA dell'espressione,tra gli attributes, c'è già anche 'id', cosa che non mi aspettavo.

Quindi facendo il ciclo tra tutti gli attributes di B da settare in A, trova id, vede che non è safe, quindi segnala il warning (e non lo setta, come corretto e come voluto).

... beh, alla fine ho capito ..
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#5 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 831
  • Joined: 03-October 12
  • Location:Ferrara

Posted 09 September 2013 - 06:32 AM

Quindi la soluzione Yii-compliant per clonare un record è:

        $model = $this->loadModel($model_id_to_clone);
        $model->isNewRecord = true;
        $model->unsetAttributes(array("id"));
        $model->save();


Ovviamente sarebbe appropriato verificare se validate va a buon fine, ma il concetto è questo.
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users