How to add custom variables
Bart Kooijman / 2019-11-24
2 min read
In Sitecore JSS you have two out of the box variables available in GraphQL: $contextItem and $datasource. In my current JSS project, which is an API-only solution, I added more variables. This simplified my queries and gave me a better understanding on how Sitecore implements GraphQL. Curious yet? Read along! I will demonstrate how to add a variable.
Steps
- Decompile this dll:
 
Sitecore.JavaScriptServices.GraphQL.dll
and find this resolver:
 Sitecore.JavaScriptServices.GraphQL.LayoutService.GraphQLAwareRenderingContentsResolver
Copy and paste the contents of ths resolver to a file in your solution.
- It's a lot of code, but focus on these lines:
 
  LocalGraphQLRequest request1 = new LocalGraphQLRequest();
  request1.Query = str;
  LocalGraphQLRequest request = request1;
  request.LocalVariables.Add("contextItem",
    global::Sitecore.Context.Item.ID.Guid.ToString());
  request.LocalVariables.Add("datasource", rendering.DataSource);
Here you can add a variable by adding this line:
  request.LocalVariables.Add("productId",
    HttpContext.Current.Request.QueryString["productId"] ?? string.Empty);
Now besides the variables $contextItem and $datasource, the variable $productId also is available. The new variable contains the value of the productId querystring parameter in the url.
- Next step, patch the config, for example like this:
 
<configuration
  xmlns:patch="http://www.sitecore.net/xmlconfig/"
  xmlns:set="http://www.sitecore.net/xmlconfig/set/">
  <sitecore>
    <layoutService>
      <configurations>
        <config name="jss">
          <rendering>
            <renderingContentsResolver
              patch:instead="*[@type='Sitecore.JavaScriptServices.GraphQL.LayoutService.GraphQLAwareRenderingContentsResolver, Sitecore.JavaScriptServices.GraphQL']"
              type="//Insert location of your custom code here, //Insert name of dll here"
              resolve="true">
              <IncludeServerUrlInMediaUrls>true</IncludeServerUrlInMediaUrls>
            </renderingContentsResolver>
          </rendering>
        </config>
      </configurations>
    </layoutService>
  </sitecore>
</configuration>
The above example alters the config of existing "jss" configuration. You can also add your own configuration. If you add a configuration with for example 'custom' as name. You can access it with the following url:
mydemosite.local/sitecore/api/layout/render/custom?...
- That's it! Now you can use the custom $productId variable in GraphQL Queries within Sitecore JSS. You can you use it to query Sitecore or even the SOLR-index directly, like the example below:
 
query ProductQuery($productId: String!) {
  search(fieldsEqual: [{ name: "_productid_s", value: $productId }]) {
    results {
      title: field(name: "title_s")
      description: field(name: "description_s")
    }
  }
}
Keep in mind I only used and tested this in Integrated / API only mode. Happy coding!