0byt3m1n1
Path:
/
data
/
applications
/
aps
/
tikiwiki
/
3.2.0-5
/
standard
/
htdocs
/
lib
/
db
/
[
Home
]
File: tikitable.php
<?php /** * @version $Id: tikitable.php,v 1.4 2007-03-02 19:49:11 luciash Exp $ * @package Tikiwiki * @subpackage db * @copyright (C) 2005 the Tiki community * @license http://www.gnu.org/copyleft/lgpl.html GNU/LGPL */ if (strpos($_SERVER["SCRIPT_NAME"],basename(__FILE__)) !== false) { header("location: index.php"); exit; } /** * TikiDBTable Abstract Class. * @abstract * @package Tikiwiki * @subpackage db * * Parent class to some database derived objects. * Customisation will generally not involve tampering with this object. * @author Andrew Eddie <eddieajau users.sourceforge.net */ class TikiDBTable { /** @var string Name of the table in the db schema relating to child class */ var $_tbl = ''; /** @var string Name of the primary key field in the table */ var $_tbl_key = ''; /** @var string Error message */ var $_error = ''; /** @var database Database connector */ var $_db = null; /** * Object constructor to set table and key field * * Can be overloaded/supplemented by the child class * @param string $table name of the table in the db schema relating to child class * @param string $key name of the primary key field in the table */ function TikiDBTable( $table, $key, &$db ) { $this->_tbl = $table; $this->_tbl_key = $key; $this->_db =& $db; } /** * Filters public properties * @access protected * @param array List of fields to ignore */ function filter( $ignoreList=null ) { $ignore = is_array( $ignoreList ); $iFilter = new InputFilter(); foreach ($this->getPublicProperties() as $k) { if ($ignore && in_array( $k, $ignoreList ) ) { continue; } $this->$k = $iFilter->process( $this->$k ); } } function setQuery($query) { $this->_db->setQuery($query); } function query($query=null) { $result = $this->_db->query($query); // print_r($result); return $result; } /** * @return string Returns the error message */ function getError() { return $this->_error; } /** * Gets the value of the class variable * @param string The name of the class variable * @return mixed The value of the class var (or null if no var of that name exists) */ function get( $_property ) { if(isset( $this->$_property )) { return $this->$_property; } else { return null; } } /** * Returns an array of public properties * @return array */ function getPublicProperties() { static $cache = null; if (is_null( $cache )) { $cache = array(); foreach (get_class_vars( get_class( $this ) ) as $key=>$val) { if (substr( $key, 0, 1 ) != '_') { $cache[] = $key; } } } return $cache; } /** * Set the value of the class variable * @param string The name of the class variable * @param mixed The value to assign to the variable */ function set( $_property, $_value ) { $this->$_property = $_value; } /** * generic check method * * can be overloaded/supplemented by the child class * @return boolean True if the object is ok */ function check() { return true; } /** * Inserts a new row if id is zero or updates an existing row in the database table * * Can be overloaded/supplemented by the child class * @param boolean If false, null object variables are not updated * @return null|string null if successful otherwise returns and error message */ function store( $updateNulls=false ) { $k = $this->_tbl_key; global $migrate; if( $this->$k && !$migrate) { $ret = $this->_db->updateObject( $this->_tbl, $this, $this->_tbl_key, $updateNulls ); } else { $ret = $this->_db->insertObject( $this->_tbl, $this, $this->_tbl_key ); } if( !$ret ) { $this->_error = strtolower(get_class( $this ))."::store failed <br />" . $this->_db->getErrorMsg(); return false; } else { return true; } } /** * Compacts the ordering sequence of the selected records * @param string Additional where query to limit ordering to a particular subset of records */ function updateOrder( $where='' ) { $k = $this->_tbl_key; if (!array_key_exists( 'ordering', get_class_vars( strtolower(get_class( $this )) ) )) { $this->_error = "WARNING: ".strtolower(get_class( $this ))." does not support ordering."; return false; } $this->setQuery( "SELECT $this->_tbl_key, ordering FROM $this->_tbl" . ($where ? "\nWHERE $where" : '') . "\nORDER BY ordering" ); if (!($orders = $this->loadObjectList())) { $this->_error = $this->_db->getErrorMsg(); return false; } // first pass, compact the ordering numbers for ($i=0, $n=count( $orders ); $i < $n; $i++) { if ($orders[$i]->ordering >= 0) { $orders[$i]->ordering = $i+1; } } $shift = 0; $n=count( $orders ); for ($i=0; $i < $n; $i++) { //echo "i=$i id=".$orders[$i]->$k." order=".$orders[$i]->ordering; if ($orders[$i]->$k == $this->$k) { // place 'this' record in the desired location $orders[$i]->ordering = min( $this->ordering, $n ); $shift = 1; } else if ($orders[$i]->ordering >= $this->ordering && $this->ordering > 0) { $orders[$i]->ordering++; } } //echo '<pre>';print_r($orders);echo '</pre>'; // compact once more until I can find a better algorithm for ($i=0, $n=count( $orders ); $i < $n; $i++) { if ($orders[$i]->ordering >= 0) { $orders[$i]->ordering = $i+1; $this->setQuery( "UPDATE $this->_tbl" . "\nSET ordering='".$orders[$i]->ordering."' WHERE $k='".$orders[$i]->$k."'" ); $this->query(); //echo '<br />'.$this->getQuery(); } } // if we didn't reorder the current record, make it last if ($shift == 0) { $order = $n+1; $this->setQuery( "UPDATE $this->_tbl" . "\nSET ordering='$order' WHERE $k='".$this->$k."'" ); $this->query(); //echo '<br />'.$this->getQuery(); } return true; } /** * Load a list of database objects * @param string The field name of a primary key * @return array If <var>key</var> is empty as sequential list of returned records. * If <var>key</var> is not empty then the returned array is indexed by the value * the database key. Returns <var>null</var> if the query fails. */ function loadObjectList( $key='' ) { if (!($cur = $this->query())) { return null; } $array = array(); while ($row = $cur->fetchRow() ) { if ($key) { $array[$row->$key] = $row; } else { $array[] = $row; } } return $array; } /** * Export item list to xml * @param boolean Map foreign keys to text values */ function toXML( $mapKeysToText=false ) { $xml = '<record table="' . $this->_tbl . '"'; if ($mapKeysToText) { $xml .= ' mapkeystotext="true"'; } $xml .= '>'; foreach (get_object_vars( $this ) as $k => $v) { if (is_array($v) or is_object($v) or $v === NULL) { continue; } if ($k[0] == '_') { // internal field continue; } $xml .= '<' . $k . '><![CDATA[' . $v . ']]></' . $k . '>'; } $xml .= '</record>'; return $xml; } } ?>