From: <nk...@us...> - 2010-03-04 22:49:03
|
Revision: 25912 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=25912&view=rev Author: nkoth Date: 2010-03-04 22:48:57 +0000 (Thu, 04 Mar 2010) Log Message: ----------- [NEW] Allow setting of custom attribute fields for articles Modified Paths: -------------- trunk/lib/articles/artlib.php trunk/lib/prefs/article.php trunk/lib/setup/prefs.php trunk/templates/tiki-admin-include-cms.tpl trunk/templates/tiki-article_types.tpl trunk/templates/tiki-edit_article.tpl trunk/templates/tiki-edit_submission.tpl trunk/tiki-article_types.php trunk/tiki-edit_article.php trunk/tiki-edit_submission.php Modified: trunk/lib/articles/artlib.php =================================================================== --- trunk/lib/articles/artlib.php 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/lib/articles/artlib.php 2010-03-04 22:48:57 UTC (rev 25912) @@ -51,12 +51,13 @@ $data["image_size"], $data["image_type"], $data["image_data"], $data["heading"], $data["body"], $data["publishDate"], $data["expireDate"], $data["author"], 0, $data["image_x"], $data["image_y"], $data["type"], $data["topline"], $data["subtitle"], $data["linkto"], $data["image_caption"], $data["lang"], $data["rating"], $data['isfloat']); + $this->transfer_attributes_from_submission($subId, $articleId); $this->remove_submission($subId); global $prefs; if ($prefs['feature_categories'] == 'y') { global $categlib; include_once('lib/categories/categlib.php'); $categlib->approve_submission($subId, $articleId); - } + } $query = 'update `tiki_objects` set `href`=?, `type`=? where `href`=?'; $this->query($query, array("'tiki-read_article.php?articleId=$articleId", 'article', "tiki-edit_submission.php?subId=$subId")); @@ -557,6 +558,9 @@ function remove_type($type) { $query = "delete from `tiki_article_types` where `type`=?"; $result = $this->query($query,array($type)); + // remove attributes set for this type too + $query = "delete from `tiki_object_relations` where `source_type` = 'articletype' and `source_itemId`=?"; + $result = $this->query($query,array($type)); } function get_type($type) { @@ -1051,6 +1055,104 @@ $res = $result->fetchRow(); return $res; } + + function add_article_type_attribute($artType, $attributeName) { + global $relationlib, $attributelib; + if (!is_object($relationlib)) { + include_once('lib/attributes/relationlib.php'); + } + if (!is_object($attributelib)) { + include_once('lib/attributes/attributelib.php'); + } + $fullAttributeName = TikiFilter::get( 'attribute_type' )->filter( trim('tiki.article.' . $attributeName) ); + $relationId = $relationlib->add_relation( 'tiki.article.attribute', 'articletype', $artType, 'attribute', $fullAttributeName); + if (!$relationId) { + return 0; + } else { + $attributelib->set_attribute( 'relation', $relationId, 'tiki.relation.target', $attributeName ); + return $relationId; + } + } + + function delete_article_type_attribute($artType, $relationId) { + global $relationlib; + if (!is_object($relationlib)) { + include_once('lib/attributes/relationlib.php'); + } + // double check relation is associated with article type before deleting + $currentAttributes = $relationlib->get_relations_from( 'articletype', $artType, 'tiki.article.attribute' ); + foreach ($currentAttributes as $att) { + if ($att["relationId"] == $relationId) { + $relationlib->remove_relation($att["relationId"]); + } + } + return true; + } + + function get_article_type_attributes($artType) { + global $relationlib, $attributelib; + if (!is_object($relationlib)) { + include_once('lib/attributes/relationlib.php'); + } + if (!is_object($attributelib)) { + include_once('lib/attributes/attributelib.php'); + } + $attributes = $relationlib->get_relations_from( 'articletype', $artType, 'tiki.article.attribute' ); + $ret = array(); + foreach ($attributes as $att) { + $relationAtt = $attributelib->get_attributes( 'relation', $att["relationId"]); + if (isset($relationAtt['tiki.relation.target'])) { + $ret[$relationAtt['tiki.relation.target']] = $att; + } + } + return $ret; + } + + function set_article_attributes($articleId, $attributeArray, $isSubmission = false) { + // expects attributeArray in the form of $key=>$val where $key is tiki.article.xxxx and $val is value + global $attributelib; + if (!is_object($attributelib)) { + include_once('lib/attributes/attributelib.php'); + } + if ($isSubmission) { + $type = 'submission'; + } else { + $type = 'article'; + } + $currentAtt = $this->get_article_attributes($articleId); + foreach ($attributeArray as $name => $value) { + if ( !in_array($name,array_keys($currentAtt)) || $value != $currentAtt[$name]["value"] ) { + $attributelib->set_attribute( $type, $articleId, $name, $value ); + } + } + return true; + } + + function get_article_attributes($articleId, $isSubmission = false) { + global $attributelib; + if (!is_object($attributelib)) { + include_once('lib/attributes/attributelib.php'); + } + if ($isSubmission) { + $type = 'submission'; + } else { + $type = 'article'; + } + $allAttributes = $attributelib->get_attributes( $type, $articleId ); + $ret = array(); + foreach ($allAttributes as $k => $att) { + if (substr($k,0,13) == 'tiki.article.') { + $ret[$k] = $att; + } + } + return $ret; + } + + function transfer_attributes_from_submission($subId, $articleId) { + $this->query( 'UPDATE `tiki_object_attributes` set `type` = ?, `itemId` = ? where `type` = ? and `itemId` = ?', + + array( 'article', $articleId, 'submission', $subId ) ); + } } $artlib = new ArtLib; Modified: trunk/lib/prefs/article.php =================================================================== --- trunk/lib/prefs/article.php 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/lib/prefs/article.php 2010-03-04 22:48:57 UTC (rev 25912) @@ -54,5 +54,10 @@ 'filter' => 'int', 'hint' => tra('0 for original image size.') , ), + 'article_custom_attributes' => array( + 'name' => tra('Custom attributes for article types'), + 'description' => tra('Allow additional custom fields for article types'), + 'type' => 'flag', + ), ); } Modified: trunk/lib/setup/prefs.php =================================================================== --- trunk/lib/setup/prefs.php 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/lib/setup/prefs.php 2010-03-04 22:48:57 UTC (rev 25912) @@ -646,6 +646,7 @@ 'article_user_rating_options' => range( 1, 5 ), 'article_image_size_x' => '0', 'article_image_size_y' => '0', + 'article_custom_attributes' => 'y', 'feature_cms_templates' => 'n', 'cms_bot_bar' => 'y', 'cms_left_column' => 'y', Modified: trunk/templates/tiki-admin-include-cms.tpl =================================================================== --- trunk/templates/tiki-admin-include-cms.tpl 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/templates/tiki-admin-include-cms.tpl 2010-03-04 22:48:57 UTC (rev 25912) @@ -48,6 +48,7 @@ {preference name=feature_cms_emails} {preference name=article_paginate} + {preference name=article_custom_attributes} <input type="hidden" name="cmsfeatures" /> </fieldset> Modified: trunk/templates/tiki-article_types.tpl =================================================================== --- trunk/templates/tiki-article_types.tpl 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/templates/tiki-article_types.tpl 2010-03-04 22:48:57 UTC (rev 25912) @@ -143,6 +143,25 @@ </tr> </table> + {if $prefs.article_custom_attributes eq 'y'} + <table class="normal"> + <tr> + <th>{tr}Custom attribute{/tr}</th> + <th>{tr}Action{/tr}</th> + </tr> + {cycle print=false values="even,odd"} + {foreach from=$types[user].attributes item=att key=attname} + <tr> + <td class="{cycle advance=false}" >{$attname|escape}</td> + <td class="{cycle}" ><a class="link" href="tiki-article_types.php?att_type={$types[user].type|escape:url}&att_remove={$att.relationId|escape:url}">{icon _id='cross' alt='{tr}Remove{/tr}'}</a></td> + </tr> + {/foreach} + <tr> + <td><input type="text" name="new_attribute[{$types[user].type|escape}]" value="" /></td> + <td> </td> + </tr> + </table> + {/if} <input type="submit" name="update_type" value="{tr}Save{/tr}" /><br /> <hr /> <br /> Modified: trunk/templates/tiki-edit_article.tpl =================================================================== --- trunk/templates/tiki-edit_article.tpl 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/templates/tiki-edit_article.tpl 2010-03-04 22:48:57 UTC (rev 25912) @@ -306,6 +306,16 @@ </tr> {/if} {include file='freetag.tpl'} + {if isset($all_attributes)} + {foreach from=$all_attributes item=att key=attname} + {assign var='attid' value=$att.itemId|replace:'.':'_'} + {assign var='attfullname' value=$att.itemId} + <tr id={$attid} {if $types.$type.$attid eq 'y'}style="display:;"{else}style="display:none;"{/if} class="formcolor"> + <td>{$attname|escape}</td> + <td><input type="text" name="{$attfullname}" value="{$article_attributes.$attfullname|escape}" size="80" /></td> + </tr> + {/foreach} + {/if} </table> <div align="center"> Modified: trunk/templates/tiki-edit_submission.tpl =================================================================== --- trunk/templates/tiki-edit_submission.tpl 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/templates/tiki-edit_submission.tpl 2010-03-04 22:48:57 UTC (rev 25912) @@ -270,6 +270,16 @@ </td> </tr> {include file='freetag.tpl'} + {if isset($all_attributes)} + {foreach from=$all_attributes item=att key=attname} + {assign var='attid' value=$att.itemId|replace:'.':'_'} + {assign var='attfullname' value=$att.itemId} + <tr id={$attid} {if $types.$type.$attid eq 'y'}style="display:;"{else}style="display:none;"{/if} class="formcolor"> + <td>{$attname|escape}</td> + <td><input type="text" name="{$attfullname}" value="{$article_attributes.$attfullname|escape}" size="80" /></td> + </tr> + {/foreach} + {/if} </table> {if $tiki_p_use_HTML eq 'y'} Modified: trunk/tiki-article_types.php =================================================================== --- trunk/tiki-article_types.php 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/tiki-article_types.php 2010-03-04 22:48:57 UTC (rev 25912) @@ -70,10 +70,30 @@ $_REQUEST["show_image_caption"][$this_type], $_REQUEST["show_lang"][$this_type], $_REQUEST["creator_edit"][$this_type]); + + // Add custom attributes + if ($prefs["article_custom_attributes"] == 'y' && !empty($_REQUEST["new_attribute"][$this_type])) { + $ok = $artlib->add_article_type_attribute($this_type, $_REQUEST["new_attribute"][$this_type]); + if (!$ok) { + $smarty->assign('msg', tra("Failed to add attribute")); + $smarty->display("error.tpl"); + die; + } + } } } $types = $artlib->list_types(); + +if ($prefs["article_custom_attributes"] == 'y') { + if (isset($_REQUEST["att_type"]) && isset($_REQUEST["att_remove"])) { + $artlib->delete_article_type_attribute($_REQUEST["att_type"], $_REQUEST["att_remove"]); + } + foreach($types as &$t) { + $t["attributes"] = $artlib->get_article_type_attributes($t["type"]); + } +} + $smarty->assign('types', $types); include_once ('tiki-section_options.php'); Modified: trunk/tiki-edit_article.php =================================================================== --- trunk/tiki-edit_article.php 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/tiki-edit_article.php 2010-03-04 22:48:57 UTC (rev 25912) @@ -433,6 +433,19 @@ $cat_href = "tiki-read_article.php?articleId=" . $cat_objid; include_once("categorize.php"); include_once ("freetag_apply.php"); + // Add attributes + if ($prefs["article_custom_attributes"] == 'y') { + $valid_att = $artlib->get_article_type_attributes($_REQUEST["type"]); + $attributeArray = array(); + foreach ($valid_att as $att) { + // need to convert . to _ for matching + $toMatch = str_replace('.', '_', $att["itemId"]); + if (isset($_REQUEST[$toMatch])) { + $attributeArray[$att["itemId"]] = $_REQUEST[$toMatch]; + } + } + $artlib->set_article_attributes($artid, $attributeArray); + } // Remove image cache because image may have changed, and we // don't want to show the old image @$artlib->delete_image_cache("article",$_REQUEST["id"]); @@ -452,6 +465,23 @@ // get list of valid types $types = $artlib->list_types_byname(); +if ($prefs["article_custom_attributes"] == 'y') { + $article_attributes = $artlib->get_article_attributes($_REQUEST["articleId"]); + $smarty->assign('article_attributes', $article_attributes); + $all_attributes = array(); + foreach($types as &$t) { + // javascript needs htmlid to show/hide to be properties of basic array + $type_attributes = $artlib->get_article_type_attributes($t["type"]); + $all_attributes = array_merge($all_attributes, $type_attributes); + foreach ($type_attributes as $att) { + $htmlid = str_replace('.','_',$att['itemId']); + $t[$htmlid] = 'y'; + $js_string .= "'$htmlid', 'y', "; + } + } + $smarty->assign('all_attributes', $all_attributes); + $headerlib->add_js("articleCustomAttributes = new Array(); articleCustomAttributes = [$js_string];"); +} $smarty->assign_by_ref('types', $types); if ($prefs['feature_cms_templates'] == 'y' && $tiki_p_use_content_templates == 'y') { Modified: trunk/tiki-edit_submission.php =================================================================== --- trunk/tiki-edit_submission.php 2010-03-04 22:48:22 UTC (rev 25911) +++ trunk/tiki-edit_submission.php 2010-03-04 22:48:57 UTC (rev 25912) @@ -372,6 +372,19 @@ $cat_href = "tiki-edit_submission.php?subId=" . $cat_objid; include_once ("categorize.php"); include_once ("freetag_apply.php"); + // Add attributes + if ($prefs["article_custom_attributes"] == 'y') { + $valid_att = $artlib->get_article_type_attributes($_REQUEST["type"]); + $attributeArray = array(); + foreach ($valid_att as $att) { + // need to convert . to _ for matching + $toMatch = str_replace('.', '_', $att["itemId"]); + if (isset($_REQUEST[$toMatch])) { + $attributeArray[$att["itemId"]] = $_REQUEST[$toMatch]; + } + } + $artlib->set_article_attributes($subid, $attributeArray, true); + } // Remove image cache because image may have changed, and we // don't want to show the old image @$artlib->delete_image_cache("submission",$subId); @@ -396,6 +409,23 @@ // get list of valid types $types = $artlib->list_types_byname(); +if ($prefs["article_custom_attributes"] == 'y') { + $article_attributes = $artlib->get_article_attributes($_REQUEST["subId"], true); + $smarty->assign('article_attributes', $article_attributes); + $all_attributes = array(); + foreach($types as &$t) { + // javascript needs htmlid to show/hide to be properties of basic array + $type_attributes = $artlib->get_article_type_attributes($t["type"]); + $all_attributes = array_merge($all_attributes, $type_attributes); + foreach ($type_attributes as $att) { + $htmlid = str_replace('.','_',$att['itemId']); + $t[$htmlid] = 'y'; + $js_string .= "'$htmlid', 'y', "; + } + } + $smarty->assign('all_attributes', $all_attributes); + $headerlib->add_js("articleCustomAttributes = new Array(); articleCustomAttributes = [$js_string];"); +} $smarty->assign_by_ref('types', $types); if ($prefs['feature_cms_templates'] == 'y' && $tiki_p_use_content_templates == 'y') { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |