Guest visits www.website.com
-> clicks link to “Submit” www.website.com/submit
-> a version of Panel opens up. Guest creates a page, fills the fields, uploads photos, hits Submit.
-> The created page is saved as invisible.
-> Website admin reviews the inivisible pages and turns to Visible the ones he approves.
Practically I would need a “Guest” access to the panel, not protected by user/password, with capability to create / sumbit invisible pages.
I would then turn on the pages that have been filled correctly / approved.
Check out the docs about $pages->create() and for file uploading you can use the upload class the toolkit provides. Unfortunately, there is documentation on how to use that class, though. But the forum is here to help …
Here’s some example code you can use in the controller of the frontend form page:
<?php
return function($site, $pages, $page) {
$error = null;
if(r::method() === 'POST') {
// The form has been sent
// Build an array of the data you want to allow as fields
// get() fetches the form field value with that `name`
$data = array(
'title' => get('title'),
'text' => get('text')
);
// Validate the data
if($whatever) $error = 'Something is invalid.';
// Create a new page as child of the current page
// You can also use a different page by using `page('whatever')->children()->create()`
$p = $page->children()->create(uniqid(), 'yourtemplate', $data);
// Upload an image
try {
// This uses the form field with `name="file"`
// See http://php.net/manual/en/features.file-upload.post-method.php#example-392 on how to structure your form
$upload = new Upload($p->root() . DS . '{safeFilename}');
} catch(Error $e) {
switch($e->getCode()) {
case Upload::ERROR_MISSING_FILE:
// File does not exist
$error = 'No file uploaded.';
break;
// See the Upload class for other error values
}
}
}
return compact('error');
};
<?php
return function($site, $pages, $page) {
$error = null;
if(r::method() === 'POST') {
// The form has been sent
$title = get('brand') . "-" . get('tube-name');
// Build an array of the data you want to allow as fields
// get() fetches the form field value with that `name`
$data = array(
'tube-name' => get('tube-name'),
'brand' => get('brand'),
'different_manufacturer' => get('different_manufacturer'),
'country' => get('country'),
'code_on_tube' => get('code_on_tube'),
'factory_code' => get('factory_code'),
'year' => get('year'),
'bottle_height' => get('bottle_height'),
'Tip-Shape' => get('Tip-Shape'),
'glass_color' => get('glass_color'),
'Mica' => get('Mica'),
'getter' => get('getter'),
'getter_support' => get('getter_support'),
'plate_look' => get('plate_look'),
'plate_size' => get('plate_size'),
'plate_color' => get('plate_color'),
'pin_color' => get('pin_color'),
'base' => get('base'),
'special_use' => get('special_use'),
'other_marks' => get('other_marks'),
'notes' => get('notes'),
'uploader_name' => get('uploader_name'),
'uploader_email' => get('uploader_email')
);
// Create a new page as child of the current page
// You can also use a different page by using `page('whatever')->children()->create()`
$p = page('uploads')->children()->create($title, 'tube', $data);
// Upload an image
$files = $_FILES['file'];
foreach($files as $file) {
try {
$upload = new Upload($p->root() . DS . '{safeFilename}', array('input' => 'file'));
} catch(Error $e) {
switch($e->getCode()) {
case Upload::ERROR_MISSING_FILE:
// File does not exist
$error = 'No file uploaded.';
break;
// See the Upload class for other error values
}
}
}
}
return compact('error');
};
?>
Thanks for the code. I just tested it and found out that the way PHP structures the resulting $_FILES array for multiple files is currently not supported by the Upload class.
I will add this feature as a Pull Request later today and come back to you here.
If you want to try it, temporarily replace your kirby/toolkit/lib/upload.php with the file from the PR and use the following controller code (your template is fine):
<?php
return function($site, $pages, $page) {
$error = null;
if(r::method() === 'POST') {
// The form has been sent
$title = get('brand') . "-" . get('tube-name');
// Build an array of the data you want to allow as fields
// get() fetches the form field value with that `name`
$data = array(
'tube-name' => get('tube-name'),
'brand' => get('brand'),
'different_manufacturer' => get('different_manufacturer'),
'country' => get('country'),
'code_on_tube' => get('code_on_tube'),
'factory_code' => get('factory_code'),
'year' => get('year'),
'bottle_height' => get('bottle_height'),
'Tip-Shape' => get('Tip-Shape'),
'glass_color' => get('glass_color'),
'Mica' => get('Mica'),
'getter' => get('getter'),
'getter_support' => get('getter_support'),
'plate_look' => get('plate_look'),
'plate_size' => get('plate_size'),
'plate_color' => get('plate_color'),
'pin_color' => get('pin_color'),
'base' => get('base'),
'special_use' => get('special_use'),
'other_marks' => get('other_marks'),
'notes' => get('notes'),
'uploader_name' => get('uploader_name'),
'uploader_email' => get('uploader_email')
);
// Create a new page as child of the current page
// You can also use a different page by using `page('whatever')->children()->create()`
$p = page('uploads')->children()->create($title, 'tube', $data);
// Upload the images
$missingFile = false;
$index = 0;
do {
try {
$upload = new Upload($p->root() . DS . '{safeFilename}', array('input' => 'file', 'index' => $index));
$index++;
} catch(Error $e) {
switch($e->getCode()) {
case Upload::ERROR_MISSING_FILE:
// No more files have been uploaded
$missingFile = true;
break;
// See the Upload class for other error values
}
}
} while(!$missingFile);
// Check if an image has been uploaded at all
if($index === 0) {
$error = 'No file uploaded.';
}
}
return compact('error');
};
I am getting an error when the page is live on the server.
When instead I run the website locally on mamp, everything works good.
The error says:
Fatal error: Uncaught Error: Call to a member function children() on boolean in /home/user/website/site/controllers/submit-page.php:40 Stack trace: #0 /home/user/website/kirby/kirby.php(525): Kirby->{closure}(Object(Site), Object(Children), Object(Page), Array) #1 /home/user/website/kirby/kirby.php(699): Kirby->controller(Object(Page), Array) #2 /home/user/website/kirby/kirby.php(680): Kirby->template(Object(Page), Array) #3 /home/user/website/kirby/kirby.hp(781): Kirby->render(Object(Page)) #4 /home/user/website/index.php(16): Kirby->launch() #5 {main} thrown in /home/user/website/site/controllers/submit-page.php on line 40