Newsgroup: it.comp.www.php
Titolo: Link ipertestuali in descrizioni testo

Premesse: uso postgresql 7.0.2, apache + php 4.0.6, ho due tabelle
(semplificando) come queste qui sotto.
create table programma (
    id              serial,
    nome            varchar(100) not null,
    versione        char(10),
    primary key(id),
    unique(nome, versione)
);
create table descrizioneProgramma (
    progId          int4 not null references programma(id) on update cascade on delete cascade,
    lingua          char(2) not null,
    testo           text,
    primary key(progId, lingua)
);
Ho un form dove faccio inserire agli utenti la descrizione dei programmi,
e vorrei che in questa descrizione si potessero fare richiami ad altri
programmi, facendoli apparire coem link al momento della visualizzazione.
Cioe', vorrei che l'utente possa scrivere
--- begin_descrizione --
Questo programma fa questo e quest'altro ed e' simile a
</link>Altro programma</link>
--- end_descrizione ---
e che al momento della visualizzazione (verso gli utenti finali)
appaia
Questo programma fa questo e quest'altro ed e' simile a
<a href="miapagina.php?id=$id">Altro programma</a>
Il problema sta nel come gestire questa cosa, e cosa far inserire
dentro <link></link>. I programmi possono, per motivi che sarebbe
lungo spiegare, cambiare id, e questo non e' un problema per il
campo descrizioneProgramma(progId) poiche' c'e' la clausola on
update cascade, pero' se io ad es. metto <link>id programma</link>
ovviamente il testo non si aggiornera' a cascata come i campi del
db. Inutile dire che anche nome programma e versione possono cambiare
ad es. se esce una nuova versione o se si fa una correzione al nome.
Vorrei sapere, prima di intraprendere qualche strada troppo contorta,
come gestireste la situazione, che riassumendo e':
- permettere l'inserimento di link ipertestuali nel testo delle
  descrizioni
- far si che il link punti sempre al programma originariamente inserito
  anche se l'id o la coppia (nome, versione) vengono aggiornati
Io al momento avevo studiato due soluzioni:
1) far inserire link del tipo <link>1</link> dentro il testo, inserendo
   poi i link numerati corrispondentemente in una tabella, in modo che
   questi possano puntare con la clausola references al campo
   programma(Id) o programma(nome, versione).
   In questo modo l'aggiornamento e' automatico, ma e' un po' scomodo
   per l'utente "inseritore"
2) far inserire nel testo link tipo <link>nome_programma-versione</link>,
   pero' a questo punto per ogni programma che viene modificato, dovrei
   fare una
   select progId from descrizioneProgramma where testo like '%$nome-$versione%'
   per sapere quali descrizioni di quali programmi devo andare ad
   aggiornare (in pratica farei io quello che fa in modo piu' efficiente
   il db :) )
Se avete soluzioni meno ingarbugliate ..
-- 
Ciao,           | Sostituisci "dontspam" con "softhome"
 Francesco      | nell'indirizzo email per avere quello corretto

"Francesco Cipriani" <f...@nwo.bbs> ha scritto nel messaggio
news:slrn9r33...@news.localhost...

Bel casino... se cambia sia ID, nome e versione allora non hai nessun punto
di riferimento...
forse ho un idea ma non so se dico qualcosa di giusto o una cavolata:
crei una tabella chiamata per esempio "links" e ci metti 2 campi:
- id_specificato
- id_variabile
dove id_specificato è l'id inserito fra <link> e </link> al submit del form
e id_variabile è il campo ID che cambia (come hai detto tu con la clausola
on update cascade).
Quindi se id in table programmi cambia, cambia anche
descrizioneProgramma(progID) e links(id_variabile)
Dopo di che quando estrai il testo del tipo:
$txt_estratto = "Questo programma blabla va usato con <link>1</link>";
fai:
$id_in_txt = eregi("<link>(.*)</link>");  // credo sia (.*) per 'grabbare'
il testo fra link e /link
$query = pg_query(" select * from links where id_specificato='$id_in_txt'
");
// ... qui estrai i dati dalla query e con $results[id_variabile] ti tiri
fuori i dati dalle altre tabelle (programma e descrizioneProgramma)
Spero di averti almeno indirizzato e di non aver detto sono cavolate!! :-)
fammi sapere
Alex

</link>Altro programma</link>
Ti serve per forza di cose un ProgID statico. Per esempio:
	ProgID	NomeProg	Versione	ID
	psp	PaintShop Pro	4.12		2873
...il giorno che il programma diventa "Paint Shop", e la versione 6.00,
e l'ID diventa 3821, non importa perche' il link ProgID resta "psp".
Basta aggiungere una colonna alla tabella dei programmi.
Leonardo
-- 
Nior thainig ar major i dtus an lae chugainn,
is ni rabhamar fein ann i gcoir na gceart
ach mar sheolfai aoireacht bo gan aoire,
ar thaobh na greine de Sliabh na mBan.

 il testo fra link e /link
Si si grabba grabba (a parte che manca un parametro in eregi :) ),
piu' che altro ci possono essere vari id, non mi ricordo se esiste
una funzione regex che te li da tutti quanti, controllero'
[..]
Anche il resto e' corretto, ed era una delle cose venutemi in mente,
pero', boh, ho in testa che si puo' fare di meglio, ma non so come :)


 Basta aggiungere una colonna alla tabella dei programmi.
Non fa una piega :), unica cosa essendo molti programmi all'atto
dell'inserimento si dovrebbe controllare che lo static_id non sia
duplicato, e potrebbe capitare varie volte di metterne di duplicati,
essendo i programmi qualche centinaio.
Se lo genero automaticamente mi verrebbero fuori delle schifezze,
direi, a questo punto gli assegno un numero, che pero' stavolta non
cambia, e buonanotte.
Diciamo che in realta' il difetto iniziale sta nel fatto che l'id
cambi, e dico questo perche' l'id cambia poiche' come metodo di
modifica, per non controllare quali sono stati i dati modificati
(ci sono molte tabelle collegate a programma), cancello l'id
(e quindi tutte i record collegati) e reinserisco, sfruttando le
routine che uso anche per l'inserimento :)
Non parliamo poi di quando un programma linkato viene cancellato ...
Certo questa soluzione della colonna aggiuntiva e' piu' efficiente
dell'aggiunta di una tabella link, pero' con quella potevo essere
in grado di identificare descrizioni in cui c'erano link mancanti
senza parsarmele tutte, ma con una sola select
