Foros del Web » Programando para Internet » ASPX (.net) »

AdRotator con fechas de visualización

Estas en el tema de AdRotator con fechas de visualización en el foro de ASPX (.net) en Foros del Web. Muy buenas. He creado un control personalizado heredado de un AdRotator, que me permite añadir un banner con Flash. He añadido en el fichero XML ...
  #1 (permalink)  
Antiguo 05/11/2010, 03:53
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
AdRotator con fechas de visualización

Muy buenas. He creado un control personalizado heredado de un AdRotator, que me permite añadir un banner con Flash. He añadido en el fichero XML dos etiquetas nuevas con la fecha en la que quiero que se empiece a mostrar el banner y con la fecha de finalización, tal y como se explica aquí:

Código XML:
Ver original
  1. <Ad>
  2.     ......
  3.     <StartDate>01/11/2010</StartDate>
  4.     <EndDate>30/11/2010</EndDate>
  5. </Ad>
Puedo manejar si está dentro de las fechas, pero no sé como hacer que salte a otro de los banners del XML:
Código vb:
Ver original
  1. Protected Overrides Sub OnAdCreated(ByVal e As AdCreatedEventArgs)
  2.             ....
  3.             If Not e.AdProperties("EndDate") Is Nothing Then
  4.                 fin = e.AdProperties("EndDate")
  5.                 If Today > fin Then
  6.                     'Banner caducado
  7.                    'Acción para saltar a otro
  8.                    Exit Sub
  9.                 End If
  10.             End If
  11.             If Not e.AdProperties("StartDate") Is Nothing Then
  12.                 ini = e.AdProperties("StartDate")
  13.                 If Today < ini Then
  14.                     'Banner aún no visible
  15.                    'Acción para saltar a otro
  16.                    Exit Sub
  17.                 End If
  18.             End If
  19.         End Sub
Gracias y un saludo
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 05/11/2010, 07:30
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: AdRotator con fechas de visualización

Se me ocurre una idea aunque es un poco drástica. Filtrar previamente los posibles banners a mostrar mediante un servicio web o una simple página sin HTML que devuelva un XML. Este XML es el que se indica como AdvertisementFile del AdRotator.

El proceso. Se lee el archivo XML original, se guarda en un DataSet, se filtra controlando las fechas y todo lo que se quiera y se genera una nuevo XML que será utilizado el AdRotator.

¿Podría resultar o es más sencillo buscar un método para lo que he expuesto antes?

Gracias de nuevo y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #3 (permalink)  
Antiguo 08/11/2010, 10:26
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: AdRotator con fechas de visualización

Buenas. He hecho la primera prueba con la opción del webservice.

He creado un WebService que devuelve un DataSet con los datos filtrados en formato stream. Al colocarlo en el atributo AvertisementFile:

AdvertisementFile="http://localhost:2749/dominio.ext/SW/banner.asmx/SeleccionaAnuncio?KeyWord=cabecera"

No es una ruta de acceso virtual válida.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #4 (permalink)  
Antiguo 08/11/2010, 10:29
 
Fecha de Ingreso: junio-2005
Mensajes: 70
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: AdRotator con fechas de visualización

y si utilizas LinQ to xml?, ahí puedes hacer consultas y podrías filtrar lo que necesites.
  #5 (permalink)  
Antiguo 08/11/2010, 12:48
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: AdRotator con fechas de visualización

Gracias por tu respuesta arcenett. Aunque no estoy familiarizado con LinQ, creo que la el problema no están en filtrar los resultados sino en que una vez filtrados se los asigne al control.

Este control es una control personalizado heredado de System.Web.UI.WebControls.AdRotator y la idea es definir el enlace a los datos válidos en el HTML y sólo en una etiqueta, sin recurrir a otros controles y que sea el propio control personalizado el que se encargue de gestionar los anuncios. Ejemplo:
<ControlesPersonalizados:AdRotatorFlash ID="cperAR" runat="server" AdvertisementFile="..." />
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #6 (permalink)  
Antiguo 08/11/2010, 13:07
 
