如何制作插入其他较小内容项视图的plone视图?

时间:2014-06-24 19:17:51

标签: templates view plone dexterity

我认为这应该很简单。我有一个文件夹TTW灵巧内容项(一个下拉框),其中包含文件夹TTW灵巧项目(提案)。每个提案都包含TTW敏捷性评论,其中包含我想要总结的字段。

我可以轻松地创建一个视图,通过对文件夹列表视图进行简单修改,为任何提案生成如下所示的表格:

[review1 link]   [criterion_1 value] [criterion-2 value]... 
[review2 link]  [criterion_1 value] [criterion-2 value]... 
.
.

我还可以通过修改文件夹列表视图为下拉框生成工作表视图:

[proposal1 link] [column I would like to insert the above table in for this proposal]
[proposal2 link] [column I would like to insert the above table in for this proposal]
.
.

我的问题是我无法弄清楚如何将第一个表插入第二个表的第二列中的单元格。我尝试了两件事:

  1. 在保管箱列表的视图模板中,我尝试复制listmacro的重复宏,为其及其所有变量赋予新名称以使其在每个提案上进行迭代。这可以轻松访问每个评论的所有都柏林核心模式,但我无法访问灵巧字段。我尝试过的所有内容(生成第一个表时都有效)会产生LocationError和AttributeError警告。不知何故,当我进入一个级别时,我会丢失视图模板查找所有内容所需的一些信息。有什么建议吗?
  2. 我也尝试使用<metal use-macro="item/first_table_template_name/listing"/>之类的调用来访问提案的列表宏。这甚至是部分正确的方法吗?它没有错误,但也没有在我的页面中插入任何内容。
  3. 感谢。

1 个答案:

答案 0 :(得分:1)

此解决方案基于kuel:https://github.com/plone/Products.CMFPlone/blob/854be6e30d1905a7bb0f20c66fbc1ba1f628eb1b/Products/CMFPlone/skins/plone_content/folder_full_view.pthttps://github.com/plone/Products.CMFPlone/blob/b94584e2b1231c44aa34dc2beb1ed9b0c9b9e5da/Products/CMFPlone/skins/plone_content/folder_full_view_item.pt提供的示例。 - 谢谢你。

我发现最容易创建和调试的方法是:

  1. 从plone标准模板folder_listing.pt创建一个极简主义模板,该模板仅显示单个提案的汇总审阅数据表。该模板仅用于表格,没有标题信息或任何其他插槽。这是一个剥离版本,但在第一个语句之上没有任何内容。允许访问字段的关键语句具有以下形式:

    python:item.getObject()。restrictedTraverse('criterion_1')

  2. 表格模板:

        <table class="review_summary listing">
            <tbody><tr class="column_labels"><th>Review</th><th>Scholarly Merit</th><th>Benefits to Student</th><th>Clarity</th><th>Sum</th></tr>
        <metal:listingmacro define-macro="listing">
        <tal:foldercontents define="contentFilter contentFilter|request/contentFilter|nothing;
                              contentFilter python:contentFilter and dict(contentFilter) or {};
    
                I kept all the standard definitions from the original template.
                I have just removed them for brevity.
    
                            plone_view context/@@plone;">
    
        The following tal:sum is where I did some math on my data.  If you are
        not manipulating the data this would not be needed.  Note that I am only
        looking at the first character of the choice field.
    
             <tal:sum define="c1_list python:[int(temp.getObject().restrictedTraverse('criterion_1')[0]) 
                                  for temp in batch if temp.portal_type=='ug_small_grants_review'];
                              c1_length python: test(len(c1_list)<1,-1,len(c1_list));
                              c2_list python:[int(temp.getObject().restrictedTraverse('criterion_2')[0]) 
                                  for temp in batch if temp.portal_type=='ug_small_grants_review'];
                              c2_length python: test(len(c2_list)<1,-1,len(c2_list));
                              c1_avg python: round(float(sum(c1_list))/c1_length,2);
                              c2_avg python: round(float(sum(c2_list))/c2_length,2);
                              avg_sum python: c1_avg+c2_avg;
                               ">
        <tal:listing condition="batch">
    
            <dl metal:define-slot="entries">
                <tal:entry tal:repeat="item batch" metal:define-macro="entries">
                <tal:block tal:define="item_url item/getURL|item/absolute_url;
                                       item_id item/getId|item/id;
    
                     Again, this is the standard define from the folder_listing.pt
                     but I've left out most of it to save space here.
    
                                       item_samedate python: (item_end - item_start &lt; 1) if item_type == 'Event' else False;">
                    <metal:block define-slot="entry"
    
                           The following condition is key if you can have things
                           other than reviews within a proposal.  Make sure the
                           item_type is proper for your review/item.
    
                            tal:condition="python: item_type=='ug_small_grants_review'">
                    <tr class="review_entry"><td class="entry_info">
                    <dt metal:define-macro="listitem"
                        tal:attributes="class python:test(item_type == 'Event', 'vevent', '')">
                  I kept all the standard stuff from folder_listing.pt here.
    
                    </dt>
    
                    <dd tal:condition="item_description">
    
                    </dd>
                    </td>
    
               The following tal:comp block is used to calculate values 
               across the rows because we do not know the index of the 
               item the way the batch is iterated.
    
                   <tal:comp define = "crit_1 python: item.getObject().restrictedTraverse('criterion_1')[0];
                                       crit_2 python: item.getObject().restrictedTraverse('criterion_2')[0];
                                       ">
    
                   <td tal:content="structure crit_1"># here</td>
                   <td tal:content="structure crit_2"># here</td>
                   <td tal:content="structure python: int(crit_1)+int(crit_2)"># here</td>
                     </tal:comp> 
                   </tr>
                 </metal:block>
                </tal:block>
                </tal:entry>
            </dl>
            <tr>
                <th>Average</th>
                <td tal:content="structure c1_avg"># here</td>
                <td tal:content="structure c2_avg"># here</td>
                <td tal:content="structure avg_sum"># here</td>
            </tr>
        </tal:listing>
        </tal:sum>
    
        <metal:empty metal:define-slot="no_items_in_listing">
            <p class="discreet"
               tal:condition="not: folderContents"
               i18n:translate="description_no_items_in_folder">
                There are currently no items in this folder.
            </p>
        </metal:empty>
    
        </tal:foldercontents>
        </metal:listingmacro>
    </tbody></table>
    
    1. 创建另一个列表模板,调用此模板以填充相应的表格单元格。我再次使用了folder_listing.pt的修改。基本上在重复块中我将以下语句放在表的第二列中:

      这属于&lt; / dd&gt;之后标记结束正常项目列表。

      &LT; / TD&GT; &lt; td class =“review_summary”&gt;
      &lt; div tal:replace =“structure python:item.getObject()。ug_small_grant_review_summary_table()”/&gt;

      &LT; / TD&GT;

    2. 请注意,“ug_small_grant_review_summary_table”是我给上面详细显示的模板的名称。