Jump to content

Trying to create an edit page using Quickform2


Strider64
Go to solution Solved by Strider64,

Recommended Posts

I've been trying to improve my php skills by reading and going through the examples (step by step in order) from the book "PHP Advanced and Object-Oriented Programming". I'll try to explain it the best that I can the problem I have followed with some code. I think I'll will start with code:

 

I have to grab the data for after all it's an edit page:

<?php # edit_page
// This page both displays and handles the "edit the page" form.
// Need the utilities file:
require('includes/utilities.inc.php');

     try {
        
         // Validate the page ID:
         if (!isset($_GET['id']) || !filter_var($_GET['id'], FILTER_VALIDATE_INT, array('min_range' => 1))) {
             throw new Exception('An invalid page ID was provided to this page.');
         }
        
         // Fetch the page from the database:
         $query = 'SELECT id, title, content, DATE_FORMAT(dateUpdated, "%e %M %Y") as dateUpdated FROM pages WHERE id=:id';
         $stmt = $pdo->prepare($query);
         $result = $stmt->execute(array(':id' => $_GET['id']));
        
         // If the query ran OK, fetch the record into an object:
         if($result) {
             $stmt->setFetchMode(PDO::FETCH_CLASS, 'Page');
             $page = $stmt->fetch();                
         } else {
             throw new Exception('An invalid page ID was provided to this page');
         }
        
     } catch(Exception $e) { // catch generic Exceptions
    
         $pageTitle = 'Error!';
         include('includes/header.inc.php');
         include('views/error.html');
        
     }

Then I have to setup my Quickform2 form

// Creat a new QuickForm2 form:
// set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/local/pear/share/pear/');
require('HTML/QuickForm2.php');
$form = new HTML_QuickForm2('editPageForm' );

// Add the title field:
$title = $form->addElement('text', 'title');
$title->setLabel('Page Title');
$title->addFilter('strip_tags');
//$title->addRule('required', 'Please enter a page title');

// Add the content field:
$content = $form->addElement('textarea', 'content');
$content->setLabel('Page Content');
$content->addFilter('strip_tags');
$content->addFilter('trim');

//$content->addRule('required', 'Please enter the page content');
// Set defaults for the form elements
$form->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
    'title' => $page->getTitle(),
    'content' => $page->getContent()
)));
// Add the submit button:
$submit = $form->addElement('submit', 'submit', array('value' => 'Edit This Page'));

and then I have to validate and submit the edited data to the database (This is where I run into problems)

// Check for a form submission:
if (!isset($_SERVER) && $_SERVER['REQUEST_METHOD'] == 'POST') { // Handle the form submission

    // Validate the form data:
    if ($form->validate()) {

        $query = 'UPDATE pages
                  SET creatorId=:creatorId,
                    title=:title,
                    content=:content,
                    dateUpdated=NOW()
                WHERE id=:id';
        // Insert into the database:
        //$query = 'INSERT INTO pages (creatorId, title, content, dateAdded) VALUES (:creatorId, :title, :content, NOW())';
        $stmt = $pdo->prepare($query);
        $result = $stmt->execute(array(':creatorId' => $user->getId(), ':title' => $title->getValue(), ':content' => $content->getValue(), ':id' => $page->getId()));
        
        // Freeze the form upon success:
        if ($result) {
            $form->toggleFrozen(true);
            $form->removeChild($submit);
        }
        
    } // End of form validation IF.
    
} // End of form submission IF.

 This is the error it gives:

Details (not for public consumption): An invalid page ID was provided to this page.

 
Notice: Undefined variable: page in C:\xampp\htdocs\php_test\chapter-09-CMS-with-OOP\edit_page.php on line 56

Fatal error: Call to a member function getTitle() on a non-object in C:\xampp\htdocs\php_test\chapter-09-CMS-with-OOP\edit_page.php on line 56

 

I think it might have something to do with the url being different (edit_page.php?id=5) vs (edit_page.php) when it kicks out the error.  I don't know if I have my query right or the POST right or what have you. This is the first time I really have been using PDO for previously I've been using mysqli to go back and forth to the MySQL database. I believe I have it right? Anyways, I apologize if I didn't make myself clear and I can always reply with more information if needed. I have gone to the author's forums, check the Quckform2 documentation, php.net manual  and have done a bunch of Google searches to no avail to fix the problem.

 

Well at least I know now how to catch an error, but now the thing is how to fix them. :happy-04:
 

Thanks,

           John

Edited by Strider64
Link to comment
Share on other sites

  • Solution

It feels so good to solve the problem on your own.... :pirate:

 

Here's the solution if anyone cares (this is only part of the file): :tease-03:

// Creat a new QuickForm2 form:
// set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/local/pear/share/pear/');
require('HTML/QuickForm2.php');
//$form = new HTML_QuickForm2('editPageForm' );
// Set defaults for the form elements
$form = new HTML_QuickForm2('editPageForm', 'post', array(
    'action' => $_SERVER['PHP_SELF'] . '?id=' . $_GET['id']
));

// Add the title field:
$title = $form->addElement('text', 'title');

// Add Data to text box, only if the submit button isn't click!
if (!($form->validate())) {
$title->setValue(strip_tags($page->getTitle()));
}

$title->setLabel('Page Title');

$title->addFilter('strip_tags');
$title->addRule('required', 'Please enter a page title');

// Add the content field:
$content = $form->addElement('textarea', 'content');

// Add Data to textarea, only if the submit button isn't click!
if (!($form->validate())) {
$content->setValue(strip_tags($page->getContent()));
}

$content->setLabel('Page Content');
$content->addFilter('strip_tags');
$content->addFilter('nl2br');
$content->addFilter('trim');

$content->addRule('required', 'Please enter the page content');
// Add the submit button:
$submit = $form->addElement('submit', 'submit', array('value' => 'Edit This Page'));

$form->addRecursiveFilter('trim');

 // Validate the form data:
 if ($form->validate()) {
    
     // Update the edited text:    
     $query = 'UPDATE pages
             SET creatorId=:creatorId,
                title=:title,
                content=:content,
                dateUpdated=NOW()
             WHERE id=:id';

     $stmt = $pdo->prepare($query);
    
     $result = $stmt->execute(array(':creatorId' => $user->getId(), ':title' => $title->getValue(), ':content' => $content->getValue(), ':id' => $page->getId()));
    
     // Freeze the form upon success:
     if ($result) {
         $form->toggleFrozen(true);
         $form->removeChild($submit);
     }
    
 }
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.