Fecha de Ingreso: junio-2005
Mensajes: 70
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: AdRotator con fechas de visualización

claro ya entiendo, lo que pasa con el mensaje de error es que no le estas enviando un archivo .xml sino un dirección web (no se si tenga que ver, ya que por lo que he visto del adrotator se le configura un xml directamente), lo que podrías hacer en generar un xml y guardarlo en algún lugar de tu solución y darle esa ruta a la propiedad AdvertisementFile.


saludos.
  #7 (permalink)  
Antiguo 09/11/2010, 08:53
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: AdRotator con fechas de visualización

Esa sería una opción, pero tendría que ir generando el XML automáticamente cada día. Por otro lado, en lugar de usar el atributo AdvertisementFile creo que lo mejor sería recurrir a DataSource.

Sigo investigando y os cuento.
Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #8 (permalink)  
Antiguo 18/11/2010, 02:19
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: AdRotator con fechas de visualización

Bueno, por fin lo he solucionado. He cambiado radicalmente la lógica del funcionamiento del control personalizado y he hecho uso de base de datos y procedimientos almacenados en lugar de XML, aunque esto último, podría haber seguido siendo igual.

Primero el control, que en lugar de derivar de un AdRotator deriva de PlaceHolder, con un AdRotator como clase privada. No he hechos comentarios al código por lo que si alguien tiene alguna duda... que pregunte, por favor.

cpersAdRotatorFlash.vb
Código vb:
Ver original
  1. Imports System.ComponentModel
  2. Imports System.Data
  3. Imports System.Data.SqlClient
  4.  
  5. Namespace ControlesPersonalizados
  6.     ''' <summary>
  7.    ''' Control personalizado para soportar Flash y fechas de visualización en un control AdRotator.
  8.    ''' </summary>
  9.    ''' <remarks></remarks>
  10.    <DefaultProperty("Text"), _
  11. ToolboxData("<{0}:AdRotatorFlash runat=""server""></{0}:AdRotatorFlash>")> _
  12. Public Class AdRotatorFlash
  13.         Inherits System.Web.UI.WebControls.PlaceHolder
  14.  
  15.         Private _maxWidth As Unit
  16.         Private _keywordFilter As String
  17.         Public Property MaxWidth() As Unit
  18.             Get
  19.                 Return _maxWidth
  20.             End Get
  21.             Set(ByVal value As Unit)
  22.                 _maxWidth = value
  23.             End Set
  24.         End Property
  25.         Public Property KeywordFilter() As String
  26.             Get
  27.                 Return _keywordFilter
  28.             End Get
  29.             Set(ByVal value As String)
  30.                 _keywordFilter = value
  31.             End Set
  32.         End Property
  33.  
  34.         Private Class tmpAdRotator
  35.             Inherits AdRotator
  36.             Private _e As System.Web.UI.WebControls.AdCreatedEventArgs
  37.             Public ReadOnly Property EventArgs() As System.Web.UI.WebControls.AdCreatedEventArgs
  38.                 Get
  39.                     Return _e
  40.                 End Get
  41.             End Property
  42.  
  43.             Protected Overrides Sub OnAdCreated(ByVal e As System.Web.UI.WebControls.AdCreatedEventArgs)
  44.                 _e = e
  45.             End Sub
  46.  
  47.         End Class
  48.  
  49.         Private Function DTBanners(ByVal Keyword As String, Optional ByVal IsDefault As Boolean = False) As DataTable
  50.             Dim da As New SqlDataAdapter("PA_Anuncios", conSQL)
  51.             da.SelectCommand.CommandType = CommandType.StoredProcedure
  52.             da.SelectCommand.Parameters.AddWithValue("@keyword", Keyword)
  53.             da.SelectCommand.Parameters.AddWithValue("@isDefault", IsDefault.GetHashCode)
  54.             Dim dt As New DataTable
  55.             da.Fill(dt)
  56.             If dt.Rows.Count = 0 And IsDefault Then
  57.                 dt = DTBanners(Keyword, True)
  58.             End If
  59.             Return dt
  60.         End Function
  61.  
  62.         Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
  63.             Dim ar As New tmpAdRotator()
  64.             Dim dt As DataTable = DTBanners(KeywordFilter)
  65.             If dt.Rows.Count <> 0 Then
  66.                 ar.DataSource = dt
  67.                 ar.DataBind()
  68.                 ar.Target = "_blank"
  69.                 Me.Controls.Add(ar)
  70.                 Dim Height As Unit = CInt(ar.EventArgs.AdProperties("Height"))
  71.                 Dim Width As Unit = CInt(ar.EventArgs.AdProperties("Width"))
  72.                 If MaxWidth.ToString <> "" Then
  73.                     If ar.EventArgs.AdProperties("Width") > MaxWidth.Value Then
  74.                         Height = (MaxWidth.Value * Height.Value / Width.Value) - 5
  75.                         Width = MaxWidth
  76.                     End If
  77.                 End If
  78.                 ar.Target = _
  79.                     IIf(String.Format("{0}", ar.EventArgs.AdProperties("Target")) <> "", _
  80.                     ar.EventArgs.AdProperties("Target"), "_blank")
  81.                 If ar.EventArgs.ImageUrl.ToLower.IndexOf(".swf") <> -1 Then
  82.                     Dim StringFormat As StringBuilder = New StringBuilder("")
  83.                     StringFormat.Append("<object type='application/x-shockwave-flash' data='{2}' width='{0}' height='{1}'>")
  84.                     StringFormat.Append("<param name='movie' value='{2}' />")
  85.                     StringFormat.Append("<img src='{2}' width='{0}' height='{1}' alt='Publicidad' />")
  86.                     StringFormat.Append("</object>")
  87.                     Dim OutPutString As StringBuilder = New StringBuilder()
  88.                     OutPutString.AppendFormat(StringFormat.ToString, _
  89.                         Width, _
  90.                         Height, _
  91.                         ResolveUrl(ar.EventArgs.ImageUrl))
  92.                     writer.Write(OutPutString.ToString)
  93.                 Else
  94.                     Me.Controls.Clear()
  95.                     ar.Width = Width
  96.                     ar.Height = Height
  97.                     Me.Controls.Add(ar)
  98.                     MyBase.Render(writer)
  99.                 End If
  100.             End If
  101.         End Sub
  102.  
  103.     End Class
  104. End Namespace
Estructura de la tabla en SQL Server, "tblAnuncios":
Código TXT:
Ver original
  1. 3   ID  int 4   0  
  2. 0   ImageUrl    nvarchar    400 0  
  3. 0   NavigateUrl nvarchar    400 0  
  4. 0   AlternateText   nvarchar    400 1  
  5. 0   Keyword nvarchar    125 1  
  6. 0   Impressions int 4   1  
  7. 0   Width   int 4   1  
  8. 0   Height  int 4   1  
  9. 0   StartDate   smalldatetime   4   1  
  10. 0   EndDate smalldatetime   4   1  
  11. 0   Target  nvarchar    50  1  
  12. 0   IsDefault   bit 1   0
Procedimiento almacenado en SQL Server, "PA_Anuncios":
Código SQL:
Ver original
  1. ALTER PROCEDURE PA_Anuncios
  2. (
  3.     @keyword nvarchar(125),
  4.     @isDefault bit = 0
  5. )
  6. AS
  7. BEGIN
  8.     SELECT * FROM tblAnuncios
  9.     WHERE
  10.         Keyword = @keyword
  11.         AND
  12.         ISNULL(StartDate,0) <= CASE WHEN StartDate IS NULL THEN ISNULL(StartDate,0) ELSE GETDATE() END
  13.         AND
  14.         ISNULL(EndDate,0) >= CASE WHEN EndDate IS NULL THEN ISNULL(EndDate,0) ELSE DATEADD(DAY,-1, GETDATE()) END
  15.         AND
  16.         IsDefault = @isDefault
  17. END
