Добавьте класс в тег body, используя diazo с notheme

я показываю содержимое документа в оверлее, используя plone/document?ajax_load=True&ajax_include_head=True в качестве источника для iframe.

в режиме разработки добавление &diazo.off=1 помогло. на рабочем сервере это, к сожалению, не работает, поэтому я добавил параметр ajax_load, как это предлагается в документация plone.app.theming

я завернул все свои директивы в элемент <rules if-not="$ajax_load">, чтобы убедиться, что они не применяются (см. код ниже)

теперь мне нужно пометить тело страницы iframe определенным классом, чтобы применить разные стили (например, без цвета фона для тела в наложениях)

решение, предложенное для почти аналогичного вопроса, работает только в том случае, если вы используете тему с элементом body, имеющим атрибут класса для работы. .

есть ли способ добавить класс к контенту без темы (используя )? или мне нужно предоставить пустой html-документ (index2.html) в качестве темы и применить множество правил для копирования css/js и т. д. дважды?

<rules if="$ajax_load">

    <!-- theme href="index.html" /-->

    <notheme />


    <!-- only works when using a theme -->
    <before theme-children="/html/body"><xsl:attribute name="class"><xsl:value-of select="/html/body/@class"/> my class</xsl:attribute></before>


    <!-- thought this could to the trick but does not work at all -->
    <xsl:template match="html/body">
    <xsl:attribute name="class"> foo</xsl:attribute>
    </xsl:template>


</rules>

<rules if-not="$ajax_load">


    <theme href="index.html" />

    <replace content="/html/head/title" theme="/html/head/title" />
    ...

person fRiSi    schedule 26.07.2012    source источник


Ответы (2)


Очевидно, что без темы для работы любое правило, ссылающееся на тему, не работает в сочетании с <notheme/>. Однако вы можете использовать контент <drop> и <replace> (у меня есть идеи, как реализовать контент <before> и <after>, но это трудно реализовать. Возможно, в будущей версии Diazo). Однако вы можете добиться того же самого с небольшим количеством xslt:

<replace content="/html/body/@class">
    <xsl:attribute name="class"><xsl:value-of select="."/> newclass</xsl:attribute>
</replace>
person Laurence Rowe    schedule 29.07.2012
comment
спасибо за разъяснение Лоуренс. не знал, что до и после на самом деле нужна тема (диазо и его документация docs.diazo.org/en/latest/basic.html#rule-directives скройте эти детали реализации) предложенное вами решение работает для меня, но на самом деле классы css тела содержимого не копируются. единственный класс результирующего элемента body — это newclass. - person fRiSi; 30.07.2012
comment
Попробуйте <xsl:value-of select="."/> вместо <xsl:copy-of select="."/>. - person Laurence Rowe; 30.07.2012

Если вы используете plone.app.jquerytools для своих оверлеев, вы можете передать параметр класса:

$('a.myPopover').prepOverlay({
    subtype: 'iframe',
    cssclass: 'my-popover'
});

В некоторых наших проектах, использующих plone.app.tiles, мы использовали определенный шаблон темы для наложений, который был лишен всех ненужных частей и уменьшен до одного div-обертки, и использовался для представления редактирования плитки следующим образом:

<theme href="minimal.html" if-path="@@edit-tile" />
person Christoph Böhner    schedule 26.07.2012
comment
спасибо Кристоф. css-класс применяется к div, содержащему оверлей, поэтому он не помогает стилизовать тело в оверлее iframe. - person fRiSi; 30.07.2012