use yii\queue\redis\Command;
class RedisCommand extends Command
{
public function actionRun($channel = null)
{
if ($channel !== null) {
$this->queue->channel = $channel;
}
return $this->queue->run(false);
}
}
'queue' => [
'class' => \yii\queue\redis\Queue::class,
'commandClass' => \app\commands\RedisCommand::class,
'redis' => 'redis',
'channel' => 'default', // Queue channel key
'as log' => \yii\queue\LogBehavior::class,
]
yii queue/run channel_group_1
yii queue/run 3 channel_group_1
Хранить html код в столбце поста кажется нецелесообразным по ряду причин:Угу, ага...
Лишняя трата памяти на хранение html теговОго, а лишние это сколько? Экономия на байтах чаще всего приводит к тратам на вычислительные мощности. Некоторые расчеты чуть ниже.
Уменьшение производительности (?)Производительности чего?
Стили/компоненты могут изменяться, а код останется прежнимСтили как раз и нужны для того, чтобы легко конфигурировать визуал, не привязываясь к коду. Код может быть каким угодно, но стилизация через теги пока что лучший вариант, который придумали разработчики.
Использовать собственные минифицированные теги, благодаря которым определенный парсер будет воссоздавать нужные блоки с помощью компонентов (возможно динамичесих)Ага, переизобретаем BBCode, найс... Для понимания проблемы - такие коды придуманы для форумов, с целью ограничить использование хтмл в пользовательском вводе. При этом подходе он худо-бедно оправдан, хотя и требует постобработки при каждом выводе, а это использование регулярок, что как бы совсем не бесплатно. В вашем же случае, источник текста более-менее доверенный, и ограничение в тегах больше мешает чем помогает.
Хранить каждый элемент поста отдельно в бд со следующим содержанием (element_name, position, content, post_id), используя отношения к родительскому посту, соответственно сохранится структура и рендериться пост будет через соответствующие компоненты в нужном порядке (однако как будет именно рендериться в шаблоне поста пока неизвестно)Базовые элементы и так должны храниться отдельно, другой вопрос почему они у вас рендерятся в одном порядке, а в другом месте в другом порядке? Заголовок, короткое описание, текст, главное изображение - отдельные поля, оглавление по сути часть текста, зачем его выносить отдельно - загадка, это же такой же текст, котрый автор волен располагать . Вариант с внешней таблицей по сути приводит нас к выносу части данных в EAV(отличный пример универсализации в ущерб производительности), что как раз будет серьезно напрягать выборки бд, если понадобится делать какие-либо поисково-выборочные манипуляции по этим данным.
Использовать собственные минифицированные теги, благодаря которым определенный парсер будет воссоздавать нужные блоки с помощью компонентов (возможно динамичесих)
Хранить html код в столбце поста кажется нецелесообразным.
Хранить каждый элемент поста отдельно в бд со следующим содержанием (element_name, position, content, post_id),Тут - непонятно. Но есть такое эвристическое правило дизайна
<?php
$go = ['test1','test2','test3'];
print_r(array_reverse($go, true));
Array ( [2] => test3 [1] => test2 [0] => test1 )
<?php
$go = ['test1','test2','test3'];
for ($i=count($go)-1; $i>=0; $i--) {
echo $i.' => '.$go[$i].'<br>';
}
2 => test3
1 => test2
0 => test1
Но не знаю, какое техническое решение взять? Писать на нативном РНР? Взять готовый фрэймворк?
// url === текущее местоположение
location.hash; // #first
location.hash.substring(1); // first
// Для переменной url (строки)
new URL(url).hash.substring(1);
url.match(/(?<=#).+$/)[0];
// Неправильно:
new URL("http://example.com/#first&utm_content=lorem");
// hash: "#first&utm_content=lorem", search: ""
// Правильно:
new URL("http://example.com/?utm_content=lorem#first");
// hash: "#first", search: "?utm_content=lorem",
array_walk($guide['postInGuides'], function (&$postInGuide, $key) use ($guide, $viewRenderer) {
$postInGuide['post']['url'] = [
'read' => $viewRenderer->url('guide/guide/post', [
'slugGuide' => $guide['name'],
'slugPost' => $postInGuide['post']['slug'],
]),
'update' => $viewRenderer->url('post/post/action', [
'slugPost' => $postInGuide['post']['slug'],
'action' => 'update',
]),
'delete' => $viewRenderer->url('post/post/action', [
'slugPost' => $postInGuide['post']['slug'],
'action' => 'delete',
]),
];
});
$item = 'hello!';
а что-то посложнее и разница будет меньше.function test_print($item2, $key)
{
echo "$key. $item2<br />\n";
}
array_walk($array1, 'test_print');
array_walk($array2, 'test_print');
array_walk($array3, 'test_print');
array_walk($array4, 'test_print');
array_walk($array5, 'test_print');
//вот тебе новая выгода:
$func_name = 'test_print';
array_walk($array5, $func_name);
function getSalutationValue(value) {
if(value == 'n' ) {
document.getElementById('driver').style.display='none';
}
}
<?= $form->field($model, 'license')->dropDownList([
'y' => 'Есть',
'n' => 'Нет'
], [
'onchange' => 'getSalutationValue(this.value)'
])
?>