content-item-procs.tcl

Tcl API for cr_items in the content repository

Location:
packages/acs-content-repository/tcl/content-item-procs.tcl
Created:
2004-05-28
Authors:
Dave Bauer <dave@thedesignexperience.org>
Jun Yamog
CVS Identification:
$Id: content-item-procs.tcl,v 1.38.2.12 2023/10/30 14:46:58 antoniop Exp $

Procedures in this file

Detailed information

content::item::content_is_null (public)

 content::item::content_is_null revision_id

Determines if the content for the revision is null (not mereley zero-length)

Parameters:
revision_id (required)
The revision id
Returns:
1 if the content is null, 0 otherwise

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::content_is_null content::item::content_is_null test_content_item->content::item::content_is_null db_string db_string (public) content::item::content_is_null->db_string publish::write_content publish::write_content (public) publish::write_content->content::item::content_is_null

Testcases:
content_item

content::item::content_methods_by_type (public)

 content::item::content_methods_by_type [ -get_labels ] content_type

Determines all the valid content methods for instantiating a content type. Possible choices are text_entry, file_upload, no_content and xml_import. Currently, this proc merely removes the text_entry method if the item does not have a text mime type registered to it. In the future, a more sophisticated mechanism will be implemented.

Switches:
-get_labels (optional, boolean)
Return not just a list of types, but a list of name-value pairs, as in the -options ATS switch for form widgets
Parameters:
content_type (required)
The content type
Returns:
A Tcl list of all possible content methods

Partial Call Graph (max 5 caller/called nodes):
%3 db_list db_list (public) content::item::content_methods_by_type content::item::content_methods_by_type content::item::content_methods_by_type->db_list

Testcases:
No testcase defined.

content::item::content_type (public, deprecated)

 content::item::content_type -item_id item_id
Deprecated. Invoking this procedure generates a warning.

Switches:
-item_id (required)
The item_id of the content item
Returns:
The content type of the item, or an empty string if no such item exists
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 ad_log_deprecated ad_log_deprecated (public) content::item::get_content_type content::item::get_content_type (public) content::item::content_type content::item::content_type content::item::content_type->ad_log_deprecated content::item::content_type->content::item::get_content_type

Testcases:
No testcase defined.

content::item::copy (public)

 content::item::copy -item_id item_id \
    -target_folder_id target_folder_id \
    [ -creation_user creation_user ] [ -creation_ip creation_ip ] \
    [ -name name ]
Switches:
-item_id (required)
- item_id of the content to be copied from. source content item
-target_folder_id (required)
- destination folder where the new content item is be passed
-creation_user (optional)
-
-creation_ip (optional)
-
-name (optional)
- the name of the new item, useful if you are copying in the same folder.
Returns:
item_id of the new copied item
Author:
Jun Yamog
Created:
2004-06-27 copy a content item to a new content item

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::copy content::item::copy test_content_item->content::item::copy package_exec_plsql package_exec_plsql (public) content::item::copy->package_exec_plsql packages/file-storage/www/move.tcl packages/file-storage/ www/move.tcl packages/file-storage/www/move.tcl->content::item::copy

Testcases:
content_item

content::item::delete (public)

 content::item::delete -item_id item_id
Switches:
-item_id (required)
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2004-05-28 Delete a content item from the database. If the content item to delete has children content items referencing its parent via acs_objects.context_id then this proc will fail.

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_image content_image (test acs-content-repository) content::item::delete content::item::delete test_content_image->content::item::delete test_content_item content_item (test acs-content-repository) test_content_item->content::item::delete test_content_revision content_revision (test acs-content-repository) test_content_revision->content::item::delete content::revision::cleanup content::revision::cleanup (private) content::item::delete->content::revision::cleanup content::revision::collect_cleanup_data content::revision::collect_cleanup_data (private) content::item::delete->content::revision::collect_cleanup_data db_1row db_1row (public) content::item::delete->db_1row db_transaction db_transaction (public) content::item::delete->db_transaction package_exec_plsql package_exec_plsql (public) content::item::delete->package_exec_plsql acs_user::erase_portrait acs_user::erase_portrait (public) acs_user::erase_portrait->content::item::delete bug_tracker::bug::delete bug_tracker::bug::delete (public) bug_tracker::bug::delete->content::item::delete content::extlink::delete content::extlink::delete (public) content::extlink::delete->content::item::delete general_comments_delete_messages general_comments_delete_messages (public) general_comments_delete_messages->content::item::delete packages/bug-tracker/www/related-file-delete.tcl packages/bug-tracker/ www/related-file-delete.tcl packages/bug-tracker/www/related-file-delete.tcl->content::item::delete

Testcases:
content_image, content_item, content_revision

content::item::get (public)

 content::item::get -item_id item_id [ -revision revision ] \
    [ -array_name array_name ]

Get an item.

Switches:
-item_id (required)
-revision (optional, defaults to "live")
live, latest
-array_name (optional, defaults to "content_item")
name of array to upvar content into
Returns:
upvars array_name containing all attributes of the content type except content
returns 0 if item does not exists or 1 if query was successful
Error:
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2004-05-28

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_folder content_folder (test acs-content-repository) content::item::get content::item::get test_content_folder->content::item::get test_content_item content_item (test acs-content-repository) test_content_item->content::item::get acs_object_type::get acs_object_type::get (public) content::item::get->acs_object_type::get acs_object_type::get_table_name acs_object_type::get_table_name (public) content::item::get->acs_object_type::get_table_name content::item::get_content_type content::item::get_content_type (public) content::item::get->content::item::get_content_type db_0or1row db_0or1row (public) content::item::get->db_0or1row fs::item_editable_info fs::item_editable_info (public, deprecated) fs::item_editable_info->content::item::get fs::publish_versioned_object_to_file_system fs::publish_versioned_object_to_file_system (public) fs::publish_versioned_object_to_file_system->content::item::get packages/acs-subsite/lib/home.tcl packages/acs-subsite/ lib/home.tcl packages/acs-subsite/lib/home.tcl->content::item::get packages/acs-subsite/www/shared/portrait-bits.tcl packages/acs-subsite/ www/shared/portrait-bits.tcl packages/acs-subsite/www/shared/portrait-bits.tcl->content::item::get packages/acs-subsite/www/user/portrait/upload.tcl packages/acs-subsite/ www/user/portrait/upload.tcl packages/acs-subsite/www/user/portrait/upload.tcl->content::item::get

Testcases:
content_folder, content_item

content::item::get_best_revision (public)

 content::item::get_best_revision -item_id item_id

Attempts to retrieve the live revision for the item. If no live revision exists, attempts to retrieve the latest revision. If the item has no revisions, returns an empty string.

Switches:
-item_id (required)
The item_id of the content item
Returns:
The best revision_id for the item, or an empty string if no revisions exist
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) content::item::get_best_revision content::item::get_best_revision test_cr_item_search_triggers->content::item::get_best_revision package_exec_plsql package_exec_plsql (public) content::item::get_best_revision->package_exec_plsql content::init content::init (public) content::init->content::item::get_best_revision image::resize image::resize (public) image::resize->content::item::get_best_revision packages/forums/lib/message/attachment-list.tcl packages/forums/ lib/message/attachment-list.tcl packages/forums/lib/message/attachment-list.tcl->content::item::get_best_revision packages/general-comments/www/admin/delete.tcl packages/general-comments/ www/admin/delete.tcl packages/general-comments/www/admin/delete.tcl->content::item::get_best_revision packages/general-comments/www/delete.tcl packages/general-comments/ www/delete.tcl packages/general-comments/www/delete.tcl->content::item::get_best_revision

Testcases:
cr_item_search_triggers

content::item::get_content (public)

 content::item::get_content [ -revision_id revision_id ] \
    [ -item_id item_id ] -array array

Create a onerow datasource called content in the calling frame which contains all attributes for the revision (including inherited ones).

The datasource will contain a column called "text", representing the main content (blob) of the revision, but only if the revision has a textual mime-type.

