Login   Register  
PHP Classes
elePHPant
Icontem

File: editentry.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of alexei peterkin  >  B-Forms  >  editentry.php  >  Download  
File: editentry.php
Role: Example script
Content type: text/plain
Description: Example form: edit blog entry
Class: B-Forms
Compose and generate complex web forms
Author: By
Last change: Updated for release 1.2
Date: 9 years ago
Size: 8,397 bytes
 

Contents

Class file image Download
<?
// Include my local files
require_once("local.inc");
require_once(
"common.inc");

// Include the library
require_once("b-forms/b-forms.inc");
require_once(
"b-forms/layout.inc");

init_db(TRUE); // Initialize the database link in the global $blog_link variable

// Define the form structure
$form = new Form("denied.html"TRUE);
$bl = & new BaseLayout();
$tl = & new TableLayout(FALSE);

// Single row block "entry"
$block = & new Block("entry");

$block->add_property(new TextProperty("title""Title"""TRUE128), new TextBox(80));
$block->add_property(new DateProperty("post_date""Post date"""FALSE));
$block->add_property(new TextProperty("brief""Intro"""TRUE10000), new TextArea(8015));
$block->add_property(new TextProperty("full""Content"""FALSE100000), new TextArea(8025));
$block->add_property(new LayoutElement("Post in topics"), new InlineBlock(&$bl"topic", &$tl));

$block -> add_property(new ButtonProperty("save""Save"TRUE));
$block -> add_property(new ButtonProperty("cancel""Cancel"));
$block -> add_property(new ButtonProperty("delete""Delete"));

$form -> add_block($block);

//Multi-row block "topic"
$block = & new Block("topic"TRUE);
$block -> add_property(new CheckBoxProperty("include_fl"""FALSE));
$block -> add_property(new TextProperty("name""Name"""TRUE64), new TextDisplay());

$form -> add_block($block);

// Define triggers

function entry_on_open() {
   global 
$form$blog_link$HTTP_GET_VARS;

   if (isset(
$HTTP_GET_VARS["entry"])) {
      
$query sprintf(
         
"SELECT entries.id, ".             //0
         
"       entries.title, ".          //1
         
"       entries.brief, ".          //2
         
"       entries.post_date, ".      //3
         
"       entries.full ".            //4
         
"FROM   entries ".
         
"WHERE  entries.id = %d ",
         
$HTTP_GET_VARS["entry"]);

      
$result = @mysql_query($query$blog_link);
      
$num_rows mysql_num_rows($result);

      if (!
$num_rows) {
         
header("Location: ".$form->_denied_target);
         
close_db();
         exit;
      }
      
$row mysql_fetch_row($result);

      
$form->entry->append(RS_OLD);

      
$form->entry->id $row[0];
      
$form->entry->title $row[1];
      
$form->entry->brief $row[2];
      
$form->entry->post_date $row[3];
      
$form->entry->full $row[4];

   }
}

// The following trigger will be executed AFTER the entry_on_open trigger
// since block entry is added to the form before block topic.

function topic_on_open() {
   global 
$form$blog_link;

   
$query sprintf(
         
"SELECT id, name, topic_id ".  // 0, 1, 2
         
"FROM topics ".
         
"LEFT JOIN entry_topics ON topic_id = id AND entry_id = %d ".
         
"ORDER BY name",
         
$form->entry->id);
      
// Because of the left join, topic_id column will be null for those
      // topics for which there is no row in the entry_topics for this entry.
      // And it will be not null, if the entry is already included in that topic.
      //
      // When the form is opened for creation, the $form->entry->id will be null,
      // sprintf() will convert it into 0, and no entry_topics will be found.

   
$result mysql_query($query$blog_link);
   
$num_rows mysql_num_rows($result);
   for (
$i=0$i<$num_rows$i++) {
      
$row mysql_fetch_row($result);
      if (
$row[2]) { // Entry already belongs to the topic
         
$form->topic->append(RS_OLD);
         
$form->topic->include_fl[$i] = TRUE;
      }
      else { 
// NULL, Entry does not belong to the topic
         
$form->topic->append(RS_NEW);
      }
      
$form->topic->id[$i]=$row[0];
      
$form->topic->name[$i]=$row[1];
   }
}



function 
entry_cancel_on_action($rownum = -1) {
   
close_db();

   
header("Location: /examples/");
   exit;
}

