add('name', FAQ_NAME); $propbag->add('description', FAQ_NAME_DESC); $propbag->add('author', 'Falk Doering'); $propbag->add('version', '1.11'); $propbag->add('copyright', 'LGPL'); $propbag->add('stackable', false); $propbag->add('requirements', array( 'serendipity' => '0.9', 'smarty' => '2.6.7', 'php' => '4.1.0' )); $propbag->add('groups', array('FRONTEND_FEATURES')); $propbag->add('configuration_faq', $this->config_faq); $propbag->add('configuration_category', $this->config_category); $propbag->add('configuration', array('markup', 'daysnew', 'daysupdate', 'faqurl' )); $propbag->add('event_hooks', array( 'backend_sidebar_entries_event_display_faq' => true, 'backend_sidebar_entries' => true, 'external_plugin' => true, 'entry_display' => true, 'genpage' => true, 'css_backend' => true, 'css' => true, 'entries_footer' => true )); return true; } /** * Introspection of this plugin configuration item * * Called by serendipity when it wants to display the configuration * editor for your plugin. * $name is the name of a configuration item added in this * instrospect method. * * @access public * @param string Name of the config item * @param object A property bag object to store the configuration in * @return boolean */ function introspect_config_item($name, &$propbag) { global $serendipity; switch ($name) { case 'daysnew': $propbag->add('type', 'string'); $propbag->add('name', FAQ_DAYSNEW); $propbag->add('description', FAQ_DAYSNEW_DESC); $propbag->add('default', '15'); break; case 'daysupdate': $propbag->add('type', 'string'); $propbag->add('name', FAQ_DAYSUPDATE); $propbag->add('description', FAQ_DAYSUPDATE_DESC); $propbag->add('default', '15'); break; case 'faqurl': $propbag->add('type', 'string'); $propbag->add('name', FAQ_FAQURL); $propbag->add('description', FAQ_FAQURL_DESC); $propbag->add('default', 'faqs'); break; case 'markup': $propbag->add('type', 'boolean'); $propbag->add('name', FAQ_MARKUP); $propbag->add('description', FAQ_MARKUP_DESC); $propbag->add('default', true); break; default: return false; } return true; } /** * Introspection of this plugin faq item * * Called by this plugin when it wants to display the configuration * editor for one faq. * $name is the name of a configuration item added in this * instrospect method. * * @access public * @param string Name of the faq item * @param object A property bag object to store the configuration in * @return boolean */ function introspect_faq_item($name, &$propbag) { global $serendipity; switch ($name) { case 'question': $propbag->add('type', 'text'); $propbag->add('name', FAQ_QUESTION); $propbag->add('description', FAQ_QUESTION_DESC); $propbag->add('default', ''); break; case 'answer': $propbag->add('type', 'text'); $propbag->add('name', FAQ_ANSWER); $propbag->add('description', FAQ_ANSWER_DESC); $propbag->add('default', ''); break; case 'cid': $propbag->add('type', 'hidden'); $propbag->add('value', (empty($this->faq['cid']) ? $serendipity['GET']['cid'] : $this->faq['cid'])); break; case 'id': $propbag->add('type', 'hidden'); $propbag->add('value', $this->faq['id']); break; default: return false; } return true; } /** * Introspection of this plugin category item * * Called by this plugin when it wants to display the configuration * editor for one category. * $name is the name of a configuration item added in this * instrospect method. * * @access public * @param string Name of the category item * @param object A property bag object to store the configuration in * @return boolean */ function introspect_category_item($name, &$propbag) { global $serendipity; switch ($name) { case 'id': $propbag->add('type', 'hidden'); $propbag->add('value', $this->category['id']); break; case 'parent_id': $propbag->add('type', 'select'); $propbag->add('name', FAQ_PID); $propbag->add('description', FAQ_PID_PID); $propbag->add('select_values', $this->getCategories($serendipity['GET']['cat_lang'])); $propbag->add('default', ''); break; case 'category': $propbag->add('type', 'string'); $propbag->add('name', FAQ_CATEGORY); $propbag->add('description', FAQ_CATEGORY_DESC); $propbag->add('default', ''); break; case 'introduction': $propbag->add('type', 'text'); $propbag->add('name', FAQ_DESCRIPTION); $propbag->add('description', FAQ_DESCRIPTION_DESC); $propbag->add('default', ''); break; case 'language': $propbag->add('type', 'hidden'); $propbag->add('value', $serendipity['GET']['cat_lang']); break; default: return false; } return true; } /** * * Get categories data * * Select all categories stroed in the faq categories table. * If the parameter is true only parent categories will be * returned. * * @access public * @param boolean * @return array */ function getCategories($lang) { global $serendipity; $c = array('0' => FAQ_PARENT); $cats = $this->fetchCategories($lang); if (is_array($cats)) { $cats = serendipity_walkRecursive($cats); foreach ($cats as $cat) { if (($this->category['id'] != $cat['id']) && ($this->category['id'] != $cat['parent_id'])) { $c[$cat['id']] = $cat['category']; } } } return $c; } function fetchCategories($lang) { global $serendipity; $q = "SELECT id, parent_id, category, catorder, language FROM ".$serendipity['dbPrefix']."faq_categorys WHERE language = '$lang' ORDER BY catorder"; return serendipity_db_query($q, false, 'assoc'); } function setupDB() { global $serendipity; $db = $this->get_config('db_built', 0); switch ($db) { case 0: $q = 'CREATE TABLE '.$serendipity['dbPrefix'].'faqs ( id {AUTOINCREMENT} {PRIMARY}, cid int(11) default 0, faqorder int(11) default 0, question text, answer text ) {UTF_8}'; serendipity_db_schema_import($q); $q = "CREATE TABLE ".$serendipity['dbPrefix']."faq_categorys ( id {AUTOINCREMENT} {PRIMARY}, parent_id int(11) not null default 0, catorder int(11) default 0, category varchar(255) not null, introduction text ) {UTF_8}"; serendipity_db_schema_import($q); case 1: $q = 'ALTER TABLE '.$serendipity['dbPrefix'].'faqs ADD COLUMN changedate int(11) default 0'; serendipity_db_schema_import($q); $q = 'ALTER TABLE '.$serendipity['dbPrefix'].'faqs ADD COLUMN changetype varchar(10)'; serendipity_db_schema_import($q); case 2: $q = 'CREATE {FULLTEXT_MYSQL} INDEX faqentry_idx on '.$serendipity['dbPrefix'].'faqs (question, answer)'; serendipity_db_schema_import($q); case 3: $q = 'ALTER TABLE '.$serendipity['dbPrefix'].'faq_categorys ADD COLUMN language varchar(2)'; serendipity_db_schema_import($q); serendipity_db_update('faq_categorys', array(), array('language' => $serendipity['language'])); $this->set_config('db_built', 4); break; } } function &getFaq($key, $default = null) { return (isset($this->faq[$key]) ? $this->faq[$key] : $default); } function &getCategory($key, $default = null) { return (isset($this->category[$key]) ? $this->category[$key] : $default); } function postgreFaqPrepare() { if (empty($this->faq['faqorder'])) { $this->faq['faqorder'] = '1'; } if (empty($this->faq['id'])) { unset($this->faq['id']); } } function &updateFAQ() { global $serendipity; if (!is_numeric($this->faq['id'])) { $this->faq['changedate'] = time(); $this->faq['changetype'] = 'new'; $q = 'SELECT COUNT(id) AS counter FROM '.$serendipity['dbPrefix'].'faqs WHERE cid = '.$this->faq['cid']; $res = serendipity_db_query($q, true, 'assoc'); $this->faq['faqorder'] = ($res['counter'] + 1); $this->postgreFaqPrepare(); $result = serendipity_db_insert('faqs', $this->faq); $serendipity['POST']['id'] = serendipity_db_insert_id('faqs', 'id'); } else { $this->faq['changedate'] = time(); $this->faq['changetype'] = 'update'; $result = serendipity_db_update('faqs', array('id' => $this->faq['id']), $this->faq); } return $result; } function deleteFAQ(&$id) { global $serendipity; $q = 'SELECT cid, faqorder FROM '.$serendipity['dbPrefix'].'faqs WHERE id = '.$id; $res = serendipity_db_query($q, true, 'assoc'); $q = 'DELETE FROM '.$serendipity['dbPrefix'].'faqs WHERE id = '.$id; if (serendipity_db_query($q)) { $q = 'UPDATE '.$serendipity['dbPrefix'].'faqs SET faqorder = faqorder - 1 WHERE cid = '.$res['cid'].' AND faqorder > '.$res['faqorder']; return serendipity_db_query($q); } return false; } function fetchFAQ(&$id) { global $serendipity; $q = 'SELECT * FROM '.$serendipity['dbPrefix'].'faqs WHERE id = '.$id; $faq = serendipity_db_query($q, true, 'assoc'); if (is_array($faq)) { $this->faq =& $faq; return true; } return false; } function fetchFaqByCid(&$cid) { global $serendipity; $q = 'SELECT id, question FROM '.$serendipity['dbPrefix'].'faqs WHERE cid = '.$cid.' ORDER BY faqorder'; return serendipity_db_query($q, false, 'assoc'); } function fetchCategory(&$id) { global $serendipity; $q = 'SELECT * FROM '.$serendipity['dbPrefix'].'faq_categorys WHERE id = '.$id; $cat = serendipity_db_query($q, true, 'assoc'); if (is_array($cat)) { $this->category = &$cat; return true; } return false; } function postgreCategoryPrepare() { if (empty($this->category['parent_id'])) { $this->category['parent_id'] = '0'; } if (empty($this->category['catorder'])) { $this->category['catorder'] = '1'; } } function &updateCategory() { global $serendipity; if (!is_numeric($this->category['id'])) { $q = 'SELECT COUNT(id) AS counter FROM '.$serendipity['dbPrefix'].'faq_categorys WHERE parent_id = '.$this->category['parent_id']; $res = serendipity_db_query($q, true, 'assoc'); $this->category['catorder'] = ($res['counter'] + 1); $this->postgreCategoryPrepare(); $result = serendipity_db_insert('faq_categorys', $this->category); $serendipity['POST']['cid'] = serendipity_db_insert_id('faq_categorys', 'id'); } else { $result = serendipity_db_update('faq_categorys', array('id' => $this->category['id']), $this->category); } return $result; } function deleteCategory(&$id) { global $serendipity; $q = 'SELECT catorder, parent_id FROM '.$serendipity['dbPrefix'].'faq_categorys WHERE id = '.$id; $res = serendipity_db_query($q, true, 'assoc'); $q = 'DELETE FROM '.$serendipity['dbPrefix'].'faq_categorys WHERE id = '.$id; if (serendipity_db_query($q)) { $q = 'UPDATE '.$serendipity['dbPrefix'].'faq_categorys SET catorder = catorder - 1 WHERE parent_id = '.$res['parent_id'].' AND catorder > '.$res['catorder']; serendipity_db_query($q); $q = 'UPDATE '.$serendipity['dbPrefix'].'faq_categorys SET parent_id = 0 WHERE parent_id = '.$id; serendipity_db_query($q); return true; } return false; } function isFaq() { global $serendipity; return (($serendipity['uriArguments'][0] == $serendipity['permalinkPluginPath']) && ($serendipity['uriArguments'][1] == $this->get_config('faqurl', 'faqs'))); } function countFAQbyCid(&$cid) { global $serendipity; $q = 'SELECT COUNT(id) AS counter FROM '.$serendipity['dbPrefix'].'faqs WHERE cid = '.$cid; $res = serendipity_db_query($q, true, 'assoc'); return $res['counter']; } function prepareMove($array) { global $serendipity; if (is_array($array)) { for ($i = 0, $ii = count($array); $i < $ii; $i++) { $array[$i]['down'] = (isset($array[$i]['down']) ? $array[$i]['down'] : false); $array[$i]['up'] = (isset($array[$i]['up']) ? $array[$i]['up'] : false); for ($j = ($i + 1); $j < $ii; $j++) { if ($array[$j]['parent_id'] == $array[$i]['parent_id']) { $array[$i]['down'] = true; $array[$j]['up'] = true; } } } return $array; } return $array; } function categoryMove(&$id, $moveto) { global $serendipity; $q = 'SELECT catorder, parent_id FROM '.$serendipity['dbPrefix'].'faq_categorys WHERE id = '.$id; $old = serendipity_db_query($q, true, 'assoc'); switch ($moveto) { case D_FAQ_MOVEUP: serendipity_db_update('faq_categorys', array('parent_id' => $old['parent_id'], 'catorder' => ($old['catorder'] - 1)), array('catorder' => $old['catorder'])); serendipity_db_update('faq_categorys', array('id' => $id), array('catorder' => ($old['catorder'] - 1))); break; case D_FAQ_MOVEDOWN: serendipity_db_update('faq_categorys', array('parent_id' => $old['parent_id'], 'catorder' => ($old['catorder'] + 1)), array('catorder' => $old['catorder'])); serendipity_db_update('faq_categorys', array('id' => $id), array('catorder' => ($old['catorder'] + 1))); break; default: return false; } return true; } function faqMove(&$id, &$cid, $moveto) { global $serendipity; $q = 'SELECT faqorder FROM '.$serendipity['dbPrefix'].'faqs WHERE id = '.$id.' AND cid = '.$cid; $old = serendipity_db_query($q, true, 'assoc'); switch ($moveto) { case D_FAQ_MOVEUP: serendipity_db_update('faqs', array('cid' => $cid, 'faqorder' => ($old['faqorder'] - 1)), array('faqorder' => $old['faqorder'])); serendipity_db_update('faqs', array('id' => $id), array('faqorder' => ($old['faqorder'] - 1))); break; case D_FAQ_MOVEDOWN: serendipity_db_update('faqs', array('cid' => $cid, 'faqorder' => ($old['faqorder'] + 1)), array('faqorder' => $old['faqorder'])); serendipity_db_update('faqs', array('id' => $id), array('faqorder' => ($old['faqorder'] + 1))); break; default: return false; } return true; } function showBackend() { global $serendipity; if (!empty($serendipity['POST']['action'])) { $serendipity['GET']['action'] = &$serendipity['POST']['action']; } echo ''.FAQs.'
'.FAQ_CATEGORIES.' '. FAQS . '
'; echo ''; break; case 'categories': echo ''; if (!empty($serendipity['GET']['id'])) { $serendipity['POST']['id'] = &$serendipity['GET']['id']; } if (is_numeric($serendipity['POST']['id'])) { $this->fetchCategory($serendipity['POST']['id']); } if (($serendipity['POST']['categorySave'] == "true") && (!empty($serendipity['POST']['SAVECONF']))) { $serendipity['POST']['categorySubmit'] = true; $bag = new serendipity_property_bag(); $this->introspect($bag); $name = htmlspecialchars($bag->get('name')); $desc = htmlspecialchars($bag->get('description')); $config_faq = $bag->get('configuration_category'); foreach ($config_faq as $config_item) { $cbag = new serendipity_property_bag(); if ($this->introspect_category_item($config_item, $cbag)) { $this->category[$config_item] = serendipity_get_bool($serendipity['POST']['plugin'][$config_item]); } } $result = $this->updateCategory(); if (is_bool($result)) { echo ''.FAQ_CATEGORIES.' '.FAQS.'
'; if ((!empty($serendipity['POST']['faqDelete'])) && (is_numeric($serendipity['POST']['id']))) { $result = $this->deleteFAQ($serendipity['POST']['id']); if (is_bool($result)) { echo ''; echo ' | '; echo ' | '; echo ' | '.$faq['question'].' | '; echo ''.(($faq['up'] == true) ? ('') : ' ').' | '; echo ''.(($faq['down'] == true) ? ('') : ' ').' | '; echo '
'.FAQ_NEWFAQ.' | '; echo '
'; $lang_links = ''; foreach ($serendipity['languages'] as $lang_key => $lang_value) { if (strlen($lang_links)) { $lang_links .= ' '; } if ($this_cat_lang == $lang_key) { $lang_links .= ''; } $lang_links .= ''.$lang_key.''; if ($this_cat_lang == $lang_key) { $lang_links .= ''; } } echo $lang_links; echo ' | ||||||
'; echo ' | '; echo ' | '; echo ' | '.$category['category'].' | '; echo ''.$this->countFAQbyCid($category['id']).' '.FAQ_NAME.' | '; echo ''.(($category['up'] == true) ? ('') : ' ').' | '; echo ''.(($category['down'] == true) ? ('') : ' ').' | '; echo '
'.FAQ_NEWCATEGORY.' | '; echo '
|
|
|||
|
$radio_value) {
$id = htmlspecialchars($config_item . $radio_value);
$counter++;
$checked = "";
if ($radio_value == 'true' && ($hvalue === '1' || $hvalue === 'true')) {
$checked = " checked";
} elseif ($radio_value == 'false' && ($hvalue === '' || $hvalue ==='0' || $hvalue === 'false')) {
$checked = " checked";
} elseif ($radio_value == $hvalue) {
$checked = " checked";
}
if ($counter == 1) {
?>
title="" />
|
|||
|
|
|||
| ||||
|
||||
get('default'); ?> | ||||
|
|
|||
|
$radio_value) {
$id = htmlspecialchars($config_item . $radio_value);
$counter++;
$checked = "";
if ($radio_value == 'true' && ($hvalue === '1' || $hvalue === 'true')) {
$checked = " checked";
} elseif ($radio_value == 'false' && ($hvalue === '' || $hvalue ==='0' || $hvalue === 'false')) {
$checked = " checked";
} elseif ($radio_value == $hvalue) {
$checked = " checked";
}
if ($counter == 1) {
?>
title="" />
|
|||
|
|
|||
| ||||
|
||||
get('default'); ?> | ||||