Jump to content
ryan

How do I create private client pages (with login)?

Recommended Posts

Client Login: I would want to let people log in to view their images. What do you think the best way to do this is? Obviously I could do it myself without using much ProcessWire - But I am guessing there are some handy things PW can do to help me along and make this job easier. I am thinking I would add them as a user in the admin interface and then give them access to view their private page which no one else can view. Does this make sense? How would I get them logged in through the front interface and have it work seamlessly with PW? I don't want them to see the admin interface...

The user functions in ProcessWire are probably the least developed part so far, but I think it can still accomplish what you want pretty well. Since ProcessWire assigns permissions to roles rather than users, I think the best bet is instead to create one role for clients, and then we'll check if they have access on the actual page by comparing the page name to the user name.

1. To start, create a new role in Access > Roles, call it "client" (or whatever), and give it just "ProcessPageView" permission.

2. Next create a new page that will be the parent of the protected client pages, i.e. "/clients/". Once the page is created, click on the "settings" tab of that page, uncheck the "guest" role, and check the "client" role. Save.

3. Now create a new template and associated page that will serve as the login form. I'd call the template "login" and the page "/login/". The logic for the login template should be something like the following:

/site/templates/login.php

<?php
if($input->post->login_submit) {
// process submitted login form
$name = $sanitizer->username($input->post->login_name);
$pass = $input->post->login_pass;
if($session->login($name, $pass)) $session->redirect("./");
	else echo "<h2>Login failed, please try again.</h2>";
}

if($user->isSuperuser()) {
// display links to all the client pages
echo $page->children()->render();

} else if($user->isLoggedin()) {
// redirect to client page, if it exists
$private = $pages->get("/clients/{$user->name}/");
if($private->id) $session->redirect($private->url);
	else echo "<p>Your page is not yet setup.</p>";
} else {
// display the login form
include("./login_form.inc");
}

I split the login form into a separate file, though you could mix it into the login.php file above too. Below is the markup for the login form:

/site/templates/login_form.inc

<form action='/login/' method='post'>

<p><label>Username
<input type='text' name='login_name' />
</label></p>

<p><label>Password
<input type='password' name='login_pass' />
</label></p>

<p><input type='submit' name='login_submit' value='Login' /></p>

</form>

4. Now create the client template, that will serve as an individual user's private page. I would call it "client", and insert logic like the following:

/site/templates/client.php

<?php
if($user->name != $page->name && !$user->isSuperuser())
throw new PageNotFoundException("No access");

// if we made it here, you are good to display their photos

5. Now setup your client pages and client users. Create each client page under /clients/, and make it use the client.php template we setup above. The client's username and page URL name must match, so if your client's username is michelle, then her client page should be /clients/michelle/. Also, when you create each client's user account, give each one the "client" role we created in step 1.

6. I think that will do it. Let me know if this makes sense or if you have any questions. Also, I'm doing this all off the top of my head (while also checking the API code), so let me know if you find I'm off on any parts too.

  • Like 2

Share this post


Link to post
Share on other sites

Hey Ryan,

I tested out what you posted and it works great. I did have to fix some typo's (<form tag, and {$user->name}).

I will need to update a few things to get it to do what I want, but your demo explains all the parts I needed. Thanks!!

It would have taken me a lot longer to do something like this in Drupal or manually. ProcessWire makes it much quicker!

-Jim

Share this post


Link to post
Share on other sites

Thanks Jim! Glad that worked. Sorry for the typos. I have corrected the typos in the original post.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...