Yii::app()->db->getLastInsertID()

ciao a tutti, vorrei ottenere l ultimo Id della mia tabella

provando con


Yii::app()->db->getLastInsertID()

mi viene restituito 0.

io uso questo. spero ti possa essere utile


if($model->save()) {

	...

	$model->id  // id dell'ultimo record inserito

	...

}

Anche io faccio lo stesso.

ma se volessi prendere l ultimo id da un altra Action devo fare per forza una query?

Fammi capire bene.

Da qualche parte parte hai una create dove crei un nuovo record, e poi vuoi usarlo come chiave esterna in un’altra create? Se è questo, nella create troverai un $this->redirect(‘action’); Li puoi passare come parametro in più che è l’ide del model appena creato. Oppure, se ti trovi in una particolare view di un model e vuoi “prendere” quell’id, la logica sarà simile: Dovrai usare un CHtml::link che passa come parametro alla nuova create l’id che ti serve.

Ci ho preso?

Effettivamente mi sono spiegato un po’ male.

diciamo che il dubbio è scaturito da questa situazione

il percorso che faccio è il seguente:

ho una form con un campo, che al submit mi salva sul db e mi crea un nuovo div con dentro le nuove informazioni (id, e titolo)

ho fatto questo codice

View




echo CHtml::ajaxSubmitButton(

                'Salva', $this->createUrl("/Pagine/Create"), array(

            'beforeSend' => 'function(){

                $("#lista_pagine").show();

                 $("#lista_pagine").html("sending...");

          }',

            'success' => "function(html) {

                  if (html.indexOf('{')==0) {

                      $('#lista_pagine').fadeOut('slow');

                      jQuery('#lista_pagine').ajaxvalidationmessages('show', html);

                  }else {

                      $('#lista_pagine').html('Salvataggio Effettuato');

                      $('#lista_pagine').fadeOut('slow');

                      jQuery('#lista_pagine').ajaxvalidationmessages('hide');

                      disegna_pagina($('#Pagine_titolo_pagina').val());

                 }

          }",

            'error' => "function(html) {

                      jQuery('#lista_pagine').ajaxvalidationmessages('hide');

          }"

                )

        );



Controller




public function actionCreate() {

        $model = new Pagine;

        $errors = CActiveForm::validate($model);

        if ($errors !== '[]') {

            echo $errors;

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

        }

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

        $model->save();

        

    }




Se io qui faccio una chiamata a un pagina con un renderPartial e dentro ho degli echo, oppure ho degli echo dentro la action ( per fare prima), io non vedo a video gli echo, ma le vedo solo in console di firebug… come mai? per scrivere in un div con ajaxSubmitButton, devo usare update per forza?

solo che per update c’e un limite perché se uso success, update non funge!

http://www.yiiframework.com/doc/api/1.1/CHtml#ajax-detail Note, if you specify the ‘success’ option, the above options will be ignored.

quindi per questo ho dovuto creare una nuova azione che è:


public function actionCreate_box() {

        $box_pagina=Pagine::model()->find('titolo_pagina=:titolo_pagina', array(':titolo_pagina'=>$_POST["titolo_pagina"]));

        $this->renderPartial('crea_pagina', array('box_pagina' => $box_pagina));

    }

dove nel render passo i parametri nuovi e creo un div.

Questa funzione è chiamata dal success che si trova nella view iniziale


function disegna_pagina(titolo_pagina) {

    $.post('Create_box',{titolo_pagina: titolo_pagina}, function(data) {   

     $(data).appendTo('#container');

});

  

}

dove titolo_pagina è il val() del form

se io potessi fare il renderPartial direttamente nella prima azione, eviterai, una chiamta Js, e un’azione. anche perché adesso passo solo il titolo, ma se devo passare N parametri è una rottura.

inizialmente il getLastId, mi serviva per fare la query dentro actionCreate_box.

spero di essermi spiegato, e di non essere andato troppo OffTopic, altrimenti creo un nuovo Topic

grazie a tutti

Devi perdonarmi ma non ho capito :-p

Potresti dirmi che cosa vorresti fare, e non come lo vorresti fare? Io non sto capendo qual’è il problema. Non capisco cosa non riesci a fare.

in pratica, quando clicco ajaxSubmitButton, mando un post con il valore del campo, lo salvo nel database e disegno il box stesso.

solamente che per disegnare il box devo fare un’altra azione e non vorrei farla. LastiId per adesso non mi serve più, ecco perché dice o spero di non andare offtopic…

Mi son Capito ora ;D ?