Switches:
-revision_id (optional)
The revision whose attributes are to be retrieved
-item_id (optional)
The item_id of the corresponding item. You can provide this as an optimization. If you don't provide revision_id, you must provide item_id, and the item must have a live revision.
-array (required)
Returns:
1 on success (and set the array in the calling frame), 0 on failure
See Also:
  • proc content::item::get_content_type

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_image content_image (test acs-content-repository) content::item::get_content content::item::get_content test_content_image->content::item::get_content test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) test_content_item_nested_structure->content::item::get_content test_content_revision content_revision (test acs-content-repository) test_content_revision->content::item::get_content content::item::get_live_revision content::item::get_live_revision (public) content::item::get_content->content::item::get_live_revision content::item::get_revision_content content::item::get_revision_content (public) content::item::get_content->content::item::get_revision_content content::revision::item_id content::revision::item_id (public) content::item::get_content->content::revision::item_id

Testcases:
content_image, content_item_nested_structure, content_revision

content::item::get_content_type (public)

 content::item::get_content_type -item_id item_id

Retrieves the content type of the item. If the item does not exist, returns an empty string.

Switches:
-item_id (required)
The item_id of the content item
Returns:
The content type of the item, or an empty string if no such item exists

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::get_content_type content::item::get_content_type test_content_item->content::item::get_content_type package_exec_plsql package_exec_plsql (public) content::item::get_content_type->package_exec_plsql content::init content::init (public) content::init->content::item::get_content_type content::item::content_type content::item::content_type (public, deprecated) content::item::content_type->content::item::get_content_type content::item::get content::item::get (public) content::item::get->content::item::get_content_type content::revision::new content::revision::new (public) content::revision::new->content::item::get_content_type oacs_dav::handle_request oacs_dav::handle_request (public) oacs_dav::handle_request->content::item::get_content_type

Testcases:
content_item

content::item::get_context (public, deprecated)

 content::item::get_context -item_id item_id
Deprecated. Invoking this procedure generates a warning.

Switches:
-item_id (required)
Returns:
NUMBER(38)

Partial Call Graph (max 5 caller/called nodes):
%3 acs_object::get_element acs_object::get_element (public) ad_log_deprecated ad_log_deprecated (public) content::item::get_context content::item::get_context content::item::get_context->acs_object::get_element content::item::get_context->ad_log_deprecated

Testcases:
No testcase defined.

content::item::get_descendants (public)

 content::item::get_descendants -parent_id parent_id [ -depth depth ]

Returns the ids of every content item that is descendant of supplied parent_id.

Switches:
-parent_id (required)
-depth (optional)
how deep we should go in the hierarchy. 1 means direct children. Returns every descendant when not specified.
Returns:
list of cr_items.item_id

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::get_descendants content::item::get_descendants test_content_item_nested_structure->content::item::get_descendants db_list db_list (public) content::item::get_descendants->db_list

Testcases:
content_item_nested_structure

content::item::get_id (public)

 content::item::get_id -item_path item_path \
    [ -root_folder_id root_folder_id ] \
    [ -resolve_index resolve_index ]

Looks up the item_path starting with the root folder and returns item_id for that content item or empty, if none exists

Switches:
-item_path (required)
-root_folder_id (optional)
-resolve_index (optional)
Returns:
The item_id of the found item, or the empty string on failure

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::get_id content::item::get_id test_content_item->content::item::get_id test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) test_cr_item_search_triggers->content::item::get_id test_image_new image_new (test acs-content-repository) test_image_new->content::item::get_id package_exec_plsql package_exec_plsql (public) content::item::get_id->package_exec_plsql attachments::richtext::require_root_folder attachments::richtext::require_root_folder (private) attachments::richtext::require_root_folder->content::item::get_id content::init content::init (public) content::init->content::item::get_id fs::get_item_id fs::get_item_id (public) fs::get_item_id->content::item::get_id image::get_size_item_id image::get_size_item_id (private) image::get_size_item_id->content::item::get_id packages/file-storage/www/folder-add.tcl packages/file-storage/ www/folder-add.tcl packages/file-storage/www/folder-add.tcl->content::item::get_id

Testcases:
image_new, content_item, cr_item_search_triggers

content::item::get_id_by_name (public)

 content::item::get_id_by_name -name name -parent_id parent_id

Returns The item_id of the content item with the passed in name

Switches:
-name (required)
Name of the content item
-parent_id (required)
Parent_id of the content item
Returns:
The item_id belonging to the name, empty string if no item_id was found

Partial Call Graph (max 5 caller/called nodes):
%3 test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) content::item::get_id_by_name content::item::get_id_by_name test_cr_item_search_triggers->content::item::get_id_by_name test_fs_add_file_to_folder fs_add_file_to_folder (test file-storage) test_fs_add_file_to_folder->content::item::get_id_by_name db_string db_string (public) content::item::get_id_by_name->db_string fs::file_copy fs::file_copy (public) fs::file_copy->content::item::get_id_by_name packages/acs-developer-support/www/css-edit.tcl packages/acs-developer-support/ www/css-edit.tcl packages/acs-developer-support/www/css-edit.tcl->content::item::get_id_by_name packages/file-storage/www/copy.tcl packages/file-storage/ www/copy.tcl packages/file-storage/www/copy.tcl->content::item::get_id_by_name packages/file-storage/www/folder-create.tcl packages/file-storage/ www/folder-create.tcl packages/file-storage/www/folder-create.tcl->content::item::get_id_by_name packages/file-storage/www/folder-zip-add.tcl packages/file-storage/ www/folder-zip-add.tcl packages/file-storage/www/folder-zip-add.tcl->content::item::get_id_by_name

Testcases:
cr_item_search_triggers, fs_add_file_to_folder

content::item::get_latest_revision (public)

 content::item::get_latest_revision -item_id item_id

Retrieves the latest revision for the item. If the item has no live revision, returns an empty string.

Switches:
-item_id (required)
The item_id of the content item
Returns:
The latest revision_id for the item, or an empty string if no revisions exist
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::get_latest_revision content::item::get_latest_revision test_content_item->content::item::get_latest_revision test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) test_cr_item_search_triggers->content::item::get_latest_revision package_exec_plsql package_exec_plsql (public) content::item::get_latest_revision->package_exec_plsql content::item::publish content::item::publish (public) content::item::publish->content::item::get_latest_revision email_image::get_user_email email_image::get_user_email (public) email_image::get_user_email->content::item::get_latest_revision general_comments_new general_comments_new (public) general_comments_new->content::item::get_latest_revision packages/general-comments/www/view-comment.tcl packages/general-comments/ www/view-comment.tcl packages/general-comments/www/view-comment.tcl->content::item::get_latest_revision

Testcases:
content_item, cr_item_search_triggers

content::item::get_live_revision (public)

 content::item::get_live_revision -item_id item_id

Retrieves the live revision for the item. If the item has no live revision, returns an empty string.

Switches:
-item_id (required)
The item_id of the content item
Returns:
The live revision_id for the item, or an empty string if no live revision exists
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) content::item::get_live_revision content::item::get_live_revision test_cr_item_search_triggers->content::item::get_live_revision package_exec_plsql package_exec_plsql (public) content::item::get_live_revision->package_exec_plsql apm_generate_tarball apm_generate_tarball (public) apm_generate_tarball->content::item::get_live_revision content::init content::init (public) content::init->content::item::get_live_revision content::item::get_content content::item::get_content (public) content::item::get_content->content::item::get_live_revision fs::get_object_info fs::get_object_info (public) fs::get_object_info->content::item::get_live_revision packages/acs-subsite/www/user/portrait/index.tcl packages/acs-subsite/ www/user/portrait/index.tcl packages/acs-subsite/www/user/portrait/index.tcl->content::item::get_live_revision

Testcases:
cr_item_search_triggers

content::item::get_parent_folder (public)

 content::item::get_parent_folder -item_id item_id
Switches:
-item_id (required)
Returns:
NUMBER(38)

Partial Call Graph (max 5 caller/called nodes):
%3 test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) content::item::get_parent_folder content::item::get_parent_folder test_cr_item_search_triggers->content::item::get_parent_folder package_exec_plsql package_exec_plsql (public) content::item::get_parent_folder->package_exec_plsql packages/file-storage/www/file-add.tcl packages/file-storage/ www/file-add.tcl packages/file-storage/www/file-add.tcl->content::item::get_parent_folder packages/file-storage/www/file.tcl packages/file-storage/ www/file.tcl packages/file-storage/www/file.tcl->content::item::get_parent_folder packages/file-storage/www/index.tcl packages/file-storage/ www/index.tcl packages/file-storage/www/index.tcl->content::item::get_parent_folder