function 
entry_save_on_action($rownum = -1) {
   global 
$blog_link$domain$form$post_date;

   
$post_date $form->entry->post_date;
   if (
$post_date == "")
      
$post_date "SYSDATE()";
   else
      
$post_date "'$post_date'";

   if (
$form->save()) {
      
close_db();
      
header("Location: /examples/");
      exit;
   }
}

function 
entry_on_update($rownum = -1) {
   global 
$form$blog_link$post_date;

   
$query sprintf(
         
"UPDATE entries ".
         
"SET    title = '%s', ".
         
"       brief = '%s', ".
         
"       full = '%s', ".
         
"       post_date = %s ".
         
"WHERE  id = %d",
         
mysql_escape_string($form->entry->title),
         
mysql_escape_string($form->entry->brief),
         
mysql_escape_string($form->entry->full),
         
$post_date,
         
$form->entry->id);

   
mysql_query($query$blog_link);
}

function 
entry_on_insert($rownum = -1) {
   global 
$form$blog_link$post_date;

   
$query sprintf(
      
"INSERT INTO entries ".
      
"   (title, brief, full, post_date) ".
      
"VALUES ('%s', '%s', '%s', %s)",
      
mysql_escape_string($form->entry->title),
      
mysql_escape_string($form->entry->brief),
      
mysql_escape_string($form->entry->full),
      
$post_date);

   
mysql_query($query$blog_link);

   
// We need to retrieve the autoincrement id assigned to our entry.
   // It will be required for saving the topics of this entry
   
$form->entry->id mysql_insert_id($blog_link);
}

// This trigger will only be called for records, that are in status RS_INSERT
// and these are records that previously did not exist in the form, thus the
// checkbox was originally off, and now the record has changed, thus the
// checkbox is on.
function topic_on_insert($rownum = -1) {
   global 
$form$blog_link;

   
$query sprintf(
         
"INSERT INTO entry_topics (entry_id, topic_id) VALUES (%d, %d)",
         
$form->entry->id,
         
$form->topic->id[$rownum]);
   
mysql_query($query$blog_link);

}

// This trigger will only be called for records in status RS_UPDATE, and these
// are those records that were originally in the database, thus the checkbox was
// on. Since the record has changed to be in status RS_UPDATE, the checkbox must
// be off now. So this is a record to be deleted. However, will will not delete it now,
// - just build a list of ids.
function topic_on_update($rownum = -1) {
   global 
$form$delete_list$join;

   
$delete_list .= $join.$form->topic->id[$rownum];
   
$join ', ';
}

function 
form_post_save() {
   global 
$form$blog_link$delete_list;

   
// And this is the place where we should delete the topics than require
   // deletion
   
if ($delete_list) {
      
$query sprintf(
         
"DELETE FROM entry_topics ".
         
"WHERE entry_id = %d ".
         
"AND topic_id IN (%s)",
         
$form->entry->id,
         
$delete_list);
      
mysql_query($query$blog_link);
   }
}

function 
entry_delete_on_action($rownum = -1) {
   global 
$blog_link$form$domain;

   
$query sprintf(
               
"DELETE FROM entry_topics ".
               
"WHERE entry_id = %d ",
               
$form->entry->id);
   
mysql_query($query$blog_link);

   
$query sprintf(
               
"DELETE FROM entries ".
               
"WHERE id = %d ",
               
$form->entry->id);
   
mysql_query($query$blog_link);


   
close_db();

   
header("Location: /examples/");
   exit;
}

function 
entry_pre_display($rownum = -1) {
   global 
$form;
   if (!
$form->entry->is_record_existing())
      
$form->entry->_properties["delete"]->visible FALSE;
}

function 
topic_name_pre_render($rownum) {
   global 
$form;
   echo 
'<label for="'.
        
$form->topic->_properties['include_fl']->get_form_name($rownum).
        
'">';
}

function 
topic_name_post_render($rownum) {
   echo 
'</label>';
}


// Do the main processing

$form->process();

// Generate the HTML code for the form

echo "<html><body><head>\n";
echo 
"<link rel=\"stylesheet\" media=\"screen, projection\" type=\"text/css\" href=\"layout.css\" />\n";
echo 
"</head><h1>";
if (
$form->entry->is_record_existing())
   echo 
"Edit";
else
   echo 
"Create";
echo 
" entry</h1>\n";

if (isset(
$error)) echo "<h2>$error</h2>\n";

$form->start_form();
$bl->show_block("entry");
$form->end_form();

echo 
"</body></html>\n";
close_db();
?>