(StartA < = EndB) и (EndA> = StartB)
Доказательство:
ConditionA, которому Позволяют, Средний, что DateRange Полностью После DateRange B _ |---- DateRange A ------|
|---Date Range B -----| _
(Верный, если StartA > EndB
)
ConditionB, которому Позволяют, Средний, что DateRange A Полностью Перед DateRange B |---- DateRange A -----| _
_ |---Date Range B ----|
(Верный, если EndA < StartB
)
Тогда, Перекрытие существует, если Ни A, Ни B не верны -
(Если один диапазон ни полностью после другого,
, ни полностью перед другим, то они должны наложиться.)
Теперь один из [1 127] законы De Morgan говорит что:
Not (A Or B)
< => Not A And Not B
, Который переводит в: (StartA <= EndB) and (EndA >= StartB)
ПРИМЕЧАНИЕ: Это включает условия, где края накладываются точно. Если Вы хотите исключить, это,
изменяется эти >=
операторы к >
, и <=
к [1 110]
NOTE2. Благодаря @Baodad см. этот блог , фактическое перекрытие является наименьшим количеством:
{endA-startA
, endA - startB
, endB-startA
, endB - startB
}
(StartA <= EndB) and (EndA >= StartB)
(StartA <= EndB) and (StartB <= EndA)
NOTE3. Благодаря @tomosius читает более короткая версия: DateRangesOverlap = max(start1, start2) < min(end1, end2)
Это - на самом деле синтаксический ярлык для того, что является более длительной реализацией, которая включает дополнительные проверки, чтобы проверить, что даты начала идут или перед endDates. Получение этого сверху:
, Если запускаются и даты окончания не могут работать, т.е. если возможно, что startA > endA
или startB > endB
, тогда также необходимо проверить, что они в порядке, так, чтобы средства Вы добавили два дополнительных правила законности: (StartA <= EndB) and (StartB <= EndA) and (StartA <= EndA) and (StartB <= EndB)
или: (StartA <= EndB) and (StartA <= EndA) and (StartB <= EndA) and (StartB <= EndB)
или, (StartA <= Min(EndA, EndB) and (StartB <= Min(EndA, EndB))
или: (Max(StartA, StartB) <= Min(EndA, EndB)
, Но реализовать Min()
и Max()
, необходимо кодировать, (использующий C троичный для краткости): (StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)
Вам нужно выполнить небольшой трюк, удалить дочерний блок и добавить его в новую позицию:
<reference name="parent.block.name">
<action method="unsetChild">
<alias>child_block_alias</alias>
</action>
<action method="insert">
<blockName>child.block.name</blockName>
<siblingName>name_of_block</siblingName>
<after>1</after>
<alias>child_block_alias</alias>
</action>
</reference>
Эта инструкция XML-макета делает то, что вы хотите. Посмотрите на этот краткий справочник параметров для метода insert
:
blockName
- уникальное имя вашего блока в макете, product.view
, например, siblingName
- это уникальное имя блока, которое уже существует в целевом блоке вставки, используется для позиционирования вашего блока. Оставьте пустым, чтобы отобразить его сверху или снизу. after
- логический идентификатор позиции блока. Если равно 1
, то блок будет добавлен после siblingName
или внизу списка детей, если siblingName
пусто alias
- это псевдоним вашего блока, если это пусто будет использовано имя блока. Некоторые примеры:
Переместить блок боковой панели корзины после недавно просмотренных продуктов
<reference name="right">
<action method="unsetChild">
<alias>cart_sidebar</alias>
</action>
<action method="insert">
<blockName>cart_sidebar</blockName>
<siblingName>right.reports.product.viewed</siblingName>
<after>1</after>
</action>
</reference>
Переместить блок боковой панели корзины перед недавно просмотренными продуктами
<reference name="right">
<action method="unsetChild">
<alias>cart_sidebar</alias>
</action>
<action method="insert">
<blockName>cart_sidebar</blockName>
<siblingName>right.reports.product.viewed</siblingName>
<after>0</after>
</action>
</reference>
Переместить блок боковой панели тележки в конце правого блока
<reference name="right">
<action method="unsetChild">
<alias>cart_sidebar</alias>
</action>
<action method="insert">
<blockName>cart_sidebar</blockName>
<siblingName></siblingName>
<after>1</after>
</action>
</reference>
Переместить блок боковой панели тележки вверху слева блок
<reference name="right">
<action method="unsetChild">
<alias>cart_sidebar</alias>
</action>
</reference>
<reference name="left">
<action method="insert">
<blockName>cart_sidebar</blockName>
</action>
</reference>
Наслаждайтесь работой с Magento!