Testcases:
cr_item_search_triggers

content::item::get_path (public)

 content::item::get_path -item_id item_id \
    [ -root_folder_id root_folder_id ]
Switches:
-item_id (required)
-root_folder_id (optional)
Returns:
VARCHAR2

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::get_path content::item::get_path test_content_item_nested_structure->content::item::get_path package_exec_plsql package_exec_plsql (public) content::item::get_path->package_exec_plsql content_search::url content_search::url (private) content_search::url->content::item::get_path packages/file-storage/lib/folder-links.tcl packages/file-storage/ lib/folder-links.tcl packages/file-storage/lib/folder-links.tcl->content::item::get_path packages/file-storage/www/file.tcl packages/file-storage/ www/file.tcl packages/file-storage/www/file.tcl->content::item::get_path packages/file-storage/www/folder-chunk.tcl packages/file-storage/ www/folder-chunk.tcl packages/file-storage/www/folder-chunk.tcl->content::item::get_path

Testcases:
content_item_nested_structure

content::item::get_publish_date (public)

 content::item::get_publish_date -item_id item_id [ -is_live is_live ]
Switches:
-item_id (required)
-is_live (optional)
Returns:
DATE

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::get_publish_date content::item::get_publish_date test_content_item_nested_structure->content::item::get_publish_date package_exec_plsql package_exec_plsql (public) content::item::get_publish_date->package_exec_plsql

Testcases:
content_item_nested_structure

content::item::get_publish_status (public)

 content::item::get_publish_status -item_id item_id

Get the publish status of the item. The publish status will be one of the following:

  • production - The item is still in production. The workflow (if any) is not finished, and the item has no live revision.
  • ready - The item is ready for publishing
  • live - The item has been published
  • expired - The item has been published in the past, but its publication has expired

Switches:
-item_id (required)
The item_id of the content item
Returns:
The publish status of the item, or the empty string on failure
See Also:
  • proc content::item::is_publishable

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::get_publish_status content::item::get_publish_status test_content_item_nested_structure->content::item::get_publish_status db_string db_string (public) content::item::get_publish_status->db_string

Testcases:
content_item_nested_structure

content::item::get_revision_content (public)

 content::item::get_revision_content -revision_id revision_id \
    [ -item_id item_id ]

Create a one-row datasource called content in the calling frame which contains all attributes for the revision (including inherited ones). The datasource will contain a column called "text", representing the main content (blob) of the revision, but only if the revision has a textual mime-type.

Switches:
-revision_id (required)
The revision whose attributes are to be retrieved
-item_id (optional)
The item_id of the corresponding item.
Returns:
1 on success (and create a content array in the calling frame), 0 on failure
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::get_revision_content content::item::get_revision_content test_content_item_nested_structure->content::item::get_revision_content acs_object_type::get_table_name acs_object_type::get_table_name (public) content::item::get_revision_content->acs_object_type::get_table_name content::revision::item_id content::revision::item_id (public) content::item::get_revision_content->content::revision::item_id db_0or1row db_0or1row (public) content::item::get_revision_content->db_0or1row db_1row db_1row (public) content::item::get_revision_content->db_1row db_map db_map (public) content::item::get_revision_content->db_map content::item::get_content content::item::get_content (public) content::item::get_content->content::item::get_revision_content

Testcases:
content_item_nested_structure

content::item::get_revision_count (public)

 content::item::get_revision_count -item_id item_id
Switches:
-item_id (required)
Returns:
NUMBER

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_revision content_revision (test acs-content-repository) content::item::get_revision_count content::item::get_revision_count test_content_revision->content::item::get_revision_count package_exec_plsql package_exec_plsql (public) content::item::get_revision_count->package_exec_plsql

Testcases:
content_revision

content::item::get_root_folder (public)

 content::item::get_root_folder [ -item_id item_id ]
Switches:
-item_id (optional)
Returns:
NUMBER(38)

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::get_root_folder content::item::get_root_folder test_content_item->content::item::get_root_folder test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) test_content_item_nested_structure->content::item::get_root_folder package_exec_plsql package_exec_plsql (public) content::item::get_root_folder->package_exec_plsql content_search::url content_search::url (private) content_search::url->content::item::get_root_folder

Testcases:
content_item, content_item_nested_structure

content::item::get_template (public)

 content::item::get_template -item_id item_id -use_context use_context

Retrieves the template which can be used to render the item. If there is a template registered directly to the item, returns the id of that template. Otherwise, returns the id of the default template registered to the item's content_type. Returns an empty string on failure.

Switches:
-item_id (required)
The item_id
-use_context (required)
The context in which the template will be used (e.g. public)
Returns:
The template_id of the template which can be used to render the item, or an empty string on failure

Partial Call Graph (max 5 caller/called nodes):
%3 publish::merge_with_template publish::merge_with_template (private) content::item::get_template content::item::get_template publish::merge_with_template->content::item::get_template package_exec_plsql package_exec_plsql (public) content::item::get_template->package_exec_plsql

Testcases:
No testcase defined.

content::item::get_title (public)

 content::item::get_title -item_id item_id [ -is_live is_live ]

Get the title for the item. If a live revision for the item exists, use the live revision. Otherwise, use the latest revision.

Switches:
-item_id (required)
The item_id of the content item
-is_live (optional, defaults to "f")
If true, return the title of the live revision, otherwise the one of the latest revision (default). Boolean, 't' or 'f'.
Returns:
The title of the item
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 attachments::get_title attachments::get_title (public) content::item::get_title content::item::get_title attachments::get_title->content::item::get_title packages/acs-core-docs/www/files/tutorial/note-delete.tcl packages/acs-core-docs/ www/files/tutorial/note-delete.tcl packages/acs-core-docs/www/files/tutorial/note-delete.tcl->content::item::get_title packages/bug-tracker/www/related-file-delete.tcl packages/bug-tracker/ www/related-file-delete.tcl packages/bug-tracker/www/related-file-delete.tcl->content::item::get_title packages/bug-tracker/www/related-file-update.tcl packages/bug-tracker/ www/related-file-update.tcl packages/bug-tracker/www/related-file-update.tcl->content::item::get_title package_exec_plsql package_exec_plsql (public) content::item::get_title->package_exec_plsql

Testcases:
No testcase defined.

content::item::get_virtual_path (public)

 content::item::get_virtual_path -item_id item_id \
    [ -root_folder_id root_folder_id ]

Retrieves the relative path to the item. The path is relative to the page root, and has no extension (Example: "/foo/bar/baz").

Switches:
-item_id (required)
The item_id for the item, for which the path is computed
-root_folder_id (optional)
Starts path resolution from this folder. Defaults to the root of the sitemap (when null).
Returns:
The path to the item, or an empty string on failure

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::get_virtual_path content::item::get_virtual_path test_content_item_nested_structure->content::item::get_virtual_path package_exec_plsql package_exec_plsql (public) content::item::get_virtual_path->package_exec_plsql fs::rss::datasource fs::rss::datasource (private) fs::rss::datasource->content::item::get_virtual_path fs::webdav_url fs::webdav_url (public) fs::webdav_url->content::item::get_virtual_path publish::item_include_tag publish::item_include_tag (public) publish::item_include_tag->content::item::get_virtual_path publish::merge_with_template publish::merge_with_template (private) publish::merge_with_template->content::item::get_virtual_path publish::write_content publish::write_content (public) publish::write_content->content::item::get_virtual_path

Testcases:
content_item_nested_structure

content::item::is_index_page (public)

 content::item::is_index_page -item_id item_id -folder_id folder_id
Switches:
-item_id (required)
-folder_id (required)
Returns:
VARCHAR2

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::is_index_page content::item::is_index_page content::item::is_index_page->package_exec_plsql

Testcases:
No testcase defined.

content::item::is_publishable (public)

 content::item::is_publishable -item_id item_id

Determine if the item is publishable. The item is publishable only if:

  • All child relations, as well as item relations, are satisfied (according to min_n and max_n)
  • The workflow (if any) for the item is finished

