Revision [15965]

This is an old revision of DanWest made by DanWest on 2007-01-19 05:03:08.

 

Dan West

FormattingRules


This has some extensions I did. I'm new at hacking this code so you may find someone has already done it better or it's not done the cleanest way. I did try to keep them simple (i.e.: The least amount of core code changes).
I put them on my page since I am sure they currenlty dont follow the coding guidelines for submitting an official extension.

Some of these extensions are designed for my "Closed" wiki sites (Internal Users Only). So, they can be dangerous for public wiki sites.

Enjoy.



My Extensions



Include File action

A basic include that will load a text file into the page.
Syntax: {{include name='file.txt'}}

includefile.php
<?php
$file_name = $vars['name'];
if(isset($file_name)) {
    if(is_readable($file_name)) {
        if(isset($pre)) echo '<pre>';
        @include($file_name);
        if(isset($pre)) echo '</pre>';
    } else {
        echo "{{includefile}} File $fname not found";
    }
} else {
    echo 'usage: {{includefile <b><u>name</u></b>="<i>filename</i>"}} (Missing name)';
}
?>




CRT display formatter

For some documentation pages, I wanted to display a classic "Green Screen" format. So I used the %% code formatter and a custom CRT formatter.

File: formatters/crt.php
<?php
    echo '<div class="code_crt">';
    print('<pre>'.htmlspecialchars($text, ENT_QUOTES).'</pre>');
    echo '</div>';
?>


It also requires a small addition to the CSS file (Taken from .code selector)
.code_crt {
    color: lime;
    background: black;
    border: 1px solid #CCC;
    font-size: 11px;
    font-family: "Lucida Console", Monaco, monospace;
    width: 95%;
    margin: auto;
    padding: 6px 3px 13px 3px; 
    text-align: left;      
    overflow: auto;    
    white-space: nowrap;   
}



Custom Page Header

I found that I did not always care for the 'automated' page header done by parsing out the first matched text from a list of elements. Instead, I wanted to control the page title on the page manually. I did this by first creating a "fake" action called {{pagetitle}}. The "pagetitle.php" is an empty file in the actions folder. Then, I put the following code into the wakka.class.php file.

Once this is done, you can modify the header.php action to use $this->PageHeader() to populate the page title HTML tags.

Added to wakka.class.php
    // DW - Added (Process {{pagetitle name}} fake action)
    function PageHeader() {
        $title = "";
        $pagecontent = $this->page["body"];
        if (ereg( "({){2}pagetitle ([^}\n]+)(}){2}", $pagecontent, $title)) {
            $title = $title[2];
        }
        if ($title) return strip_tags($this->Format($title));               # fix for forced links in heading
        else return $this->GetPageTag();
    }


header.php
$PgTitle = $this->PageHeader();
    .
    .
    .
<title><?php echo $PgTitle; ?></title>



Admin User Registration

Since I was using Wikka as a content management system and did not want the general public to be able to register, I needed to have a method to register users under administrator control. I hack up the user registration action from DarTar. The main function is it allows you to register a user but does NOT log you in after doing so. So it allows you to add a new user to the database with all the validations but will not log you in to that user. It also checks to make sure you have 'write' access to the page the action is defined on as a basic permission trigger to allow you to register users.

<?php
/**
* Display a form for user registration.
*
* This action allows new users to register an account, if user registration is enabled.
* All the required fields are validated before the new user is created.
*
* @package        Actions
* @name        Register
*
* @author        {@link http://wikka.jsnx.com/DarTar Dario Taraborelli}
* @version        0.3
* @since        Wikka 1.1.X.X
* @output        form for user registration
*
* @todo
*            - CSS to style form;
*            - (optionally) drop WikiName restriction on usernames;
*            - use core functions to validate fields;
*            - use central error handler for printing error messages;
*            - decide best strategy to link hardcoded login/logout page;
*            - define welcome page where new users must be redirected;
*            - (optionally) add option for email-confirmation of registered users.
*/

 
// constants
define('MIN_PASSW_LENGTH', '5');
 
print $this->Format('===== New User Registration page ===== ----');
 
if ($user = $this->GetUser() && $this->HasAccess("write")) {
           
        // user is logged in
 
        // initializing variables
        $name = '';
        $email = '';
        $password = '';
        $confpassword = '';
        $error = '';
    $message = '';
   
        // Is this the result from a signup
        if ((isset($_GET['reg'])) && ($_GET['reg'] == '1')) {
 
                // print first login welcome screen
                $message = '--- **Registration successful!** ---';
        }
 
   
        // is user trying to register?
        if ($_POST) {
            // get POST values
            if (isset($_POST['name'])) $name = trim($_POST['name']);
            if (isset($_POST['email'])) $email = trim($_POST['email']);
            if (isset($_POST['password'])) $password = $_POST['password'];
            if (isset($_POST['confpassword'])) $confpassword = $_POST['confpassword'];
   
            // validate fields
            // note: all these validation checks should use core functions to preserve consistency
 
            if ($this->LoadUser($name))
            {
                $error = 'Sorry, this username already exists. Please choose a different name.';
                $validname = $this->Action('failed');
            } elseif ($this->ExistsPage($name))
            {
                $error = 'Sorry, this username is reserved for a page. Please choose a different name.';
                $validname = $this->Action('failed');
            } elseif (!$this->IsWikiName($name))
            {
                $error = 'Please fill in a valid username (formatted as a ##""WikiName""##).';
                $validname = $this->Action('failed');
            } elseif (!$email)  
            {
                $error = 'Please specify an email address.';
                $validname = $this->Action('done');
                $validemail = $this->Action('failed');
            } elseif (!preg_match("/^.+?\@.+?\..+$/", $email))
            {
                $error = 'That does not quite look like an email address.';
                $validname = $this->Action('done');
                $validemail = $this->Action('failed');
            } elseif (!$password)
            {
                $error = 'Please choose a password.';
                $validname = $this->Action('done');
                $validemail = $this->Action('done');
                $validpassword = $this->Action('failed');
            } elseif (strlen($password) < MIN_PASSW_LENGTH)
            {
                $error = 'Sorry, password too short (min. '.MIN_PASSW_LENGTH.' chars).';
                $validname = $this->Action('done');
                $validemail = $this->Action('done');
                $validpassword = $this->Action('failed');
            } elseif (preg_match("/ /", $password)) {
                $error = 'Sorry, spaces are not allowed in passwords.';
                $validname = $this->Action('done');
                $validemail = $this->Action('done');
                $validpassword = $this->Action('failed');
            } elseif (!$confpassword)
            {
                $error = 'You need to confirm password.';
                $validname = $this->Action('done');
                $validemail = $this->Action('done');
                $validpassword = $this->Action('failed');
                $validconfpassword = $this->Action('failed');
            } elseif ($confpassword != $password)
            {
                $error = 'Sorry, passwords do not match.';
                $validname = $this->Action('done');
                $validemail = $this->Action('done');
                $validpassword = $this->Action('failed');
                $validconfpassword = $this->Action('failed');
            } else
            {
                // all required fields are valid and non-empty
 
                // create user
                $this->Query("insert into ".$this->config["table_prefix"]."users set ".
                    "signuptime = now(), ".
                    "name = '".mysql_real_escape_string($name)."', ".
                    "email = '".mysql_real_escape_string($email)."', ".
                    "password = md5('".mysql_real_escape_string($password)."')");
 
                // log in
                if($dologin=="Y") {
            $this->SetUser($this->LoadUser($name));

                $this->Redirect($this->href('','','reg=1'));
    } else {
                // forward
                    $this->Redirect('','User ' . $name . ' Registration successful');
    }
            }
        }
       
        $intro = $this->Format(' --- To register, the following fields are required:
~-a **username** (it must be formatted like a ##""WikiName""##, for example: ##""JuliusCaesar""##);
~-a **valid email address** (this will only be used to retrieve your password in case you lose it);
~-a **valid password** (min. '
.MIN_PASSW_LENGTH.' characters, no space allowed).
--- ---'
);
 
        // build registration form
        $form  = $this->FormOpen();
        $form .= '    <table summary="Form to provide registration data: username, email and password">';
        $form .= '    <caption>Registration form</caption>';
        $form .= '    <tbody>';
   
        if (isset($error))
        {
            $form .= '<tr><td colspan="3" align="center"><em class="error">'.$this->Format($error).'</em></td></tr>';
        }
        if (isset($message))
        {
            $form .= '<tr><td colspan="3" align="center"><em class="error">'.$this->Format($message).'</em></td></tr>';
        }

        $form .= '        <tr>';
        $form .= '            <th align="right" scope="row"><label for="name">Username:</label></th>';
        $form .= '            <td><input name="name" id="name" size="40" value="'.$name.'" title="Choose a valid username (formatted as a WikiName)" /></td>';
        $form .= '            <td>'.$validname.'</td>';
        $form .= '        </tr>';
        $form .= '        <tr>';
        $form .= '            <th align="right" scope="row"><label for="email">User email address:</label></th>';
        $form .= '            <td><input name="email" id="email" size="40" value="'.$email.'" title="Fill in a valid email address"/></td>';
        $form .= '            <td align="left">'.$validemail.'</td>';
        $form .= '        </tr>';
        $form .= '        <tr>';
        $form .= '            <th align="right" scope="row"><label for="password">Password:</label></th>';
        $form .= '            <td><input type="password" name="password" id="password" size="40" title="Choose a valid password (min. '.MIN_PASSW_LENGTH.' chars, no space)" /></td>';
        $form .= '            <td align="left">'.$validpassword.'</td>';
        $form .= '        </tr>';
        $form .= '        <tr>';
        $form .= '            <th align="right" scope="row"><label for="confpassword">Confirm password:</label></th>';
        $form .= '            <td><input type="password" name="confpassword" id="confpassword" size="40" title="Type again your password for confirmation" /></td>';  
        $form .= '            <td align="left">'.$validconfpassword.'</td>';
        $form .= '        </tr>';
        $form .= '        <tr>';
        $form .= '            <td></td>';
        $form .= '            <td><input type="submit" value="Register" title="Register" /></td>';  
        $form .= '        </tr>';
        $form .= '    </tbody>';
        $form .= '    </table>';
        $form .= $this->FormClose();
 
        // output intro and form
        print $intro.$form;
   
} else {
    print $this->Format('--- ===You do not have authority to add users=== ---');
}
?>
There are 2 comments on this page. [Show comments]
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki