Revision [15972]

This is an old revision of DanWest made by DanWest on 2007-01-19 20:19:10.

 

Dane Westvik

(pen name): Dan West



Who

I have been a software developer, designer for over 25 years. I remember paper tape and punch cards.
For the last 20+ years I have been designing and developing POS (point of sale) systems. My focus was on networking, communications and protocols. Also known as KO6YD in the amateur radio world.

Why Wikka

Well, why not. I was looking at some sort of content management system for our company web site. That way the different departments can contribute to the site without having hire someone or have me do it. (we are a small company). I really fell in love with the wiki concept and the Wikka design in how is works and the very well thought out design was a natural. The system is very easy to extend with actions and not too complex.

What I have done

The major overhaul is to make the Wikka engine as invisible as I could. Then I could use it to host our web site and disable the public access to the system so we could maintain it inhouse. I know this is not a new concept but it turned out to be a perfect CMS for us. I made some modifications to the header and footer to "wrap" the header, logo, navigation and main page in division classes so I could have better control over the look and feel with CSS.

The result (link coming soon) is that the only indication is a very small login prompt on the bottom of our pages. Our inhouse publishers login to manage content. To manage images and product PDF files, I setup various ImageLib pages with the {{files}} action. Then, users will upload PDF files, images, driver updates, etc to these pages. Then I setup Interwiki links so the can just enter [[PDF:brochure.pdf Title]] links and it all works. Very nicely done Wikka...

My extensions and hacks

I'm new to 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 currently dont follow the coding guidelines for submitting an official extensions.

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

Enjoy.
Dane


Allows you to setup custom navigation menus by page. You just create a NavigationLinks page and enter your customized links on this page.

DanWestIncludeFile Include File action

DanWestCRT CRT Code 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.

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