Switches:
-item_id (required)
The item_id of the content item
Returns:
't' if the item is publishable, 'f' otherwise
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::is_publishable content::item::is_publishable content::item::is_publishable->package_exec_plsql

Testcases:
No testcase defined.

content::item::is_published (public)

 content::item::is_published -item_id item_id
Switches:
-item_id (required)
Returns:
CHAR

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::is_published content::item::is_published test_content_item_nested_structure->content::item::is_published package_exec_plsql package_exec_plsql (public) content::item::is_published->package_exec_plsql

Testcases:
content_item_nested_structure

content::item::is_subclass (public)

 content::item::is_subclass -object_type object_type \
    -supertype supertype
Switches:
-object_type (required)
-supertype (required)
Returns:
CHAR

Partial Call Graph (max 5 caller/called nodes):
%3 test_attachments_name_api attachments_name_api (test attachments) content::item::is_subclass content::item::is_subclass test_attachments_name_api->content::item::is_subclass package_exec_plsql package_exec_plsql (public) content::item::is_subclass->package_exec_plsql attachments::get_title attachments::get_title (public) attachments::get_title->content::item::is_subclass packages/attachments/www/go-to-attachment.tcl packages/attachments/ www/go-to-attachment.tcl packages/attachments/www/go-to-attachment.tcl->content::item::is_subclass packages/forums/lib/message/attachment-list.tcl packages/forums/ lib/message/attachment-list.tcl packages/forums/lib/message/attachment-list.tcl->content::item::is_subclass

Testcases:
attachments_name_api

content::item::is_valid_child (public)

 content::item::is_valid_child -item_id item_id \
    -content_type content_type [ -relation_tag relation_tag ]
Switches:
-item_id (required)
-content_type (required)
-relation_tag (optional)
Returns:
CHAR

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::is_valid_child content::item::is_valid_child content::item::is_valid_child->package_exec_plsql

Testcases:
No testcase defined.

content::item::move (public)

 content::item::move -item_id item_id \
    -target_folder_id target_folder_id [ -name name ]

Move an item to a folder.

Switches:
-item_id (required)
item to move
-target_folder_id (required)
folder to move the item to
-name (optional)
new name, allows move with rename
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2004-05-28

Partial Call Graph (max 5 caller/called nodes):
%3 packages/file-storage/www/move.tcl packages/file-storage/ www/move.tcl content::item::move content::item::move packages/file-storage/www/move.tcl->content::item::move package_exec_plsql package_exec_plsql (public) content::item::move->package_exec_plsql

Testcases:
No testcase defined.

content::item::new (public)

 content::item::new -name name [ -parent_id parent_id ] \
    [ -item_id item_id ] [ -locale locale ] \
    [ -creation_date creation_date ] [ -creation_user creation_user ] \
    [ -context_id context_id ] [ -package_id package_id ] \
    [ -creation_ip creation_ip ] [ -item_subtype item_subtype ] \
    [ -content_type content_type ] [ -title title ] \
    [ -description description ] [ -mime_type mime_type ] \
    [ -nls_language nls_language ] [ -text text ] [ -data data ] \
    [ -relation_tag relation_tag ] [ -is_live is_live ] \
    [ -storage_type storage_type ] [ -attributes attributes ] \
    [ -tmp_filename tmp_filename ]

Create a new content item This proc creates versioned content items where content_type iscontent_revision or subtypes of content revision. There are procedures for each other base content item. This procedure uses package_instantiate object. Under PostgreSQL the object_type new function must be registered with define_function_args.

Switches:
-name (required)
name of the item, must be unique for the folder
-parent_id (optional)
parent object of this content_item
-item_id (optional)
item_id of this content_item. If this is not specified an item_id will be generated automatically
-locale (optional)
-
-creation_date (optional)
defaults to current date and time
-creation_user (optional)
-
-context_id (optional)
Context of the item. usually used in conjunction with permissions.
-package_id (optional)
Package ID of the object
-creation_ip (optional)
-
-item_subtype (optional, defaults to "content_item")
-content_type (optional, defaults to "content_revision")
content_revision or subtype of content_revision
-title (optional)
- title of content_revision to be created
-description (optional)
of content_revision to be created
-mime_type (optional)
-nls_language (optional)
- ???
-text (optional)
- text of content revision to be created
-data (optional)
- ???
-relation_tag (optional)
-is_live (optional, defaults to "f")
-storage_type (optional, defaults to "file")
file, lob, or text (postgresql only)
-attributes (optional)
A list of lists of pairs of additional attributes and their values to pass to the constructor. Each pair is a list of two elements: key => value such as [list [list attribute value] [list attribute value]]
-tmp_filename (optional)
file containing content to be added to new revision. Caller is responsible to handle cleaning up the temporary file
Returns:
item_id of the new content item
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2004-05-28
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_image content_image (test acs-content-repository) content::item::new content::item::new test_content_image->content::item::new test_content_item content_item (test acs-content-repository) test_content_item->content::item::new test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) test_content_item_nested_structure->content::item::new test_content_revision content_revision (test acs-content-repository) test_content_revision->content::item::new test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) test_cr_item_search_triggers->content::item::new ad_conn ad_conn (public) content::item::new->ad_conn content::revision::new content::revision::new (public) content::item::new->content::revision::new cr_check_mime_type cr_check_mime_type (public) content::item::new->cr_check_mime_type db_transaction db_transaction (public) content::item::new->db_transaction package_exec_plsql package_exec_plsql (public) content::item::new->package_exec_plsql acs_user::create_portrait acs_user::create_portrait (public) acs_user::create_portrait->content::item::new apm_generate_tarball apm_generate_tarball (public) apm_generate_tarball->content::item::new attachments::richtext::file_attach attachments::richtext::file_attach (public) attachments::richtext::file_attach->content::item::new attachments::richtext::require_root_folder attachments::richtext::require_root_folder (private) attachments::richtext::require_root_folder->content::item::new email_image::edit_email_image email_image::edit_email_image (public) email_image::edit_email_image->content::item::new

Testcases:
content_image, content_item, content_item_nested_structure, content_revision, cr_item_search_triggers, data_links_update_links, data_links_update_links_with_tag, data_links_with_tag

content::item::publish (public)

 content::item::publish -item_id item_id [ -revision_id revision_id ]

Publish a content item. Updates the live_revision and publish_date attributes, and sets publish_status to live.

Switches:
-item_id (required)
The id of the content item
-revision_id (optional)
The id of the revision to publish. Defaults to the latest revision.
Author:
Peter Marklund

Partial Call Graph (max 5 caller/called nodes):
%3 content::item::get_latest_revision content::item::get_latest_revision (public) content::item::set_live_revision content::item::set_live_revision (public) content::item::publish content::item::publish content::item::publish->content::item::get_latest_revision content::item::publish->content::item::set_live_revision

Testcases:
No testcase defined.

content::item::register_template (public)

 content::item::register_template -item_id item_id \
    -template_id template_id -use_context use_context
Switches:
-item_id (required)
-template_id (required)
-use_context (required)

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::register_template content::item::register_template content::item::register_template->package_exec_plsql

Testcases:
No testcase defined.

content::item::relate (public)

 content::item::relate -item_id item_id -object_id object_id \
    [ -relation_tag relation_tag ] [ -order_n order_n ] \
    [ -relation_type relation_type ]
Switches:
-item_id (required)
-object_id (required)
-relation_tag (optional)
-order_n (optional)
-relation_type (optional, defaults to "cr_item_rel")
Returns:
NUMBER(38)

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::relate content::item::relate content::item::relate->package_exec_plsql

Testcases:
No testcase defined.

content::item::rename (public)

 content::item::rename -item_id item_id -name name

Rename an item.

Switches:
-item_id (required)
-name (required)
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2004-05-28 Rename a content item.

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::rename content::item::rename test_content_item->content::item::rename package_exec_plsql package_exec_plsql (public) content::item::rename->package_exec_plsql

Testcases:
content_item

content::item::set_live_revision (public)

 content::item::set_live_revision -revision_id revision_id \
    [ -publish_status publish_status ]
Switches:
-revision_id (required)
-publish_status (optional, defaults to "ready")

