Exemple #1
0
        /// <summary>
        /// Handles the CommunicateClick event of the Actions control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void Actions_CommunicateClick( object sender, EventArgs e )
        {
            OnGridRebind( e );

            if ( !string.IsNullOrWhiteSpace( PersonIdField ) )
            {
                // Set Sender
                var rockPage = Page as RockPage;
                if ( rockPage != null )
                {
                    var communication = new Rock.Model.Communication();
                    communication.Status = Model.CommunicationStatus.Transient;

                    if ( rockPage.CurrentPersonId.HasValue )
                    {
                        communication.SenderPersonId = rockPage.CurrentPersonId.Value;
                    }

                    if ( this.DataSource is DataTable || this.DataSource is DataView )
                    {
                        communication.AdditionalMergeFields = CommunicateMergeFields;

                        DataTable data = null;

                        if ( this.DataSource is DataTable )
                        {
                            data = (DataTable)this.DataSource;
                        }
                        else if ( this.DataSource is DataView )
                        {
                            data = ( (DataView)this.DataSource ).Table;
                        }

                        foreach ( DataRow row in data.Rows )
                        {
                            int? personId = null;
                            var mergeValues = new Dictionary<string, string>();
                            for ( int i = 0; i < data.Columns.Count; i++ )
                            {
                                if ( data.Columns[i].ColumnName == this.PersonIdField )
                                {
                                    personId = (int)row[i];
                                }

                                if ( CommunicateMergeFields.Contains( data.Columns[i].ColumnName ) )
                                {
                                    mergeValues.Add( data.Columns[i].ColumnName, row[i].ToString() );
                                }
                            }

                            if ( personId.HasValue )
                            {
                                var recipient = new Rock.Model.CommunicationRecipient();
                                recipient.PersonId = personId.Value;
                                recipient.AdditionalMergeValues = mergeValues;
                                communication.Recipients.Add( recipient );
                            }
                        }
                    }
                    else
                    {
                        CommunicateMergeFields.ForEach( f => communication.AdditionalMergeFields.Add( f.Replace( '.', '_' ) ) );

                        // get access to the List<> and its properties
                        IList data = (IList)this.DataSource;
                        Type oType = data.GetType().GetProperty( "Item" ).PropertyType;

                        PropertyInfo idProp = oType.GetProperty( this.PersonIdField );
                        if ( idProp != null )
                        {
                            foreach ( var item in data )
                            {
                                var recipient = new Rock.Model.CommunicationRecipient();
                                recipient.PersonId = (int)idProp.GetValue( item, null );

                                foreach ( string mergeField in CommunicateMergeFields )
                                {
                                    object obj = item.GetPropertyValue( mergeField );
                                    if ( obj != null )
                                    {
                                        recipient.AdditionalMergeValues.Add( mergeField.Replace( '.', '_' ), obj.ToString() );
                                    }
                                }

                                communication.Recipients.Add( recipient );
                            }
                        }
                    }

                    var service = new Rock.Model.CommunicationService();
                    service.Add( communication, rockPage.CurrentPersonId );
                    service.Save( communication, rockPage.CurrentPersonId );

                    Page.Response.Redirect( string.Format( CommunicationPageRoute, communication.Id ), false );
                    Context.ApplicationInstance.CompleteRequest();
                }
            }
        }