Location: PHPKode > scripts > B-Forms > b-forms/editentry.php
<?
// 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", "", TRUE, 128), new TextBox(80));
$block->add_property(new DateProperty("post_date", "Post date", "", FALSE));
$block->add_property(new TextProperty("brief", "Intro", "", TRUE, 10000), new TextArea(80, 15));
$block->add_property(new TextProperty("full", "Content", "", FALSE, 100000), new TextArea(80, 25));
$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", "", TRUE, 64), 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();
?>
Return current item: B-Forms