lunes, 5 de diciembre de 2011

Modificar la gem Vpim para introducir múltiples contactos en un solo archivo vcard

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