Partial Call Graph (max 5 caller/called nodes):
%3 test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) content::item::set_live_revision content::item::set_live_revision test_cr_item_search_triggers->content::item::set_live_revision package_exec_plsql package_exec_plsql (public) content::item::set_live_revision->package_exec_plsql content::item::publish content::item::publish (public) content::item::publish->content::item::set_live_revision content::item::upload_file content::item::upload_file (public) content::item::upload_file->content::item::set_live_revision content::revision::new content::revision::new (public) content::revision::new->content::item::set_live_revision fs::add_version fs::add_version (public) fs::add_version->content::item::set_live_revision fs::file_copy fs::file_copy (public) fs::file_copy->content::item::set_live_revision

Testcases:
cr_item_search_triggers

content::item::set_release_period (public)

 content::item::set_release_period -item_id item_id \
    [ -start_when start_when ] [ -end_when end_when ]
Switches:
-item_id (required)
-start_when (optional)
-end_when (optional)

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::set_release_period content::item::set_release_period content::item::set_release_period->package_exec_plsql

Testcases:
No testcase defined.

content::item::unpublish (public)

 content::item::unpublish -item_id item_id \
    [ -publish_status publish_status ]

Unpublish a content item.

Switches:
-item_id (required)
The id of the content item
-publish_status (optional, defaults to "production")
The publish_status to put the item in after unpublishing it.
Author:
Peter Marklund

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item_nested_structure content_item_nested_structure (test acs-content-repository) content::item::unpublish content::item::unpublish test_content_item_nested_structure->content::item::unpublish content::item::update content::item::update (public) content::item::unpublish->content::item::update

Testcases:
content_item_nested_structure

content::item::unregister_template (public)

 content::item::unregister_template -item_id item_id \
    [ -template_id template_id ] [ -use_context use_context ]
Switches:
-item_id (required)
-template_id (optional)
-use_context (optional)

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::unregister_template content::item::unregister_template content::item::unregister_template->package_exec_plsql

Testcases:
No testcase defined.

content::item::unrelate (public)

 content::item::unrelate -rel_id rel_id
Switches:
-rel_id (required)

Partial Call Graph (max 5 caller/called nodes):
%3 package_exec_plsql package_exec_plsql (public) content::item::unrelate content::item::unrelate content::item::unrelate->package_exec_plsql

Testcases:
No testcase defined.

content::item::unset_live_revision (public)

 content::item::unset_live_revision -item_id item_id
Switches:
-item_id (required)

Partial Call Graph (max 5 caller/called nodes):
%3 test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) content::item::unset_live_revision content::item::unset_live_revision test_cr_item_search_triggers->content::item::unset_live_revision package_exec_plsql package_exec_plsql (public) content::item::unset_live_revision->package_exec_plsql

Testcases:
cr_item_search_triggers

content::item::update (public)

 content::item::update -item_id item_id -attributes attributes

Update standard non-versioned content item attributes (cr_items) Valid attributes: name parent_id latest_revision live_revision locale publish_status

Switches:
-item_id (required)
item to update
-attributes (required)
A list of pairs of additional attributes and their values to get. Each pair is a list of two elements: key => value
Returns:
Error:
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2004-06-04

Partial Call Graph (max 5 caller/called nodes):
%3 test_content_item content_item (test acs-content-repository) content::item::update content::item::update test_content_item->content::item::update test_cr_item_search_triggers cr_item_search_triggers (test acs-content-repository) test_cr_item_search_triggers->content::item::update db_dml db_dml (public) content::item::update->db_dml content::folder::update content::folder::update (public) content::folder::update->content::item::update content::item::unpublish content::item::unpublish (public) content::item::unpublish->content::item::update

Testcases:
content_item, cr_item_search_triggers

content::item::upload_file (public)

 content::item::upload_file -upload_file upload_file \
    -parent_id parent_id [ -package_id package_id ] [ -title title ]

Store the file uploaded under the parent_id if a file was uploaded

Switches:
-upload_file (required)
File to upload
-parent_id (required)
Parent ID
-package_id (optional)
-title (optional)
Title of the uploaded file
Returns:
revision_id of the generated item
Author:
Malte Sussdorff <sussdorff@sussdorff.de>
Created:
2005-06-21

Partial Call Graph (max 5 caller/called nodes):
%3 packages/bug-tracker/www/related-file-add.tcl packages/bug-tracker/ www/related-file-add.tcl content::item::upload_file content::item::upload_file packages/bug-tracker/www/related-file-add.tcl->content::item::upload_file ad_sanitize_filename ad_sanitize_filename (public) content::item::upload_file->ad_sanitize_filename content::item::set_live_revision content::item::set_live_revision (public) content::item::upload_file->content::item::set_live_revision cr_import_content cr_import_content (public) content::item::upload_file->cr_import_content db_list db_list (public) content::item::upload_file->db_list template::util::file::get_property template::util::file::get_property (public) content::item::upload_file->template::util::file::get_property

Testcases:
No testcase defined.
[ hide source ] | [ make this the default ]

Content File Source

ad_library {

    Tcl API for cr_items in the content repository

    @author Dave Bauer (dave@thedesignexperience.org)
    @author Jun Yamog
    @creation-date 2004-05-28
    @cvs-id $Id: content-item-procs.tcl,v 1.38.2.12 2023/10/30 14:46:58 antoniop Exp $
}

namespace eval ::content::item {}

d_proc -public ::content::item::new {
    -name:required
    {-parent_id ""}
    {-item_id ""}
    {-locale ""}
    {-creation_date ""}
    {-creation_user ""}
    {-context_id ""}
    {-package_id ""}
    {-creation_ip ""}
    {-item_subtype "content_item"}
    {-content_type "content_revision"}
    {-title ""}
    {-description ""}
    {-mime_type ""}
    {-nls_language ""}
    {-text ""}
    {-data ""}
    {-relation_tag ""}
    {-is_live "f"}
    {-storage_type "file"}
    {-attributes ""}
    {-tmp_filename ""}
} {

    Create a new content item This proc creates versioned content
    items where content_type iscontent_revision or subtypes of content
    revision. There are procedures for each other base content
    item. This procedure uses package_instantiate object. Under
    PostgreSQL the object_type new function must be registered with
    define_function_args.

    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2004-05-28

    @param name name of the item, must be unique for the folder
    @param item_id item_id of this content_item. If this is not
    specified an item_id will be generated automatically
    @param parent_id parent object of this content_item
    @param item_subtype
    @param content_type content_revision or subtype of content_revision
    @param context_id Context of the item. usually used in conjunction with permissions.
    @param package_id Package ID of the object
    @param creation_user -
    @param creation_ip -
    @param creation_date defaults to current date and time
    @param storage_type file, lob, or text (postgresql only)
    @param locale -
    @param title - title of content_revision to be created
    @param description of content_revision to be created
    @param text - text of content revision to be created
    @param tmp_filename file containing content to be added to new revision.
           Caller is responsible to handle cleaning up the temporary file
    @param nls_language - ???
    @param data - ???
    @param attributes A list of lists of pairs of additional attributes and
           their values to pass to the constructor. Each pair is a list of two
           elements: key => value such as
    [list [list attribute value] [list attribute value]]

    @return item_id of the new content item

    @see content::symlink::new
    @see content::extlink::new
    @see content::folder::new
} {
    if {$creation_user eq ""} {
        set creation_user [ad_conn user_id]
    }
    if {$creation_ip eq ""} {
        set creation_ip [ad_conn peeraddr]
    }
    if {$package_id eq ""} {
        set package_id [ad_conn package_id]
    }

    set mime_type [cr_check_mime_type \
                       -filename  $name \
                       -mime_type $mime_type \
                       -file      $tmp_filename]

    set var_list [list]
    lappend var_list \
        [list name $name] \
        [list parent_id $parent_id ] \
        [list item_id $item_id ] \
        [list locale $locale ] \
        [list creation_date $creation_date ] \
        [list creation_user $creation_user ] \
        [list context_id $context_id ] \
        [list package_id $package_id ] \
        [list creation_ip $creation_ip ] \
        [list item_subtype $item_subtype ] \
        [list content_type $content_type ] \
        [list mime_type $mime_type ] \
        [list nls_language $nls_language ] \
        [list relation_tag $relation_tag ] \
        [list is_live $is_live ] \
        [list storage_type $storage_type]

    # we don't pass title, text, or data to content_item__new because
    # the magic revision creation of the pl/sql proc does not create a
    # proper subtype of content revision, also it can't set attributes
    # of an extended type

    # the content type is not the object type of the cr_item so we
    # pass in the cr_item subtype here and content_type as part of
    # var_list
    db_transaction {
        # An explicit lock was necessary for PostgreSQL between 8.0 and
        # 8.2; left the following statement here for documentary
        # purposes
        #
        # db_dml lock_objects "LOCK TABLE acs_objects IN SHARE ROW EXCLUSIVE MODE"

        set item_id [package_exec_plsql \
                         -var_list $var_list \
                         content_item new]
        # if we have attributes we pass in everything and create a
        # revision with all subtype attributes that were passed in

        # since we can't rely on content_item__new to create a
        # revision we have to pass is_live to content::revision::new
        # and set the live revision there
        if {$title ne ""
            || $text ne ""
            || $data ne ""
            || $tmp_filename ne ""
            || [llength $attributes]
        } {
            content::revision::new \
                -item_id $item_id \
                -title $title \
                -description $description \
                -content $text \
                -mime_type $mime_type \
                -content_type $content_type \
                -is_live $is_live \
                -package_id $package_id \
                -creation_user $creation_user \
                -creation_ip $creation_ip \
                -creation_date $creation_date \
                -nls_language $nls_language \
                -tmp_filename $tmp_filename \
                -attributes $attributes
        }
    }
    return $item_id
}

