We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 29597 ☆ A M B ☆
    • 350 Posts
    In my themes I use a settings.resolver.php file to set custom settings like this:

    Client Config setting
    $analytics = $modx->getObject('cgSetting', array('key' => 'solo.analytics'));
    if (!$analytics) { 
      $analytics = $modx->newObject('cgSetting');
      $analytics->fromArray(array(
        'key' => 'solo.analytics',
        'label' => 'Google Analytics code',
        'xtype' => 'textfield',
        'description' => 'Fill in your Google Analytics Tracking ID (like UA-XXXXXXX-X) to activate Analytics.',
        'is_required' => '0',
        'sortorder' => '5',
        'value' => '',
        'group' => $soloSiteSettings->get("id")
      ));
      $analytics->save();
    }


    Site setting
    $setSiteName = $modx->getOption('change_sitename', $options, false);
    if ($setSiteName) {
      $siteName = $modx->getOption('sitename', $options);
      $modx->log(xPDO::LOG_LEVEL_INFO,'Setting site name to: ' . $siteName);
      $setting = $modx->getObject('modSystemSetting','site_name');
      $setting->set('value', $siteName);
      $setting->save();
    }


    My question is:

    How do I set a custom context setting in this resolver?

    This question has been answered by multiple community members. See the first response.

      MODX Ambassador (NL) | Responsive web design specialist, developer & speaker
      DESIGNfromWITHIN, MPThemes and Any Screen Size
      Follow me on Twitter | Read my blog | My code on GitHub
      • 3749
      • 24,544 Posts
      Do you need to create the setting, or just set it's value?

      If you just want to set the value and you know the setting's key, you can do this:

      $key = 'some_setting_key';
      $setting = $modx->getObject('modContextSetting', array('key' => $key));
      
      if ($setting) {
          $setting->set('value', 'myvalue');
          $setting->save();
      } else {
          $modx->log(modX::LOG_LEVEL_ERROR, 'No setting with key ' $key . ' found');
      }
        Did I help you? Buy me a beer
        Get my Book: MODX:The Official Guide
        MODX info for everyone: http://bobsguides.com/modx.html
        My MODX Extras
        Bob's Guides is now hosted at A2 MODX Hosting
        • 29597 ☆ A M B ☆
        • 350 Posts
        Thank Bob!

        Just one more question, where do I target a specific Context?
        Lets say I have the following contexts:


        • web
        • nl

        And I want so set [[++error_page]] at a package install for both contexts as a context setting.
          MODX Ambassador (NL) | Responsive web design specialist, developer & speaker
          DESIGNfromWITHIN, MPThemes and Any Screen Size
          Follow me on Twitter | Read my blog | My code on GitHub
        • discuss.answer
          • 3749
          • 24,544 Posts
          Something like this should do it:

          /* Set desired value for error page */
          $errorPage = $modx->getOption('error_page');
          
          /* Or just $errorPage = 12 */
          
          
          $contexts = array('nl', 'web');
          
          foreach ($contexts as $context) {
              /* Get setting if it exists */
              $setting = $modx->getObject('modContextSetting',
                  array(
                      'context_key' => $context,
                      'key' => 'error_page',
                  )
              );
          
              if (! $setting) {
                  /* Create setting */
                  $setting = $modx->newObject('modContextSetting');
          
                  $setting->set('context_key', $context);
                  $setting->set('key', 'error_page');
              )
          
              /* Set value and save */
              $setting->set('value', $errorPage);
              $setting->save();
          
          }
            Did I help you? Buy me a beer
            Get my Book: MODX:The Official Guide
            MODX info for everyone: http://bobsguides.com/modx.html
            My MODX Extras
            Bob's Guides is now hosted at A2 MODX Hosting
            • 29597 ☆ A M B ☆
            • 350 Posts
            Thanks Bob, getting close but I get this error on install of my package:


            Console running...
            Attempting to install package with signature: modx_start-1.0.0-pl
            Package found...now preparing to install.
            Grabbing package workspace...
            Workspace environment initiated, now installing package...
            Skipping vehicle object of class modContextSetting (data object exists and cannot be upgraded); criteria: Array ( [key] => MODX Start )
            Attempting to preserve files at E:/Projects/localhost/test/core/components/modx_start into archive E:/Projects/localhost/test/core/packages/modx_start-1.0.0-pl/modCategory/6d64d29e2a5deddfd631b3c4f583b742.0.preserved.zip
            Attempting to preserve files at E:/Projects/localhost/test/assets/components/modx_start into archive E:/Projects/localhost/test/core/packages/modx_start-1.0.0-pl/modCategory/6d64d29e2a5deddfd631b3c4f583b742.1.preserved.zip

            Any idea why?

            My resolver:

            <?php
            $modx =& $object->xpdo;
            
            $setSiteName = $modx->getOption('change_sitename', $options, false);
            if ($setSiteName) {
              $siteName = $modx->getOption('sitename', $options);
              $modx->log(xPDO::LOG_LEVEL_INFO,'Setting site name to: ' . $siteName);
              $setting = $modx->getObject('modSystemSetting','site_name');
              $setting->set('value', $siteName);
              $setting->save();
            }
            
            $addCorePages = $modx->getOption('add_core_pages', $options, false);
            if ($addCorePages) {
              $modx->log(xPDO::LOG_LEVEL_INFO,'Setting Error Page ID to 2 in site settings.');
              $errorPage = $modx->getObject('modSystemSetting','error_page');
              $errorPage->set('value', '2');
              $errorPage->save();
              $modx->log(xPDO::LOG_LEVEL_INFO,'Setting Default Template to 2 in site settings.');
              $default_template = $modx->getObject('modSystemSetting','default_template');
              $default_template->set('value', '2');
              $default_template->save();
              $modx->log(xPDO::LOG_LEVEL_INFO,'Setting Site Unavailable page ID to 3 in site settings.');
              $site_unavailable_page = $modx->getObject('modSystemSetting','site_unavailable_page');
              $site_unavailable_page->set('value', '3');
              $site_unavailable_page->save();
              $modx->log(xPDO::LOG_LEVEL_INFO,'Setting Unauthorized Page ID to 4 in site settings.');
              $unauthorized_page = $modx->getObject('modSystemSetting','unauthorized_page');
              $unauthorized_page->set('value', '4');
              $unauthorized_page->save();
            
              /* Add context setting 1 */
              $contexts = array('web');
              $errorPage = $modx->getOption('error_page');
              foreach ($contexts as $context) {
                /* Get setting1 if it exists */
                $setting1 = $modx->getObject('modContextSetting',
                    array(
                        'context_key' => $context,
                        'key' => 'error_page',
                    )
                );
                if (! $setting1) {
                    /* Create setting */
                    $setting1 = $modx->newObject('modContextSetting');
                    $setting1->set('context_key', $context);
                    $setting1->set('key', 'error_page');
                )
                /* Set value and save */
                $setting1->set('value', $errorPage);
                $modx->log(xPDO::LOG_LEVEL_INFO,'Setting error_page to 2 for web context');
                $setting1->save();
              }
            }
            $modx->log(xPDO::LOG_LEVEL_INFO,'Finished adding site settings');
            return true;
            
              MODX Ambassador (NL) | Responsive web design specialist, developer & speaker
              DESIGNfromWITHIN, MPThemes and Any Screen Size
              Follow me on Twitter | Read my blog | My code on GitHub
            • discuss.answer
              • 3749
              • 24,544 Posts
              It may be because you have UPDATE_OBJECT set to false in the attributes for the context setting in your build.transport.php file. That's typical with settings because you don't want to revert a setting that the user has changed.

              I don't think your resolver is throwing that error. I think it's happening when it tries to install the context setting and it already exists. I could be wrong. If I'm right, the resolver should still be changing the setting for you and the message can be ignored.

              Since you're intending to change the setting, changing UPDATE_OBJECT to true shouldn't hurt anything and should prevent the message from appearing.
                Did I help you? Buy me a beer
                Get my Book: MODX:The Official Guide
                MODX info for everyone: http://bobsguides.com/modx.html
                My MODX Extras
                Bob's Guides is now hosted at A2 MODX Hosting