<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Adam Anderly</title>
	<atom:link href="https://anderly.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://anderly.com</link>
	<description>Husband, Father, Developer</description>
	<lastBuildDate>Fri, 18 Sep 2020 18:21:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">47051404</site>	<item>
		<title>Cross-Cutting Concerns with MediatR Pipeline Behaviors</title>
		<link>https://anderly.com/2019/12/12/cross-cutting-concerns-with-mediatr-pipeline-behaviors/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cross-cutting-concerns-with-mediatr-pipeline-behaviors</link>
					<comments>https://anderly.com/2019/12/12/cross-cutting-concerns-with-mediatr-pipeline-behaviors/#respond</comments>
		
		<dc:creator><![CDATA[Adam]]></dc:creator>
		<pubDate>Thu, 12 Dec 2019 16:41:14 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET Core]]></category>
		<category><![CDATA[MediatR]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[Fallback]]></category>
		<category><![CDATA[Polly]]></category>
		<category><![CDATA[Retry]]></category>
		<category><![CDATA[Scrutor]]></category>
		<guid isPermaLink="false">http://anderly.com/?p=541</guid>

					<description><![CDATA[<p>I&#8217;ve recently been exploring MediatR Pipeline Behaviors and cross-cutting concerns (logging, validation, security, transactions) but also wanted to tackle some performance and resilience scenarios that may not always apply to every request/command (retry, fallback and caching). Here are some gists that tackle these concerns: Caching Behavior (using ASP.NET Core IDistributedCache): For caching, I&#8217;m using a [&#8230;]</p>
<p>The post <a href="https://anderly.com/2019/12/12/cross-cutting-concerns-with-mediatr-pipeline-behaviors/">Cross-Cutting Concerns with MediatR Pipeline Behaviors</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve recently been exploring <a href="https://github.com/jbogard/MediatR">MediatR</a> Pipeline <a href="https://github.com/jbogard/MediatR/wiki/Behaviors">Behaviors</a> and cross-cutting concerns (logging, validation, security, transactions) but also wanted to tackle some performance and resilience scenarios that may not always apply to every request/command (retry, fallback and caching).</p>



<p>Here are some gists that tackle these concerns:</p>



<p><strong>Caching Behavior (using ASP.NET Core <a href="https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-3.1">IDistributedCache</a>):</strong></p>



<p>For caching, I&#8217;m using a separately defined CachePolicy similar to a <a href="https://fluentvalidation.net/">FluentValidation</a> Validator class.</p>


<p><script src="https://gist.github.com/anderly/9ccab0c57c593975f32cce3ad6430652.js"></script></p>


<p><strong>Fallback Behavior (using <a href="https://github.com/App-vNext/Polly">Polly</a>):</strong></p>



<p>For Fallback and Retry behavior, I&#8217;m using separate interfaces  IFallbackHandler and IRetryableRequest to get the behavior.</p>


<p><script src="https://gist.github.com/anderly/576aece4c7c37ce8a6cc1fc5a7f6bb9e.js"></script></p>


<p><strong>Retry Behavior (using <a href="https://github.com/App-vNext/Polly">Polly</a>):</strong></p>


<p><script src="https://gist.github.com/anderly/49f34162605d639a2a0c265bb5a0d00a.js"></script></p>


<p>These can all be combined as well and work based on the order they&#8217;re registered in Startup.cs. In my case, I want my main <strong>Handle </strong>method to retry, then, optionally, fallback to my <strong>HandleFallback</strong>, then finally cache the result based on the defined CachePolicy. </p>



<p>I&#8217;m debating between using separately defined classes/policies (like <a href="https://fluentvalidation.net/">FluentValidation</a> Validators) vs. making Handlers implement the interfaces to get the behavior. On one hand, if they&#8217;re separate, I could move the Cache, Fallback and Retry policies to separate files, folders, etc. and keep my main MediatR handlers very lean and clean. If you want to see them in the same place, you could put them in the same file like many of Jimmy Bogard&#8217;s <a href="https://github.com/jbogard/ContosoUniversityDotNetCore-Pages">examples</a> with <a href="https://github.com/jbogard/ContosoUniversityDotNetCore-Pages/blob/master/ContosoUniversity/Pages/Courses/Edit.cshtml.cs#L80">Validators</a>, etc. But if the files get too big and you want to separate them out, you could do that. However, with Retry and Fallback, it&#8217;s kind of nice seeing that with the main request handler.</p>



<p>Of course, all this gets wired-up and registered in <strong>Startup.cs</strong>. I&#8217;m using <a href="https://github.com/khellang/Scrutor">Scrutor</a> to aid in discovery my Caching, Fallback and Retry policies. See below.</p>


<p><script src="https://gist.github.com/anderly/53e3b98c440479a9171643a79d2720d7.js"></script></p>


<p>What do you think? Which approach do you prefer? Let me know in the comments.</p><p>The post <a href="https://anderly.com/2019/12/12/cross-cutting-concerns-with-mediatr-pipeline-behaviors/">Cross-Cutting Concerns with MediatR Pipeline Behaviors</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://anderly.com/2019/12/12/cross-cutting-concerns-with-mediatr-pipeline-behaviors/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">541</post-id>	</item>
		<item>
		<title>Laravel User Timezone Aware Trait</title>
		<link>https://anderly.com/2017/12/21/laravel-user-timezone-aware-trait/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=laravel-user-timezone-aware-trait</link>
					<comments>https://anderly.com/2017/12/21/laravel-user-timezone-aware-trait/#respond</comments>
		
		<dc:creator><![CDATA[Adam]]></dc:creator>
		<pubDate>Thu, 21 Dec 2017 17:36:21 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel Traits]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://anderly.com/?p=521</guid>

					<description><![CDATA[<p>Next up in the series on useful Laravel model traits is the UserTimezoneAware Trait. This trait is useful when you have dates on models that you need to display in the user&#8217;s timezone. &#60;pre class=&#34;lang:php decode:true&#34;&#62;// app\Traits\UserTimezoneAware.php namespace App\Traits; trait UserTimezoneAware { /** * The attribute name containing the timezone (defaults to &#34;timezone&#34;). * * [&#8230;]</p>
<p>The post <a href="https://anderly.com/2017/12/21/laravel-user-timezone-aware-trait/">Laravel User Timezone Aware Trait</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Next up in the series on <a href="http://anderly.com/category/laravel-traits/" target="_blank" rel="noopener noreferrer">useful Laravel model traits</a> is the <code data-enlighter-language="generic" class="EnlighterJSRAW">UserTimezoneAware</code> Trait.</p>
<p>This trait is useful when you have dates on models that you need to display in the user&#8217;s timezone.</p>
<pre data-enlighter-language="php" class="EnlighterJSRAW">
&lt;pre class=&quot;lang:php decode:true&quot;&gt;// app\Traits\UserTimezoneAware.php
namespace App\Traits;
trait UserTimezoneAware
{
    /**
     * The attribute name containing the timezone (defaults to &quot;timezone&quot;).
     *
     * @var string
     */
    public $timezoneAttribute = &#039;timezone&#039;;
     
    /**
     * Return the passed date in the user&#039;s timezone (or default to the app timezone)
     *
     * @return string
    */
    public function getDateToUserTimezone($date, $timezone = null)
    {
        if ($timezone == null) {
            if (Auth::check()) {
                $timezone = Auth::user()-&gt;timezone;
            } else {
                $timezone = Config::get(&#039;app.timezone&#039;);
            }
        }
        $datetime = new DateTime($date);
        $datetime-&gt;setTimezone(new datetimezone($timezone));
        
        return $datetime-&gt;format(&#039;c&#039;);
    }   
}

&lt;/pre&gt;
</pre>
<p>It&#8217;s a simple trait you can drop onto one of your eloquent models to add timezone support like so:</p>
<pre data-enlighter-language="php" class="EnlighterJSRAW">
&lt;pre class=&quot;lang:php decode:true&quot;&gt;// app\Models\User.php
namespace App\Models;

use App\Traits\UserTimezoneAware

class User
{
    use UserTimezoneAware;

    public function getLastLoginAttribute()
    {
        return $this-&gt;getDateToUserTimezone($this-&gt;attributes[&#039;last_login&#039;]);
    }
}
&lt;/pre&gt;
</pre>
<p>Now when you access the <code data-enlighter-language="generic" class="EnlighterJSRAW">$user-&gt;lastLogin</code> attribute anywhere in your app, you&#8217;ll get the date in the user&#8217;s timezone.</p>
<p>The UserTimezoneAware trait expects the model to have a <code data-enlighter-language="generic" class="EnlighterJSRAW">timezone</code> attribute. If your column/attribute is named something other than <code data-enlighter-language="generic" class="EnlighterJSRAW">timezone</code> simply override the <code data-enlighter-language="generic" class="EnlighterJSRAW">$timezoneAttribute</code> property on the <code data-enlighter-language="generic" class="EnlighterJSRAW">UserTimezoneAware</code> trait.</p>
<pre data-enlighter-language="php" class="EnlighterJSRAW">
&lt;pre class=&quot;lang:php decode:true&quot;&gt;namespace App\Models;

use App\Traits\UserTimezoneAware
 
class User
{
    use UserTimezoneAware;

    public $timezoneAttribute= &#039;time_zone&#039;;
}&lt;/pre&gt;
</pre>
<p>Enjoy!</p><p>The post <a href="https://anderly.com/2017/12/21/laravel-user-timezone-aware-trait/">Laravel User Timezone Aware Trait</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://anderly.com/2017/12/21/laravel-user-timezone-aware-trait/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">521</post-id>	</item>
		<item>
		<title>Useful Laravel Model Traits: Gravatar</title>
		<link>https://anderly.com/2016/09/09/useful-laravel-traits-gravatar/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=useful-laravel-traits-gravatar</link>
					<comments>https://anderly.com/2016/09/09/useful-laravel-traits-gravatar/#respond</comments>
		
		<dc:creator><![CDATA[Adam]]></dc:creator>
		<pubDate>Fri, 09 Sep 2016 14:38:45 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel Traits]]></category>
		<guid isPermaLink="false">http://anderly.com/?p=520</guid>

					<description><![CDATA[<p>Starting a little series here on useful Laravel model traits. This first one I use quite often. // app\Traits\HasGravatar.php namespace App\Traits; trait HasGravatar { /** * The attribute name containing the email address. * * @var string */ public $gravatarEmail = 'email'; /** * Get the model's gravatar * * @return string */ public function [&#8230;]</p>
<p>The post <a href="https://anderly.com/2016/09/09/useful-laravel-traits-gravatar/">Useful Laravel Model Traits: Gravatar</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Starting a little series here on <a href="http://anderly.com/category/laravel-traits/" target="_blank" rel="noopener noreferrer">useful Laravel model traits</a>.</p>
<p>This first one I use quite often.</p>
<pre class="lang:php decode:true">// app\Traits\HasGravatar.php
namespace App\Traits;

trait HasGravatar
{
    
    /**
     * The attribute name containing the email address.
     *
     * @var string
     */
    public $gravatarEmail = 'email';
    
    /**
     * Get the model's gravatar
     *
     * @return string
     */
    public function getGravatarAttribute()
    {
        $hash = md5(strtolower(trim($this-&gt;attributes[$this-&gt;gravatarEmail])));
        return "https://www.gravatar.com/avatar/$hash";
    }

}
</pre>
<p>It&#8217;s a simple trait you can drop onto one of your eloquent models to add gravatar support like so:</p>
<pre class="lang:php decode:true">// app\Models\User.php
namespace App\Models;

use App\Traits\HasGravatar

class User
{
    use HasGravatar;
}
</pre>
<p>Now you can do something like this in your blade views:</p>
<pre class="lang:php decode:true">&lt;img src="{{ Auth::user()-&gt;gravatar }}"&gt;

</pre>
<p>And you&#8217;ll get the gravatar.com URL you&#8217;re expecting. No need to create a gravatar column, variable, method, or anything else.</p>
<p><code><code></code></code></p>
<p>The HasGravatar Trait expects the model to have an <code data-enlighter-language="generic" class="EnlighterJSRAW">email</code> attribute. If your column/attribute is named something other than <code data-enlighter-language="generic" class="EnlighterJSRAW">email</code> simply override the <code data-enlighter-language="generic" class="EnlighterJSRAW">$gravatarEmail</code> property on the <code data-enlighter-language="generic" class="EnlighterJSRAW">HasGravatar</code> trait.</p>
<p><code><code></code></code></p>
<pre class="lang:php decode:true">namespace App\Models;

use App\Traits\HasGravatar

class User
{
    use HasGravatar;

    public $gravatarEmail = 'email_address';
}
</pre>
<p><code><code></code></code></p>
<p>Enjoy!</p><p>The post <a href="https://anderly.com/2016/09/09/useful-laravel-traits-gravatar/">Useful Laravel Model Traits: Gravatar</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://anderly.com/2016/09/09/useful-laravel-traits-gravatar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">520</post-id>	</item>
		<item>
		<title>Laravel Transformable &#8211; An Eloquent Model Trait for Consumable Models</title>
		<link>https://anderly.com/2016/09/08/laravel-transformable-a-model-trait-for-consumable-models/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=laravel-transformable-a-model-trait-for-consumable-models</link>
					<comments>https://anderly.com/2016/09/08/laravel-transformable-a-model-trait-for-consumable-models/#comments</comments>
		
		<dc:creator><![CDATA[Adam]]></dc:creator>
		<pubDate>Thu, 08 Sep 2016 21:37:31 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[APIs]]></category>
		<guid isPermaLink="false">http://anderly.com/?p=518</guid>

					<description><![CDATA[<p>In working on a new Laravel-based REST API over an existing database, I quickly realized the need to shield API consumers from my underlying database structure, especially since I knew the structure would be changing. This is a common concern in API design and many times I would turn to creating DTOs (Data Transfer Objects) [&#8230;]</p>
<p>The post <a href="https://anderly.com/2016/09/08/laravel-transformable-a-model-trait-for-consumable-models/">Laravel Transformable – An Eloquent Model Trait for Consumable Models</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>In working on a new Laravel-based REST API over an existing database, I quickly realized the need to shield API consumers from my underlying database structure, especially since I knew the structure would be changing. This is a common concern in API design and many times I would turn to creating DTOs (Data Transfer Objects) or transformer classes using either a scaled-down Transformer pattern or the excellent&nbsp;<a href="http://fractal.thephpleague.com/" target="_blank">Fractal</a> package. However, for this project time was of the essence so I needed a very quick way to simply provide a transformation map without having to create new transformer classes for each model and without having to update the <code>visible</code>&nbsp;and <code class="language-php">appends</code>&nbsp;attributes on every model.</p>
<p>Hence, the <code class="language-php">Transformable</code>&nbsp;trait was born. It&#8217;s a simple PHP trait that you drop into your model and then override the <code class="language-php">$transformation_map</code>&nbsp;property to specify your consumable model attributes.</p>
<p>Here&#8217;s an example:</p>
<pre class="lang:php decode:true">namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Traits\Transformable;

class Group extends Model
{
    use Transformable;

    protected $transformation_map = [
        'Group_ID' =&gt; 'id',
        'Name' =&gt; 'name',
        'PublicGroup' =&gt; 'public',
    ];
}
</pre>
<p>A quick explanation: we&#8217;re importing the Transformable trait (which I&#8217;ll cover shortly) and then we&#8217;re providing a database column name-to-consumable attribute name mapping. That&#8217;s it.</p>
<p>A consumer of this model will not see the underlying database column names on the left hand of the mapping such as &#8220;Group_ID&#8221;, &#8220;Name&#8221;, or &#8220;PublicGroup.&#8221; Instead, they&#8217;ll see the names on the right hand side: &#8220;id&#8221;, &#8220;name&#8221; and &#8220;public.&#8221; In essence, it&#8217;s a simple transformer.&nbsp;Here&#8217;s an example usage:</p>
<pre class="lang:php decode:true">use App\Models\Group;

class GroupsController
{
    public function index()
    {
        return Group::all();
    }
}
</pre>
<p>With a call to the above <code class="language-php">GroupsController@index</code> method, we&#8217;d end up with the following JSON:</p>
<pre class="lang:php decode:true">[
    {
        "id": 1,
        "name": "Group 1",
        "public": "0"
    },
    {
        "id": 2,
        "name": "Group 2",
        "public": "0"
    }
}
</pre>
<p>Additionally, we can create the model specifying the consumable attribute names (not the database column names):</p>
<pre class="lang:php decode:true">$group = new App\Models\Group(['name' =&gt; 'Group 3', 'public' =&gt; true]);

// Calling this
$group-&gt;toJson();

// Will yield this
{
    "id": 3,
    "name": "Group 3",
    "public":"1"
}
</pre>
<p>The magic of this is in the Transformable trait. Normally, to achieve this, we&#8217;d have to specify the <code class="language-php">$visible</code> and <code class="language-php">$appends</code> properties on our model and provide&nbsp;get and set mutators for each attribute mapping. Instead, with Transformable, we simply provide the <code class="language-php">$transformation_map</code> and the Transformable trait takes care of the rest.</p>
<p>It does this by overriding several methods of the Eloquent model that determine if get and set mutators exist to include checking the <code data-enlighter-language="generic" class="EnlighterJSRAW">$transformation_map</code> property. This is how it can return you an instance of your model as well as create an instance of your model with the consumable attribute names without you needing to specify&nbsp;the source database column names.</p>
<p>I&#8217;m working on an enhancement to Transformable to allow queries (i.e. where* methods) on the models so that you can query with the consumable attribute names and&nbsp;not the database column names. As soon as I wrap up those changes, I&#8217;ll look at making this a composer package.</p>
<p>Here&#8217;s the entire trait implementation:</p>
<pre class="lang:php decode:true">namespace App\Traits;

use Illuminate\Support\Str;

Trait Transformable
{
	protected $transformation_map = [];

    /**
     * Determine if a get mutator exists for an attribute.
     *
     * @param  string  $key
     * @return bool
     */
    public function hasGetMutator($key)
    {
        return $this-&gt;keyExistsInTransformationMap($key) || parent::hasGetMutator($key);
    }

    /**
     * Determine if a set mutator exists for an attribute.
     *
     * @param  string  $key
     * @return bool
     */
    public function hasSetMutator($key)
    {
        return $this-&gt;keyExistsInTransformationMap($key) || parent::hasSetMutator($key);
    }

    /**
     * Get the value of an attribute using its mutator.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return mixed
     */
    protected function mutateAttribute($key, $value)
    {
        if ($this-&gt;keyExistsInTransformationMap($key)) {
            return $this-&gt;{$this-&gt;getTransformationMapInverse()[$key]};
        }
        return parent::mutateAttribute($key, $value);
    }

    /**
     * Set a given attribute on the model.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return $this
     */
    public function setAttribute($key, $value)
    {
        if ($this-&gt;keyExistsInTransformationMap($key)) {
            if (method_exists($this, 'set'.Str::studly($key).'Attribute')) {
                parent::setAttribute($key, $value);
            }
            $key = $this-&gt;getTransformationMapInverse()[$key];
        }
        return parent::setAttribute($key, $value);
    }

    public function keyExistsInTransformationMap($key)
    {
        return array_key_exists($key, $this-&gt;getTransformationMapInverse());
    }

    public function getTransformationMapInverse()
    {
        return array_flip($this-&gt;transformation_map);
    }
}
</pre>
<p>This could certainly be enhanced further to support casting to/from datatypes and supporting compound properties via a Closure or similar.</p>
<p>Let me know what you think in the comments.</p><p>The post <a href="https://anderly.com/2016/09/08/laravel-transformable-a-model-trait-for-consumable-models/">Laravel Transformable – An Eloquent Model Trait for Consumable Models</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://anderly.com/2016/09/08/laravel-transformable-a-model-trait-for-consumable-models/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">518</post-id>	</item>
		<item>
		<title>Gravity Forms + Microsoft Dynamics CRM</title>
		<link>https://anderly.com/2015/09/02/gravity-forms-microsoft-dynamics-crm/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gravity-forms-microsoft-dynamics-crm</link>
					<comments>https://anderly.com/2015/09/02/gravity-forms-microsoft-dynamics-crm/#comments</comments>
		
		<dc:creator><![CDATA[Adam]]></dc:creator>
		<pubDate>Wed, 02 Sep 2015 21:57:43 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Plugins]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[Dynamics]]></category>
		<category><![CDATA[Dynamics CRM]]></category>
		<category><![CDATA[Gravity Forms]]></category>
		<category><![CDATA[Microsoft Dynamics CRM]]></category>
		<guid isPermaLink="false">http://anderly.com/?p=514</guid>

					<description><![CDATA[<p>I&#8217;ve been hard at work on a brand new WordPress plugin that brings you easy web-to-lead and web-to-contact forms for Microsoft Dynamics CRM through the powerful Gravity Forms plugin for WordPress. At my company, Saint Systems, we have a non-profit client that uses Office 365 and Microsoft Dynamics CRM plus WordPress for their front-end website. Initially [&#8230;]</p>
<p>The post <a href="https://anderly.com/2015/09/02/gravity-forms-microsoft-dynamics-crm/">Gravity Forms + Microsoft Dynamics CRM</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve been hard at work on a brand new WordPress plugin that brings you easy web-to-lead and web-to-contact forms for Microsoft Dynamics CRM through the powerful <a href="http://www.gravityforms.com/" target="_blank">Gravity Forms</a> plugin for WordPress.</p>
<p>At my company, <a href="http://www.saintsystems.com">Saint Systems</a>, we have a non-profit client that uses <a href="https://products.office.com/en-us/business/office" target="_blank">Office 365</a> and <a href="http://www.microsoft.com/en-us/dynamics/crm.aspx" target="_blank">Microsoft Dynamics CRM</a> plus WordPress for their front-end website. Initially we searched for an existing plugin, add-on or integration between Gravity Forms and Dynamics CRM to no avail. So, we decided to build one and scratch our own itch.</p>
<p><a href="http://www.saintsystems.com/products/gravity-forms-dynamics-crm-add-on/"><img fetchpriority="high" decoding="async" class="wp-image-551 size-full alignright" src="http://saintsystems.wpengine.netdna-cdn.com/wp-content/uploads/edd/2016/10/gravity-forms-dynamics-crm-add-on-logo.png" alt="Gravity Forms Dynamics CRM Add-On" width="300" height="225" /></a></p>
<p>The result is the <a href="http://www.saintsystems.com/products/gravity-forms-dynamics-crm-add-on/">Gravity Forms Dynamics CRM Add-On</a> &#8211; a WordPress plugin that allows you to quickly integrate Gravity Forms with Microsoft Dynamics CRM. Easily create leads or contacts in Microsoft Dynamics CRM when a form is submitted.</p>
<h2>Key Features</h2>
<ul>
<li>Quickly and easily integrate with Dynamics CRM when a form is submitted.</li>
<li>Create a lead in Dynamics CRM when a form is submitted.</li>
<li>Create a contact in Dynamics CRM when a form is submitted.</li>
<li>Update a lead in Dynamics CRM when a form is submitted.</li>
<li>Update a contact in Dynamics CRM when a form is submitted.</li>
<li>Choose a Dynamics CRM user as the lead or contact owner.</li>
<li>Avoid duplicates by checking for existing leads and contacts by email address.</li>
<li>Use Gravity Forms built-in Conditional Logic to only integrate with Dynamics CRM when you want to!</li>
</ul>
<p><del>We&#8217;re planning on an October 2015 release and are anxious to get it in your hands.</del> The plugin is now available for purchase.</p>
<p>Find out more about it on the <a href="http://www.saintsystems.com/products/gravity-forms-dynamics-crm-add-on/">Gravity Forms Dynamics CRM Add-On product page</a>.</p><p>The post <a href="https://anderly.com/2015/09/02/gravity-forms-microsoft-dynamics-crm/">Gravity Forms + Microsoft Dynamics CRM</a> first appeared on <a href="https://anderly.com">Adam Anderly</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://anderly.com/2015/09/02/gravity-forms-microsoft-dynamics-crm/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">514</post-id>	</item>
	</channel>
</rss>