d_proc -public ::content::item::delete {
    -item_id:required
} {
    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2004-05-28

    Delete a content item from the database. If the content item
    to delete has children content items referencing its parent
    via acs_objects.context_id then this proc will fail.

    @param item_id
} {
    set result 0
    db_1row get_storage_type {select storage_type, storage_area_key from cr_items where item_id = :item_id}

    set cleanup_data [::content::revision::collect_cleanup_data \
                          -item_id $item_id \
                          -storage_type $storage_type]
    db_transaction {
        set result [package_exec_plsql \
                        -var_list [list [list item_id $item_id]] \
                        content_item del]
        #
        # In case, everything goes well in the call above, we perform
        # the cleanup.
        #
        ::content::revision::cleanup \
            -storage_area_key $storage_area_key \
            -storage_type $storage_type \
            -data $cleanup_data
    }
    return $result
}

d_proc -public ::content::item::rename {
    -item_id:required
    -name:required
} {
    Rename an item.

    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2004-05-28

    Rename a content item.
    @param item_id
    @param name
} {
    return [package_exec_plsql \
                -var_list [list \
                               [list item_id $item_id] \
                               [list name $name]
                          ] \
                content_item edit_name]
}

d_proc -public ::content::item::move {
    -item_id:required
    -target_folder_id:required
    {-name ""}
} {
    Move an item to a folder.

    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2004-05-28

    @param item_id              item to move
    @param target_folder_id     folder to move the item to
    @param name                 new name, allows move with rename
} {
    set var_list [list \
                      [list item_id $item_id] \
                      [list target_folder_id $target_folder_id] ]
    if {$name ne ""} {
        lappend var_list [list name $name]
    }
    return [package_exec_plsql \
                -var_list $var_list \
                content_item move]
}

d_proc -public ::content::item::get {
    -item_id:required
    {-revision "live"}
    {-array_name "content_item"}
} {
    Get an item.

    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2004-05-28

    @param item_id
    @param revision live, latest
    @param array_name name of array to upvar content into
    @return upvars array_name containing all attributes of the content
    type except content
    @return returns 0 if item does not exists or 1 if query was successful

    @error
} {
    upvar $array_name local_array
    if {$revision ni {live latest}} {
        error "content::item::get revision was '${revision}'. It must be 'live' or 'latest'"
    }
    set content_type [content::item::get_content_type -item_id $item_id]
    if {$content_type eq ""} {
        # content_type query was unsuccessful, item does not exist
        return 0
    }
    if {"content_folder" eq $content_type} {
        return [db_0or1row get_item_folder "" -column_array local_array]
    }
    set table_name [acs_object_type::get_table_name -object_type $content_type]
    while {$table_name eq ""} {
        acs_object_type::get -object_type $content_type -array typeInfo
        ns_log notice "no table for $content_type registered, trying '$typeInfo(supertype)' instead"
        set content_type $typeInfo(supertype)
        set table_name [acs_object_type::get_table_name -object_type $content_type]
    }
    set table_name "${table_name}x"
    # get attributes of the content_item use the content_typex view
    return [db_0or1row get_item "" -column_array local_array]
}

d_proc -public ::content::item::update {
    -item_id:required
    -attributes:required
} {
    Update standard non-versioned content item attributes (cr_items)
    Valid attributes: name parent_id latest_revision live_revision locale publish_status

    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2004-06-04

    @param item_id item to update

    @param attributes A list of pairs of additional attributes and their values to get.
           Each pair is a list of two elements: key => value

    @return

    @error
} {
    # do not allow update of item_id, storage_location, storage_type,
    # content_type, or tree_sortkey

    set valid_attributes [list name parent_id latest_revision live_revision locale publish_status]

    set update_text ""

    foreach {attribute_list} $attributes {
        lassign $attribute_list attribute value
        if {$attribute in $valid_attributes}  {

            # create local variable to use for binding

            set $attribute $value
            if {$update_text ne ""} {
                append update_text ","
            }
            append update_text ${attribute} = :${attribute} "
        }
    }
    if {$update_text ne ""} {

    # we have valid attributes, update them

    set query_text "update cr_items set ${update_text} where item_id=:item_id"
    db_dml item_update $query_text
    }
}

d_proc -deprecated -public ::content::item::content_type {
    -item_id:required
} {
    @public get_content_type

    Retrieves the content type of the item. If the item does not exist,
    returns an empty string.

    Deprecated: exactly the same proc as content::item::get_content_type

    @see content::item::get_content_type

    @param  item_id   The item_id of the content item

    @return The content type of the item, or an empty string if no such
    item exists
} {
    return [content::item::get_content_type -item_id $item_id]
}

d_proc -public content::item::get_content_type {
    -item_id:required
} {
    Retrieves the content type of the item. If the item does not exist,
    returns an empty string.

    @param  item_id   The item_id of the content item

    @return The content type of the item, or an empty string if no such
            item exists
} {
    return [package_exec_plsql \
        -var_list [list [list item_id $item_id ]] \
        content_item get_content_type]
}

d_proc -deprecated -public content::item::get_context {
    -item_id:required
} {
    @param item_id

    @return NUMBER(38)
} {
    return [acs_object::get_element -object_id $item_id -element context_id]
}


d_proc -public content::item::get_id {
    -item_path:required
    {-root_folder_id ""}
    {-resolve_index ""}
} {
  Looks up the item_path starting with the root folder and returns item_id for that
  content item or empty, if none exists

  @param item_path
  @param root_folder_id
  @param resolve_index

  @return The item_id of the found item, or the empty string on failure
} {
    return [package_exec_plsql -var_list [list \
        [list item_path $item_path ] \
        [list root_folder_id $root_folder_id ] \
        [list resolve_index $resolve_index ] \
    ] content_item get_id]
}

d_proc -public content::item::get_descendants {
    -parent_id:required
    {-depth ""}
} {
    Returns the ids of every content item that is descendant of
    supplied parent_id.

    @param parent_id
    @param depth how deep we should go in the hierarchy. 1 means
           direct children. Returns every descendant when not
           specified.

    @return list of cr_items.item_id
} {
    return [db_list get_descendants {
        with recursive descendants (item_id) as (
           select item_id, 1 as depth
             from cr_items
            where parent_id = :parent_id

           union all

           select i.item_id, d.depth + 1
             from cr_items i, descendants d
            where i.parent_id = d.item_id
              and (:depth is null or d.depth < :depth)
        ) select * from descendants
    }]
}

d_proc -public content::item::get_best_revision {
    -item_id:required
} {
  Attempts to retrieve the live revision for the item. If no live revision
  exists, attempts to retrieve the latest revision. If the item has no
  revisions, returns an empty string.

  @param  item_id   The item_id of the content item

  @return The best revision_id for the item, or an empty string if no
          revisions exist

  @see content::revision::item_id
  @see content::item::get_live_revision
  @see content::item::get_latest_revision
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item get_best_revision]
}

