Profilazione utente con Profile
Salve devo realizzare una web application per un gestionale.
La prima domanda è se Drupal possa essere usato a tale scopo. Nel senso che devo interagire con dati, fare calcoli, leggere fogli excel, fare stampe complesse e controllare che i dati inseriti corrispondano a quello che è possibile inserire ed altro. Non è un normale sito web.
Secondo, la strutturazione della base dati. Normalmente in un software sotto windows definisco le tabelle di base tipo comuni o atri dati come descriizoni varie che per drupal dovrebbero corrispondere ai vocabolari.
Queste tabelle di base sono collegate tra di loro. Ho visto che con i vocabolari si possono usare campi entity reference per collegare le tabelle tra di loro anche in modalità padre/Figlio (1:n)
Per quanto riguarda gli altri dati di gestione penso si possano usare i contenuti, tipo per le anagrafiche.
La questione è, in tale cms conviene creare un vocabolario per ogni tabella di base? anche per qielle collegate come padre/Figlio? Cioè parcellizzare le varie tabelle e non crearne una omnicomprensiva
Dico ciò in quanto in un vocabolario o contenuto posso mette l'intestazione e poi inserire un campo con numero illimiattao di valori per poter inserire i figli. Correggetemi se sbaglio
Cosa mi consigliate?
Risposte
Ciao, puoi usarlo per questo
Ciao,
puoi usarlo per questo scopo, io che non sono un programmatore ma sono un appassionato , ho impiegato anni ad arrivare ad un certo tipo di risultato.
Il mio gestionale gestisce ordini e fatture ( non elettroniche)prima nota pagamenti , personale un callcenter, e altro ancora, è multi aziendale, ma se dovessi ripetere l'eseprienza partirei con qualcosa di più adatto.
Con Drupal puoi collegare con entity refrence i content type, e puoi considerarli quasi delle tabelle, puoi interrogare il database creando delle view, anche molto complesse,hai il potere di creare ruoli per vari utenti, ma la parte di inserimento dati in linea non è il massimo, e nemmeno la stampa di report.
Il problema è che molti sviluppatori di moduli anche molto importanti per questo tipo di cose, non seguono più i loro progetti come un tempo.
Ciao potresti utilizzare una
Ciao potresti utilizzare una o più entità custom (il boilerplate code lo puoi produrre con drupal console in pochissimo tempo) se hai a che fare con elementi fortemente relazionali (es. schemi e/r complessi) e vuoi mantenere la struttura delle tabelle. Definendo i campi dell'entità attraverso BaseFieldDefinition puoi usufruire dell'integrazione con tutte le funzionalità Drupal (view/form mode, views etc..), compresi gli entityreference (quindi con i widgets e inline entity form etc..).
Oppure puoi definire la struttura delle tabelle senza usare le entità / campi con le apposite api e creare i form per le operazioni crud e i controller per la visualizzazione. Un esempio di questo lo trovi qui: https://www.valuebound.com/resources/blog/how-to-create-custom-form-crud....
Puoi anche fare un approccio ibrido, creando entità custom fieldable, a cui agganciare i campi che ti servono tramite l'apposita UI. Questo ti aiuta a separare concettualmente le entità (non tutto è un nodo o un termine di tassonomia) e a non portarti dietro complessità inutili (un esempio sono il sistema di menù, le revisioni, la traducibilità di "default" dei nodi e dei campi ad essi collegati).
Per stampe complesse o report sui dati le opzioni ci sono, da https://www.drupal.org/project/entity_print per la stampa, alle viste (core) per le pagine di reporting.
Spero ti sia utile.
Caspita ragazzi, mi avete
Caspita ragazzi, mi avete tolto un grosso peso dallo stomaco e mi avete dato vari spunti di lettura. Se possibile, chiaritemi un altro dubbio. Per l'anagrafica comuni, descriizoni e anagrafiche varie (tipo Clienti e Fornitori) pensavo di usare la tassonomia. E' giusto così o per le anagrafiche mi conviene usare i nodi?
grazie
In sè non è sbagliato,
In sè non è sbagliato, termini e nodi sono entità di contenuto e fieldable. Personalmente preferisco scindere il contenuto reale (node) da ciò che lo classifica (taxonomy term).
Poi tutto dipende dalla finalità e dal progetto.
Se, ad esempio, le anagrafiche fossero legate ad account Drupal li vedrei meglio come profili (https://www.drupal.org/project/profile) diversi di uno stesso utente. Solo un esempio, come dicevo il tuo obiettivo potrebbe essere completamente diverso.
E' da un po' che ci penso in
E' da un po' che ci penso in quanto il fornitore/cliente deve loggarsi e fare delle operazioni. quindi mi chiedevo, che faccio creo l'anagrafica come nodo poi un utene con la stessa anagrafica e poi devo collegarli tra loro?
Oppure creo l 'utente ed aggiungo tanti campi per quanto me ne servono?
oppure il profilo?
Per quel che ho capito mi consigli di usare il profilo per tutte quelle anagrafiche dove gli utenti si devono loggare
Sempre se ho capito bene.
P.S.:
mi sa che la prima cosa è che devo leggere bene cosa fa il profilo e a cosa serve. Mi sa che è una situazione diversa da quello che ho espresso
Sei hai degli utenti il caso
Sei hai degli utenti il caso è pertinente. Profile è ad esempio usato nella suite commerce proprio come storage per gli indirizzi di spedizione / fatturazione degli utenti.
Non è sbagliato nemmeno usare i campi dell'entità user, ma con profile hai la possibilità di avere profili distinti e separati per ogni utente, definire chi può avere tali profili (ad esempio potresti avere utenti operatori di sistema che non devono avere profili), avere profili multipli (es. più indirizzi di fatturazione e definire quello principale), etc .. insomma tante features utili a portata di mano.
Ho installato il modulo
Ho installato il modulo profile e creato più profili. A seconda dell'utente ho aggiunto al profilo 2 campi codice e anagrafica.
Ho realizzato una form dove l'utente loggato deve inserire dei dati. Come primo campo ho inserito un campo text da riempire in automatico con il codice e l'anagrafica del profilo utente, attraverso il form_alter del C.T.
Per il momento richiamo una func utente per poter accedere ai campi
Il tutto funziona, però non ho capito come accedere ai campi del profile. Pensavo fosse collegato all'utente e bastasse inserire il field interessato ma non è così
Puoi creare vari profili con
Puoi creare vari profili con profile, che si vanno ad aggiungere al profilo principale.
Se apri il profilo di un utente e vai in modifica, vedrai che ci sarà una scheda con il profilo aggiuntivo.
In drupal 7 una volta c'era già un profilo chiamato Main profile, ora in Drupal 8 non ho idea se sia rimasto così.
Per quanto riguarda la tua domanda sul legame, certamente ogni profilo aggiuntivo è legato al profilo utente.
Probabilmente dovresti prima verificare con l'utente amministratore (se il percorso che ti ho spiegato sia corretto.) veda il profilo aggiuntivo dei vari utenti, sottoforma di scheda.
Per quanto riguarda l'accesso come utente , il profilo aggiuntivo non è normalmente visibile a tutti i ruoli, ma solo all'amministratore, se vuoi che questo cambi, dovrai assegnare i permessi per vedere il profilo aggiuntivo ai vari ruoli del tuo sistema.
Poi un suggerimento..
Ogni volta che fai una relazione con profile o entity reference, non serve che crei un sistema per ricopiare " propolare" i dati sul profilo o tipo di contenuto figlio, perchè se questo campo anagrafica è già persente sul profilo principale,, ti basterà utilizzare le relazioni di view per richiamare i dati.
Altrimenti non avrebbe senso fare le relazioni tra campi.
Se poi dovesse essere indispensabile ricopiare i dati, (ma è molto difficile che lo sia) potresti usare computed_field per farlo.
non ho capito come accedere
<?php
$profiles = \Drupal::entityTypeManager()->getStorage('profile')->loadByProperties(['uid' => \Drupal::currentUser()->id()]);
if (!empty($profiles)) {
foreach ($profiles as $profile) {
// ksm($profile->bundle());
foreach ($profile->getFields() as $field) {
// ksm($field->getName());
}
}
}
?>
Il codice mi è abbastanza
Il codice mi è abbastanza chiaro. entity TypeManager ha una proprieta getStorage che si collega al C.T. profilo selezionando l'utente collegato
Il primo foreach cicla gli eventuali utenti, in questo caso è presente un unico utente perchè filtrato con l'uid e per ogni utente trovato col secondo foreach visualizza le variabili del profilo apparteneti all'utente
Ci ho sbattuto la testa parecchio e non capito come fare a prendere il valore dei campi che mi interessano.
Se non sbaglio con la trerminologia, con i 2 foreach hai referenziato l'array ($profiles) usando altre variabili per visualizzare i nomi dell'array.
facendo printare $field->getName() ottengo tutti i nomi dei campi presenti nel profilo
Tenendo presente ciò e per similitudine con il codice della funzione utente ho scritto nel secondo foreach il codice $field->getName('field_cap')->value; ma ni riporta errore.
Pensando alla referenziazione ho scritto questo codice $profiles()->getFields->getName('field_cap')->value;
Ho fatto varie ricerche ma non non sono riuscito a trovare nulla che mi spieghi come prendere il valore di un campo del profilo
Un "field" si accede alla
Un "field" si accede alla stessa maniera indipendentemente dall'entità a cui è attaccato.
$entity->get('field_indirizzo')->getValue()
se multiplo
$entity->get('field_indirizzo')->first()->getValue() o $entity->get('field_indirizzo')->get(0)->getValue() .. $entity->get('field_indirizzo')->get(n)->getValue()
o anche:
$entity->field_indirizzo->value
getFields() ti dà l'intera collezione dei campi presenti con le loro proprietà.
Ciao Maurizio, $entity->
Ciao Maurizio, $entity-> nella ricerca l'avevo già provato ma mi ritornava errore, perciò tio ho scritto non sono riuscito a capire il codice da scrivere.
Ho provato tutte le righe che mi hai indicato. Per tutte tranne che per l'ultima mi ritorna l'errore che il sistema ha riscontrato un errore. Per l'ultima istruzione non mi ritona nessun errore ma non mi printa nulla
Ti allego tutto ilcodice così da vedere se ho omesso o scritto male qualcosa
Ciao, ho scritto una generica
Ciao, ho scritto una generica variabile $entity nel contesto del post ovviamente devi adattare la cosa alle tue esigenze.
Ragionaci un attimo ... nel tuo codice qual è la variabile dell'entità da cui estrarre il valore del campo?
Ci ho lavorato parecchio e
Ci ho lavorato parecchio e visto come funziona per i nodi ma non funziona per la proprietà del profilo.
La variabile dell'entità è $profiles però se la uso così com'è non va
Quasi sicuramente va referenziata ma non ho capito come. Dico ciò perchè se uso questo codice mi viene stampato il valore del campo A proposito sulla prima riga mi ritorna errore e non ho capito perché
Poi c'é il problema che il campo che mi serve è una entity reference. Ho provato con
ma nulla
e mi ritorna un array, quindi significa che dovrò rendere più profondo il codice. Ma lo potrò fare solo quando capirò come referenziare il primo
provato anche con
Grazie per lo stimolo che mi dai. Ho l'opportunità di capire in base ai tuoi suggerimenti
Posto che tu abbia devel e
Posto che tu abbia devel e kint attivi, prova:
<?php
foreach ($profiles as $aa){
ksm($aa->field_partita_iva->value);
ksm($aa->field_codice_funzionario->entity->label());
}
?>
nota che se il campo funzionario non è valorizzato avrai un errore (controlla con ->isEmpty() nel caso più completo).
non ci avevo proprio pensato
non ci avevo proprio pensato a entity->label
Una domanda chiarimento se possibile
Ho fatto varie prove e lasciato vuoto il foreach. In quanto serve solo come referenziaaione ed inserito direttamente nel return della funzione il codice del campo che m'interessa
Il ragionamento è giusto e il termine referenziare è esatto?
Non smetterò mai di ringraziarti per il supporto che ci dai su questo forum
Il foreach serve per fare
Il foreach serve per fare iterazioni su una collezione di elementi, se non lo utilizzi puoi eliminarlo. Non serve come "referenziazione". Ad esempio $aa->field_codice_funzionario->entity->id() restituisce un id che è utilizzabile per referenziare (far riferimento a) un'istanza dell'entità funzionario.
scusa mi sono espresso male.
scusa mi sono espresso male. Adesso ho capito che il termine referenziare serve per il collegamento al c.t. collegamenteo tramite campo entity reference.
A questo punto non riesco a capire dove ho sbagliato in un precedente post quando ti chiedevo come prendere i dati del profilo.
Tenendo presente la func scritta e funzionanate col foreach
function Profilo() {
$profiles = \Drupal::entityTypeManager()->getStorage('profile')->loadByProperties(['uid' => \Drupal::currentUser()->id()]);
if (!empty($profiles)) {
se scrivo
profiles->field_codice_funzionario->entity->label() .' - '. $profiles->field_anagrafica_funzionario->value;
mi ritorna errore
se scrivo
$aa = profiles;
$aa->field_codice_funzionario->entity->label() .' - '. $aa->field_anagrafica_funzionario->value;
mi ritorna errore
come faccio ad eliminare il foreach e prendere i valori di campi del profilo?
Nei giorni scorsi ci ho lavorato tanto ma non ci ho capito
loadByProperties ti
loadByProperties ti restituisce un array. Quindi o cicli su di esso o prendi un elemento preciso (ad esempio il primo se sei sicuro di non averne altri). Funzioni php come current(), array_unshift(), array_pop() possono venirti incontro. Credo che un approfondimento su Php prima che su Drupal sia fondamentale. Altrimenti si rischia di impiegare una vita a capire le cose oppure di imparare a farle meccanicamente senza poi riuscire a riprodurle correttamente.
Di buono c'è che in Drupal puoi, attraverso vari strumenti tra cui le viste e i token, ottenere ciò che ti serve senza necessariamente mettere mano al codice.
ok vedo le varie differenze
ok vedo le varie differenze su php e approfondirò come fare la stressa cosa con i token che ho visto essere comodi
Mi sono letto un po' di php.
Mi sono letto un po' di php. Letto ed usato le funzioi che mi hai consigliato ma non sono riuscito a capire come interagire con loro, in quanto per tutti le prove che ho fatto mi riporta sempre errore.,
Alla fine ho provaot i lcodice che normalmente uso per la form
echo $profiles['field_partita_iva']['value']['#value'];
Non mi ritorna errore ma anche nessun dato. Ho provato anche con label ma senza successo.
Per quel che ho capito il contenuto di profiles dovrebbe essere un array multidimensionale e ci si dovrebbe accedere con una semplice sintassi ed invece no.
Continuerò a studiare e cercare
$profiles è un array di
$profiles è un array di oggetti (profili). Ogni profilo ha vari metodi per accedere ai dati.
<?php
// prendi il primo profilo
$profile = current($profiles);
// print campo p. iva
\Drupal::messenger()->addMessage($profile->field_partita_iva->value);
?>
etc...
ho trovato current e letto
ho trovato current e letto cosa significa. Quando ho letto degli array php non sono proprio andato a pensare a current che legge il valore corrente dell'array.
Grazie ho imparato un'altra cosa