⌈⌋ branch:  freshcode


Hex Artifact Content

Artifact d347f3bc5a1590bf686b9b53be51ef7b5f07a9de:

  • File page_admin.php — part of check-in [5bda659526] at 2015-03-24 20:07:22 on branch trunk — Fix spacing to header block. Correct nowrap issue for title/version/datetime in .project headers (Firefox). (user: mario size: 6522)

0000: 3c 3f 70 68 70 0a 2f 2a 2a 0a 20 2a 20 61 70 69  <?php./**. * api
0010: 3a 20 66 72 65 73 68 63 6f 64 65 0a 20 2a 20 74  : freshcode. * t
0020: 79 70 65 3a 20 70 61 67 65 0a 20 2a 20 74 69 74  ype: page. * tit
0030: 6c 65 3a 20 61 64 6d 69 6e 20 69 6e 74 65 72 66  le: admin interf
0040: 61 63 65 0a 20 2a 20 64 65 73 63 72 69 70 74 69  ace. * descripti
0050: 6f 6e 3a 20 53 68 6f 77 63 61 73 65 20 75 73 65  on: Showcase use
0060: 72 20 66 6c 61 67 73 20 61 6e 64 20 61 6c 6c 6f  r flags and allo
0070: 77 20 74 6f 20 64 65 6c 65 74 65 20 6f 72 20 68  w to delete or h
0080: 69 64 65 20 70 72 6f 6a 65 63 74 20 65 6e 74 72  ide project entr
0090: 69 65 73 2f 72 65 76 69 73 69 6f 6e 73 2e 0a 20  ies/revisions.. 
00a0: 2a 20 76 65 72 73 69 6f 6e 3a 20 30 2e 31 0a 20  * version: 0.1. 
00b0: 2a 20 64 65 70 65 6e 64 73 3a 20 64 62 0a 20 2a  * depends: db. *
00c0: 0a 20 2a 20 55 73 65 72 20 66 6c 61 67 73 20 61  . * User flags a
00d0: 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 20  re collected in 
00e0: 61 20 73 65 70 61 72 61 74 65 20 60 66 6c 61 67  a separate `flag
00f0: 73 60 20 74 61 62 6c 65 2e 20 59 65 74 20 65 61  s` table. Yet ea
0100: 63 68 20 70 72 6f 6a 65 63 74 0a 20 2a 20 65 6e  ch project. * en
0110: 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 60  try contains a `
0120: 66 6c 61 67 73 60 20 63 6f 75 6e 74 65 72 20 63  flags` counter c
0130: 6f 6c 75 6d 6e 20 61 73 20 77 65 6c 6c 20 28 74  olumn as well (t
0140: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 66  his is used by f
0150: 72 6f 6e 74 2d 65 6e 64 0a 20 2a 20 63 6f 64 65  ront-end. * code
0160: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
0170: 79 20 68 69 64 65 20 74 6f 6f 20 66 72 65 71 75  y hide too frequ
0180: 65 6e 74 6c 79 20 66 6c 61 67 67 65 64 20 73 75  ently flagged su
0190: 62 6d 69 73 73 69 6f 6e 73 29 2e 2e 0a 20 2a 0a  bmissions)... *.
01a0: 20 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   * CREATE TABLE 
01b0: 66 6c 61 67 73 0a 20 2a 20 20 20 20 20 28 6e 61  flags. *     (na
01c0: 6d 65 20 54 45 58 54 2c 20 72 65 61 73 6f 6e 20  me TEXT, reason 
01d0: 54 45 58 54 2c 20 6e 6f 74 65 20 54 45 58 54 2c  TEXT, note TEXT,
01e0: 20 73 75 62 6d 69 74 74 65 72 5f 6f 70 65 6e 69   submitter_openi
01f0: 64 20 54 45 58 54 2c 20 73 75 62 6d 69 74 74 65  d TEXT, submitte
0200: 72 5f 69 70 20 54 45 58 54 29 3b 0a 20 2a 0a 20  r_ip TEXT);. *. 
0210: 2a 20 54 68 65 20 61 64 6d 69 6e 20 70 61 67 65  * The admin page
0220: 20 6c 69 73 74 73 20 66 72 6f 6d 20 74 68 65 20   lists from the 
0230: 66 6c 61 67 73 20 74 61 62 6c 65 2e 20 54 68 65  flags table. The
0240: 6e 20 61 6c 6c 6f 77 73 20 74 6f 20 22 64 65 6c  n allows to "del
0250: 65 74 65 22 20 63 65 72 74 61 69 6e 0a 20 2a 20  ete" certain. * 
0260: 72 65 76 69 73 69 6f 6e 73 2c 20 6f 72 20 6a 75  revisions, or ju
0270: 73 74 20 6d 61 72 6b 20 74 68 65 6d 20 61 73 20  st mark them as 
0280: 68 69 64 64 65 6e 2e 0a 20 2a 0a 20 2a 2f 0a 0a  hidden.. *. */..
0290: 0a 0a 2f 2f 20 4d 6f 64 65 72 61 74 6f 72 20 61  ..// Moderator a
02a0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 61 6c 72  uthorization alr
02b0: 65 61 64 79 20 68 61 6e 64 6c 65 64 20 62 79 20  eady handled by 
02c0: 64 69 73 70 61 74 63 68 65 72 20 28 69 6e 64 65  dispatcher (inde
02d0: 78 2e 70 68 70 29 0a 69 6e 63 6c 75 64 65 28 22  x.php).include("
02e0: 74 65 6d 70 6c 61 74 65 2f 68 65 61 64 65 72 2e  template/header.
02f0: 70 68 70 22 29 3b 0a 3f 3e 0a 20 20 3c 73 65 63  php");.?>.  <sec
0300: 74 69 6f 6e 20 69 64 3d 6d 61 69 6e 20 63 6c 61  tion id=main cla
0310: 73 73 3d 63 6f 6e 74 61 69 6e 65 72 2d 77 69 64  ss=container-wid
0320: 74 68 3e 0a 3c 3f 70 68 70 0a 24 6e 61 6d 65 20  th>.<?php.$name 
0330: 3d 20 24 5f 52 45 51 55 45 53 54 2d 3e 70 72 6f  = $_REQUEST->pro
0340: 6a 5f 6e 61 6d 65 5b 22 6e 61 6d 65 22 5d 3b 0a  j_name["name"];.
0350: 0a 0a 2f 2f 20 4a 75 73 74 20 6c 69 73 74 20 66  ..// Just list f
0360: 6c 61 67 73 2b 70 72 6f 6a 65 63 74 73 0a 69 66  lags+projects.if
0370: 20 28 65 6d 70 74 79 28 24 6e 61 6d 65 29 29 20   (empty($name)) 
0380: 7b 0a 20 20 20 20 70 72 69 6e 74 20 22 3c 68 33  {.    print "<h3
0390: 3e 46 6c 61 67 67 65 64 20 65 6e 74 72 69 65 73  >Flagged entries
03a0: 3c 2f 68 33 3e 20 3c 64 6c 3e 22 3b 0a 0a 20 20  </h3> <dl>";..  
03b0: 20 20 2f 2f 20 71 75 65 72 79 20 66 6c 61 67 73    // query flags
03c0: 20 74 61 62 6c 65 2c 20 62 75 74 20 61 73 73 6f   table, but asso
03d0: 63 69 61 74 65 20 64 61 74 61 20 66 72 6f 6d 20  ciate data from 
03e0: 6c 61 73 74 20 72 65 6c 65 61 73 65 0a 20 20 20  last release.   
03f0: 20 24 66 6c 61 67 73 20 3d 20 64 62 28 22 53 45   $flags = db("SE
0400: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66 6c 61 67  LECT * FROM flag
0410: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
0420: 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 72 65 6c     LEFT JOIN rel
0430: 65 61 73 65 5f 76 65 72 73 69 6f 6e 73 20 4f 4e  ease_versions ON
0440: 20 66 6c 61 67 73 2e 6e 61 6d 65 3d 72 65 6c 65   flags.name=rele
0450: 61 73 65 5f 76 65 72 73 69 6f 6e 73 2e 6e 61 6d  ase_versions.nam
0460: 65 22 29 3b 0a 20 20 20 0a 20 20 20 20 2f 2f 20  e");.   .    // 
0470: 6a 75 73 74 20 6f 75 74 70 75 74 20 61 64 6d 69  just output admi
0480: 6e 2f 50 52 4f 4a 49 44 20 6c 69 6e 6b 73 0a 20  n/PROJID links. 
0490: 20 20 20 77 68 69 6c 65 20 28 24 72 6f 77 20 3d     while ($row =
04a0: 20 24 66 6c 61 67 73 2d 3e 66 65 74 63 68 28 29   $flags->fetch()
04b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 24 72 6f 77  ) {.        $row
04c0: 20 3d 20 61 72 72 61 79 5f 6d 61 70 28 22 69 6e   = array_map("in
04d0: 70 75 74 3a 3a 68 74 6d 6c 22 2c 20 24 72 6f 77  put::html", $row
04e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  );.        print
04f0: 20 3c 3c 3c 48 54 4d 4c 0a 20 20 20 20 20 20 20   <<<HTML.       
0500: 20 20 20 20 3c 64 74 3e 3c 61 20 68 72 65 66 3d      <dt><a href=
0510: 22 61 64 6d 69 6e 2f 24 72 6f 77 5b 6e 61 6d 65  "admin/$row[name
0520: 5d 22 3e 24 72 6f 77 5b 6e 61 6d 65 5d 3c 2f 61  ]">$row[name]</a
0530: 3e 20 28 3c 65 6d 3e 24 72 6f 77 5b 66 6c 61 67  > (<em>$row[flag
0540: 5d 3c 2f 65 6d 3e 20 66 6c 61 67 73 20 6f 6e 20  ]</em> flags on 
0550: 23 24 72 6f 77 5b 74 5f 70 75 62 6c 69 73 68 65  #$row[t_publishe
0560: 64 5d 29 3c 2f 64 74 3e 0a 20 20 20 20 20 20 20  d])</dt>.       
0570: 20 20 20 20 3c 64 64 3e 3c 62 3e 24 72 6f 77 5b      <dd><b>$row[
0580: 72 65 61 73 6f 6e 5d 3c 2f 62 3e 0a 20 20 20 20  reason]</b>.    
0590: 20 20 20 20 20 20 20 20 20 20 20 24 72 6f 77 5b             $row[
05a0: 6e 6f 74 65 5d 0a 20 20 20 20 20 20 20 20 20 20  note].          
05b0: 20 3c 2f 64 64 3e 0a 48 54 4d 4c 3b 0a 20 20 20   </dd>.HTML;.   
05c0: 20 7d 0a 20 20 20 20 0a 7d 0a 0a 2f 2f 20 53 68   }.    .}..// Sh
05d0: 6f 77 20 65 6e 74 72 79 20 2b 20 72 65 73 70 6f  ow entry + respo
05e0: 6e 64 20 74 6f 20 61 63 74 69 6f 6e 73 0a 65 6c  nd to actions.el
05f0: 73 65 20 7b 0a 0a 0a 20 20 20 20 2f 2a 2a 0a 20  se {...    /**. 
0600: 20 20 20 20 2a 20 41 70 70 6c 79 20 61 63 74 69      * Apply acti
0610: 6f 6e 73 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ons.     *.     
0620: 2a 20 20 20 e2 86 92 20 41 63 74 69 6f 6e 73 20  *   ... Actions 
0630: 69 6e 20 60 61 63 74 69 6f 6e 5b 66 69 65 6c 64  in `action[field
0640: 5d 5b 5d 3d 6e 61 6d 65 20 61 6e 64 20 61 63 74  ][]=name and act
0650: 69 6f 6e 5b 76 61 6c 75 65 5d 5b 5d 3d 76 61 6c  ion[value][]=val
0660: 75 65 60 0a 20 20 20 20 20 2a 20 20 20 e2 86 92  ue`.     *   ...
0670: 20 52 65 76 69 73 69 6f 6e 73 20 61 72 65 20 20   Revisions are  
0680: 6c 69 73 74 73 20 6f 66 20 60 73 65 6c 65 63 74  lists of `select
0690: 5b 74 5f 70 75 62 6c 69 73 68 65 64 5d 5b 5d 20  [t_published][] 
06a0: 3d 20 74 5f 63 68 61 6e 67 65 64 60 0a 20 20 20  = t_changed`.   
06b0: 20 20 2a 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20    *.     */.    
06c0: 69 66 20 28 24 5f 50 4f 53 54 2d 3e 68 61 73 28  if ($_POST->has(
06d0: 22 61 63 74 69 6f 6e 22 29 29 20 7b 0a 20 20 20  "action")) {.   
06e0: 20 0a 20 20 20 20 20 20 20 20 2f 2f 20 4d 65 72   .        // Mer
06f0: 67 65 20 61 63 74 69 6f 6e 20 6b 65 79 73 20 61  ge action keys a
0700: 6e 64 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  nd values.      
0710: 20 20 24 61 63 74 69 6f 6e 20 3d 20 24 5f 50 4f    $action = $_PO
0720: 53 54 2d 3e 72 61 77 5b 22 61 63 74 69 6f 6e 22  ST->raw["action"
0730: 5d 3b 0a 20 20 20 20 20 20 20 20 24 61 63 74 69  ];.        $acti
0740: 6f 6e 20 3d 20 61 72 72 61 79 5f 63 6f 6d 62 69  on = array_combi
0750: 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ne(.            
0760: 61 72 72 61 79 5f 69 6e 74 65 72 73 65 63 74 5f  array_intersect_
0770: 6b 65 79 28 24 61 63 74 69 6f 6e 5b 22 66 69 65  key($action["fie
0780: 6c 64 22 5d 2c 20 24 61 63 74 69 6f 6e 5b 22 76  ld"], $action["v
0790: 61 6c 75 65 22 5d 29 2c 0a 20 20 20 20 20 20 20  alue"]),.       
07a0: 20 20 20 20 20 61 72 72 61 79 5f 69 6e 74 65 72       array_inter
07b0: 73 65 63 74 5f 6b 65 79 28 24 61 63 74 69 6f 6e  sect_key($action
07c0: 5b 22 76 61 6c 75 65 22 5d 2c 20 24 61 63 74 69  ["value"], $acti
07d0: 6f 6e 5b 22 66 69 65 6c 64 22 5d 29 0a 20 20 20  on["field"]).   
07e0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
07f0: 76 61 72 5f 64 75 6d 70 28 24 61 63 74 69 6f 6e  var_dump($action
0800: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 52  );..        // R
0810: 75 6e 20 74 72 6f 75 67 68 20 61 63 74 69 6f 6e  un trough action
0820: 73 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  s.        foreac
0830: 68 20 28 24 61 63 74 69 6f 6e 20 61 73 20 24 66  h ($action as $f
0840: 69 65 6c 64 3d 3e 24 76 61 6c 75 65 29 20 69 66  ield=>$value) if
0850: 20 28 73 74 72 6c 65 6e 28 24 66 69 65 6c 64 29   (strlen($field)
0860: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0870: 2f 2f 20 55 70 64 61 74 65 20 44 42 20 66 6f 72  // Update DB for
0880: 20 65 61 63 68 20 72 65 76 69 73 69 6f 6e 20 69   each revision i
0890: 6e 20 73 65 6c 65 63 74 5b 5d 5b 5d 0a 20 20 20  n select[][].   
08a0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
08b0: 20 28 24 5f 50 4f 53 54 2d 3e 72 61 77 5b 22 73   ($_POST->raw["s
08c0: 65 6c 65 63 74 22 5d 20 61 73 20 24 74 5f 70 75  elect"] as $t_pu
08d0: 62 6c 69 73 68 65 64 20 3d 3e 20 24 74 5f 63 68  blished => $t_ch
08e0: 61 6e 67 65 64 29 20 7b 0a 20 20 20 20 20 20 20  anged) {.       
08f0: 20 20 20 20 20 20 20 20 20 64 62 28 22 55 50 44           db("UPD
0900: 41 54 45 20 72 65 6c 65 61 73 65 0a 20 20 20 20  ATE release.    
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 53 45 54 20 3a 3f 20 3d 20 3f 0a 20 20 20 20 20  SET :? = ?.     
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
0940: 48 45 52 45 20 6e 61 6d 65 3d 3f 20 41 4e 44 20  HERE name=? AND 
0950: 74 5f 70 75 62 6c 69 73 68 65 64 3d 3f 20 41 4e  t_published=? AN
0960: 44 20 74 5f 63 68 61 6e 67 65 64 20 49 4e 20 28  D t_changed IN (
0970: 3f 3f 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ??)",.          
0980: 20 20 20 20 20 20 20 20 20 20 61 72 72 61 79 28            array(
0990: 24 66 69 65 6c 64 29 2c 20 24 76 61 6c 75 65 2c  $field), $value,
09a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
09b0: 20 20 20 20 20 24 6e 61 6d 65 2c 20 24 74 5f 70       $name, $t_p
09c0: 75 62 6c 69 73 68 65 64 2c 20 24 74 5f 63 68 61  ublished, $t_cha
09d0: 6e 67 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nged.           
09e0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
09f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
0a00: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
0a10: 20 2f 2f 20 4d 61 6e 75 61 6c 6c 79 20 65 6d 70   // Manually emp
0a20: 74 79 20 60 66 6c 61 67 73 60 20 74 61 62 6c 65  ty `flags` table
0a30: 0a 20 20 20 20 20 20 20 20 69 66 20 28 24 61 63  .        if ($ac
0a40: 74 69 6f 6e 5b 22 66 6c 61 67 22 5d 20 3d 3d 3d  tion["flag"] ===
0a50: 20 22 30 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "0") {.        
0a60: 20 20 20 20 64 62 28 22 44 45 4c 45 54 45 20 46      db("DELETE F
0a70: 52 4f 4d 20 66 6c 61 67 73 20 57 48 45 52 45 20  ROM flags WHERE 
0a80: 6e 61 6d 65 3d 3f 22 2c 20 24 6e 61 6d 65 29 3b  name=?", $name);
0a90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
0aa0: 0a 0a 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20  ....    /**.    
0ab0: 20 2a 20 47 65 74 20 61 6c 6c 20 72 65 76 69 73   * Get all revis
0ac0: 69 6f 6e 73 20 61 6e 64 20 66 6c 61 67 73 20 66  ions and flags f
0ad0: 6f 72 20 70 72 6f 6a 65 63 74 20 6e 61 6d 65 0a  or project name.
0ae0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 0a 20 20       *.     *.  
0af0: 20 20 20 2a 2f 0a 20 20 20 20 24 65 6e 74 72 69     */.    $entri
0b00: 65 73 20 3d 20 64 62 28 22 53 45 4c 45 43 54 20  es = db("SELECT 
0b10: 2a 20 46 52 4f 4d 20 72 65 6c 65 61 73 65 20 57  * FROM release W
0b20: 48 45 52 45 20 6e 61 6d 65 3d 3f 20 4f 52 44 45  HERE name=? ORDE
0b30: 52 20 42 59 20 74 5f 70 75 62 6c 69 73 68 65 64  R BY t_published
0b40: 20 41 53 43 2c 20 74 5f 63 68 61 6e 67 65 64 20   ASC, t_changed 
0b50: 41 53 43 22 2c 20 24 6e 61 6d 65 29 2d 3e 66 65  ASC", $name)->fe
0b60: 74 63 68 41 6c 6c 28 29 3b 0a 20 20 20 20 24 66  tchAll();.    $f
0b70: 6c 61 67 73 20 3d 20 64 62 28 22 53 45 4c 45 43  lags = db("SELEC
0b80: 54 20 2a 20 46 52 4f 4d 20 66 6c 61 67 73 20 57  T * FROM flags W
0b90: 48 45 52 45 20 6e 61 6d 65 3d 3f 22 2c 20 24 6e  HERE name=?", $n
0ba0: 61 6d 65 29 2d 3e 66 65 74 63 68 41 6c 6c 28 29  ame)->fetchAll()
0bb0: 3b 0a 0a 0a 20 20 20 20 2f 2f 20 53 74 61 72 74  ;...    // Start
0bc0: 20 3c 66 6f 72 6d 3e 0a 20 20 20 20 70 72 69 6e   <form>.    prin
0bd0: 74 20 22 3c 68 33 3e 45 64 69 74 20 27 24 6e 61  t "<h3>Edit '$na
0be0: 6d 65 27 20 72 65 76 69 73 69 6f 6e 73 3c 2f 68  me' revisions</h
0bf0: 33 3e 20 20 4f 6c 64 65 73 74 20 74 6f 20 6e 65  3>  Oldest to ne
0c00: 77 65 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  west..          
0c10: 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 27 61   <form action='a
0c20: 64 6d 69 6e 2f 24 6e 61 6d 65 27 20 6d 65 74 68  dmin/$name' meth
0c30: 6f 64 3d 50 4f 53 54 3e 20 20 20 20 20 20 20 20  od=POST>        
0c40: 20 0a 20 20 20 20 20 20 20 20 20 20 22 3b 0a 0a   .          ";..
0c50: 20 20 20 20 2f 2f 20 53 68 6f 77 20 61 6c 6c 20      // Show all 
0c60: 66 6c 61 67 67 69 6e 67 20 6e 6f 74 65 73 0a 20  flagging notes. 
0c70: 20 20 20 66 6f 72 65 61 63 68 20 28 24 66 6c 61     foreach ($fla
0c80: 67 73 20 61 73 20 24 72 6f 77 29 20 7b 0a 20 20  gs as $row) {.  
0c90: 20 20 20 20 20 20 24 72 6f 77 20 3d 20 61 72 72        $row = arr
0ca0: 61 79 5f 6d 61 70 28 22 69 6e 70 75 74 3a 3a 68  ay_map("input::h
0cb0: 74 6d 6c 22 2c 20 24 72 6f 77 29 3b 0a 20 20 20  tml", $row);.   
0cc0: 20 20 20 20 20 70 72 69 6e 74 20 22 3c 6c 69 3e       print "<li>
0cd0: 46 6c 61 67 3a 20 3c 62 3e 24 72 6f 77 5b 72 65  Flag: <b>$row[re
0ce0: 61 73 6f 6e 5d 3c 2f 62 3e 3c 62 72 3e 4e 6f 74  ason]</b><br>Not
0cf0: 65 3a 20 3c 65 6d 3e 24 72 6f 77 5b 6e 6f 74 65  e: <em>$row[note
0d00: 5d 3c 2f 65 6d 3e 3c 62 72 3e 42 79 3a 20 3c 75  ]</em><br>By: <u
0d10: 3e 24 72 6f 77 5b 73 75 62 6d 69 74 74 65 72 5f  >$row[submitter_
0d20: 6f 70 65 6e 69 64 5d 3c 2f 75 3e 3c 2f 6c 69 3e  openid]</u></li>
0d30: 3c 62 72 3e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20  <br>";.    }..  
0d40: 20 20 0a 20 20 20 20 2f 2f 20 50 72 69 6e 74 20    .    // Print 
0d50: 65 61 63 68 20 72 65 76 69 73 69 6f 6e 3b 0a 20  each revision;. 
0d60: 20 20 20 66 6f 72 65 61 63 68 20 28 24 65 6e 74     foreach ($ent
0d70: 72 69 65 73 20 61 73 20 24 72 65 76 3d 3e 24 72  ries as $rev=>$r
0d80: 6f 77 29 20 7b 0a 20 20 20 20 0a 20 20 20 20 20  ow) {.    .     
0d90: 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 2c 20 6c     // current, l
0da0: 61 73 74 2c 20 61 6e 64 20 6e 65 78 74 20 72 6f  ast, and next ro
0db0: 77 0a 20 20 20 20 20 20 20 20 24 72 6f 77 20 3d  w.        $row =
0dc0: 20 61 72 72 61 79 5f 6d 61 70 28 22 69 6e 70 75   array_map("inpu
0dd0: 74 3a 3a 68 74 6d 6c 22 2c 20 24 72 6f 77 29 3b  t::html", $row);
0de0: 0a 20 20 20 20 20 20 20 20 24 6c 61 73 74 20 3d  .        $last =
0df0: 20 69 73 73 65 74 28 24 65 6e 74 72 69 65 73 5b   isset($entries[
0e00: 24 72 65 76 2d 31 5d 29 20 3f 20 61 72 72 61 79  $rev-1]) ? array
0e10: 5f 6d 61 70 28 22 69 6e 70 75 74 3a 3a 68 74 6d  _map("input::htm
0e20: 6c 22 2c 20 24 65 6e 74 72 69 65 73 5b 24 72 65  l", $entries[$re
0e30: 76 2d 31 5d 29 20 3a 20 24 72 6f 77 3b 0a 20 20  v-1]) : $row;.  
0e40: 20 20 20 20 20 20 24 6e 65 78 74 20 3d 20 69 73        $next = is
0e50: 73 65 74 28 24 65 6e 74 72 69 65 73 5b 24 72 65  set($entries[$re
0e60: 76 2b 31 5d 29 20 3f 20 61 72 72 61 79 5f 6d 61  v+1]) ? array_ma
0e70: 70 28 22 69 6e 70 75 74 3a 3a 68 74 6d 6c 22 2c  p("input::html",
0e80: 20 24 65 6e 74 72 69 65 73 5b 24 72 65 76 2b 31   $entries[$rev+1
0e90: 5d 29 20 3a 20 24 72 6f 77 3b 0a 0a 20 20 20 20  ]) : $row;..    
0ea0: 20 20 20 20 2f 2f 20 56 65 72 73 69 6f 6e 20 68      // Version h
0eb0: 65 61 64 65 72 0a 20 20 20 20 20 20 20 20 24 64  eader.        $d
0ec0: 61 74 65 20 3d 20 73 74 72 66 74 69 6d 65 28 22  ate = strftime("
0ed0: 25 59 2d 25 6d 2d 25 64 20 25 54 22 2c 20 24 72  %Y-%m-%d %T", $r
0ee0: 6f 77 5b 22 74 5f 63 68 61 6e 67 65 64 22 5d 29  ow["t_changed"])
0ef0: 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 20  ;.        print 
0f00: 22 0a 20 20 20 20 20 20 20 20 3c 62 72 3e 0a 20  ".        <br>. 
0f10: 20 20 20 20 20 20 20 3c 74 61 62 6c 65 20 63 6c         <table cl
0f20: 61 73 73 3d 27 72 63 20 61 64 6d 69 6e 27 3e 0a  ass='rc admin'>.
0f30: 20 20 20 20 20 20 20 20 3c 74 72 3e 0a 20 20 20          <tr>.   
0f40: 20 20 20 20 20 20 20 3c 74 68 3e 0a 20 20 20 20         <th>.    
0f50: 20 20 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20           <input 
0f60: 74 79 70 65 3d 63 68 65 63 6b 62 6f 78 20 6e 61  type=checkbox na
0f70: 6d 65 3d 27 73 65 6c 65 63 74 5b 24 72 6f 77 5b  me='select[$row[
0f80: 74 5f 70 75 62 6c 69 73 68 65 64 5d 5d 5b 5d 27  t_published]][]'
0f90: 20 76 61 6c 75 65 3d 27 24 72 6f 77 5b 74 5f 63   value='$row[t_c
0fa0: 68 61 6e 67 65 64 5d 27 3e 0a 20 20 20 20 20 20  hanged]'>.      
0fb0: 20 20 20 20 20 20 20 72 65 76 3d 24 72 65 76 0a         rev=$rev.
0fc0: 20 20 20 20 20 20 20 20 20 20 3c 2f 74 68 3e 0a            </th>.
0fd0: 20 20 20 20 20 20 20 20 20 20 3c 74 68 3e 0a 20            <th>. 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 3d              pub=
0ff0: 24 72 6f 77 5b 74 5f 70 75 62 6c 69 73 68 65 64  $row[t_published
1000: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 63  ].             c
1010: 68 67 3d 24 72 6f 77 5b 74 5f 63 68 61 6e 67 65  hg=$row[t_change
1020: 64 5d 20 3c 73 6d 61 6c 6c 3e 28 24 64 61 74 65  d] <small>($date
1030: 29 3c 2f 73 6d 61 6c 6c 3e 0a 20 20 20 20 20 20  )</small>.      
1040: 20 20 20 20 3c 2f 74 68 3e 0a 20 20 20 20 20 20      </th>.      
1050: 20 20 3c 2f 74 72 3e 22 3b 0a 20 20 20 20 20 20    </tr>";.      
1060: 20 20 0a 20 20 20 20 20 20 20 20 2f 2f 20 46 69    .        // Fi
1070: 65 6c 64 73 0a 20 20 20 20 20 20 20 20 66 6f 72  elds.        for
1080: 65 61 63 68 20 28 24 72 6f 77 20 61 73 20 24 66  each ($row as $f
1090: 3d 3e 24 76 29 20 7b 0a 20 20 20 20 20 20 20 20  =>$v) {.        
10a0: 20 20 20 20 24 76 20 3d 20 70 64 69 66 66 3a 3a      $v = pdiff::
10b0: 74 72 69 64 69 66 66 28 24 6c 61 73 74 5b 24 66  tridiff($last[$f
10c0: 5d 2c 20 24 76 2c 20 24 6e 65 78 74 5b 24 66 5d  ], $v, $next[$f]
10d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
10e0: 66 20 28 69 6e 5f 61 72 72 61 79 28 24 66 2c 20  f (in_array($f, 
10f0: 5b 22 74 5f 70 75 62 6c 69 73 68 65 64 22 2c 20  ["t_published", 
1100: 22 74 5f 63 68 61 6e 67 65 64 22 5d 29 29 20 7b  "t_changed"])) {
1110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1120: 20 24 76 20 2e 3d 20 22 20 3c 73 6d 61 6c 6c 3e   $v .= " <small>
1130: 28 22 20 2e 20 73 74 72 66 74 69 6d 65 28 22 25  (" . strftime("%
1140: 59 2d 25 6d 2d 25 64 20 25 54 22 2c 20 69 6e 74  Y-%m-%d %T", int
1150: 76 61 6c 28 24 72 6f 77 5b 24 66 5d 29 29 20 2e  val($row[$f])) .
1160: 20 22 29 3c 2f 73 6d 61 6c 6c 3e 22 3b 0a 20 20   ")</small>";.  
1170: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1180: 20 20 20 20 20 20 20 20 69 66 20 28 69 6e 5f 61          if (in_a
1190: 72 72 61 79 28 24 66 2c 20 5b 22 68 69 64 64 65  rray($f, ["hidde
11a0: 6e 22 2c 22 66 6c 61 67 22 2c 22 64 65 6c 65 74  n","flag","delet
11b0: 65 64 22 2c 22 6e 61 6d 65 22 2c 22 74 5f 63 68  ed","name","t_ch
11c0: 61 6e 67 65 64 22 2c 22 76 65 72 73 69 6f 6e 22  anged","version"
11d0: 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ])) {.          
11e0: 20 20 20 20 20 20 24 66 20 3d 20 22 3c 65 6d 3e        $f = "<em>
11f0: 24 66 3c 2f 65 6d 3e 22 3b 0a 20 20 20 20 20 20  $f</em>";.      
1200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1210: 20 20 20 20 70 72 69 6e 74 20 22 3c 74 72 3e 3c      print "<tr><
1220: 74 64 3e 24 66 3c 2f 74 64 3e 3c 74 64 3e 24 76  td>$f</td><td>$v
1230: 3c 2f 74 64 3e 22 3b 0a 20 20 20 20 20 20 20 20  </td>";.        
1240: 7d 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 20  }.        print 
1250: 22 3c 2f 74 61 62 6c 65 3e 22 3b 0a 20 20 20 20  "</table>";.    
1260: 7d 0a 0a 20 20 20 20 0a 20 20 20 20 2f 2a 2a 0a  }..    .    /**.
1270: 20 20 20 20 20 2a 20 50 72 69 6e 74 20 60 61 63       * Print `ac
1280: 74 69 6f 6e 60 20 66 6f 72 6d 20 66 69 65 6c 64  tion` form field
1290: 73 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  s.     *.     * 
12a0: 20 e2 86 92 20 41 73 73 6f 63 63 69 61 74 69 76   ... Assocciativ
12b0: 65 6c 79 20 61 73 20 60 61 63 74 69 6f 6e 5b 66  ely as `action[f
12c0: 69 65 6c 64 5d 5b 5d 20 3d 20 64 62 66 69 65 6c  ield][] = dbfiel
12d0: 64 60 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  d`.     *       
12e0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 60             and `
12f0: 61 63 74 69 6f 6e 5b 76 61 6c 75 65 5d 5b 5d 20  action[value][] 
1300: 3d 20 76 61 6b 75 65 60 0a 20 20 20 20 20 2a 20  = vakue`.     * 
1310: 20 e2 86 92 20 41 70 70 6c 79 69 6e 67 20 64 65   ... Applying de
1320: 70 65 6e 64 73 20 61 6e 20 74 68 65 20 66 69 65  pends an the fie
1330: 6c 64 20 62 65 69 6e 67 20 6e 6f 6e 2d 65 6d 70  ld being non-emp
1340: 74 79 0a 20 20 20 20 20 2a 20 20 20 20 28 66 6f  ty.     *    (fo
1350: 72 20 75 6e 63 68 65 63 6b 65 64 20 63 68 65 63  r unchecked chec
1360: 6b 62 6f 78 65 73 20 74 68 65 79 20 61 72 65 29  kboxes they are)
1370: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 2f  ..     *.     */
1380: 0a 20 20 20 20 70 72 69 6e 74 20 3c 3c 3c 48 54  .    print <<<HT
1390: 4d 4c 0a 20 20 20 20 3c 68 34 3e 41 63 74 69 6f  ML.    <h4>Actio
13a0: 6e 73 3c 2f 68 34 3e 0a 20 20 20 20 3c 74 61 62  ns</h4>.    <tab
13b0: 6c 65 20 63 6c 61 73 73 3d 72 63 3e 0a 20 20 20  le class=rc>.   
13c0: 20 3c 74 72 3e 0a 20 20 20 20 20 20 3c 74 64 3e   <tr>.      <td>
13d0: 3c 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20  <label>.        
13e0: 3c 69 6e 70 75 74 20 74 79 70 65 3d 63 68 65 63  <input type=chec
13f0: 6b 62 6f 78 20 6e 61 6d 65 3d 22 61 63 74 69 6f  kbox name="actio
1400: 6e 5b 66 69 65 6c 64 5d 5b 30 5d 22 20 76 61 6c  n[field][0]" val
1410: 75 65 3d 22 68 69 64 64 65 6e 22 3e 0a 20 20 20  ue="hidden">.   
1420: 20 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65       <input type
1430: 3d 68 69 64 64 65 6e 20 6e 61 6d 65 3d 22 61 63  =hidden name="ac
1440: 74 69 6f 6e 5b 76 61 6c 75 65 5d 5b 30 5d 22 20  tion[value][0]" 
1450: 76 61 6c 75 65 3d 22 31 22 3e 0a 20 20 20 20 20  value="1">.     
1460: 20 20 20 3c 62 3e 53 65 74 20 68 69 64 64 65 6e     <b>Set hidden
1470: 3c 2f 62 3e 0a 20 20 20 20 20 20 3c 2f 6c 61 62  </b>.      </lab
1480: 65 6c 3e 3c 2f 74 64 3e 0a 20 20 20 20 20 20 3c  el></td>.      <
1490: 74 64 3e 73 6f 20 74 68 65 20 72 65 76 69 73 69  td>so the revisi
14a0: 6f 6e 20 77 69 6c 6c 20 6e 6f 20 6c 6f 6e 67 65  on will no longe
14b0: 72 20 73 68 6f 77 20 75 70 20 6f 6e 20 74 68 65  r show up on the
14c0: 20 66 72 6f 6e 74 70 61 67 65 2e 20 3c 2f 74 64   frontpage. </td
14d0: 3e 0a 20 20 20 20 3c 2f 74 72 3e 0a 20 20 20 20  >.    </tr>.    
14e0: 3c 74 72 3e 0a 20 20 20 20 20 20 3c 74 64 3e 3c  <tr>.      <td><
14f0: 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 3c  label>.        <
1500: 69 6e 70 75 74 20 74 79 70 65 3d 63 68 65 63 6b  input type=check
1510: 62 6f 78 20 6e 61 6d 65 3d 22 61 63 74 69 6f 6e  box name="action
1520: 5b 66 69 65 6c 64 5d 5b 31 5d 22 20 76 61 6c 75  [field][1]" valu
1530: 65 3d 22 64 65 6c 65 74 65 64 22 3e 0a 20 20 20  e="deleted">.   
1540: 20 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65       <input type
1550: 3d 68 69 64 64 65 6e 20 6e 61 6d 65 3d 22 61 63  =hidden name="ac
1560: 74 69 6f 6e 5b 76 61 6c 75 65 5d 5b 31 5d 22 20  tion[value][1]" 
1570: 76 61 6c 75 65 3d 22 31 22 3e 0a 20 20 20 20 20  value="1">.     
1580: 20 20 20 3c 62 3e 4d 61 72 6b 20 64 65 6c 65 74     <b>Mark delet
1590: 65 64 3c 2f 62 3e 0a 20 20 20 20 20 20 3c 2f 6c  ed</b>.      </l
15a0: 61 62 65 6c 3e 3c 2f 74 64 3e 0a 20 20 20 20 20  abel></td>.     
15b0: 20 3c 74 64 3e 20 74 6f 20 74 65 72 6d 69 6e 61   <td> to termina
15c0: 74 65 20 61 20 70 72 6f 6a 65 63 74 20 72 65 76  te a project rev
15d0: 69 73 69 6f 6e 20 6c 69 6e 65 20 3c 2f 74 64 3e  ision line </td>
15e0: 0a 20 20 20 20 3c 2f 74 72 3e 0a 20 20 20 20 3c  .    </tr>.    <
15f0: 74 72 3e 0a 20 20 20 20 20 20 3c 74 64 3e 3c 6c  tr>.      <td><l
1600: 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 3c 69  abel>.        <i
1610: 6e 70 75 74 20 74 79 70 65 3d 63 68 65 63 6b 62  nput type=checkb
1620: 6f 78 20 6e 61 6d 65 3d 22 61 63 74 69 6f 6e 5b  ox name="action[
1630: 66 69 65 6c 64 5d 5b 32 5d 22 20 76 61 6c 75 65  field][2]" value
1640: 3d 22 66 6c 61 67 22 20 63 68 65 63 6b 65 64 3e  ="flag" checked>
1650: 0a 20 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20  .        <input 
1660: 74 79 70 65 3d 68 69 64 64 65 6e 20 6e 61 6d 65  type=hidden name
1670: 3d 22 61 63 74 69 6f 6e 5b 76 61 6c 75 65 5d 5b  ="action[value][
1680: 32 5d 22 20 76 61 6c 75 65 3d 22 30 22 3e 0a 20  2]" value="0">. 
1690: 20 20 20 20 20 20 20 3c 62 3e 55 6e 73 65 74 20         <b>Unset 
16a0: 66 6c 61 67 73 3c 2f 62 3e 0a 20 20 20 20 20 20  flags</b>.      
16b0: 3c 2f 6c 61 62 65 6c 3e 3c 2f 74 64 3e 0a 20 20  </label></td>.  
16c0: 20 20 20 20 3c 74 64 3e 20 74 6f 20 63 6c 65 61      <td> to clea
16d0: 72 20 66 6c 61 67 67 69 6e 67 20 68 69 73 74 6f  r flagging histo
16e0: 72 79 20 77 68 65 6e 20 66 69 6e 69 73 68 65 64  ry when finished
16f0: 2e 20 3c 2f 74 64 3e 0a 20 20 20 20 3c 2f 74 72  . </td>.    </tr
1700: 3e 0a 20 20 20 20 3c 74 72 3e 3c 74 68 3e 55 70  >.    <tr><th>Up
1710: 64 61 74 65 20 66 69 65 6c 64 3c 2f 74 68 3e 3c  date field</th><
1720: 74 68 3e 77 69 74 68 20 76 61 6c 75 65 3c 2f 74  th>with value</t
1730: 68 3e 3c 2f 74 72 3e 0a 20 20 20 20 3c 74 72 3e  h></tr>.    <tr>
1740: 0a 20 20 20 20 20 20 3c 74 64 3e 20 3c 69 6e 70  .      <td> <inp
1750: 75 74 20 74 79 70 65 3d 74 65 78 74 20 6e 61 6d  ut type=text nam
1760: 65 3d 22 61 63 74 69 6f 6e 5b 66 69 65 6c 64 5d  e="action[field]
1770: 5b 33 5d 22 20 76 61 6c 75 65 3d 22 22 3e 20 3c  [3]" value=""> <
1780: 2f 74 64 3e 0a 20 20 20 20 20 20 3c 74 64 3e 20  /td>.      <td> 
1790: 3c 69 6e 70 75 74 20 74 79 70 65 3d 74 65 78 74  <input type=text
17a0: 20 6e 61 6d 65 3d 22 61 63 74 69 6f 6e 5b 76 61   name="action[va
17b0: 6c 75 65 5d 5b 33 5d 22 20 76 61 6c 75 65 3d 22  lue][3]" value="
17c0: 22 20 73 69 7a 65 3d 34 30 3e 20 3c 2f 74 64 3e  " size=40> </td>
17d0: 0a 20 20 20 20 3c 2f 74 72 3e 0a 20 20 20 20 3c  .    </tr>.    <
17e0: 74 72 3e 0a 20 20 20 20 20 20 3c 74 64 3e 20 3c  tr>.      <td> <
17f0: 69 6e 70 75 74 20 74 79 70 65 3d 74 65 78 74 20  input type=text 
1800: 6e 61 6d 65 3d 22 61 63 74 69 6f 6e 5b 66 69 65  name="action[fie
1810: 6c 64 5d 5b 34 5d 22 20 76 61 6c 75 65 3d 22 22  ld][4]" value=""
1820: 3e 20 3c 2f 74 64 3e 0a 20 20 20 20 20 20 3c 74  > </td>.      <t
1830: 64 3e 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 74  d> <input type=t
1840: 65 78 74 20 6e 61 6d 65 3d 22 61 63 74 69 6f 6e  ext name="action
1850: 5b 76 61 6c 75 65 5d 5b 34 5d 22 20 76 61 6c 75  [value][4]" valu
1860: 65 3d 22 22 20 73 69 7a 65 3d 34 30 3e 20 3c 2f  e="" size=40> </
1870: 74 64 3e 0a 20 20 20 20 3c 2f 74 72 3e 0a 20 20  td>.    </tr>.  
1880: 20 20 3c 74 72 3e 0a 20 20 20 20 20 20 3c 74 64    <tr>.      <td
1890: 3e 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 74 65  > <input type=te
18a0: 78 74 20 6e 61 6d 65 3d 22 61 63 74 69 6f 6e 5b  xt name="action[
18b0: 66 69 65 6c 64 5d 5b 35 5d 22 20 76 61 6c 75 65  field][5]" value
18c0: 3d 22 22 3e 20 3c 2f 74 64 3e 0a 20 20 20 20 20  =""> </td>.     
18d0: 20 3c 74 64 3e 20 3c 69 6e 70 75 74 20 74 79 70   <td> <input typ
18e0: 65 3d 74 65 78 74 20 6e 61 6d 65 3d 22 61 63 74  e=text name="act
18f0: 69 6f 6e 5b 76 61 6c 75 65 5d 5b 35 5d 22 20 76  ion[value][5]" v
1900: 61 6c 75 65 3d 22 22 20 73 69 7a 65 3d 34 30 3e  alue="" size=40>
1910: 20 3c 2f 74 64 3e 0a 20 20 20 20 3c 2f 74 72 3e   </td>.    </tr>
1920: 0a 20 20 20 20 3c 2f 74 61 62 6c 65 3e 0a 20 20  .    </table>.  
1930: 20 20 3c 62 72 3e 0a 20 20 20 20 3c 69 6e 70 75    <br>.    <inpu
1940: 74 20 74 79 70 65 3d 73 75 62 6d 69 74 20 76 61  t type=submit va
1950: 6c 75 65 3d 41 70 70 6c 79 3e 0a 20 20 20 20 3c  lue=Apply>.    <
1960: 62 72 3e 0a 20 20 20 20 3c 62 72 3e 0a 48 54 4d  br>.    <br>.HTM
1970: 4c 3b 0a 7d 0a 0a 0a 0a 3f 3e                    L;.}....?>