d_proc -public content::item::get_latest_revision {
    -item_id:required
} {
  Retrieves the latest revision for the item. If the item has no live
  revision, returns an empty string.

  @param  item_id   The item_id of the content item

  @return The latest revision_id for the item, or an empty string if no
          revisions exist

  @see content::revision::item_id
  @see content::item::get_best_revision
  @see content::item::get_live_revision
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item get_latest_revision]
}


d_proc -public content::item::get_live_revision {
    -item_id:required
} {
  Retrieves the live revision for the item. If the item has no live
  revision, returns an empty string.

  @param  item_id   The item_id of the content item

  @return The live revision_id for the item, or an empty string if no
          live revision exists

  @see content::revision::item_id
  @see content::item::get_best_revision
  @see content::item::get_latest_revision
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item get_live_revision]
}


d_proc -public content::item::get_parent_folder {
    -item_id:required
} {
    @param item_id

    @return NUMBER(38)
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item get_parent_folder]
}

d_proc -public content::item::get_path {
    -item_id:required
    {-root_folder_id ""}
} {
    @param item_id
    @param root_folder_id

    @return VARCHAR2
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list root_folder_id $root_folder_id ] \
    ] content_item get_path]
}


d_proc -public content::item::get_publish_date {
    -item_id:required
    {-is_live ""}
} {
    @param item_id
    @param is_live

    @return DATE
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list is_live $is_live ] \
    ] content_item get_publish_date]
}


d_proc -public content::item::get_revision_count {
    -item_id:required
} {
    @param item_id

    @return NUMBER
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item get_revision_count]
}


d_proc -public content::item::get_root_folder {
    {-item_id ""}
} {
    @param item_id

    @return NUMBER(38)
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item get_root_folder]
}


d_proc -public content::item::get_template {
    -item_id:required
    -use_context:required
} {
  Retrieves the template which can be used to render the item. If there is
  a template registered directly to the item, returns the id of that template.
  Otherwise, returns the id of the default template registered to the item's
  content_type. Returns an empty string on failure.

  @param  item_id       The item_id
  @param  use_context   The context in which the template will be used (e.g. public)

  @return The template_id of the template which can be used to render the
    item, or an empty string on failure
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list use_context $use_context ] \
    ] content_item get_template]
}


d_proc -public content::item::get_title {
    -item_id:required
    {-is_live "f"}
} {

  Get the title for the item. If a live revision for the item exists,
  use the live revision. Otherwise, use the latest revision.

  @param item_id    The item_id of the content item
  @param is_live    If true, return the title of the live revision, otherwise
                    the one of the latest revision (default).
                    Boolean, 't' or 'f'.

  @return The title of the item

  @see content::item::get_best_revision

} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list is_live $is_live ] \
    ] content_item get_title]
}


d_proc -public content::item::get_virtual_path {
    -item_id:required
    {-root_folder_id ""}
} {
  Retrieves the relative path to the item. The path is relative to the
  page root, and has no extension (Example: "/foo/bar/baz").

  @param  item_id         The item_id for the item, for which the path is computed
  @param  root_folder_id  Starts path resolution from this folder.
                          Defaults to the root of the sitemap (when null).

  @return The path to the item, or an empty string on failure
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list root_folder_id $root_folder_id ] \
    ] content_item get_virtual_path]
}


d_proc -public content::item::is_index_page {
    -item_id:required
    -folder_id:required
} {
    @param item_id
    @param folder_id

    @return VARCHAR2
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list folder_id $folder_id ] \
    ] content_item is_index_page]
}


d_proc -public content::item::is_publishable {
    -item_id:required
} {

  Determine if the item is publishable. The item is publishable only
  if:
  <ul>
   <li>All child relations, as well as item relations, are satisfied
     (according to min_n and max_n)</li>
   <li>The workflow (if any) for the item is finished</li>
  </ul>

  @param  item_id   The item_id of the content item

  @see content::item::is_publishable

  @return    't' if the item is publishable, 'f' otherwise
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item is_publishable]
}


d_proc -public content::item::is_published {
    -item_id:required
} {
    @param item_id

    @return CHAR
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item is_published]
}


d_proc -public content::item::is_subclass {
    -object_type:required
    -supertype:required
} {
    @param object_type
    @param supertype

    @return CHAR
} {
    return [package_exec_plsql -var_list [list \
        [list object_type $object_type ] \
        [list supertype $supertype ] \
    ] content_item is_subclass]
}


d_proc -public content::item::is_valid_child {
    -item_id:required
    -content_type:required
    {-relation_tag ""}
} {
    @param item_id
    @param content_type
    @param relation_tag

    @return CHAR
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list content_type $content_type ] \
        [list relation_tag $relation_tag ] \
    ] content_item is_valid_child]
}


d_proc -public content::item::register_template {
    -item_id:required
    -template_id:required
    -use_context:required
} {
    @param item_id
    @param template_id
    @param use_context
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list template_id $template_id ] \
        [list use_context $use_context ] \
    ] content_item register_template]
}


d_proc -public content::item::relate {
    -item_id:required
    -object_id:required
    {-relation_tag ""}
    {-order_n ""}
    {-relation_type "cr_item_rel"}
} {
    @param item_id
    @param object_id
    @param relation_tag
    @param order_n
    @param relation_type

    @return NUMBER(38)
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list object_id $object_id ] \
        [list relation_tag $relation_tag ] \
        [list order_n $order_n ] \
        [list relation_type $relation_type ] \
    ] content_item relate]
}


d_proc -public content::item::set_live_revision {
    -revision_id:required
    {-publish_status "ready"}
} {
    @param revision_id
    @param publish_status
} {
    return [package_exec_plsql -var_list [list \
        [list revision_id $revision_id ] \
        [list publish_status $publish_status ] \
    ] content_item set_live_revision]
}


d_proc -public content::item::set_release_period {
    -item_id:required
    {-start_when ""}
    {-end_when ""}
} {
    @param item_id
    @param start_when
    @param end_when
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list start_when $start_when ] \
        [list end_when $end_when ] \
    ] content_item set_release_period]
}


d_proc -public content::item::unregister_template {
    -item_id:required
    {-template_id ""}
    {-use_context ""}
} {
    @param item_id
    @param template_id
    @param use_context
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
        [list template_id $template_id ] \
        [list use_context $use_context ] \
    ] content_item unregister_template]
}


d_proc -public content::item::unrelate {
    -rel_id:required
} {
    @param rel_id
} {
    return [package_exec_plsql -var_list [list \
        [list rel_id $rel_id ] \
    ] content_item unrelate]
}


d_proc -public content::item::unset_live_revision {
    -item_id:required
} {
    @param item_id
} {
    return [package_exec_plsql -var_list [list \
        [list item_id $item_id ] \
    ] content_item unset_live_revision]
}

d_proc -public content::item::copy {
    -item_id:required
    -target_folder_id:required
    {-creation_user ""}
    {-creation_ip ""}
    {-name ""}
} {
    @author Jun Yamog
    @creation-date 2004-06-27

    copy a content item to a new content item

    @param item_id - item_id of the content to be copied from. source content item
    @param target_folder_id - destination folder where the new content item is be passed
    @param creation_user -
    @param creation_ip -
    @param name - the name of the new item, useful if you are copying in the same folder.

    @return item_id of the new copied item
} {
    return [package_exec_plsql \
                -var_list [list \
                               [list item_id $item_id] \
                               [list target_folder_id $target_folder_id] \
                               [list creation_user $creation_user] \
                               [list creation_ip $creation_ip] \
                               [list name $name]] \
                           content_item copy]
}