Adesso si =). Io fossi in te creerei una funzione javascript che carica un metodo e lo disegna. Quindi, la richiamerei al ‘success’ del submit.

Quando disegno pagine ajax, prima creo l’html. Poi creo delle funzioni javascript che interagiscono con la pagina. Queste funzioni, in genere, non vengono mai chiamate direttamente. Proprio come nel tuo caso. Nel tuo caso, al submit di un form, ricarico l’elenco dei record inseriti. In genere mi faccio restituire un json che poi utilizzo per ricreare un nuovo codice html.

ciao e grazie per la risposta, io faccio come hai detto te, al success faccio invoco una funzione che mi disegna.

però ho fatto anche questo, che era quello che volevo e risparmio la funzione Js

dentro all’action chiamato con ajaxButtonSubmit scrivo:


public function actionSalva() {

        $contenuto = new Contenuti;

        $contenuto->tbl_pagine_web_id = $_GET['id'];

        $contenuto->tipo_contenuto = 4;

        $contenuto->contenuto = $_POST['contenuto'];

        $contenuto->save();

        

        if (Yii::app()->request->isAjaxRequest){

                    echo CJSON::encode(array(

                        'div'=>$this->renderPartial('crea_contenuto', array('contenuto_pagina' => $contenuto), true,false),

                    ));

                }

    }

nel success ella chiamata ajaxbutton scrivo


$("#contenuto_pagina").append(data.div);

e nelle impostazioni iniziali abilito il Json così:


       "dataType" => "json",

nel mio caso devo aggiungere a video il risultato, che è un renderPartial come si può vedere.

Nel renderPartial però ho un problema ( E TE PAREVA ! )

che è il seguente:


<?php

 echo "<div class=\"contenuto\">";

        echo "ID ".$contenuto_pagina->id." ";

        echo $contenuto_pagina->contenuto;

        echo CHtml::ajaxLink('Cancella elemento', $this->createUrl("/ContenutoPagina/Cancella_elemento",

            array("id_elemento" => $contenuto_pagina->id)), //PARAMETRI_URL

            array(

              "dataType" => "json",

                "url" =>  $this->createUrl("/ContenutoPagina/Cancella_elemento"),

                'beforeSend' => 'function(){

                           }',

             'success' => 'function(data){

                   $(".contenuto_data").hide("slow"); //nascondoil box selezionato

              }'

            )

        );

   echo "</div><br/>\n";

?>

a Video vedo tutto bene, Id corretto (nuovo id dopo salvataggio) e il contenuto che ho scritto nel Post. Il problema è che quando clicco sul nuovo AjaxSubmit creato in questa Pagina, mi cancella il primo elemento della tabella. quando faccio


$(".contenuto_data").hide("slow"); //nascondoil box selezionato

non mi cancella ad esempio l’id 130, che sarebbe lui. non capisco il motivo dato che l’id viene caricato correttamente perchè lo vedo dall’eco che faccio all’inizio del render


 echo "ID ".$contenuto_pagina->id." ";

quindi per adesso per ovviare al problema ho fatto un link con il classico CHtml::link


echo CHtml::link('cancella', "", array(

    'style' => 'cursor: pointer;',

    'onclick' => "{cancella_pagina('.contenuto','".$this->createUrl('Cancella_elemento')."',".$contenuto_pagina->id.",'#risposta');}"));

echo "</div>";

dove qui mi passa correttamente l’id, e la funzione JS per cancellare il blocco selezionato


function cancella_pagina(div_chiamante,url,id,div_risposta) {

       

     $(div_chiamante).click(function() {

          box_selezionato = $(this);

       });

    

    $.ajax({

        url: url,

        context: document.body,

        data: {

            id_elemento:id

        },

        beforeSend: function () {

            $().show();

            $(div_risposta).html('<p>Loading...</p>');

        },

      success: function(){

                $(box_selezionato).fadeOut("slow");

                $(div_risposta).html('<p>Completato</p>');

                $(div_risposta).fadeOut('slow');           

        },


      error: function(){

            $(div_risposta).html('<p>Errore non previsto</p>');

            $(div_risposta).fadeOut('slow');


        }

    });	

}

ho messo dei parametri così la stessa funzione la uso da più parti.

Mi piacerebbe non utilizzare questa chiamata Js e il link "classico" ma creare il ajaxSubmitButton e cancellare tutto, come faccio per il caricamento…

E’ un pò un bordello spiegarlo, spero di esserci riuscito, e forse per questo è il caso di aprire un Topic…

Grazie per l’aiuto