Results 1 to 6 of 6

Thread: ordine chiamate nella procedura di salvataggio

  1. #1
    eardizzo is offline Junior Member
    Join Date
    Apr 2011
    Posts
    4

    Default ordine chiamate nella procedura di salvataggio

    salve
    ho fatto un modulo prendendo come base il modulo persone
    ho creato un hoo kper salvare contemporaneamente alla persona appena creata anche un contatto con il suo nome cognome ed indirizzo di posta

    così che quando si inserisce una nuova persona o la si modifica, viene creato il suo contatto o viene modificato

    funziona tutto perfettamente trann che l'indirizzo e-mail viene inserito in email_address dopo il mio hook.
    così che se modifico una persona il mio hook riesce a copiare le sue mail in contatti, ma se è la prima volta che lo inserisco non funziona(viene inserito il contatto senza mail)

    questo è il codice del mio hook

    function crea(&$bean, $event, $arguments)
    {
    if (empty($bean->fetched_row['id']) )
    {
    //se è una nuova persona creo il cotnatto
    $query="INSERT INTO contacts (id,last_name,first_name) VALUES ('$bean->id','$bean->last_name','$bean->first_name')";
    $result = $bean->db->query($query);
    }
    //cancello tutte le mail del contatto in questione , per poi reinserirle così da permettere le modifche
    $query="DELETE FROM email_addr_bean_rel WHERE bean_id='$bean->id' AND bean_module='Contacts' AND primary_address=1";
    $result = $bean->db->query($query);
    //trovo le mail della persona inserita
    $query="SELECT email_address_id FROM email_addr_bean_rel WHERE bean_id='{$bean->id}' AND bean_module='STU_Persone' AND primary_address=1";
    $result = $bean->db->query($query, true);
    if ($bean->db->getRowCount($result) > 0)
    {
    //creo in email_addr_bean_rel la nuova reklazione fra la mail ed il contatto
    $row =$bean->db->fetchByAssoc($result);
    $mail=$row['email_address_id'];
    $query="INSERT INTO email_addr_bean_rel (id , email_address_id , bean_id , bean_module , primary_address ) VALUES( UUID(),'$mail','$bean->id','Contacts',1)";
    $result = $bean->db->query($query);
    }

    quindi la domanda è:
    c'è un modo di far eseguire il mio hook dopo che è stata inserita la mail ?
    oppure esiste un modo diverso per far sì che i contatti e le persone(compresa la loro mail primaria)siano sempre sincronizzati?

    grazie

  2. #2
    fulvio is offline Sugar Community Member
    Join Date
    Sep 2007
    Location
    Lesmo - MB
    Posts
    124

    Default Re: ordine chiamate nella procedura di salvataggio

    Ciao,
    forse sono io a non aver capito:
    tu dici: ......funziona tutto perfettamente tranne che l'indirizzo e-mail viene inserito in email_address dopo il mio hook........
    La frase giusta è forse questa ?
    ..... funziona tutto perfettamente tranne che l'indirizzo e-mail NON viene inserito in email_address dopo il mio hook.......

    Inoltre: l'hook come lo fai ?
    Come before_save o come after_save ?

    fulvio

  3. #3
    eardizzo is offline Junior Member
    Join Date
    Apr 2011
    Posts
    4

    Default Re: ordine chiamate nella procedura di salvataggio

    si forse non sono stato chiaro.
    scusate

    volevo dire questo

    ho fatto un modulo custom che ha come base il modello persone poi gli ho aggiunto un campo mail.
    quando si salva una nuova persona sugar esegue questa coda di chiamate

    salva la nuova persona
    esegue gli hook after_save
    crea il nuovo campo nella tabella mail
    crea la nuova associazione fra la mail e la persona

    quindi quando viene eseguito il mio hook(tipo after_save) la mail ancora fisicamente non è stata inserita e quindi non riesco a replicarla nei contatti.

    se invece si modifica la persona la mail esiste già (poichè creata durante il primo salvataggio della persona) ed il mio hook riesce a copiarla.

    chiaramente il mio hook fallisce anche in caso si modifichi la mail nel modulo persone perchè nel momento dell'after_save la mail associata è ancora quella vecchia e non quella nuova.

    magari mi stò incasinando per niente ed esiste un modo banale per replicare in automatico le persone in cotatti

  4. #4
    fulvio is offline Sugar Community Member
    Join Date
    Sep 2007
    Location
    Lesmo - MB
    Posts
    124

    Default Re: ordine chiamate nella procedura di salvataggio

    Ciao,
    hai ragione, e secondo me è un bug di Sugar:
    nonostante l'after_save, il record nella tabella email_addr_bean_rel, non esiste
    ancora e quindi il tuo metodo non può funzionare, e non mi viene in mente
    niente per risolvere il problema con l'utilizzo degli hooks.
    Gli hooks sono il miglior modo per agire "in tempo reale" sui dati.Se NON hai
    la necessità del "tempo reale" potresti affrontare il problema in un altro modo.
    Ho visto che hai utilizzato, net tuo hook, questa istruzione:
    $query="INSERT INTO contacts (id,last_name,first_name) VALUES ('$bean->id','$bean->last_name','$bean->first_name')";
    Questa istruzione crea un nuovo Contatto con un id uguale all'id della Persona che
    hai appena creata, questo non è proprio corretto dal punto di vista di
    Sugar (in Sugar ogni "entità" dovrebbe avere un id diverso) ma ti facilita molto nel compito
    di ottenere la sincronizzazione che ti serve. Potresti schedulare una procedura (ogni x minuti
    oppure ore) che "scansioni" la tabella email_addr_bean_rel e faccia le opportune
    INSERT in caso trovi dei record nuovi. Se le INSERT le fai in modo appropriato NON dovrebbero
    essere necessari gli UPDATE (almeno per quanto riguarda il campo email) poiché il campo email
    è su un'altra tabella quindi il suo contenuto viene automaticamente aggiornato dall'ultima operazione
    fatta, o dal modulo Contatti o dal modulo STU_Persone (così mi sembra che lo hai chiamato tu).
    Riassumendo:
    1) nel tuo hook lasci le istruzioni che creano il nuovo Contatto a partire dalla nuova Persona
    2) la procedura schedulata (che ti devi scrivere) aggiunge il record (o i records) mancanti
    in email_addr_bean_rel.
    Aggiungo: con il meccanismo della "scansione" potresti anche sincronizzare altri campi delle
    tabelle contacts e STU_Persone in virtù del fatto che i record corrispondenti hanno il valore del
    campo id uguale, e potresti anche utilizzare il campo date_modified presente in tutte queste
    tabelle per verificare quale modulo ha effettuato l'ultima modifica.
    Spero di non essere stato troppo contorto, nel caso chiedimi pure.
    Buon lavoro
    fulvio

  5. #5
    eardizzo is offline Junior Member
    Join Date
    Apr 2011
    Posts
    4

    Default Re: ordine chiamate nella procedura di salvataggio

    contorto no.
    ma una domanda mi viene.
    dove in sugar è definito l'ordine delle chiamate?
    perchè mi basterebbe impostare che l'ook venga eseguito dopo.
    essendo tutto in php da qualche parte ci sarà scritto in che ordine eseguire i comandi, no?

    comunque :
    come si scrivono le procedure in modo che vengano eseguite ciclicamente?

    grazie ancora

  6. #6
    fulvio is offline Sugar Community Member
    Join Date
    Sep 2007
    Location
    Lesmo - MB
    Posts
    124

    Default Re: ordine chiamate nella procedura di salvataggio

    Quote Originally Posted by eardizzo View Post
    contorto no.
    ma una domanda mi viene.
    dove in sugar è definito l'ordine delle chiamate?
    Nel codice sorgente, quindi nei file .php e .js

    perchè mi basterebbe impostare che l'ook venga eseguito dopo.
    essendo tutto in php da qualche parte ci sarà scritto in che ordine eseguire i comandi, no?
    Certo che c'è scritto.
    Un punto dipartenza per studiare lo trovi qui: http://developers.sugarcrm.com/
    Poi hai a disposizione tutto il codice sorgente di sugar, ma modificare il codice
    non è banale, poichè l'architettura di Sugar non è così banale: tra le altre cose
    fa uso del meccanismo dell'ereditarietà nella programmazione ad oggetti.
    Piccolo esempio: tu vuoi trovare il punto in cui viene chiamato l'hook after_save,
    bene: se cerchi nel codice sorgente del tuo modulo con tutta probabilità
    il punto che ti serve non lo trovi, ma lo troverai in una classe "genitore" ereditata
    del "discendente". Per esempio troverai qualcosa in <sugar>/data/SugarBean.php
    nella classe SugarBean che è la base di "discendenza" di quasi tutti i moduli di
    Sugar. Modificare questa classe vuol dire modificare il comportamento di tutti
    i moduli discendenti, non solo il tuo. Quindi l'operazione risulta non facilissima.
    Certo, se sei un bravo programmatore ed hai buona volontà (e tempo.....) poi
    ribaltare completamente Sugar e farlo diventare quello che vuoi tu

    comunque :
    come si scrivono le procedure in modo che vengano eseguite ciclicamente?
    ?? Cosa intendi ?? Intendi le procedure schedulate ?
    Allora devi vedere come è scritto il file <sugar>/modules/Schedulers/_AddJobsHere.php
    Vedi un po' come sono fatte le procedure già esistenti, ti scrivi la tua, e poi la configuri entrando
    come amministratore e poi in Admin -> Scheduler
    Poi devi configurare il "crontab" sei sei in Linux, oppure le "Operazioni pianificate" se sei
    in Windows (in MacOsx, non lo so...)

    grazie ancora
    prego
    fulvio
    Last edited by fulvio; 2011-05-05 at 02:01 PM.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Problemi di salvataggio dati
    By Albert Wolfe in forum Italiano
    Replies: 0
    Last Post: 2011-03-03, 03:18 PM
  2. procedura di autoregistrazione nuovi utenti
    By Kidder in forum Italiano
    Replies: 0
    Last Post: 2009-08-26, 10:36 AM
  3. Nessun salvataggio su campi personalizzati
    By seraph in forum Italiano
    Replies: 1
    Last Post: 2008-05-09, 12:15 AM
  4. Errore nelle chiamate programmate
    By Riscom08 in forum Italiano
    Replies: 1
    Last Post: 2008-04-19, 08:37 AM
  5. Replies: 0
    Last Post: 2007-06-14, 04:11 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •