[horde] only first initialization of preferences via hooks

Steffen skhorde at smail.inf.fh-bonn-rhein-sieg.de
Wed Mar 5 20:37:00 UTC 2014


Steffen wrote:
> On Tue, 4 Mar 2014, Michael M Slusarz wrote:
> 
>> Quoting Steffen <skhorde at smail.inf.fh-bonn-rhein-sieg.de>:
>>
>>> how do I initialize preferences of users via hooks, but then keep my
>>> hands off them for later logins? I use: horde 5.1.5 stable
>>
>> Explicitly save the value to the prefs backend - $prefs->setValue() -
>> before returning the value from the hook.
> 
> Hmm, I seem to mis-understand the purpose prefs_init() actually. :-)
> 
> I want to provide user-depended start values. setValue() does not help
> me, because it does not save the value to the prefs DB and it does not
> prevent prefs_init() to be called again. Can I explicitly commit my
> changes to the prefs DB?

setValue() does not cause the pref to be marked as "dirty", because
"init" is true. Therefore changes made are not committed to the storage
backend.
I have added a "forcesave" option to Horde/Prefs.php similiar to "nosave":

        $this->_scopes[$scope]->set($pref, $val);
        if (!empty($opts['forcesave'])) {
Horde::logMessage("setValue($pref,$val) = forcesave", 'ERR');
            $this->_scopes[$scope]->setDirty($pref, true);
        }
        if (!empty($opts['nosave'])) {
            $this->_scopes[$scope]->setDirty($pref, false);
        }

Then I use:
$GLOBALS['prefs']->setValue('fb_cals', $me, array('forcesave' => 1));

Now the pref is saved to the backend. But how is this achieved without
my hack?

The appauthenticated() hook won't work as well.

> I now switched to kronolith/fb_cals for testing, in order to ensure the
> pref is found in one scope only.
> 
> class Kronolith_Hooks
> {
>     public function prefs_init($pref, $value, $username, $scope_ob)
>     {
>             if (is_null($username)) {    // not logged in
>                 return $value;
>             }
> 
>         switch ($pref) {
>         case 'fb_cals':
>         $me = serialize(array('internal_fbz'));
>         $GLOBALS['prefs']->setValue('fb_cals', $me);
>         $scope_ob->set('fb_cals', $me);
>         if($fh = fopen('/tmp/hook.log', 'a')) {
>             fwrite($fh, print_r($GLOBALS['prefs'], true));
>             fwrite($fh, print_r($scope_ob, true)."\n");
>             fwrite($fh, "value=" . print_r($value, true)."\n");
>             fwrite($fh, "getValue()=" .
> print_r($GLOBALS['prefs']->getValue('fb_cals'), true)."\n");
>             fwrite($fh, "getDefault()=" . print_r($dflt, true)."\n");
>             fwrite($fh, "getDefault(scope)=" .
> print_r($scope_ob->getDefault('fb_cals'), true)."\n");
>             fclose($fh);
>         }
>         return $me;
> 
> I also added a logging statement into Horde_Prefs::setValue(), which shows
> that my values are passed on and that the scope is kronolith.
> The dump of $prefs shows:
> 
>     [fb_cals] => Array
>         (
>             [v] => a:1:{i:0;s:12:"internal_fbz";}
>             [d] =>
> a:2:{i:0;s:32:"internal_tlYSPxMIzwjT0YqX2fe5Tw4";i:1;s:16:"internal_fbz_eng";}
> 
>         )
> 
> The [d] setting corresponds to the values I selected in the GUI.
> The [v] setting corresponds to the value  I set in prefs_init().
> 
> After logoff the [d] value is storred in the prefs database still, but [v]
> has gone.
> 
> value=a:2:{i:0;s:12:"internal_fbz";i:1;s:16:"internal_fbz_eng";}
> getValue()=a:1:{i:0;s:12:"internal_fbz";}
> getDefault()=a:0:{}
> getDefault(scope)=a:2:{i:0;s:12:"internal_fbz";i:1;s:16:"internal_fbz_eng";}
> 
> 
> The 1st getDefault() is the value from prefs.php, the getDefault(scope) is
> the value from horde_prefs DB of the user, so is $value. getValue() is
> the string passed to $prefs->setValue() / $scope_ob->set().
> 


-- 
Steffen


More information about the horde mailing list