d_proc -public content::item::upload_file {
    {-upload_file:required}
    {-parent_id:required}
    {-package_id ""}
    {-title ""}
} {
    Store the file uploaded under the parent_id if a file was uploaded

    @author Malte Sussdorff (sussdorff@sussdorff.de)
    @creation-date 2005-06-21

    @param upload_file  File to upload
    @param parent_id    Parent ID
    @param title        Title of the uploaded file

    @return revision_id of the generated item
} {

    set filename [template::util::file::get_property filename $upload_file]
    if {$filename ne "" } {
        set tmp_filename [template::util::file::get_property tmp_filename $upload_file]
        set mime_type [template::util::file::get_property mime_type $upload_file]
        set tmp_size [file size $tmp_filename]
        set extension [file extension $filename]
        if {$title eq ""} {

            # maltes: The following regsub garbles the title and consequently the filename as well.
            # "info_c+w.zip" will become "info_c+"
            # This is bad, first of all because a letter is missing entirely. Additionally
            # the title in itself should be the original filename, after all this is what
            # the user uploaded, not something stripped of its extension.
            # So I commented this out until someone can either fix the regsub but more importantly
            # can explain why the title should not contain the extension.

            # DRB: removing the explicit "." isn't sufficient because the "." in the
            # extension also matches any char unless it is escaped.  Like Malte, I
            # see no reason to get rid of the extension in the title anyway ...

            # regsub -all -- ".${extension}\$" $filename "" title
            set title $filename
        }

        set existing_filenames [db_list get_parent_existing_filenames {}]
        set filename [ad_sanitize_filename \
                          -existing_names $existing_filenames \
                          -collapse_spaces \
                          -replace_with "_" $title]

        set revision_id [cr_import_content \
                             -storage_type "file" \
                             -title $title \
                             -package_id $package_id \
                             $parent_id $tmp_filename $tmp_size $mime_type $filename]

        content::item::set_live_revision -revision_id $revision_id

        return $revision_id
    }
}

d_proc -public content::item::get_id_by_name {
    {-name:required}
    {-parent_id:required}
} {
    Returns The item_id of the content item with the passed in name

    @param name Name of the content item
    @param parent_id Parent_id of the content item

    @return The item_id belonging to the name, empty string if no item_id was found
} {
    return [db_string get_item_id_by_name {} -default ""]
}

#
#
#

d_proc -public ::content::item::get_publish_status {
    -item_id:required
} {
  Get the publish status of the item. The publish status will be one of
  the following:
  <ul>
    <li><tt>production</tt> - The item is still in production. The workflow
      (if any) is not finished, and the item has no live revision.</li>
    <li><tt>ready</tt> - The item is ready for publishing</li>
    <li><tt>live</tt> - The item has been published</li>
    <li><tt>expired</tt> - The item has been published in the past, but
     its publication has expired</li>
  </ul>

  @param item_id  The item_id of the content item

  @return The publish status of the item, or the empty string on failure

  @see proc content::item::is_publishable

} {

    set publish_status [db_string gps_get_publish_status {
        select publish_status from cr_items where item_id = :item_id
    }]

  return $publish_status
}


#
#
#

ad_proc -public ::content::item::content_is_null { revision_id } {

  Determines if the content for the revision is null (not mereley
  zero-length)
  @param revision_id The revision id

  @return 1 if the content is null, 0 otherwise

} {
    set content_test [db_string cin_get_content {} -default ""]

    return [expr {$content_test eq ""}]
}

#
#
#

d_proc -public ::content::item::content_methods_by_type {
    -get_labels:boolean
    content_type
} {

  Determines all the valid content methods for instantiating
  a content type.
  Possible choices are text_entry, file_upload, no_content and
  xml_import. Currently, this proc merely removes the text_entry
  method if the item does not have a text mime type registered to
  it. In the future, a more sophisticated mechanism will be
  implemented.

  @param content_type  The content type

  @param get_labels    Return not just a list of types,
    but a list of name-value pairs, as in the -options
    ATS switch for form widgets

  @return A Tcl list of all possible content methods

} {

    set types [db_list cmbt_get_content_mime_types {
        select mime_type from cr_content_mime_type_map
        where content_type = :content_type
        and lower(mime_type) like 'text/%'
    }]

    set need_text [expr {[llength $types] > 0}]

    if { [info exists $get_label)] } {
        set methods [list \
                         [list "No Content" no_content] \
                         [list "File Upload" file_upload]]

        if { $need_text } {
            lappend methods [list "Text Entry" text_entry]
        }

        lappend methods [list "XML Import" xml_import]
    } else {
        set methods [list no_content file_upload]
        if { $need_text } {
            lappend methods text_entry
        }
        lappend methods xml_import
  }

  return $methods
}

#
#
#

d_proc -public content::item::get_content {
    {-revision_id ""}
    {-item_id ""}
    {-array:required}
} {

  Create a onerow datasource called content in the calling frame
  which contains all attributes for the revision (including inherited
  ones).<p>
  The datasource will contain a column called "text", representing the
  main content (blob) of the revision, but only if the revision has a
  textual mime-type.

  @param revision_id The revision whose attributes are to be retrieved

  @param item_id The item_id of the
    corresponding item. You can provide this as an optimization.
    If you don't provide revision_id, you must provide item_id,
    and the item must have a live revision.

  @return 1 on success (and set the array in the calling frame),
    0 on failure

  @see proc content::item::get_content_type

} {
    upvar 1 $array content

    if { $item_id eq "" } {
        set item_id [::content::revision::item_id -revision_id  $revision_id]
        if { $item_id eq "" } {
            ns_log notice "item::get_content: no such revision: $revision_id"
            return 0
        }
    } elseif$revision_id eq "" } {
        set revision_id [::content::item::get_live_revision -item_id $item_id]
    }
    if { $revision_id eq "" } {
        error "You must supply revision_id, or the item must have a live revision."
    }

    return [content::item::get_revision_content -revision_id $revision_id -item_id $item_id]
}

#
#
#
d_proc -public content::item::get_revision_content {
    -revision_id:required
    -item_id
} {

  Create a one-row datasource called content in the calling frame
  which contains all attributes for the revision (including inherited
  ones).

  The datasource will contain a column called "text", representing the
  main content (blob) of the revision, but only if the revision has a
  textual mime-type.

  @param revision_id The revision whose attributes are to be retrieved
  @param item_id  The item_id of the corresponding item.

  @return 1 on success (and create a content array in the calling frame),
    0 on failure

  @see content::item::get_content_type

} {

  if { ![info exists item_id] } {
      # Get the item id
      set item_id [::content::revision::item_id -revision_id $revision_id]

      if { $item_id eq "" } {
          ns_log warning "item::get_revision_content: No such revision: $revision_id"
          return 0
      }
  }

  # Get the "mime_type" from the revision to decide if we want the
  # "text" in the result.  The "content_type" is needed for obtaining
  # the table_name later.
  db_1row get_mime_and_content_type_from_revision {
      select mime_type, object_type as content_type
      from cr_revisionsx
      where revision_id = :revision_id
  }

  if { $mime_type ne "" && [string match "text/*" $mime_type]} {
      set text_sql [db_map grc_get_all_content_1]
  } else {
      set text_sql ""
  }

  # Get the table name
  set table_name [acs_object_type::get_table_name -object_type $content_type]

  upvar content content

  # Get (all) the content (note this is really dependent on file type)
  db_0or1row grc_get_all_content [subst {
      select x.*,
         :item_id as item_id $text_sql,
         :content_type as content_type
      from  cr_revisions r, ${table_name}x x
      where r.revision_id = :revision_id
      and   x.revision_id = r.revision_id
  }] -column_array content

  if { ![array exists content] } {
    ns_log warning "item::get_revision_content: No data found for item $item_id, revision $revision_id"
    return 0
  }

  return 1
}

#
#
#
d_proc -public content::item::publish {
    {-item_id:required}
    {-revision_id ""}
} {
    Publish a content item. Updates the live_revision and publish_date attributes, and
    sets publish_status to live.

    @param item_id The id of the content item
    @param revision_id The id of the revision to publish. Defaults to the latest revision.

    @author Peter Marklund
} {
    if { $revision_id eq "" } {
      set revision_id [::content::item::get_latest_revision -item_id $item_id]
    }
    ::content::item::set_live_revision -revision_id $revision_id -publish_status "live"
}

#
#
#
d_proc -public content::item::unpublish {
    {-item_id:required}
    {-publish_status "production"}
} {
    Unpublish a content item.

    @param item_id The id of the content item
    @param publish_status The publish_status to put the item in after unpublishing it.

    @author Peter Marklund
} {
  ::content::item::update -item_id $item_id -attributes [list [list publish_status $publish_status]]
}


#
# Local variables:
#    mode: tcl
#    tcl-indent-level: 4
#    indent-tabs-mode: nil
# End: