Source: show.php

last updated: 5 Aug 2007
author: KlenWell

note: the code has not yet been tested (I need to upgrade to the latest version before I'll be able to test it)

<?php
/**
 * show.php refactored to controller model
 *
 * This is based on revision #637 (http://wush.net/trac/wikka/changeset/637)
 *
 * For more info, see http://wikkawiki.org/KlenWell
 *  
 *
 * @package     Handlers
 * @subpackage  Page
 * @version     $Id$
 * @license     http://www.gnu.org/copyleft/gpl.html GNU General Public License
 * @filesource
 *
 * @uses        Config::$anony_delete_own_comments
 * @uses        Config::$hide_comments
 * @uses        Wakka::Format()
 * @uses        Wakka::FormClose()
 * @uses        Wakka::FormOpen()
 * @uses        Wakka::GetConfigValue()
 * @uses        Wakka::GetPageTag()
 * @uses        Wakka::GetUser()
 * @uses        Wakka::GetUserName()
 * @uses        Wakka::HasAccess()
 * @uses        Wakka::Href()
 * @uses        Wakka::htmlspecialchars_ent()
 * @uses        Wakka::LoadComments()
 * @uses        Wakka::LoadPage()
 * @uses        Wakka::LoadUser()
 * @uses        Wakka::UserIsOwner()
 */

 
// *** Show Flags for Controller
$_SHOW['page_start'] = 0;
$_SHOW['no_access'] = 0;
$_SHOW['not_exists'] = 0;
$_SHOW['page_body'] = 0;
$_SHOW['revision_info'] = 0;
$_SHOW['revision_edit_form'] = 0;
$_SHOW['comments'] = 0;
$_SHOW['hidden_comments'] = 0;
$_SHOW['no_comments'] = 0;
$_SHOW['comment_form'] = 0;
$_SHOW['page_close'] = 0;

// *** HTML Blocks
$_HTML['page'] = '';
$_HTML['page_start'] = '';
$_HTML['no_access'] = '';
$_HTML['not_exists'] = '';
$_HTML['revision_info'] = '';
$_HTML['page_body'] = '';
$_HTML['revision_edit_form'] = '';
$_HTML['page_close_div'] = '';
$_HTML['comments_header'] = '';
$_HTML['comments'] = '';
$_HTML['comment_form'] = '';
$_HTML['hidden_comments'] = '';
$_HTML['page_close'] = '';



// *** displayComments function
function displayComments(&$obj, &$comments, $tag)
{
    $current_user = $obj->GetUserName();
    $is_owner = $obj->UserIsOwner();
    $prev_level = null;
    $threaded = 0;
    if ($_SESSION['show_comments'][$tag] == COMMENT_ORDER_THREADED)
    {
        $threaded = 1;
    }

    ?>
    <div class="commentscontainer">
    <?php
    foreach ($comments as $comment)
    {
        # Handle legacy or non-threaded comments
        if (!isset($comment['level']) || !$threaded)
        {
            $comment['level'] = 0;
        }

        # Keep track of closing <div> tags to effect nesting
        if (isset($prev_level) && ($comment['level'] <= $prev_level))
        {
            for ($i=0; $i<$prev_level-$comment['level']+1; ++$i)
            {
                echo '</div><!--closing comment level '.$i.'-->'."\n";
            }
        }

        # Alternate light/dark comment styles per level
        $comment_class = '';
        if ($comment['level'] % 2 == 1)
        {
            $comment_class = "comment-layout-1";
        }
        else
        {
            $comment_class = "comment-layout-2";
        }

        if ($comment['status'] == 'deleted') {
?>
    <div class="<?php echo $comment_class ?>">
        <div class="commentdeleted"><?php echo COMMENT_DELETED_LABEL ?></div>
<?php
        }
        else
        {
            # Some stats
            $comment_author = $obj->FormatUser($comment['user']);
            //$comment_author = $obj->LoadUser($comment['user'])? $obj->Format($comment['user']) : $comment['user'];
            $comment_ts = sprintf(COMMENT_TIME_CAPTION,$comment['time']);
?>
    <div id="comment_<?php echo $comment['id'] ?>" class="<?php echo $comment_class ?>" >
        <div class="commentheader">
        <div class="commentauthor"><?php echo COMMENT_BY_LABEL.$comment_author ?></div>
        <div class="commentinfo"><?php echo $comment_ts ?></div>
        </div>
        <div class="commentbody">
        <?php echo $comment['comment'] ?>
        </div>
<?php
            if ($obj->HasAccess('comment_post'))
            {
                echo '<div class="commentaction">';
                echo $obj->FormOpen("processcomment");
?>
        <input type="hidden" name="comment_id" value="<?php echo $comment['id'] ?>" />
<?php
?>
        <input type="submit" name="submit" value="<?php echo COMMENT_REPLY_BUTTON ?>" />
<?php
                $user = $obj->GetUser();
                if (isset($user))
                {
                    $name = $user['name'];
                }
                if ($is_owner || $name == $comment['user'] || ($obj->config['anony_delete_own_comments'] && $current_user == $comment['user']))
                {
?>
        <input type="submit" name="submit" value="<?php echo COMMENT_DELETE_BUTTON ?>" />
<?php
                }
                echo $obj->FormClose();
                echo "</div>";
            }
        }
        $prev_level = $comment['level'];
    }
    for ($i=0; $i<$prev_level+1; ++$i)
    {
        print '</div><!--closing comment level (end)-->'."\n";
    }
    ?>
    </div>
    <?php
}



// *** Controller

    // Default Shows
    $_SHOW['page_start'] = 1;
    $_SHOW['page_close'] = 1;

    // Has Page Access
    if (!$this->HasAccess('read'))
    {
        $_SHOW['no_access'] = 1;
    }

    // Page Exists
    if ( !$this->page )
    {
        $_SHOW['not_exists'] = 1;
    }
    else
    {
        $_SHOW['page_body'] = 1;
    }
   
    // As Revision
    if ($this->page['latest'] == 'N')
    {
        $_SHOW['revision_info'] = 1;
    }

    // Revision w/ write access
    if ( ($this->page['latest'] == 'N' && $this->HasAccess('write')) && ($latest = $this->LoadPage($this->tag))  )
    {
        $_SHOW['revision_edit_form'] = 1;
    }
   
    // Show Comment Form
    if ( $this->GetConfigValue('hide_comments') != 1 )
    {
        // get page tag
        $tag = $this->GetPageTag();
       
        // session settings?
        if ( !isset($_SESSION['show_comments'][$tag]) && $this->UserWantsComments($tag) !== FALSE )
        {
            $_SESSION['show_comments'][$tag] = $this->UserWantsComments($tag);
        }
       
        // GET setting takes precedence
        if ( isset($_GET['show_comments']) ) #312
        {
            switch($_GET['show_comments'])
      {
        case COMMENT_NO_DISPLAY:
          $_SESSION['show_comments'][$tag] = COMMENT_NO_DISPLAY;
          break;
        case COMMENT_ORDER_DATE_ASC:
          $_SESSION['show_comments'][$tag] = COMMENT_ORDER_DATE_ASC;
          break;
        case COMMENT_ORDER_DATE_DESC:
          $_SESSION['show_comments'][$tag] = COMMENT_ORDER_DATE_DESC;
          break;
        case COMMENT_ORDER_THREADED:
          $_SESSION['show_comments'][$tag] = COMMENT_ORDER_THREADED;
          break;
      }
        }
       
        if ( isset($_SESSION['show_comments'][$tag]) && ($_SESSION['show_comments'][$tag] != COMMENT_NO_DISPLAY) )
        {
            $_SHOW['comment_form'] = 1;
        }
        else
        {
            $_SHOW['hidden_comments'] = 1;
        }
    }
   
    // Show Comments?
    $comments = $this->LoadComments($this->tag);
    if ( $_SESSION['show_comments'][$tag] && $comments )
    {
        $_SHOW['comments'] = 1;
    }
 
  // Comment Post?
  if ( $this->HasAccess('comment_post') )
  {
    $_SHOW['comment_post'] = 1;
  }
               
   
   
   
// *** Viewer Blocks

// Page Start
if ( $_SHOW['page_start'] )
{
    $_js = ( ($user = $this->GetUser()) && ($user['doubleclickedit'] == 'N') || !$this->HasAccess('write') ) ? '' : 'ondblclick="document.location=\''.$this->Href('edit').'\';" ';

    $_HTML['page_start'] = <<<HTML

<!--starting page content-->
<div class="page" {$_js }>

HTML;
}


// Generic
if ( $_SHOW['no_access'] )
{
  $inner = '<p><em class="error">'.WIKKA_ERROR_ACL_READ.'</em></p>';
    $_HTML['no_access'] = <<<HTML
   
$inner
</div>
<!--closing page content-->

HTML;

}


// Page does not exist yet
if ( $_SHOW['not_exists'] )
{
  $createlink = '<a href="'.$this->Href('edit').'">'.WIKKA_PAGE_CREATE_LINK_DESC.'</a>';
  $inner = '<p>'.sprintf(SHOW_ASK_CREATE_PAGE_CAPTION,$createlink).'</p>';
 
    $_HTML['not_exists'] = <<<HTML
   
$inner
</div>
<!--closing page content-->
   

HTML;

}


// Revision Info
if ( $_SHOW['revision_info'] )
{
    $pagelink = '<a href="'.$this->Href().'">'.$this->tag.'</a>';
    $inner = '<div class="revisioninfo">'.sprintf(SHOW_OLD_REVISION_CAPTION,$pagelink,$this->Link($this->tag, 'revisions', $this->page['time']));

    $_HTML['revision_info'] = <<<HTML

$inner
</div>

HTML;

}


// Page Body
if ( $_SHOW['page_body'] )
{
    $_HTML['page_body'] = $this->Format($this->page['body'], 'wakka', 'page');
    $_HTML['page_close_div'] = "\n".'</div><!--closing page content-->'."\n\n";
}


// Revision Edit Form
if ( $_SHOW['revision_edit_form'] )
{
    $form_start = $this->FormOpen('edit');
    $lid = $latest['id'];
    $hvalue = $this->htmlspecialchars_ent($this->page['body']);
  $svalue = SHOW_RE_EDIT_BUTTON;
    $form_close = $this->FormClose();
   
    $_HTML['revision_edit_form'] = <<<HTML
   
<br />
$form_start
<input type="hidden" name="previous" value="$lid" />
<input type="hidden" name="body" value="$hvalue" />
<input type="submit" value="$svalue" />
$form_close
   
HTML;

}


// Comments Header and Form
if ( $_SHOW['comment_form'] )
{
    $href = $this->Href('', '', 'show_comments=0');
   
    $_HTML['comments_header'] = <<<HTML

<div class="commentsheader">
<span id="comments">&nbsp;</span>Comments [<a href="$href">Hide comments/form</a>]
</div>

HTML;

    $form_start = $this->FormOpen('addcomment');
    $form_close = $this->FormClose();

    $_HTML['comment_form'] = <<<HTML

<div class="commentform">
$form_start
<label for="commentbox">Add a comment to this page:<br />
<textarea id="commentbox" name="body" rows="6" cols="78"></textarea><br />
<input type="submit" value="Add Comment" accesskey="s" />
</label>
$form_close
</div>
   
HTML;

}


// comments themselves
if ( $_SHOW['comments'] )
{
  $comment_stack = '';
    $current_user = $this->GetUserName();
  $display_mode = $_SESSION['show_comments'][$tag];
 
  // icons
    $sort_desc_icon_url = StaticHref('images/icons/sort_desc.gif');
    $sort_ascc_icon_url = StaticHref('images/icons/sort_asc.gif');
    $sort_comment_icon_url = StaticHref('images/icons/comment.gif');
 
  // comments header
  $inner = '<a href="' . $this->Href('', '', 'show_comments='.COMMENT_ORDER_DATE_DESC.'#comments') . '"><img class="'.($display_mode==COMMENT_ORDER_DATE_DESC ?  "icon_on" : "icon").'" alt="flat" title="Flat (newest first)" src="'.$sort_desc_icon_url.'" /></a>';
    $inner .= '<a href="' . $this->Href('', '', 'show_comments='.COMMENT_ORDER_DATE_ASC.'#comments') . '"><img class="'.($display_mode==COMMENT_ORDER_DATE_ASC ?  "icon_on" : "icon").'" alt="flat" title="Flat (oldest first)" src="'.$sort_asc_icon_url.'" /></a>';
    $inner .=   '<a href="' . $this->Href('', '', 'show_comments='.COMMENT_ORDER_THREADED.'#comments') . '"><img class="'.($display_mode==COMMENT_ORDER_THREADED ?  "icon_on" : "icon").'" alt="threaded" title="Threaded" src="'.$sort_comment_icon_url.'" /></a>';
  $inner2 = COMMENTS_CAPTION;
  $inner3 = '[<a href="' . $this->Href('', '', 'show_comments='.COMMENT_NO_DISPLAY) . '">' . HIDE_COMMENTS_LINK_DESC . '</a>]';
 
  // comment post
  if ( $_SHOW['comment_post'] )
  {
    $form1 = $this->FormOpen('processcomment');
    $svalue = COMMENT_NEW_BUTTON;
    $form2 = $this->FormClose();
   
    $_HTML['comment_post'] = <<<HTML

$form1
<input type="submit" name="submit" value="$svalue" />          
$form2

HTML;
  }
 
  $_HTML['comments_header'] = <<<HTML
 
<!--starting comments header (show)-->
<div class="commentsheader">
  <div id="commentsnav">
  $inner
  </div>
  <!-- closing commentsnav div -->

  $inner2
  $inner3
 
  {$_HTML['comment_post']}
 
</div>
<!--closing commentsheader (show)-->
 
HTML;

  // a very ugly hack
  if ( $comments )
  {
    ob_start();
    displayComments($this, $comments, $tag);
    $_HTML['comments'] = ob_get_flush();
    #echo "<pre>{$_HTML['comments']}</pre>";  # debug
  }
}


// hidden comments
if ( $_SHOW['hidden_comments'] )
{        
  $showcomments_text = '';      
    $commentCount = $this->CountComments($this->tag);
 
  switch ( $commentCount )
    {
        case 0:
      $comments_message = STATUS_NO_COMMENTS.' ';
      if ($this->HasAccess('comment_post'))
      {
        $showcomments_text = $this->FormOpen("processcomment");
        $showcomments_text .= '<input type="submit" name="submit" value="'.COMMENT_NEW_BUTTON.'" />';
        $showcomments_text .= $this->FormClose();
      }
      break;
       
        case 1:
      $comments_message = STATUS_ONE_COMMENT.' ';
            $showcomments_text = '[<a href="'.$this->Href('', '', 'show_comments=1#comments').'">'.DISPLAY_COMMENT_LINK_DESC.'</a>]';
            break;

           
        default:
      $comments_message = sprintf(STATUS_SOME_COMMENTS, $commentCount).' ';
      $comment_ordering = NULL;
      if (isset($user['default_comment_display']))
      {
        $comment_ordering = $user['default_comment_display'];
      }
      elseif (NULL !== $this->GetConfigValue('default_comment_display'))
      {
        $comment_ordering = $this->GetConfigValue('default_comment_display');
      }
      else
      {
        $comment_ordering = COMMENT_ORDER_DATE_ASC;
      }
      $showcomments_text = '[<a href="'.$this->Href('', '', 'show_comments='.$comment_ordering.'#comments').'">'.DISPLAY_COMMENTS_LABEL.'</a>]';
  }

    $_HTML['hidden_comments'] = <<<HTML
   
<!--starting comments header (hide)-->
<div class="commentsheader">
$comments_message
$showcomments_text
</div>
<!--closing comments block-->

HTML;

}


// Page Close
if ( $_SHOW['page_close'] )
{
    $_HTML['page_close'] = <<<HTML

</div>
<!--closing page content-->

HTML;
}

// End Viewer Blocks


// *** TEMPLATE: stitch it all together
require_once('show.tpl.php');
echo $_HTML['page'];

?>



source: show.tpl.php

<?php

/* wikka page template

don't remove any of the $_HTML array elements below, but feel free to move them
around and add wrapper classes as you see fit

Full List of $_HTML elements from show.php in template:

{$_HTML['page_start']}
{$_HTML['no_access']}
{$_HTML['not_exists']}
{$_HTML['revision_info']}
{$_HTML['page_body']}
{$_HTML['revision_edit_form']}
{$_HTML['page_close_div']}
{$_HTML['comments_header']}
{$_HTML['comments']}
{$_HTML['comment_form']}
{$_HTML['hidden_comments']}
{$_HTML['page_close']}

*/


$_HTML['page'] = <<<HTML

{$_HTML['page_start']}
{$_HTML['no_access']}
{$_HTML['not_exists']}
{$_HTML['revision_info']}
{$_HTML['page_body']}
{$_HTML['revision_edit_form']}

<div id="comment_stack">
{$_HTML['comments_header']}
{$_HTML['comments']}
{$_HTML['comment_form']}
{$_HTML['hidden_comments']}
</div>

{$_HTML['page_close_div']}
{$_HTML['page_close']}

HTML;
 
?>
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki