$posts = get_posts([
'post_type' => 'tc_events',
'numposts' => 1,
'meta_key' => 'event_date_new',
'orderby' => 'meta_value',
'order' => 'ASC'
]);
$post = array_shift($posts);
@extends
:%subsclasses-color {
.sub1, .sub2, .sub3 {
color:red;
}
}
.main1 {
@extends %subclasses-color;
}
.another-main {
@extends %subclasses-color;
}
Box
в целом не должен уметь что-то кроме хранения фигур. Как правильно заметил vgbege - из задачи не следует что в дальнейшем вариантов подсчёта каких-то метрик по фигурам с Box'е не станет больше, так что в первую очередь я бы выносил отдельно калькулятор. Также у вас нет обобщающего интерфейса для IArea
и IShape
из-за чего и возникает путаница в addShape
. /**
* Основной интерфейс для всех фигур которые можно хранить в Box'е
*/
interface IFigure
{
}
/**
* Интерфейс для фигур которые могут обладать площадью
*/
interface IArea extends IFigure
{
public function getArea(): float;
}
/**
* Интерфейс для фигур которые могут обладать цветом заливки
*/
interface IFillColor
{
public function setFillColor(string $color): self;
public function getFillColor(): string;
}
/**
* Обобщённый интерфейс для фигур, обладающих и цветом и площадью
* По факту, думаю, он не имеет смысла, но нужен по условию задачи
*/
interface IShape extends IArea, IFillColor
{
}
/**
* Коробка для хранения фигур
*/
class Box
{
/**
* @var IFigure[]
*/
private $figures = [];
/**
* @param IFigure[] $figures
*/
public function __construct(array $figures = [])
{
// Добавляем полученные через конструктор фигуры в объект
// Используем addFigure() чтобы проконтролировать корректность типов
array_walk($figures, [$this, 'addFigure']);
}
/**
* @param IFigure $figure
* @return $this
*/
public function addFigure(IFigure $figure): self
{
$this->figures[] = $figure;
return $this;
}
/**
* @param IFigure $figure
* @return bool
*/
public function hasFigure(IFigure $figure): bool
{
return in_array($figure, $this->figures, true);
}
/**
* @param IFigure $figure
* @return $this
*/
public function removeFigure(IFigure $figure): self
{
$this->figures = array_filter($this->figures, static function (IFigure $f) use ($figure) {
return $f !== $figure;
});
return $this;
}
/**
* @return IFigure[]
*/
public function getFigures(): array
{
return $this->figures;
}
}
/**
* Интерфейс для калькуляторов фигур в Box'ах
*/
interface IFigureCalculator
{
/**
* @param Box $box
* @param mixed ...$args
* @return mixed
*/
public function calculate(Box $box, ...$args);
}
/**
* Пример калькулятора
*/
class AreaCalculator implements IFigureCalculator
{
public function calculate(Box $box, ...$args): float
{
// Получаем список фигур которые обладают площадью
$figures = array_filter($box->getFigures(), static function (IFigure $figure) {
return $figure instanceof IArea;
});
// Получаем цвет из дополнительных аргументов калькулятора
$color = array_shift($args);
if ($color) {
// У нас задан цвет, фильтруем фигуры по цвету
$figures = array_filter($figures, static function (IFigure $figure) use ($color) {
return $figure instanceof IFillColor && $figure->getFillColor() === $color;
});
}
// Подсчитываем суммарную площадь
return array_reduce($figures, static function (float $area, IArea $figure) {
return $area + $figure->getArea();
}, 0);
}
}
public function calculate(IFigureCalculator $calculator, ...$args)
preUpdate
, pretPersist
, prePremove
, собираете из переданных вам событий информацию для формирования нужного вам лога, затем в postFlush
из собранной информации формируете запись в лог и записываете. background-image: url(<картинка с точками, можно как data url>);
background-position: top left;
background-repeat: repeat-y;
padding-left: <размер фона по Y + отступ до контента>;
position: relative;
&:before {
content: '';
position: absolute;
top: 0;
left: 0 - <размер отступа>;
transform: translate(50%, 50%);
border: <размер белого пространства сверху / снизу> solid #fff;
<и здесь либо рисуем элемент через width, height, background-color, border-radius либо картинками, думаю что второе предпочтительнее>
}
cb()
стоит после return
т.е. он вообще не вызывается. Но поскольку в списке аргументов он есть - gulp ожидает его вызова и, не дождавшись, ругается.cb
вообще не нужен, просто уберите его из списка аргументов и всё начнёт работать. flex-shrink
и flex-grow
не имеют прямого отношения к размерам элемента в том плане что они не определяют размер напрямую (для этого есть flex-basis
). Эти свойства определяют поведение элемента при сжатии (shrink) и расширении (grow).:first-of-type
. На Stack Overflow есть пара очень хороших объяснений этого, стоит ознакомиться (раз, два)..services-block:first-of-type
означает "первый элемент с классом services-block
" ложно и это приводит к неработающему селектору. В реальности этот селектор читается как "любой подэлемент текущего элемента, имеющий класс services-block
и при этом являющийся первым элементом с таким именем тега среди всех имеющихся". Слегка контр-интуитивно, да, но уж как есть.div
- не единственный элемент в HTML и начнёте использовать также и другие элементы. В вашем примере для div.basic-title
и div.services-block_title
явно лучше подходят какие-то из элементов заголовка, а структура из div.services-block_item
и подэлементов - это явно dl/dt/dtt.container > div.services-container:first-of-type > .services-block:first-child
. .container > .basic-title + .services-container > .services-block:first-child
_sharedData
end_cursor
.headers.set('X-Instagram-GIS', md5(`${(window._sharedData || {}).rhx_gis}:${JSON.stringify(vard)}`));
vars
, передаваемая в JSON.stringify()
- это содержимое поля variables
из GraphQL запроса.public/.htaccess
файл который реализует rewriting не срабатывает. Вам необходимо донастроить nginx для того чтобы он занимался преобразованием ссылок. Пример конфига есть в официальной документации. |
даст нужное регулярное выражение. <?php
$phrases = [
'Hello world',
'Lorem ipsum',
'Just some test phrase',
'Phrase with special "|" chars',
];
$tests = array_merge($phrases, [
'Some other text',
'It should not match',
]);
$regex = sprintf('/^%s$/i', implode('|', array_map(function ($v) {
return preg_quote($v, '/');
}, $phrases)));
echo $regex . "\n";
array_walk($tests, function ($phrase) use ($regex) {
echo sprintf('%s: %s' . "\n", $phrase, preg_match($regex, $phrase) ? 'Matches' : 'Does not match');
});
array
или json_array
для mapping'а. Полный список типов можно посмотреть в документации Doctrine.