browsercms 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/cms/connectors_controller.rb +1 -1
- data/app/helpers/cms/application_helper.rb +2 -19
- data/app/helpers/cms/form_builder.rb +8 -5
- data/app/helpers/cms/menu_helper.rb +19 -5
- data/app/helpers/cms/page_helper.rb +9 -1
- data/app/helpers/cms/template_support.rb +21 -0
- data/app/models/abstract_file_block.rb +4 -0
- data/app/models/connector.rb +7 -3
- data/app/models/dynamic_view.rb +2 -4
- data/app/models/portlet.rb +22 -9
- data/app/models/section.rb +7 -5
- data/app/views/cms/blocks/_toolbar_for_member.html.erb +4 -4
- data/app/views/cms/blocks/index.html.erb +1 -1
- data/app/views/cms/blocks/usages.html.erb +44 -34
- data/app/views/cms/connectors/new.html.erb +2 -2
- data/app/views/cms/dynamic_views/_form.html.erb +1 -1
- data/app/views/cms/dynamic_views/index.html.erb +7 -3
- data/app/views/cms/email_messages/index.html.erb +3 -5
- data/app/views/cms/form_builder/_cms_datetime_select.html.erb +12 -0
- data/app/views/cms/form_builder/_cms_text_editor.html.erb +2 -2
- data/app/views/cms/form_builder/_cms_text_field.html.erb +1 -2
- data/app/views/cms/groups/_permissions.html.erb +1 -0
- data/app/views/cms/groups/_sections.html.erb +1 -0
- data/app/views/cms/groups/index.html.erb +3 -5
- data/app/views/cms/page_routes/index.html.erb +13 -7
- data/app/views/cms/page_routes/show.html.erb +4 -4
- data/app/views/cms/pages/_edit_connector.html.erb +4 -1
- data/app/views/cms/pages/_edit_container.html.erb +4 -1
- data/app/views/cms/redirects/index.html.erb +12 -7
- data/app/views/cms/routes/index.html.erb +11 -7
- data/app/views/cms/sections/_form.html.erb +4 -5
- data/app/views/cms/users/_groups.html.erb +1 -0
- data/app/views/layouts/_cms_toolbar.html.erb +37 -4
- data/app/views/layouts/_page_toolbar.html.erb +2 -2
- data/browsercms.gemspec +381 -3
- data/db/demo/data.rb +2 -1
- data/doc/app/classes/AbstractFileBlock.html +146 -0
- data/doc/app/classes/ActiveRecord.html +105 -0
- data/doc/app/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html +242 -0
- data/doc/app/classes/ActiveSupport.html +111 -0
- data/doc/app/classes/ActiveSupport/Cache.html +111 -0
- data/doc/app/classes/ActiveSupport/Cache/FileStore.html +146 -0
- data/doc/app/classes/ActsAsList.html +147 -0
- data/doc/app/classes/ActsAsList/ClassMethods.html +202 -0
- data/doc/app/classes/ActsAsList/InstanceMethods.html +510 -0
- data/doc/app/classes/ApplicationController.html +119 -0
- data/doc/app/classes/ApplicationHelper.html +112 -0
- data/doc/app/classes/Attachment.html +726 -0
- data/doc/app/classes/Category.html +230 -0
- data/doc/app/classes/CategoryType.html +214 -0
- data/doc/app/classes/Cms.html +638 -0
- data/doc/app/classes/Cms/Acts.html +111 -0
- data/doc/app/classes/Cms/Acts/ContentBlock.html +146 -0
- data/doc/app/classes/Cms/Acts/ContentBlock/MacroMethods.html +165 -0
- data/doc/app/classes/Cms/Acts/ContentBlock/MacroMethods/InstanceMethods.html +140 -0
- data/doc/app/classes/Cms/ApplicationController.html +418 -0
- data/doc/app/classes/Cms/ApplicationHelper.html +814 -0
- data/doc/app/classes/Cms/AttachmentsController.html +154 -0
- data/doc/app/classes/Cms/Authentication.html +116 -0
- data/doc/app/classes/Cms/Authentication/Controller.html +702 -0
- data/doc/app/classes/Cms/Authentication/Model.html +165 -0
- data/doc/app/classes/Cms/Authentication/Model/ClassMethods.html +246 -0
- data/doc/app/classes/Cms/Authentication/Model/InstanceMethods.html +412 -0
- data/doc/app/classes/Cms/BaseController.html +113 -0
- data/doc/app/classes/Cms/Behaviors.html +235 -0
- data/doc/app/classes/Cms/Behaviors/Archiving.html +147 -0
- data/doc/app/classes/Cms/Behaviors/Archiving/InstanceMethods.html +220 -0
- data/doc/app/classes/Cms/Behaviors/Archiving/MacroMethods.html +175 -0
- data/doc/app/classes/Cms/Behaviors/Attaching.html +160 -0
- data/doc/app/classes/Cms/Behaviors/Attaching/InstanceMethods.html +670 -0
- data/doc/app/classes/Cms/Behaviors/Attaching/MacroMethods.html +188 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing/InstanceMethods.html +140 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing/MacroMethods.html +178 -0
- data/doc/app/classes/Cms/Behaviors/ClassMethods.html +272 -0
- data/doc/app/classes/Cms/Behaviors/Connecting.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Connecting/ClassMethods.html +188 -0
- data/doc/app/classes/Cms/Behaviors/Connecting/InstanceMethods.html +312 -0
- data/doc/app/classes/Cms/Behaviors/Connecting/MacroMethods.html +184 -0
- data/doc/app/classes/Cms/Behaviors/DynamicAttributes.html +285 -0
- data/doc/app/classes/Cms/Behaviors/DynamicAttributes/InstanceMethods.html +181 -0
- data/doc/app/classes/Cms/Behaviors/DynamicAttributes/MacroMethods.html +243 -0
- data/doc/app/classes/Cms/Behaviors/FlushCacheOnChange.html +178 -0
- data/doc/app/classes/Cms/Behaviors/FlushCacheOnChange/InstanceMethods.html +142 -0
- data/doc/app/classes/Cms/Behaviors/FlushCacheOnChange/MacroMethods.html +175 -0
- data/doc/app/classes/Cms/Behaviors/Hiding.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Hiding/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Hiding/InstanceMethods.html +220 -0
- data/doc/app/classes/Cms/Behaviors/Hiding/MacroMethods.html +176 -0
- data/doc/app/classes/Cms/Behaviors/InstanceMethods.html +234 -0
- data/doc/app/classes/Cms/Behaviors/Pagination.html +151 -0
- data/doc/app/classes/Cms/Behaviors/Pagination/ClassMethods.html +252 -0
- data/doc/app/classes/Cms/Behaviors/Pagination/Collection.html +437 -0
- data/doc/app/classes/Cms/Behaviors/Pagination/InvalidPage.html +146 -0
- data/doc/app/classes/Cms/Behaviors/Publishing.html +179 -0
- data/doc/app/classes/Cms/Behaviors/Publishing/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Publishing/InstanceMethods.html +333 -0
- data/doc/app/classes/Cms/Behaviors/Publishing/MacroMethods.html +180 -0
- data/doc/app/classes/Cms/Behaviors/Rendering.html +179 -0
- data/doc/app/classes/Cms/Behaviors/Rendering/MacroMethods.html +186 -0
- data/doc/app/classes/Cms/Behaviors/Searching.html +147 -0
- data/doc/app/classes/Cms/Behaviors/Searching/ClassMethods.html +164 -0
- data/doc/app/classes/Cms/Behaviors/Searching/MacroMethods.html +188 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting.html +148 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting/ClassMethods.html +217 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting/InstanceMethods.html +247 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting/MacroMethods.html +205 -0
- data/doc/app/classes/Cms/Behaviors/Taggable.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Taggable/ClassMethods.html +164 -0
- data/doc/app/classes/Cms/Behaviors/Taggable/InstanceMethods.html +197 -0
- data/doc/app/classes/Cms/Behaviors/Taggable/MacroMethods.html +182 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping/InstanceMethods.html +143 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping/MacroMethods.html +181 -0
- data/doc/app/classes/Cms/Behaviors/Versioning.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Versioning/ClassMethods.html +237 -0
- data/doc/app/classes/Cms/Behaviors/Versioning/InstanceMethods.html +685 -0
- data/doc/app/classes/Cms/Behaviors/Versioning/MacroMethods.html +290 -0
- data/doc/app/classes/Cms/CacheController.html +174 -0
- data/doc/app/classes/Cms/Caching.html +171 -0
- data/doc/app/classes/Cms/CategoriesController.html +113 -0
- data/doc/app/classes/Cms/CategoryTypesController.html +148 -0
- data/doc/app/classes/Cms/ConnectorsController.html +215 -0
- data/doc/app/classes/Cms/ContentBlockController.html +1175 -0
- data/doc/app/classes/Cms/ContentController.html +313 -0
- data/doc/app/classes/Cms/ContentTypesController.html +148 -0
- data/doc/app/classes/Cms/DashboardController.html +151 -0
- data/doc/app/classes/Cms/DataLoader.html +182 -0
- data/doc/app/classes/Cms/DynamicViewsController.html +359 -0
- data/doc/app/classes/Cms/EmailMessagesController.html +172 -0
- data/doc/app/classes/Cms/ErrorHandling.html +172 -0
- data/doc/app/classes/Cms/Errors.html +111 -0
- data/doc/app/classes/Cms/Errors/AccessDenied.html +146 -0
- data/doc/app/classes/Cms/Extensions.html +140 -0
- data/doc/app/classes/Cms/Extensions/ActionView.html +111 -0
- data/doc/app/classes/Cms/Extensions/ActionView/Base.html +141 -0
- data/doc/app/classes/Cms/Extensions/ActiveRecord.html +116 -0
- data/doc/app/classes/Cms/Extensions/ActiveRecord/Base.html +144 -0
- data/doc/app/classes/Cms/Extensions/ActiveRecord/Errors.html +140 -0
- data/doc/app/classes/Cms/Extensions/Hash.html +175 -0
- data/doc/app/classes/Cms/Extensions/Integer.html +146 -0
- data/doc/app/classes/Cms/Extensions/NilClass.html +212 -0
- data/doc/app/classes/Cms/Extensions/String.html +212 -0
- data/doc/app/classes/Cms/FileBlocksController.html +113 -0
- data/doc/app/classes/Cms/FormBuilder.html +312 -0
- data/doc/app/classes/Cms/FormTagHelper.html +245 -0
- data/doc/app/classes/Cms/GroupsController.html +225 -0
- data/doc/app/classes/Cms/HomeController.html +148 -0
- data/doc/app/classes/Cms/HtmlBlocksController.html +113 -0
- data/doc/app/classes/Cms/ImageBlocksController.html +113 -0
- data/doc/app/classes/Cms/LinksController.html +341 -0
- data/doc/app/classes/Cms/MenuHelper.html +330 -0
- data/doc/app/classes/Cms/PageHelper.html +292 -0
- data/doc/app/classes/Cms/PageRouteConditionsController.html +113 -0
- data/doc/app/classes/Cms/PageRouteOptionsController.html +355 -0
- data/doc/app/classes/Cms/PageRouteRequirementsController.html +113 -0
- data/doc/app/classes/Cms/PageRoutesController.html +284 -0
- data/doc/app/classes/Cms/PagesController.html +331 -0
- data/doc/app/classes/Cms/PathHelper.html +268 -0
- data/doc/app/classes/Cms/PortletController.html +150 -0
- data/doc/app/classes/Cms/PortletsController.html +301 -0
- data/doc/app/classes/Cms/RedirectsController.html +172 -0
- data/doc/app/classes/Cms/ResourceController.html +616 -0
- data/doc/app/classes/Cms/Routes.html +303 -0
- data/doc/app/classes/Cms/RoutesController.html +164 -0
- data/doc/app/classes/Cms/SectionNodesController.html +272 -0
- data/doc/app/classes/Cms/SectionNodesHelper.html +145 -0
- data/doc/app/classes/Cms/SectionsController.html +542 -0
- data/doc/app/classes/Cms/SessionsController.html +270 -0
- data/doc/app/classes/Cms/TagsController.html +152 -0
- data/doc/app/classes/Cms/TasksController.html +221 -0
- data/doc/app/classes/Cms/ToolbarController.html +153 -0
- data/doc/app/classes/Cms/UsersController.html +405 -0
- data/doc/app/classes/Connector.html +350 -0
- data/doc/app/classes/ContentType.html +448 -0
- data/doc/app/classes/ContentTypeGroup.html +111 -0
- data/doc/app/classes/DynamicPortlet.html +148 -0
- data/doc/app/classes/DynamicView.html +411 -0
- data/doc/app/classes/EmailMessage.html +228 -0
- data/doc/app/classes/EmailMessageMailer.html +150 -0
- data/doc/app/classes/EmailPagePortlet.html +184 -0
- data/doc/app/classes/FileBlock.html +202 -0
- data/doc/app/classes/Group.html +170 -0
- data/doc/app/classes/GroupPermission.html +111 -0
- data/doc/app/classes/GroupSection.html +111 -0
- data/doc/app/classes/GroupType.html +111 -0
- data/doc/app/classes/GroupTypePermission.html +111 -0
- data/doc/app/classes/GuestUser.html +347 -0
- data/doc/app/classes/HtmlBlock.html +170 -0
- data/doc/app/classes/ImageBlock.html +202 -0
- data/doc/app/classes/InitialData.html +171 -0
- data/doc/app/classes/Link.html +249 -0
- data/doc/app/classes/LoginPortlet.html +151 -0
- data/doc/app/classes/Page.html +954 -0
- data/doc/app/classes/PagePartial.html +201 -0
- data/doc/app/classes/PageRoute.html +335 -0
- data/doc/app/classes/PageRouteCondition.html +113 -0
- data/doc/app/classes/PageRouteOption.html +111 -0
- data/doc/app/classes/PageRouteRequirement.html +113 -0
- data/doc/app/classes/PageTemplate.html +278 -0
- data/doc/app/classes/Permission.html +111 -0
- data/doc/app/classes/Portlet.html +738 -0
- data/doc/app/classes/Redirect.html +111 -0
- data/doc/app/classes/Section.html +580 -0
- data/doc/app/classes/SectionNode.html +410 -0
- data/doc/app/classes/Sequence.html +146 -0
- data/doc/app/classes/Site.html +253 -0
- data/doc/app/classes/Tag.html +292 -0
- data/doc/app/classes/TagCloudPortlet.html +176 -0
- data/doc/app/classes/Tagging.html +146 -0
- data/doc/app/classes/Task.html +288 -0
- data/doc/app/classes/User.html +618 -0
- data/doc/app/classes/UserGroupMembership.html +111 -0
- data/doc/app/created.rid +1 -0
- data/doc/app/files/app/controllers/application_controller_rb.html +109 -0
- data/doc/app/files/app/controllers/cms/application_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/attachments_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/base_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/cache_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/categories_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/category_types_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/connectors_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/content_block_controller_rb.html +107 -0
- data/doc/app/files/app/controllers/cms/content_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/content_types_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/dashboard_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/dynamic_views_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/email_messages_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/error_handling_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/file_blocks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/groups_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/home_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/html_blocks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/image_blocks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/links_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_route_conditions_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_route_options_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_route_requirements_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_routes_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/pages_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/portlet_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/portlets_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/redirects_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/resource_controller_rb.html +108 -0
- data/doc/app/files/app/controllers/cms/routes_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/section_nodes_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/sections_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/sessions_controller_rb.html +107 -0
- data/doc/app/files/app/controllers/cms/tags_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/tasks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/toolbar_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/users_controller_rb.html +101 -0
- data/doc/app/files/app/helpers/application_helper_rb.html +108 -0
- data/doc/app/files/app/helpers/cms/application_helper_rb.html +107 -0
- data/doc/app/files/app/helpers/cms/form_builder_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/form_tag_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/menu_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/page_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/path_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/section_nodes_helper_rb.html +101 -0
- data/doc/app/files/app/models/abstract_file_block_rb.html +101 -0
- data/doc/app/files/app/models/attachment_rb.html +109 -0
- data/doc/app/files/app/models/category_rb.html +101 -0
- data/doc/app/files/app/models/category_type_rb.html +101 -0
- data/doc/app/files/app/models/connector_rb.html +101 -0
- data/doc/app/files/app/models/content_type_group_rb.html +101 -0
- data/doc/app/files/app/models/content_type_rb.html +101 -0
- data/doc/app/files/app/models/dynamic_view_rb.html +101 -0
- data/doc/app/files/app/models/email_message_mailer_rb.html +101 -0
- data/doc/app/files/app/models/email_message_rb.html +101 -0
- data/doc/app/files/app/models/file_block_rb.html +101 -0
- data/doc/app/files/app/models/group_permission_rb.html +101 -0
- data/doc/app/files/app/models/group_rb.html +101 -0
- data/doc/app/files/app/models/group_section_rb.html +101 -0
- data/doc/app/files/app/models/group_type_permission_rb.html +101 -0
- data/doc/app/files/app/models/group_type_rb.html +101 -0
- data/doc/app/files/app/models/guest_user_rb.html +101 -0
- data/doc/app/files/app/models/html_block_rb.html +101 -0
- data/doc/app/files/app/models/image_block_rb.html +101 -0
- data/doc/app/files/app/models/link_rb.html +101 -0
- data/doc/app/files/app/models/page_partial_rb.html +101 -0
- data/doc/app/files/app/models/page_rb.html +101 -0
- data/doc/app/files/app/models/page_route_condition_rb.html +101 -0
- data/doc/app/files/app/models/page_route_option_rb.html +101 -0
- data/doc/app/files/app/models/page_route_rb.html +101 -0
- data/doc/app/files/app/models/page_route_requirement_rb.html +101 -0
- data/doc/app/files/app/models/page_template_rb.html +101 -0
- data/doc/app/files/app/models/permission_rb.html +101 -0
- data/doc/app/files/app/models/portlet_rb.html +101 -0
- data/doc/app/files/app/models/redirect_rb.html +101 -0
- data/doc/app/files/app/models/section_node_rb.html +101 -0
- data/doc/app/files/app/models/section_rb.html +101 -0
- data/doc/app/files/app/models/site_rb.html +101 -0
- data/doc/app/files/app/models/tag_rb.html +101 -0
- data/doc/app/files/app/models/tagging_rb.html +101 -0
- data/doc/app/files/app/models/task_rb.html +101 -0
- data/doc/app/files/app/models/user_group_membership_rb.html +101 -0
- data/doc/app/files/app/models/user_rb.html +108 -0
- data/doc/app/files/app/portlets/dynamic_portlet_rb.html +101 -0
- data/doc/app/files/app/portlets/email_page_portlet_rb.html +101 -0
- data/doc/app/files/app/portlets/login_portlet_rb.html +101 -0
- data/doc/app/files/app/portlets/tag_cloud_portlet_rb.html +101 -0
- data/doc/app/files/doc/README_FOR_APP.html +127 -0
- data/doc/app/files/lib/acts_as_list_rb.html +101 -0
- data/doc/app/files/lib/browsercms_rb.html +113 -0
- data/doc/app/files/lib/cms/acts/content_block_rb.html +101 -0
- data/doc/app/files/lib/cms/authentication/controller_rb.html +101 -0
- data/doc/app/files/lib/cms/authentication/model_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/archiving_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/attaching_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/categorizing_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/connecting_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/dynamic_attributes_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/flush_cache_on_change_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/hiding_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/pagination_rb.html +107 -0
- data/doc/app/files/lib/cms/behaviors/publishing_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/rendering_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/searching_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/soft_deleting_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/taggable_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/userstamping_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/versioning_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors_rb.html +147 -0
- data/doc/app/files/lib/cms/caching_rb.html +101 -0
- data/doc/app/files/lib/cms/data_loader_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/action_view/base_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_record/base_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_record/errors_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_support/cache/file_store_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/hash_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/integer_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/nil_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/string_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions_rb.html +101 -0
- data/doc/app/files/lib/cms/init_rb.html +101 -0
- data/doc/app/files/lib/cms/routes_rb.html +101 -0
- data/doc/app/files/lib/initial_data_rb.html +101 -0
- data/doc/app/files/lib/sequence_rb.html +101 -0
- data/doc/app/fr_class_index.html +205 -0
- data/doc/app/fr_file_index.html +152 -0
- data/doc/app/fr_method_index.html +738 -0
- data/doc/app/index.html +24 -0
- data/doc/app/rdoc-style.css +208 -0
- data/doc/guides/html/build_it_yourself.html +175 -0
- data/doc/guides/html/deployment_guide.html +181 -0
- data/doc/guides/html/designer_guide.html +153 -0
- data/doc/guides/html/developer_guide.html +266 -0
- data/doc/guides/html/files/javascripts/code_highlighter.js +188 -0
- data/doc/guides/html/files/javascripts/guides.js +7 -0
- data/doc/guides/html/files/javascripts/highlighters.js +90 -0
- data/doc/guides/html/files/stylesheets/main.css +441 -0
- data/doc/guides/html/files/stylesheets/reset.css +43 -0
- data/doc/guides/html/files/stylesheets/style.css +13 -0
- data/doc/guides/html/files/stylesheets/syntax.css +31 -0
- data/doc/guides/html/getting_started.html +181 -0
- data/doc/guides/html/images/bg.png +0 -0
- data/doc/guides/html/images/bottom_cap.png +0 -0
- data/doc/guides/html/images/browsercms_logo.png +0 -0
- data/doc/guides/html/images/dot.png +0 -0
- data/doc/guides/html/images/icons/README +5 -0
- data/doc/guides/html/images/icons/callouts/1.png +0 -0
- data/doc/guides/html/images/icons/callouts/10.png +0 -0
- data/doc/guides/html/images/icons/callouts/11.png +0 -0
- data/doc/guides/html/images/icons/callouts/12.png +0 -0
- data/doc/guides/html/images/icons/callouts/13.png +0 -0
- data/doc/guides/html/images/icons/callouts/14.png +0 -0
- data/doc/guides/html/images/icons/callouts/15.png +0 -0
- data/doc/guides/html/images/icons/callouts/2.png +0 -0
- data/doc/guides/html/images/icons/callouts/3.png +0 -0
- data/doc/guides/html/images/icons/callouts/4.png +0 -0
- data/doc/guides/html/images/icons/callouts/5.png +0 -0
- data/doc/guides/html/images/icons/callouts/6.png +0 -0
- data/doc/guides/html/images/icons/callouts/7.png +0 -0
- data/doc/guides/html/images/icons/callouts/8.png +0 -0
- data/doc/guides/html/images/icons/callouts/9.png +0 -0
- data/doc/guides/html/images/icons/caution.png +0 -0
- data/doc/guides/html/images/icons/example.png +0 -0
- data/doc/guides/html/images/icons/home.png +0 -0
- data/doc/guides/html/images/icons/important.png +0 -0
- data/doc/guides/html/images/icons/next.png +0 -0
- data/doc/guides/html/images/icons/note.png +0 -0
- data/doc/guides/html/images/icons/prev.png +0 -0
- data/doc/guides/html/images/icons/tip.png +0 -0
- data/doc/guides/html/images/icons/up.png +0 -0
- data/doc/guides/html/images/icons/warning.png +0 -0
- data/doc/guides/html/images/top_cap.png +0 -0
- data/doc/guides/html/images/top_cap_content.png +0 -0
- data/doc/guides/html/index.html +168 -0
- data/doc/guides/html/installing_modules.html +181 -0
- data/doc/guides/html/user_guide.html +266 -0
- data/lib/cms/behaviors/attaching.rb +1 -1
- data/lib/cms/behaviors/rendering.rb +1 -1
- data/lib/cms/behaviors/taggable.rb +2 -1
- data/lib/cms/behaviors/versioning.rb +1 -1
- data/lib/cms/init.rb +4 -4
- data/lib/tasks/cms.rake +16 -42
- data/public/images/cms/buttons/button_cap_off_middle.gif +0 -0
- data/public/images/cms/buttons/button_left_bg.png +0 -0
- data/public/images/cms/buttons/button_off_middle.png +0 -0
- data/public/images/cms/nav_admin.gif +0 -0
- data/public/images/cms/nav_admin_h.gif +0 -0
- data/public/images/cms/nav_admin_on.gif +0 -0
- data/public/images/cms/nav_content_library.gif +0 -0
- data/public/images/cms/nav_content_library_h.gif +0 -0
- data/public/images/cms/nav_content_library_on.gif +0 -0
- data/public/images/cms/nav_dash.gif +0 -0
- data/public/images/cms/nav_dash_h.gif +0 -0
- data/public/images/cms/nav_dash_on.gif +0 -0
- data/public/images/cms/nav_sitemap.gif +0 -0
- data/public/images/cms/nav_sitemap_h.gif +0 -0
- data/public/images/cms/nav_sitemap_on.gif +0 -0
- data/public/stylesheets/cms/administration.css +91 -91
- data/public/stylesheets/cms/block.css +25 -25
- data/public/stylesheets/cms/buttons.css +120 -111
- data/public/stylesheets/cms/content_library.css +2 -1
- data/public/stylesheets/cms/content_types.css +3 -3
- data/public/stylesheets/cms/dashboard.css +118 -118
- data/public/stylesheets/cms/data_table.css +155 -155
- data/public/stylesheets/cms/form_layout.css +269 -269
- data/public/stylesheets/cms/jquery.contextMenu.css +61 -61
- data/public/stylesheets/cms/login.css +77 -77
- data/public/stylesheets/cms/menu.css +116 -116
- data/public/stylesheets/cms/nav.css +98 -111
- data/public/stylesheets/cms/page_toolbar.css +134 -134
- data/public/stylesheets/cms/sitemap.css +31 -15
- data/rails_generators/content_block/content_block_generator.rb +4 -9
- data/rails_generators/content_block/templates/_form.html.erb +3 -1
- data/rails_generators/portlet/portlet_generator.rb +2 -6
- data/rails_generators/portlet/templates/_form.html.erb +1 -0
- data/templates/blank.rb +30 -0
- data/templates/demo.rb +28 -0
- data/templates/module.rb +945 -0
- data/test/functional/cms/connectors_controller_test.rb +12 -1
- data/test/functional/cms/portlets_controller_test.rb +10 -0
- data/test/unit/behaviors/taggable_test.rb +19 -0
- data/test/unit/helpers/menu_helper_test.rb +72 -1
- data/test/unit/lib/generators_test.rb +21 -3
- data/test/unit/models/connector_test.rb +16 -0
- data/test/unit/models/sections_test.rb +4 -0
- metadata +380 -2
@@ -0,0 +1,153 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>BrowserCMS Designer Guide</title>
|
6
|
+
<link rel="stylesheet" type="text/css" href="files/stylesheets/syntax.css" />
|
7
|
+
<script type="text/javascript" src="files/javascripts/code_highlighter.js"></script>
|
8
|
+
<script type="text/javascript" src="files/javascripts/highlighters.js"></script>
|
9
|
+
<style type="text/css">
|
10
|
+
body {
|
11
|
+
background: #FFFFFF url(images/bg.png) repeat-x scroll 0 0;
|
12
|
+
font-family: "Trebuchet MS", Helvetica, Verdana, Arial, sans-serif;
|
13
|
+
margin: 0;
|
14
|
+
padding: 0;
|
15
|
+
}
|
16
|
+
|
17
|
+
#page {
|
18
|
+
margin: 0 auto;
|
19
|
+
text-align: left;
|
20
|
+
width: 1000px;
|
21
|
+
}
|
22
|
+
|
23
|
+
#header {
|
24
|
+
height: 110px;
|
25
|
+
}
|
26
|
+
|
27
|
+
div.top_cap {
|
28
|
+
background: transparent url(images/top_cap.png) no-repeat scroll 0 0;
|
29
|
+
height: 10px;
|
30
|
+
}
|
31
|
+
|
32
|
+
#contentwrap {
|
33
|
+
background: transparent url(images/dot.png) repeat scroll 0 0;
|
34
|
+
float: left;
|
35
|
+
width: 1000px;
|
36
|
+
}
|
37
|
+
|
38
|
+
div.bottom_cap {
|
39
|
+
background: transparent url(images/bottom_cap.png) no-repeat scroll 0 0;
|
40
|
+
height: 9px;
|
41
|
+
}
|
42
|
+
|
43
|
+
div.top_cap_content {
|
44
|
+
background: transparent url(images/top_cap_content.png) no-repeat scroll 0 0;
|
45
|
+
height: 5px;
|
46
|
+
}
|
47
|
+
|
48
|
+
#content {
|
49
|
+
background-color: #FFFFFF;
|
50
|
+
margin: 0 5px;
|
51
|
+
padding: 0 10px;
|
52
|
+
}
|
53
|
+
|
54
|
+
div.title {
|
55
|
+
padding: 20px;
|
56
|
+
}
|
57
|
+
|
58
|
+
div.title h1 {
|
59
|
+
border-bottom: 3px solid #505358;
|
60
|
+
color: #FFFFFF;
|
61
|
+
font-size: 24pt;
|
62
|
+
font-weight: normal;
|
63
|
+
line-height: 1;
|
64
|
+
margin: 0 0 10px;
|
65
|
+
padding-bottom: 10px;
|
66
|
+
}
|
67
|
+
|
68
|
+
td.sidebar {
|
69
|
+
font-size: 8pt;
|
70
|
+
width: 165px;
|
71
|
+
padding: 5px;
|
72
|
+
}
|
73
|
+
|
74
|
+
td.sidebar ol {
|
75
|
+
margin-left: 20px;
|
76
|
+
padding: 0;
|
77
|
+
line-height: 1.5;
|
78
|
+
}
|
79
|
+
|
80
|
+
td.sidebar ol li {
|
81
|
+
margin: 0;
|
82
|
+
padding: 0;
|
83
|
+
}
|
84
|
+
|
85
|
+
td.sidebar ol li ul {
|
86
|
+
list-style-type: none;
|
87
|
+
padding-left: 10px;
|
88
|
+
}
|
89
|
+
|
90
|
+
td.guides {
|
91
|
+
font-size: 10pt;
|
92
|
+
width: 800px;
|
93
|
+
padding: 10px;
|
94
|
+
}
|
95
|
+
|
96
|
+
.code_container {
|
97
|
+
padding: 10px;
|
98
|
+
background: #eee;
|
99
|
+
border: 1px solid #ccc;
|
100
|
+
overflow: auto;
|
101
|
+
width: 760px;
|
102
|
+
}
|
103
|
+
|
104
|
+
pre, code {
|
105
|
+
overflow: auto;
|
106
|
+
white-space:pre;
|
107
|
+
}
|
108
|
+
|
109
|
+
</style>
|
110
|
+
</head>
|
111
|
+
<body>
|
112
|
+
<div id="page">
|
113
|
+
<div id="header">
|
114
|
+
<a href="index.html"><img style="border:0px" src="images/browsercms_logo.png" alt="BrowserCMS"/></a>
|
115
|
+
</div>
|
116
|
+
<div id="main">
|
117
|
+
<div class="top_cap"></div>
|
118
|
+
<div id="contentwrap">
|
119
|
+
<div class="title">
|
120
|
+
<h1>BrowserCMS Designer Guide</h1>
|
121
|
+
</div>
|
122
|
+
<div class="top_cap_content"></div>
|
123
|
+
<div id="content">
|
124
|
+
<table width="100%" cellpadding="0" cellspacing="0" border="0">
|
125
|
+
<tr>
|
126
|
+
<td class="sidebar" valign="top">
|
127
|
+
<div id="subCol">
|
128
|
+
<h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
|
129
|
+
<ol class="chapters">
|
130
|
+
</ol></div>
|
131
|
+
</td>
|
132
|
+
<td class="guides">
|
133
|
+
<h2>BrowserCMS Designer Guide</h2>
|
134
|
+
<p>This guide covers how to set up styled templates for BrowserCMS. This guide will cover:</p>
|
135
|
+
<ul>
|
136
|
+
<li>How to create custom page templates</li>
|
137
|
+
<li>How to create custom page partials</li>
|
138
|
+
<li>How to use helpers to add dynamic content to templates and partials</li>
|
139
|
+
<li>How to use the <span class="caps">CMS</span>-specific form builder extensions</li>
|
140
|
+
</ul>
|
141
|
+
|
142
|
+
</td>
|
143
|
+
</tr>
|
144
|
+
</table>
|
145
|
+
</div>
|
146
|
+
</div>
|
147
|
+
<br clear="all"/>
|
148
|
+
<div class="bottom_cap"></div>
|
149
|
+
</div>
|
150
|
+
</div>
|
151
|
+
</body>
|
152
|
+
</html>
|
153
|
+
|
@@ -0,0 +1,266 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>BrowserCMS Developer Guide</title>
|
6
|
+
<link rel="stylesheet" type="text/css" href="files/stylesheets/syntax.css" />
|
7
|
+
<script type="text/javascript" src="files/javascripts/code_highlighter.js"></script>
|
8
|
+
<script type="text/javascript" src="files/javascripts/highlighters.js"></script>
|
9
|
+
<style type="text/css">
|
10
|
+
body {
|
11
|
+
background: #FFFFFF url(images/bg.png) repeat-x scroll 0 0;
|
12
|
+
font-family: "Trebuchet MS", Helvetica, Verdana, Arial, sans-serif;
|
13
|
+
margin: 0;
|
14
|
+
padding: 0;
|
15
|
+
}
|
16
|
+
|
17
|
+
#page {
|
18
|
+
margin: 0 auto;
|
19
|
+
text-align: left;
|
20
|
+
width: 1000px;
|
21
|
+
}
|
22
|
+
|
23
|
+
#header {
|
24
|
+
height: 110px;
|
25
|
+
}
|
26
|
+
|
27
|
+
div.top_cap {
|
28
|
+
background: transparent url(images/top_cap.png) no-repeat scroll 0 0;
|
29
|
+
height: 10px;
|
30
|
+
}
|
31
|
+
|
32
|
+
#contentwrap {
|
33
|
+
background: transparent url(images/dot.png) repeat scroll 0 0;
|
34
|
+
float: left;
|
35
|
+
width: 1000px;
|
36
|
+
}
|
37
|
+
|
38
|
+
div.bottom_cap {
|
39
|
+
background: transparent url(images/bottom_cap.png) no-repeat scroll 0 0;
|
40
|
+
height: 9px;
|
41
|
+
}
|
42
|
+
|
43
|
+
div.top_cap_content {
|
44
|
+
background: transparent url(images/top_cap_content.png) no-repeat scroll 0 0;
|
45
|
+
height: 5px;
|
46
|
+
}
|
47
|
+
|
48
|
+
#content {
|
49
|
+
background-color: #FFFFFF;
|
50
|
+
margin: 0 5px;
|
51
|
+
padding: 0 10px;
|
52
|
+
}
|
53
|
+
|
54
|
+
div.title {
|
55
|
+
padding: 20px;
|
56
|
+
}
|
57
|
+
|
58
|
+
div.title h1 {
|
59
|
+
border-bottom: 3px solid #505358;
|
60
|
+
color: #FFFFFF;
|
61
|
+
font-size: 24pt;
|
62
|
+
font-weight: normal;
|
63
|
+
line-height: 1;
|
64
|
+
margin: 0 0 10px;
|
65
|
+
padding-bottom: 10px;
|
66
|
+
}
|
67
|
+
|
68
|
+
td.sidebar {
|
69
|
+
font-size: 8pt;
|
70
|
+
width: 165px;
|
71
|
+
padding: 5px;
|
72
|
+
}
|
73
|
+
|
74
|
+
td.sidebar ol {
|
75
|
+
margin-left: 20px;
|
76
|
+
padding: 0;
|
77
|
+
line-height: 1.5;
|
78
|
+
}
|
79
|
+
|
80
|
+
td.sidebar ol li {
|
81
|
+
margin: 0;
|
82
|
+
padding: 0;
|
83
|
+
}
|
84
|
+
|
85
|
+
td.sidebar ol li ul {
|
86
|
+
list-style-type: none;
|
87
|
+
padding-left: 10px;
|
88
|
+
}
|
89
|
+
|
90
|
+
td.guides {
|
91
|
+
font-size: 10pt;
|
92
|
+
width: 800px;
|
93
|
+
padding: 10px;
|
94
|
+
}
|
95
|
+
|
96
|
+
.code_container {
|
97
|
+
padding: 10px;
|
98
|
+
background: #eee;
|
99
|
+
border: 1px solid #ccc;
|
100
|
+
overflow: auto;
|
101
|
+
width: 760px;
|
102
|
+
}
|
103
|
+
|
104
|
+
pre, code {
|
105
|
+
overflow: auto;
|
106
|
+
white-space:pre;
|
107
|
+
}
|
108
|
+
|
109
|
+
</style>
|
110
|
+
</head>
|
111
|
+
<body>
|
112
|
+
<div id="page">
|
113
|
+
<div id="header">
|
114
|
+
<a href="index.html"><img style="border:0px" src="images/browsercms_logo.png" alt="BrowserCMS"/></a>
|
115
|
+
</div>
|
116
|
+
<div id="main">
|
117
|
+
<div class="top_cap"></div>
|
118
|
+
<div id="contentwrap">
|
119
|
+
<div class="title">
|
120
|
+
<h1>BrowserCMS Developer Guide</h1>
|
121
|
+
</div>
|
122
|
+
<div class="top_cap_content"></div>
|
123
|
+
<div id="content">
|
124
|
+
<table width="100%" cellpadding="0" cellspacing="0" border="0">
|
125
|
+
<tr>
|
126
|
+
<td class="sidebar" valign="top">
|
127
|
+
<div id="subCol">
|
128
|
+
<h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
|
129
|
+
<ol class="chapters">
|
130
|
+
<li><a href="#content-blocks">Content Blocks</a><ul></ul></li><li><a href="#creating-a-custom-content-block">Creating A Custom Content Block</a><ul></ul></li><li><a href="#creating-a-custom-portlet">Creating A Custom Portlet</a><ul><li><a href="#using-file-system-templates">Using File system templates</a></li><li><a href="#pre-selecting-a-handler">Pre-selecting a handler</a></li></ul></li><li><a href="#page-routes">Page Routes</a><ul></ul></li></ol></div>
|
131
|
+
</td>
|
132
|
+
<td class="guides">
|
133
|
+
<h2>BrowserCMS Developer Guide</h2>
|
134
|
+
<p>This guide covers how to use the tools that come with BrowserCMS to extend the functionality of your BrowserCMS site. The target audience for this guide is intermediate to advanced Rails developers. You should also read the <a href="user_guide.html">Building a Site with BrowserCMS</a> guide first as well, so you know how to create pages and put content on pages. This guide will cover:</p>
|
135
|
+
<ul>
|
136
|
+
<li>What content blocks and portlets are and how they work</li>
|
137
|
+
<li>How to create custom content blocks</li>
|
138
|
+
<li>How to create custom portlets</li>
|
139
|
+
<li>How to create friendly URLs for pages</li>
|
140
|
+
</ul>
|
141
|
+
<h3 id="content-blocks">1 Content Blocks</h3>
|
142
|
+
<p>Content Blocks are the basic unit used to add content to pages in a BrowserCMS site. There are several pre-built content types that are part of BrowserCMS core. The most commonly used one is the HtmlBlock content type, so we will use that as a starting example.</p>
|
143
|
+
<p>If you look at the HtmlBlock model in BrowserCMS core, you will see that it is an ActiveRecord model, just like any model you create in a Rails application. It also calls the <a href="/doc/app/classes/Cms/Acts/ContentBlock/MacroMethods.html">acts_as_content_block</a> method, which just sets up several <a href="/doc/app/classes/Cms/Behaviors.html">Behaviors</a> on the model. One of the key Behaviors to understand is the <a href="/doc/app/classes/Cms/Behaviors/Rendering.html">Rendering</a> behavior. Essentially what this behavior does is to allow a model (by model I mean a subclass of ActiveRecord::Base) to act as a mini-controller. This is the same thing conceptually as <a href="http://yehudakatz.com/2007/09/06/merbs-parts-are-pretty-rocking-too">Merb Parts</a> or <a href="http://cells.rubyforge.org">Rails Cells</a>, the only difference is that content blocks are models as well, so they have attributes that are stored in the database like any other model.</p>
|
144
|
+
<p>In the BrowserCMS implementation, first the render method of the object is called, which is like an action. This is where instance variables are set. In the case of an HtmlBlock, there are no other instance variables to set up, so this step is just skipped. It is similar to a controller action that has no action method, it just goes straight to the view.</p>
|
145
|
+
<p>The view is the render template, which is inside the <tt>cms/html_blocks</tt> directory in the view path. If you look in the render template, you will see all it does is print the value of <tt>@content_block.content</tt>. Content is the name of the property that holds the <span class="caps">HTML</span> content.</p>
|
146
|
+
<h3 id="creating-a-custom-content-block">2 Creating A Custom Content Block</h3>
|
147
|
+
<p>Let’s say that you are using BrowserCMS to build a website that will display a list of products. The first step would be to create a product content block. This will give the users of the <span class="caps">CMS</span> a way to create products. To create a product content block, in an existing BrowserCMS project, run the content block generator:</p>
|
148
|
+
<div class="code_container"><code class="html">$ script/generate content_block product name:string price:integer description:html</code></div>
|
149
|
+
<p>You will notice that several things have been created:</p>
|
150
|
+
<ul>
|
151
|
+
<li>A model in <tt>app/models/product.rb</tt></li>
|
152
|
+
<li>A migration for the product model</li>
|
153
|
+
<li>A controller for the product in <tt>app/controllers/cms/products_controller.rb</tt></li>
|
154
|
+
<li>A form partial in <tt>app/views/cms/products/_form.html.erb</tt></li>
|
155
|
+
<li>A render template in <tt>app/views/cms/products/render.html.erb</tt></li>
|
156
|
+
<li>A resource route for the controller</li>
|
157
|
+
</ul>
|
158
|
+
<p>If you look at <tt>app/models/product.rb</tt>, you will see that it is nothing more than:</p>
|
159
|
+
<div class="code_container"><code class="ruby">class Product < ActiveRecord::Base
|
160
|
+
acts_as_content_block
|
161
|
+
end</code></div>
|
162
|
+
<p>The controller created at <tt>app/controllers/cms/products_controller.rb</tt> is equally empty:</p>
|
163
|
+
<div class="code_container"><code class="ruby">class Cms::ProductsController < Cms::ContentBlockController
|
164
|
+
end</code></div>
|
165
|
+
<p>This controller is the controller used in the actual <span class="caps">CMS</span> interface. If you want to create a controller to use in the front end of your application, create a products controller that is not in the <span class="caps">CMS</span> namespace, so as not to conflict the <span class="caps">CMS</span> functionality. You will most likely not need to customize the <span class="caps">CMS</span> controller at all.</p>
|
166
|
+
<p>The form partial at <tt>app/views/cms/products/_form.html.erb</tt> is the form that will be used when creating/editing the product content block in the content library of the <span class="caps">CMS</span>. The contents of this file will be:</p>
|
167
|
+
<div class="code_container"><code class="html"><%= f.cms_text_field :name %>
|
168
|
+
<%= f.cms_text_field :price %>
|
169
|
+
<%= f.cms_text_editor :description %></code></div>
|
170
|
+
<p>The form helper methods that are prefixed with <tt>cms_</tt> will wrap that form helper with the <span class="caps">CMS</span> styling and extra functionality. The <tt>cms_text_editor</tt> will show the user a <span class="caps">WYSIWYG</span> editor for editing <span class="caps">HTML</span>. Additional <span class="caps">CMS</span> form builder extensions are covered in the <a href="designer_guide.html">BrowserCMS Designer Guide</a>.</p>
|
171
|
+
<p>The render template at <tt>app/views/cms/products/render.html.erb</tt> is the template that will be used to render the <span class="caps">HTML</span> when this product is placed directly on a page. It is also what is shown when you view a product within the content library of the <span class="caps">CMS</span>.</p>
|
172
|
+
<p>As you will see in the next section, custom content blocks are often not placed directly on a page, instead the data of a product is displayed through a portlet. For this reason, a more informational display, similar to what is automatically generated by the generator, is what the render template often contains. Depending on what your content block is, you may want to place the content block directly on a page, in which case you would most likely customize the render template.</p>
|
173
|
+
<h3 id="creating-a-custom-portlet">3 Creating A Custom Portlet</h3>
|
174
|
+
<p>Once you have created the product content block and created a few products in the content library, you need a way to display them on a page. To do that, you will want to create a portlet.</p>
|
175
|
+
<p>A portlet is used to display dynamic data on a page. A portlet is a content block. A portlet will typically perform some kind of database query in the render method and then render it’s view. One difference between a portlet and typical content block is that each instance of a portlet can have a unique template because that template is stored as data along with the portlet. Let’s generate a portlet to display the most recently created products:</p>
|
176
|
+
<div class="code_container"><code class="html">$ script/generate portlet recent_products limit:integer</code></div>
|
177
|
+
<p>What you will see created is:</p>
|
178
|
+
<ul>
|
179
|
+
<li>A portlet at <tt>app/portlets/recent_products_portlet.rb</tt></li>
|
180
|
+
<li>A form partial at <tt>app/views/portlets/recent_products/_form.html.erb</tt></li>
|
181
|
+
<li>A render template at <tt>app/views/portlets/recent_products/render.html.erb</tt></li>
|
182
|
+
</ul>
|
183
|
+
<p>What you don’t see created is a migration. Portlets use the <a href="/doc/app/classes/Cms/Behaviors/DynamicAttributes.html">DynamicAttributes</a> behavior in order to store associated values in the database without having to create custom database tables. What this means is that you can set and then store a value for any attribute for a portlet.</p>
|
184
|
+
<p>So if you look at the form partial that was generate for this portlet, you will see this:</p>
|
185
|
+
<div class="code_container"><code class="html"><%= f.cms_text_field :name %>
|
186
|
+
<%= f.cms_text_field :limit %>
|
187
|
+
<%= f.cms_drop_down :handler, ActionView::Template.template_handler_extensions, :default_value => "erb" %>
|
188
|
+
<%= f.cms_text_area :template, :default_value => @block.class.default_template %></code></div>
|
189
|
+
<p>Every portlet instance has to have a name and that is stored in the main <tt>portlets</tt> table, but <tt>limit</tt> is stored in the <tt>portlet_attributes</tt> table. You could add anything to this form, such as <tt><%= f.cms_text_field :foobar %></tt>, and whatever the user enters for <tt>foobar</tt> would get saved with the portlet.</p>
|
190
|
+
<p>If you look at the code for the portlet, you will see:</p>
|
191
|
+
<div class="code_container"><code class="ruby">class RecentProducts < Portlet
|
192
|
+
|
193
|
+
def render
|
194
|
+
# Your Code Goes Here
|
195
|
+
end
|
196
|
+
|
197
|
+
end</code></div>
|
198
|
+
<p>As the comment says, you will want to fill in your application logic here. We’re going to get the most recent products and use the value the user entered for limit when they filled out the form. So edit the code to look like:</p>
|
199
|
+
<div class="code_container"><code class="ruby">class RecentProducts < Portlet
|
200
|
+
|
201
|
+
def render
|
202
|
+
@products = Product.all(:order => "created_at desc", :limit => self.limit)
|
203
|
+
end
|
204
|
+
|
205
|
+
end</code></div>
|
206
|
+
<p><code>self</code> in this case is the portlet instance, which is also available in the instance variable
|
207
|
+
<code>@portlet</code>.
|
208
|
+
We are setting the <code>@products</code> instance variable so that will be available in the view. If you look at the render template, you will see this:</p>
|
209
|
+
<div class="code_container"><code class="html"><%=h @portlet.name %></code></div>
|
210
|
+
<p>This is simply a place holder, you should override this code with something similar to what you expect the user of your portlet to want to use. In this case, let’s go with:</p>
|
211
|
+
<div class="code_container"><code class="html"><ul>
|
212
|
+
<% @products.each do |product| %>
|
213
|
+
<li><%=h product.name %></li>
|
214
|
+
<% end %>
|
215
|
+
</ul></code></div>
|
216
|
+
<p>Notice that in the last paragraph I said “similar to what you expect the user of your portlet to want to use”. This value is simply the default starting point for the template of a portlet. The actual value is entered into the form when the user creates an instance of this portlet.</p>
|
217
|
+
<p>If you look back at the form partial that was generated, you’ll see:</p>
|
218
|
+
<div class="code_container"><code class="html"><%= f.cms_text_area :template, :default_value => @block.class.default_template %></code></div>
|
219
|
+
<p>What this does is preload the template with whatever you entered into the render template. The user is free to change it as they see fit and even have different values from one portlet instance to the next.</p>
|
220
|
+
<h4 id="using-file-system-templates">3.1 Using File system templates</h4>
|
221
|
+
<p>If you do not want to have the portlet’s render template stored in the <span class="caps">CMS</span> content libary, but would rather have it just render the file from the file system, simply add this to your portlet code:</p>
|
222
|
+
<div class="code_container"><code class="ruby">class RecentProducts < Portlet
|
223
|
+
|
224
|
+
render_inline false
|
225
|
+
|
226
|
+
def render
|
227
|
+
@products = Product.all(:order => "created_at desc", :limit => self.limit)
|
228
|
+
end
|
229
|
+
|
230
|
+
end</code></div>
|
231
|
+
<p>The key line being the <code>render_line false</code>. Also, you will probably notice this line in the form that was generated:</p>
|
232
|
+
<div class="code_container"><code class="html"><%= f.cms_drop_down :handler,
|
233
|
+
ActionView::Template.template_handler_extensions,
|
234
|
+
:default_value => "erb" %></code></div>
|
235
|
+
<p>This generates a drop-down menu for the user creating the portlet to select from the various portlet handlers installed in your Rails app.
|
236
|
+
The default handler for portlet views is erb, but you could use alternative ones, like Haml. To do that, install the <span class="caps">HAML</span> gem and set the default_value to ‘haml’ like so:</p>
|
237
|
+
<div class="code_container"><code class="html"><%= f.cms_drop_down :handler,
|
238
|
+
ActionView::Template.template_handler_extensions,
|
239
|
+
:default_value => "haml" %></code></div>
|
240
|
+
<h4 id="pre-selecting-a-handler">3.2 Pre-selecting a handler</h4>
|
241
|
+
<p>If you would rather not have the user select the handler type, or if you are using the file system instead of storing the template code in the <span class="caps">CMS</span>, you can set the handler to a different value like this:</p>
|
242
|
+
<div class="code_container"><code class="ruby">class RecentProducts < Portlet
|
243
|
+
|
244
|
+
handler "haml"
|
245
|
+
render_inline false
|
246
|
+
|
247
|
+
def render
|
248
|
+
@products = Product.all(:order => "created_at desc", :limit => self.limit)
|
249
|
+
end
|
250
|
+
|
251
|
+
end</code></div>
|
252
|
+
<p>The key line being <code>handler "haml"</code>.</p>
|
253
|
+
<h3 id="page-routes">4 Page Routes</h3>
|
254
|
+
<p><span class="caps">TODO</span></p>
|
255
|
+
</td>
|
256
|
+
</tr>
|
257
|
+
</table>
|
258
|
+
</div>
|
259
|
+
</div>
|
260
|
+
<br clear="all"/>
|
261
|
+
<div class="bottom_cap"></div>
|
262
|
+
</div>
|
263
|
+
</div>
|
264
|
+
</body>
|
265
|
+
</html>
|
266
|
+
|
@@ -0,0 +1,188 @@
|
|
1
|
+
/* Unobtrustive Code Highlighter By Dan Webb 11/2005
|
2
|
+
Version: 0.4
|
3
|
+
|
4
|
+
Usage:
|
5
|
+
Add a script tag for this script and any stylesets you need to use
|
6
|
+
to the page in question, add correct class names to CODE elements,
|
7
|
+
define CSS styles for elements. That's it!
|
8
|
+
|
9
|
+
Known to work on:
|
10
|
+
IE 5.5+ PC
|
11
|
+
Firefox/Mozilla PC/Mac
|
12
|
+
Opera 7.23 + PC
|
13
|
+
Safari 2
|
14
|
+
|
15
|
+
Known to degrade gracefully on:
|
16
|
+
IE5.0 PC
|
17
|
+
|
18
|
+
Note: IE5.0 fails due to the use of lookahead in some stylesets. To avoid script errors
|
19
|
+
in older browsers use expressions that use lookahead in string format when defining stylesets.
|
20
|
+
|
21
|
+
This script is inspired by star-light by entirely cunning Dean Edwards
|
22
|
+
http://dean.edwards.name/star-light/.
|
23
|
+
*/
|
24
|
+
|
25
|
+
// replace callback support for safari.
|
26
|
+
if ("a".replace(/a/, function() {return "b"}) != "b") (function(){
|
27
|
+
var default_replace = String.prototype.replace;
|
28
|
+
String.prototype.replace = function(search,replace){
|
29
|
+
// replace is not function
|
30
|
+
if(typeof replace != "function"){
|
31
|
+
return default_replace.apply(this,arguments)
|
32
|
+
}
|
33
|
+
var str = "" + this;
|
34
|
+
var callback = replace;
|
35
|
+
// search string is not RegExp
|
36
|
+
if(!(search instanceof RegExp)){
|
37
|
+
var idx = str.indexOf(search);
|
38
|
+
return (
|
39
|
+
idx == -1 ? str :
|
40
|
+
default_replace.apply(str,[search,callback(search, idx, str)])
|
41
|
+
)
|
42
|
+
}
|
43
|
+
var reg = search;
|
44
|
+
var result = [];
|
45
|
+
var lastidx = reg.lastIndex;
|
46
|
+
var re;
|
47
|
+
while((re = reg.exec(str)) != null){
|
48
|
+
var idx = re.index;
|
49
|
+
var args = re.concat(idx, str);
|
50
|
+
result.push(
|
51
|
+
str.slice(lastidx,idx),
|
52
|
+
callback.apply(null,args).toString()
|
53
|
+
);
|
54
|
+
if(!reg.global){
|
55
|
+
lastidx += RegExp.lastMatch.length;
|
56
|
+
break
|
57
|
+
}else{
|
58
|
+
lastidx = reg.lastIndex;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
result.push(str.slice(lastidx));
|
62
|
+
return result.join("")
|
63
|
+
}
|
64
|
+
})();
|
65
|
+
|
66
|
+
var CodeHighlighter = { styleSets : new Array };
|
67
|
+
|
68
|
+
CodeHighlighter.addStyle = function(name, rules) {
|
69
|
+
// using push test to disallow older browsers from adding styleSets
|
70
|
+
if ([].push) this.styleSets.push({
|
71
|
+
name : name,
|
72
|
+
rules : rules,
|
73
|
+
ignoreCase : arguments[2] || false
|
74
|
+
})
|
75
|
+
|
76
|
+
function setEvent() {
|
77
|
+
// set highlighter to run on load (use LowPro if present)
|
78
|
+
if (typeof Event != 'undefined' && typeof Event.onReady == 'function')
|
79
|
+
return Event.onReady(CodeHighlighter.init.bind(CodeHighlighter));
|
80
|
+
|
81
|
+
var old = window.onload;
|
82
|
+
|
83
|
+
if (typeof window.onload != 'function') {
|
84
|
+
window.onload = function() { CodeHighlighter.init() };
|
85
|
+
} else {
|
86
|
+
window.onload = function() {
|
87
|
+
old();
|
88
|
+
CodeHighlighter.init();
|
89
|
+
}
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
// only set the event when the first style is added
|
94
|
+
if (this.styleSets.length==1) setEvent();
|
95
|
+
}
|
96
|
+
|
97
|
+
CodeHighlighter.init = function() {
|
98
|
+
if (!document.getElementsByTagName) return;
|
99
|
+
if ("a".replace(/a/, function() {return "b"}) != "b") return; // throw out Safari versions that don't support replace function
|
100
|
+
// throw out older browsers
|
101
|
+
|
102
|
+
var codeEls = document.getElementsByTagName("CODE");
|
103
|
+
// collect array of all pre elements
|
104
|
+
codeEls.filter = function(f) {
|
105
|
+
var a = new Array;
|
106
|
+
for (var i = 0; i < this.length; i++) if (f(this[i])) a[a.length] = this[i];
|
107
|
+
return a;
|
108
|
+
}
|
109
|
+
|
110
|
+
var rules = new Array;
|
111
|
+
rules.toString = function() {
|
112
|
+
// joins regexes into one big parallel regex
|
113
|
+
var exps = new Array;
|
114
|
+
for (var i = 0; i < this.length; i++) exps.push(this[i].exp);
|
115
|
+
return exps.join("|");
|
116
|
+
}
|
117
|
+
|
118
|
+
function addRule(className, rule) {
|
119
|
+
// add a replace rule
|
120
|
+
var exp = (typeof rule.exp != "string")?String(rule.exp).substr(1, String(rule.exp).length-2):rule.exp;
|
121
|
+
// converts regex rules to strings and chops of the slashes
|
122
|
+
rules.push({
|
123
|
+
className : className,
|
124
|
+
exp : "(" + exp + ")",
|
125
|
+
length : (exp.match(/(^|[^\\])\([^?]/g) || "").length + 1, // number of subexps in rule
|
126
|
+
replacement : rule.replacement || null
|
127
|
+
});
|
128
|
+
}
|
129
|
+
|
130
|
+
function parse(text, ignoreCase) {
|
131
|
+
// main text parsing and replacement
|
132
|
+
return text.replace(new RegExp(rules, (ignoreCase)?"gi":"g"), function() {
|
133
|
+
var i = 0, j = 1, rule;
|
134
|
+
while (rule = rules[i++]) {
|
135
|
+
if (arguments[j]) {
|
136
|
+
// if no custom replacement defined do the simple replacement
|
137
|
+
if (!rule.replacement) return "<span class=\"" + rule.className + "\">" + arguments[0] + "</span>";
|
138
|
+
else {
|
139
|
+
// replace $0 with the className then do normal replaces
|
140
|
+
var str = rule.replacement.replace("$0", rule.className);
|
141
|
+
for (var k = 1; k <= rule.length - 1; k++) str = str.replace("$" + k, arguments[j + k]);
|
142
|
+
return str;
|
143
|
+
}
|
144
|
+
} else j+= rule.length;
|
145
|
+
}
|
146
|
+
});
|
147
|
+
}
|
148
|
+
|
149
|
+
function highlightCode(styleSet) {
|
150
|
+
// clear rules array
|
151
|
+
var parsed, clsRx = new RegExp("(\\s|^)" + styleSet.name + "(\\s|$)");
|
152
|
+
rules.length = 0;
|
153
|
+
|
154
|
+
// get stylable elements by filtering out all code elements without the correct className
|
155
|
+
var stylableEls = codeEls.filter(function(item) { return clsRx.test(item.className) });
|
156
|
+
|
157
|
+
// add style rules to parser
|
158
|
+
for (var className in styleSet.rules) addRule(className, styleSet.rules[className]);
|
159
|
+
|
160
|
+
|
161
|
+
// replace for all elements
|
162
|
+
for (var i = 0; i < stylableEls.length; i++) {
|
163
|
+
// EVIL hack to fix IE whitespace badness if it's inside a <pre>
|
164
|
+
if (/MSIE/.test(navigator.appVersion) && stylableEls[i].parentNode.nodeName == 'PRE') {
|
165
|
+
stylableEls[i] = stylableEls[i].parentNode;
|
166
|
+
|
167
|
+
parsed = stylableEls[i].innerHTML.replace(/(<code[^>]*>)([^<]*)<\/code>/i, function() {
|
168
|
+
return arguments[1] + parse(arguments[2], styleSet.ignoreCase) + "</code>"
|
169
|
+
});
|
170
|
+
parsed = parsed.replace(/\n( *)/g, function() {
|
171
|
+
var spaces = "";
|
172
|
+
for (var i = 0; i < arguments[1].length; i++) spaces+= " ";
|
173
|
+
return "\n" + spaces;
|
174
|
+
});
|
175
|
+
parsed = parsed.replace(/\t/g, " ");
|
176
|
+
parsed = parsed.replace(/\n(<\/\w+>)?/g, "<br />$1").replace(/<br \/>[\n\r\s]*<br \/>/g, "<p><br></p>");
|
177
|
+
|
178
|
+
} else parsed = parse(stylableEls[i].innerHTML, styleSet.ignoreCase);
|
179
|
+
|
180
|
+
stylableEls[i].innerHTML = parsed;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
// run highlighter on all stylesets
|
185
|
+
for (var i=0; i < this.styleSets.length; i++) {
|
186
|
+
highlightCode(this.styleSets[i]);
|
187
|
+
}
|
188
|
+
}
|