[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