Ferreteria/v2/class/fcPageContent

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
< Ferreteria‎ | v2‎ | class
Revision as of 12:29, 26 April 2019 by Woozle (talk | contribs)
Jump to navigation Jump to search

Calls

Code

abstract class fcPageContent extends fcpeSimple {
    use ftExecutableTree, ftRenderableTree;
    
    // ++ RECORDS ++ //
    
    protected function GetSessionRecord() {
	return fcApp::Me()->GetSessionRecord();
    }
    
    // -- RECORDS -- //
    // ++ THRUPUT ++ //
    
    /*----
      PURPOSE: Adds a string to the main content.
	If the page is redirected before rendering, the content will be saved with the Session record
	and displayed after the redirect.
    */
    protected function AddString($s) {
	$sSaved = $this->GetValue();
	$sSaved .= $s;
	$this->SetValue($sSaved);
    }
    
    // -- THRUPUT -- //
    // ++ OUTPUT ++ //

    /*----
      NOTE: We shouldn't ever need to have RenderBefore()/RenderAfter() methods here.
	The only time this has come up so far, it turned out they belong in the page header.
	If we want to wrap the content in, say, <span> tags, then add a tag element node.
    */
    public function Render() {
	
	return
	  $this->RenderStashed()
	  .$this->RenderNodes()
	  .$this->GetValue()
	  ;
    }
    // PURPOSE: Render any content that was stashed for a redirect (typically result-status messages)
    protected function RenderStashed() {
	$rcSess = $this->GetSessionRecord();
	$out = $rcSess->PullStashValue('page contents');
	// 2017-05-25 At this point, I totally don't get why this is being called here:
	//$rcSess->Save();	maybe it should actually LOAD the data?
	return $out;
    }
    /*----
      ACTION: Save anything which should be preserved across a redirect, and then do the redirect.
      PUBLIC so linkable objects can redirect without losing content
      NEW
      HISTORY:
	2017-05-25 I previously did $rcSess->Save() after $rcSess->SetStashValue(), but this has proven to be
	  awkward since we don't have storage objects (at this level) to do the translation. I'm hoping this
	  is unnecessary in the short term; in the long term, it looks like we need a way to have storage objects
	  without a form.
    */
    public function DoStashedRedirect($url) {
	// save the current page contents for redisplay after redirect
	$s = $this->GetValue();	// get content that won't be displayed because we're redirecting
	$rcSess = $this->GetSessionRecord();
	$rcSess->SetStashValue('page contents',$s);
	//fcApp::Me()->ThrowCookies();
	//$rcSess->Save();	// write to persistent storage

	// now actually redirect
	fcHTTP::Redirect($url);
	die();	// stop doing stuff; we're redirecting
    }
    /*----
      ACTION: Redirect the browser to the same page (path only; no domain, ?query, or #fragment)
      PUBLIC so widgets (so far, just the login widget) can call it
      HISTORY:
	2017-02-04 written as a companion to RedirectToDefaultPage()
    */
    public function RedirectToSamePage() {
	$url = fcURL::GetCurrentString();
	$this->DoStashedRedirect($url);
    }
    /*----
      ACTION: Redirect the browser to a sensible default URL (currently the base page).
	Later we might try to figure out where we were before, and go back there.
      PUBLIC so widgets (so far, just the login widget) can call it
      HISTORY:
	2016-12-25 moved here from the login widget, because this is the content we want to save
	2017-02-04 renamed from RedirectToEraseRequest() -> RedirectToDefaultPage()
    */
    public function RedirectToDefaultPage() {
	$url = fcApp::Me()->GetKioskObject()->GetBasePath();	// until we can come up with something more fine-tuned
	$this->DoStashedRedirect($url);
    }
}