Class ::xo::db::CrFolder (public)
::xo::db::CrClass ::xo::db::CrFolder
Defined in /var/www/openacs/packages/xotcl-core/tcl/cr-procs.tcl
This is a generic class that represents a "cr_folder" XoWiki specific methods are currently directly mixed into all instances of this class.
- See Also:
- xowiki::Folder
- Testcases:
- No testcase defined.
Source code: namespace eval ::xo::db {} ::nsf::object::alloc ::xo::db::CrClass ::xo::db::CrFolder {set :__default_metaclass ::xotcl::Class set :__default_superclass ::xotcl::Object set :abstract_p f set :auto_save false array set :db_constraints {folder_id {{references {cr_items on delete cascade}} {references {cr_items on delete cascade}}}} array set :db_slot {label ::xo::db::CrFolder::slot::label creation_date ::xo::db::Object::slot::creation_date creation_user ::xo::db::Object::slot::creation_user object_id ::xo::db::Object::slot::object_id description ::xo::db::CrFolder::slot::description creation_ip ::xo::db::Object::slot::creation_ip text ::xo::db::CrItem::slot::text folder_id ::xo::db::CrFolder::slot::folder_id nls_language ::xo::db::CrItem::slot::nls_language object_title ::xo::db::Object::slot::object_title package_id ::xo::db::Object::slot::package_id security_inherit_p ::xo::db::Object::slot::security_inherit_p context_id ::xo::db::Object::slot::context_id mime_type ::xo::db::CrItem::slot::mime_type name ::xo::db::CrItem::slot::name title ::xo::db::CrItem::slot::title item_id ::xo::db::CrItem::slot::item_id revision_id ::xo::db::CrItem::slot::revision_id modifying_user ::xo::db::Object::slot::modifying_user publish_date ::xo::db::CrItem::slot::publish_date last_modified ::xo::db::Object::slot::last_modified modifying_ip ::xo::db::Object::slot::modifying_ip} set :edit_form CrFolderForm set :folder_id -100 set :form CrFolderForm set :id_column folder_id set :mime_type text/plain set :name_method {} set :non_cached_instance_var_patterns __* set :object_type content_folder set :object_type_key 000000000000110100000000 set :pretty_name Folder set :pretty_plural Folders set :security_inherit_p t set :sql_package_name ::xo::db::CrFolder set :storage_type text set :supertype content_revision set :table_name cr_folders set :with_table true} ::xo::db::CrFolder proc get_instance_from_db {{-item_id 0} {-revision_id 0} {-initialize:boolean true}} { set object ::$item_id if {![nsf::is object $object]} { :fetch_object -object $object -item_id $item_id -initialize $initialize $object destroy_on_cleanup } return $object } ::xo::db::CrFolder proc fetch_object {-item_id:required {-revision_id 0} -object:required {-initialize:boolean true}} { if {![nsf::is object $object]} { :create $object } $object set item_id $item_id $object db_1row [:qn fetch_folder] { SELECT * FROM cr_folders JOIN cr_items on cr_folders.folder_id = cr_items.item_id JOIN acs_objects on cr_folders.folder_id = acs_objects.object_id WHERE folder_id = :item_id } if {$initialize} { $object initialize_loaded_object } return $object } ::xo::db::CrFolder proc instance_select_query {{-select_attributes ""} {-orderby ""} {-where_clause ""} {-from_clause ""} {-with_subtypes:boolean true} {-with_children:boolean true} -publish_status {-count:boolean false} -folder_id -parent_id {-page_size 20} {-page_number ""} {-base_table "cr_folders"}} { if {![info exists folder_id]} {set folder_id ${:folder_id}} if {![info exists parent_id]} {set parent_id $folder_id} if {$base_table eq "cr_folders"} { set attributes [list ci.item_id ci.name ci.publish_status acs_objects.object_type] } else { set attributes [list bt.item_id ci.name ci.publish_status bt.object_type] } foreach a $select_attributes { # if {$a eq "title"} {set a bt.title} lappend attributes $a } # FIXME: This is dirty: We "fake" the base table for this function, so we can reuse the code set type_selection_clause [:type_selection_clause -base_table cr_revisions -with_subtypes false] # :log "type_selection_clause -with_subtypes $with_subtypes returns $type_selection_clause" if {$count} { set attribute_selection "count(*)" set orderby "" ;# no need to order when we count set page_number "" ;# no pagination when count is used } else { set attribute_selection [join $attributes ,] } set cond [list] if {$type_selection_clause ne ""} {lappend cond $type_selection_clause} if {$where_clause ne ""} {lappend cond $where_clause} if {[info exists publish_status]} {lappend cond "ci.publish_status = :publish_status"} if {$base_table eq "cr_folders"} { lappend cond "acs_objects.object_id = cf.folder_id and ci.item_id = cf.folder_id" set acs_objects_table "acs_objects, cr_items ci, " } else { lappend cond "ci.item_id = bt.item_id" set acs_objects_table "" } if {$parent_id ne ""} { set parent_clause "ci.parent_id = :parent_id" if {$with_children} { lappend cond "ci.item_id in ( select children.item_id from cr_items parent, cr_items children where children.tree_sortkey between parent.tree_sortkey and tree_right(parent.tree_sortkey) and parent.item_id = $parent_id and parent.tree_sortkey <> children.tree_sortkey)" } else { lappend cond $parent_clause } } if {$page_number ne ""} { set limit $page_size set offset [expr {$page_size*($page_number-1)}] } else { set limit "" set offset "" } set sql [::xo::dc select -vars $attribute_selection -from "$acs_objects_table cr_folders cf $from_clause" -where [join $cond " and "] -orderby $orderby -limit $limit -offset $offset] return $sql } ::xo::db::CrFolder proc register_content_types {-folder_id:required {-content_types ""}} { foreach content_type $content_types { set with_subtypes [expr {[regexp {^(.*)[*]$} $content_type _ content_type] ? "t" : "f"}] ::acs::dc call content_folder register_content_type -folder_id $folder_id -content_type $content_type -include_subtypes $with_subtypes } } ::xo::db::CrFolder proc delete -item_id { ::acs::dc call content_folder del -folder_id $item_id -cascade_p t } ::xo::db::CrFolder instproc save_new -creation_user { set package_id ${:package_id} [:info class] get_context package_id creation_user creation_ip set :folder_id [::acs::dc call content_folder new -name ${:name} -label [:label] -description [:description] -parent_id ${:parent_id} -package_id $package_id -creation_user $creation_user -creation_ip $creation_ip] #parent_s has_child_folders attribute could have become outdated if { [nsf::is object ::${:parent_id}] } { ::${:parent_id} set has_child_folders t } # well, obtaining the allowed content_types this way is not very # straightforward, but since we currently create these folders via # ad_forms, and we have no form variable, this should be at least # robust. if {[[self class] exists allowed_content_types]} { ::xo::db::CrFolder register_content_types -folder_id ${:folder_id} -content_types [[self class] set allowed_content_types] } ::xo::xotcl_object_cache flush ${:parent_id} return ${:folder_id} } ::xo::db::CrFolder instproc update {} { ::xo::dc transaction { next :instvar object_id label description ::xo::dc dml update_cr_folders {update cr_folders set label = :label,description = :description where folder_id = :object_id } } } ::xo::db::CrFolder instproc save args { set folder_id ${:folder_id} content::folder::update -folder_id $folder_id -attributes [list [list name ${:name}] [list label ${:label}] [list description ${:description}] ] [:info class] get_context package_id user_id ip ::xo::dc 1row _ "select acs_object__update_last_modified(:folder_id, :user_id, :ip)" } ::xo::db::CrFolder instproc delete {} { if {[:is_package_root_folder]} { ad_return_error "Removal denied" "Don't delete the package root folder, delete the package" return } # delegate deletion to the class [:info class] delete -item_id ${:folder_id} } ::xo::db::CrFolder instparametercmd description ::xo::db::CrFolder instparametercmd label ::xo::db::CrFolder instparametercmd folder_id ::xo::db::CrFolder instparametercmd mime_type ::nsf::relation::set ::xo::db::CrFolder superclass ::xo::db::CrItem ::nx::slotObj -container slot ::xo::db::CrFolder ::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrFolder::slot::folder_id {set :accessor public set :column_name folder_id set :configurable true set :convert false set :create_acs_attribute true set :create_table_attribute true set :datatype integer set :defaultmethods {} set :disposition alias set :domain ::xo::db::CrFolder set :incremental false set :manager ::xo::db::CrFolder::slot::folder_id set :max_n_values 1 set :methodname folder_id set :min_n_values 1 set :multiplicity 1..1 set :name folder_id set :per-object false set :position 0 set :pretty_name {Folder ID} set :pretty_plural {} set :references {cr_items on delete cascade} set :required false set :sqltype integer set :trace none : init} ::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrFolder::slot::label {set :accessor public set :column_name label set :configurable true set :convert false set :create_acs_attribute true set :create_table_attribute true set :datatype text set :defaultmethods {} set :disposition alias set :domain ::xo::db::CrFolder set :incremental false set :manager ::xo::db::CrFolder::slot::label set :max_n_values 1 set :methodname label set :min_n_values 1 set :multiplicity 1..1 set :name label set :per-object false set :position 0 set :pretty_name Label set :pretty_plural {} set :references {} set :required false set :sqltype text set :trace none : init} ::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrFolder::slot::description {set :accessor public set :column_name description set :configurable true set :convert false set :create_acs_attribute true set :create_table_attribute true set :datatype text set :defaultmethods {} set :disposition alias set :domain ::xo::db::CrFolder set :incremental false set :manager ::xo::db::CrFolder::slot::description set :max_n_values 1 set :methodname description set :min_n_values 1 set :multiplicity 1..1 set :name description set :per-object false set :position 0 set :pretty_name Description set :pretty_plural {} set :references {} set :required false set :spec textarea,cols=80,rows=2 set :sqltype text set :trace none : init} ::nsf::object::alloc ::xotcl::Attribute ::xo::db::CrFolder::slot::mime_type {set :accessor public set :configurable true set :convert false set :default text/plain set :defaultmethods {} set :disposition alias set :domain ::xo::db::CrFolder set :incremental false set :manager ::xo::db::CrFolder::slot::mime_type set :methodname mime_type set :multiplicity 1..1 set :name mime_type set :per-object false set :position 0 set :required false set :substdefault 0b111 set :trace none : init}XQL Not present: Generic, PostgreSQL, Oracle
![[i]](/resources/acs-subsite/ZoomIn16.gif)