Ferreteria/v0.5/stash/session

From Woozle Writes Code
< Ferreteria‎ | v0.5‎ | stash
Jump to navigation Jump to search
Ferreteria 0.5: the Session stash

About

This is one possible way of stashing. It's the one Ferreteria uses, in order to minimize use of cookies.

The stash array is encoded in JSON and stored in the user_session.Stash field.

Classes/Methods

Archive

2022-12-20 These methods from the Session CalcCard class were putting the Stash in the cookie, which... shouldn't be this class's job. I'm saving the code for reference before rewriting it.

    /*----
      ACTION: retrieves stash data from cookie and returns it
    */
    static protected function FetchStash() : array {
        $osStash = F\csAppCookie::GetValue(
          F\caApp::Me()->Config()::WPaths()::StashCookieAffix()
          );

        if ($osStash->HasIt()) {
            $sStash = $osStash->GetIt();
            $arStash = unserialize($sStash);
        } else {
            $arStash = array();
        }
        return $arStash;
    }
    /*----
      ACTION: stores the given stash data into browser cookie
    */
    static protected function StoreStash(array $ar) : void {
        $sStashKey = F\caApp::Me()->Config()::WPaths()::StashCookieAffix();
        #echo 'STASH AR:<pre>'.print_r($ar,TRUE); die();
        if (count($ar) > 0) {
            $sStashVal = serialize($ar);
            F\csAppCookie::SetValue($sStashKey,$sStashVal);
        } else {
            F\csAppCookie::ClearValue($sStashKey);
        }
    }
    /*----
      ACTION: sets a value in the local (memory) stash data
    */
    public function SetStashValue(string $sName,string $sValue) : void {
        $arStash = $this->FetchStash();
        $sApp = F\caApp::Me()->Config()::WPaths()::AppCookiePrefix();
        $arStash[$sApp][$sName] = $sValue;
        #echo 'STASH ARRAY:<pre>'.print_r($arStash,TRUE);
        $this->StoreStash($arStash);
    }
    // NOTE 2020-11-26 NULL values are sometimes getting stashed. Is there a reason for this?
    public function GetStashValue(string $sName) : string {
        $arStash = $this->FetchStash();
        $sApp = F\caApp::Me()->Config()::WPaths()::AppCookiePrefix();
        $arAppStash = F\csArray::Nz($arStash,$sApp,NULL);
        if (!is_array($arAppStash)) {
            if (is_null($arAppStash)) {
                // not sure why this happens, but treat it like there's no stash
                $sValue = NULL;
            } else {
                $sType = gettype($arAppStash);
                $s = "The app stash is supposed to be an array, but is a $sType instead.";
                $e = new F\except\cInternal($s);
                $e->AddDiagnostic("app key is [$sApp]");
                if (is_scalar($arAppStash)) {
                    $e->AddDiagnostic("app stash value is [$arAppStash]");
                }
                $e->AddDiagnostic('entire stash: '.F\csArray::Render($arStash));
                throw $e;
            }
        }
        $sValue = F\csArray::Nz($arAppStash,$sName);
        return is_null($sValue)?'':$sValue;
    }
    // ACTION: retrieve the value from the stash and remove it
    public function PullStashValue(string $sName) : string {
        $sValue = $this->GetStashValue($sName);
        #$this->ClearStashValue($sName);
        return $sValue;
    }
    // ACTION: delete the given value from the stash
    protected function ClearStashValue(string $sName) : void {
        $sApp = F\caApp::Me()->Config()::WPaths()::AppCookiePrefix();
        $arStash = $this->FetchStash();
        unset($arStash[$sApp][$sName]);
        $this->StoreStash($arStash);
    }