En este post voy a explicar como modificar el código de la gema vpim para poder introducir múltiples contactos en un solo archivo vcard. Para poder introducir múltiples contactos en un archivo vcard (.vcf) necesitamos tener separado cada contacto de esta manera:
BEGIN:VCARD
//atributos del contacto1 nombre, tlf...
END:VCARD
BEGIN:VCARD
//atributos del contacto2 nombre, tlf...
END:VCARD
.
.
.
BEGIN:VCARD
//atributos del contactoN nombre, tlf...
END:VCARD
La gema vpim no nos da esta opción por lo tanto tenemos que modificar un poco de código de la gema. Para ello tenemos que ir a la carpeta donde tenemos el código de la gema vpim instalado y modificamos el archivo vcard.rb. Añadimos tres funciones en la parte public: (las podeis llamar como queráis)
add_begin: que introduce la etiqueta BEGIN:VCARD
add_end: que introduce la etiqueta BEGIN:VCARD
add_name2: introduce un atributo N por cada contacto con su nombre
def add_begin
@card << Vpim::DirectoryInfo::Field.create( 'BEGIN', 'VCARD');
end
def add_end
@card << Vpim::DirectoryInfo::Field.create( 'END', 'VCARD' );
end
def add_name2
x = Vpim::Vcard::Name.new
fn = x.fullname
yield x
x.fullname.strip!
@card << x.encode
@card << x.encode_fn
self
end
El código del método del vcard_controller quedaría así:
def get_list_cards
ids = params[:ids]
contact_list = []
card = Vpim::Vcard.create
Vpim::Vcard::Maker.make2(card) do |maker|
ids.each do |id|
contact_list.push(User.find(id))
end
contact_list.each do |contact|
if contact_list.first != contact
#I need to introduce BEGIN:VCARD tag to separate contacts
maker.add_begin
end
#I call add_name2 to write a N attribute for each contact, because add_name default method only writes single N attribute each vcard file
maker.add_name2 do |name|
name.given = contact.user_info.name
end
maker.add_addr do |addr|
addr.location = 'home'
addr.street = contact.user_info.address_street
addr.locality = contact.user_info.address_city
addr.region = contact.user_info.address_state
addr.postalcode = contact.user_info.address_postalcode
end
if !contact.user_info.telephone.empty?
maker.add_tel(contact.user_info.telephone) do |tel|
tel.location = 'home'
tel.preferred = truedef get_list_cards
ids = params[:ids]
contact_list = []
card = Vpim::Vcard.create
Vpim::Vcard::Maker.make2(card) do |maker|
ids.each do |id|
contact_list.push(User.find(id))
end
contact_list.each do |contact|
if contact_list.first != contact
#I need to introduce BEGIN:VCARD tag to separate contacts
maker.add_begin
end
#I call add_name2 to write a N attribute for each contact, because add_name default method only writes single N attribute each vcard file
maker.add_name2 do |name|
name.given = contact.user_info.name
end
maker.add_addr do |addr|
addr.location = 'home'
addr.street = contact.user_info.address_street
addr.locality = contact.user_info.address_city
addr.region = contact.user_info.address_state
addr.postalcode = contact.us
end
end
if !contact.user_info.fax.empty?
maker.add_tel(contact.user_info.fax) do |tel|
tel.location = 'home'
tel.capability = 'fax'
end
end
maker.add_email(contact.email) do |e|
e.location = 'home'
end
if contact_list.last != contact
#I need to introduce END:VCARD tag to separate contacts
maker.add_end
end
end
end
send_data card.to_s, :filename => params[:event_name] + "("+params[:type]+").vcf"
end
No hay comentarios:
Publicar un comentario