1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335:
<?php
class fieldExtender {
function constructor($me, $newfields) {
$previous = getSerializedArray(getOption(get_class($this) . '_addedFields'));
$current = $fields = array();
if (extensionEnabled($me)) {
foreach ($newfields as $newfield) {
$current[$newfield['table']][$newfield['name']] = true;
unset($previous[$newfield['table']][$newfield['name']]);
switch (strtolower($newfield['type'])) {
default:
$dbType = strtoupper($newfield['type']);
break;
case 'int':
case 'varchar':
$dbType = strtoupper($newfield['type']) . '(' . min(255, $newfield['size']) . ')';
break;
}
$sql = 'ALTER TABLE ' . prefix($newfield['table']) . ' ADD COLUMN `' . $newfield['name'] . '` ' . $dbType;
if (query($sql, false) && in_array($newfield['table'], array('albums', 'images', 'news', 'news_categories', 'pages')))
$fields[] = strtolower($newfield['name']);
}
setOption(get_class($this) . '_addedFields', serialize($current));
} else {
purgeOption(get_class($this) . '_addedFields');
}
$set_fields = array_flip(explode(',', getOption('search_fields')));
foreach ($previous as $table => $orpahed) {
foreach ($orpahed as $field => $v) {
unset($set_fields[$field]);
$sql = 'ALTER TABLE ' . prefix($table) . ' DROP `' . $field . '`';
query($sql, false);
}
}
$set_fields = array_unique(array_merge($fields, array_flip($set_fields)));
setOption('search_fields', implode(',', $set_fields));
}
static function _addToSearch($list, $fields) {
foreach ($fields as $newfield) {
if (in_array($newfield['table'], array('albums', 'images', 'news', 'news_categories', 'pages'))) {
$list[strtolower($newfield['name'])] = $newfield['desc'];
}
}
return $list;
}
static function _adminSave($updated, $userobj, $i, $alter, $fields) {
if ($userobj->getValid()) {
foreach ($fields as $field) {
if (isset($_POST[$field['name'] . '_' . $i])) {
if ($field['table'] == 'administrators') {
$olddata = $userobj->get($field['name']);
$userobj->set($field['name'], $newdata = $_POST[$field['name'] . '_' . $i]);
if ($olddata != $newdata) {
$updated = true;
}
}
}
}
}
return $updated;
}
static function _adminEdit($html, $userobj, $i, $background, $current, $fields) {
$list = array();
foreach ($fields as $field) {
if ($field['table'] == 'administrators') {
$input = '<fieldset>' .
'<legend>' . $field['desc'] . '</legend>';
if (in_array(strtolower($field['type']), array('varchar', 'int', 'tinytext'))) {
$input .= '<input name = "' . $field['name'] . '_' . $i . '" type = "text" size = "' . TEXT_INPUT_SIZE . '" value = "' . html_encode($userobj->get($field['name'])) . '" />';
} else {
$input .= '<textarea name = "' . $field['name'] . '_' . $i . '" cols = "' . TEXTAREA_COLUMNS . '"rows = "1">' . html_encode($userobj->get($field['name'])) . '</textarea>';
}
$input .='</fieldset>';
$list[] = $input;
}
}
if (($count = count($list)) % 2) {
$list[] = '';
}
if (!empty($list)) {
for ($key = 0; $key < $count; $key = $key + 2) {
$html .=
'<tr' . ((!$current) ? ' style = "display:none;"' : '') . ' class = "userextrainfo">' .
'<td width = "20%"' . ((!empty($background)) ? ' style = "' . $background . '"' : '') . ' valign = "top">' .
$list[$key] .
'</td>' .
'<td ' . ((!empty($background)) ? ' style = "' . $background . '"' : '') . ' valign = "top">' .
$list[$key + 1] .
'</td>' .
'</tr>';
}
}
return $html;
}
static function _mediaItemSave($object, $i, $fields) {
foreach ($fields as $field) {
if ($field['table'] == $object->table) {
$olddata = $object->get($field['name']);
$object->set($field['name'], $newdata = $_POST[$field['name'] . '_' . $i]);
if ($olddata != $newdata) {
$updated = true;
}
}
}
}
static function _mediaItemEdit($html, $object, $i, $fields) {
foreach ($fields as $field) {
if ($field['table'] == $object->table) {
$html .= '<tr><td>' . $field['desc'] . '</td><td>';
if (in_array(strtolower($field['type']), array('varchar', 'int', 'tinytext'))) {
$html .= '<input name = "' . $field['name'] . '_' . $i . '" type = "text" style = "width:100%;" value = "' . html_encode($object->get($field['name'])) . '" />';
} else {
$html .= '<textarea name = "' . $field['name'] . '_' . $i . '" style = "width:100%;" rows = "6">' . html_encode($object->get($field['name'])) . '</textarea>';
}
$html .='</td></tr>';
}
}
return $html;
}
static function _zenpageItemSave($custom, $object, $fields) {
foreach ($fields as $field) {
if ($field['table'] == $object->table) {
$olddata = $object->get($field['name']);
$object->set($field['name'], $newdata = $_POST[$field['name']]);
if ($olddata != $newdata) {
$updated = true;
}
}
}
return $custom;
}
static function _zenpageItemEdit($html, $object, $fields) {
foreach ($fields as $field) {
if ($field['table'] == $object->table) {
$html .= '<tr><td>' . $field['desc'] . '</td><td>';
if (in_array(strtolower($field['type']), array('varchar', 'int', 'tinytext'))) {
$html .= '<input name="' . $field['name'] . '" type="text" style = "width:97%;"
value="' . html_encode($object->get($field['name'])) . '" />';
} else {
$html .= '<textarea name = "' . $field['name'] . '" style = "width:97%;" "rows="6">' . html_encode($object->get($field['name'])) . '</textarea>';
}
}
}
return $html;
}
static function _register($me, $fields) {
zp_register_filter('searchable_fields', "$me::addToSearch");
$items = array();
foreach ($fields as $field) {
$items[$field['table']] = true;
}
if (isset($items['albums'])) {
zp_register_filter("save_album_utilities_data", "$me::mediaItemSave");
zp_register_filter("edit_album_custom_data", "$me::mediaItemEdit");
}
if (isset($items['images'])) {
zp_register_filter("save_image_utilities_data", "$me::mediaItemSave");
zp_register_filter("edit_image_custom_data", "$me::mediaItemEdit");
}
if (isset($items['administrators'])) {
zp_register_filter("save_admin_custom_data", "$me::adminSave");
zp_register_filter("edit_admin_custom_data", "$me::adminEdit");
}
if (isset($items['news'])) {
zp_register_filter("save_article_custom_data", "$me::zenpageItemSave");
zp_register_filter("edit_article_custom_data", "$me::zenpageItemEdit");
}
if (isset($items['news_categories'])) {
zp_register_filter("save_category_custom_data", "$me::zenpageItemSave");
zp_register_filter("edit_category_custom_data", "$me::zenpageItemEdit");
}
if (isset($items['pages'])) {
zp_register_filter("save_page_custom_data", "$me::zenpageItemSave");
zp_register_filter("edit_page_custom_data", "$me::zenpageItemEdit");
}
if (OFFSET_PATH && !getOption($me . "_addedFields")) {
zp_register_filter('admin_note', "$me::adminNotice");
}
}
static function _adminNotice($tab, $subtab, $me) {
echo '<p class="notebox">' . sprintf(gettext('You will need to run <a href="%1$s">setup</a> to update the database with the custom fields defined by the <em>%2$s</em> plugin.'), FULLWEBPATH . '/' . ZENFOLDER . '/setup.php', $me) . '</p>';
return $tab;
}
static function _getCustomData($obj, $fields) {
$result = array();
foreach ($fields as $element) {
if ($element['table'] == $obj->table) {
$result[$element['name']] = $obj->get($element['name']);
}
}
return $result;
}
static function _setCustomData($obj, $values) {
foreach ($values as $field => $value) {
$obj->set($field, $value);
}
}
}
?>