Y finalmente, la inserción del control en el HTML:
Código HTML:
Ver original
  1. <ControlesPersonalizados:AdRotatorFlash ID="AdRotatorFlash1" runat="server" KeywordFilter="rotatorioMenu" MaxWidth="190" />
¿Pegas y/o sugerencias?

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #9 (permalink)  
Antiguo 19/11/2010, 02:11
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: AdRotator con fechas de visualización

He añadio una pequeña mejora para contar las veces que se muestra un banner.
Añado una nueva columna en la tabla "tblAnuncios":
Código TXT:
Ver original
  1. 1   AdCounter   int 4   0
Creo el procedimiento almacenado "PA_AnunciosContador"
Código SQL:
Ver original
  1. CREATE PROCEDURE PA_AnunciosContador (@id INT)
  2. AS
  3. BEGIN
  4. UPDATE tblAnuncios SET AdCounter = AdCounter + 1 WHERE ID = @id
  5. END
Y el control:
Código vb:
Ver original
  1. Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
  2.             Dim ar As New tmpAdRotator()
  3.             Dim dt As DataTable = DTBanners(KeywordFilter)
  4.             If dt.Rows.Count <> 0 Then
  5.                 ar.DataSource = dt
  6.                 ar.DataBind()
  7.                 ar.Target = "_blank"
  8.                 Me.Controls.Add(ar)
  9.                 Dim cmd As New SqlCommand("PA_AnunciosContador", conSQL)
  10.                 cmd.CommandType = CommandType.StoredProcedure
  11.                 cmd.Parameters.AddWithValue("@id", ar.EventArgs.AdProperties("ID"))
  12.                 Dim generado As Boolean = False
  13.                 Dim Height As Unit = CInt(ar.EventArgs.AdProperties("Height"))
  14.                 Dim Width As Unit = CInt(ar.EventArgs.AdProperties("Width"))
  15.                 If MaxWidth.ToString <> "" Then
  16.                     If ar.EventArgs.AdProperties("Width") > MaxWidth.Value Then
  17.                         Height = (MaxWidth.Value * Height.Value / Width.Value) - 5
  18.                         Width = MaxWidth
  19.                     End If
  20.                 End If
  21.                 ar.Target = _
  22.                     IIf(String.Format("{0}", ar.EventArgs.AdProperties("Target")) <> "", _
  23.                     ar.EventArgs.AdProperties("Target"), "_blank")
  24.                 If ar.EventArgs.ImageUrl.ToLower.IndexOf(".swf") <> -1 Then
  25.                     Dim StringFormat As StringBuilder = New StringBuilder("")
  26.                     StringFormat.Append("<object type='application/x-shockwave-flash' data='{2}' width='{0}' height='{1}'>")
  27.                     StringFormat.Append("<param name='movie' value='{2}' />")
  28.                     StringFormat.Append("<img src='{2}' width='{0}' height='{1}' alt='Publicidad' />")
  29.                     StringFormat.Append("</object>")
  30.                     Dim OutPutString As StringBuilder = New StringBuilder()
  31.                     OutPutString.AppendFormat(StringFormat.ToString, _
  32.                         Width, _
  33.                         Height, _
  34.                         ResolveUrl(ar.EventArgs.ImageUrl))
  35.                     writer.Write(OutPutString.ToString)
  36.                     generado = True
  37.                 Else
  38.                     Me.Controls.Clear()
  39.                     ar.Width = Width
  40.                     ar.Height = Height
  41.                     ar.ToolTip = ar.EventArgs.AdProperties("AlternateText")
  42.                     Me.Controls.Add(ar)
  43.                     MyBase.Render(writer)
  44.                     generado = True
  45.                 End If
  46.                 If generado Then
  47.                     Try
  48.                         cmd.Connection.Open()
  49.                         cmd.ExecuteNonQuery()
  50.                     Catch ex As Exception
  51.                         'No se gestiona la excepción
  52.                    Finally
  53.                         cmd.Connection.Close()
  54.                     End Try
  55.                 End If
  56.             End If
  57.         End Sub
Para otro día el control de clicks.

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:03.