Артем

Артем

С нами с 15 октября 2017; Место в рейтинге пользователей: #168
Артем
13 апреля 2020, 19:42
0
Вероятно, в JSON
{"phytomodule_color":["sizes"],"equipment":["sizes","phytomodule_color"],"frame_color":["sizes","phytomodule_color","equipment"]}
Артем
11 апреля 2020, 21:00
+1
берешь вот это чудо, дописываешь под свои нужды build.php, ну и вперед, дальше все должно быть понятно
Артем
31 марта 2020, 22:09
+1
надо было прописать абсолютно каждую мелочь (о чем не говорят ни на одном форуме)
абсолютно ни на одном форуме
Артем
29 марта 2020, 16:30
+1
потому что эта строка
$parent = $resource->get('parent');
возвращает id родителя, а не объект, поэтому в следующей строке вообще должен быть fatal error
$parentTpl = $parent->get('template');

сначала нужно получить объект родителя на основе его id
$parentObj = $modx->getObject(modResource::class, ['id' => $parent]);
а затем уже работать с этим объектом
Артем
28 марта 2020, 16:08
0
В общем, как выяснилось, ты хочешь, чтобы тебе на блюдечке готовое решение принесли, при этом ты даже не удосужился почитать документацию и предпринять хоть какие-то попытки решения своей проблемы. Не хочешь решать ее самостоятельно? Тебе сюда.
Артем
27 марта 2020, 01:50
0
В плагине локализатора на OnDocFormPrerender напрямую дергается шаблон из ресурса в строке
localizator.config.resource_template = "' . $resource->get('template') . '";
из этого следует, что если открыть несуществующий ресурс в админке, то получим 500 ошибку

было бы неплохо добавить проверку в следующем обновлении
if ($mode == 'upd' && $resource instanceof modResource) {
Артем
26 марта 2020, 14:51
1
+1
тильдами ничего не экранируется, тильда — конкатенация строки, а ошибка заключалась в неправильном синтаксисе и дважды открытых фигурных скобках
Артем
24 марта 2020, 02:59
0
справедливости ради, в примерах от jQuery только 1 строчка
думаю, любой vanilla js разработчик осилит ее заменить на
document.addEventListener('eventName', e => {});
Артем
23 марта 2020, 21:33
+1
Но, компонент работает без jQuery.
*довольные звуки сторонников vanilla js*
Артем
19 марта 2020, 16:56
0
'where' => ['parent' => $id]
или

'parents' => $id
если используется сниппет, принимающий параметры pdo
Артем
19 марта 2020, 16:52
0
выводишь справа нужные категории, у каждой из них должен быть прописан id, при отправке формы поиска ловишь выбранный id и добавляешь его в where при формировании поиска
естественно, нужно обязательно фильтровать id, которые будешь отдавать в where
Артем
13 марта 2020, 21:04
0
Для этого есть отдельный процессор — resource/trash/purge.
Артем
10 марта 2020, 23:44
0
Согласен, бывает и такое, но лично я считаю, что это проблема исключительно клиента и его нежелания обновляться на современное ПО.
Почему разработчик должен тратить свое время и решать эти проблемы? Если клиент хочет поддержку IE, то пусть изволит оплатить это отдельно. А как только клиент поймет, что гораздо проще обновить ПО, чем каждый раз оплачивать доработку под IE, то вдруг у него внезапно появятся и Windows 7/10, и последний хром.
Артем
10 марта 2020, 20:53
0
О кроссбраузерности в 2020 году стоит думать только в том случае, если по какой-то странной причине есть надобность поддерживать бородатый IE, в чем я очень сильно сомневаюсь. В остальном никакой головной боли уже нет, а писать на современном JS одно удовольствие, чего не скажешь о jQuery лапше с всевозможным подавлением ошибок и зоопарком долларов.
Артем
06 марта 2020, 21:14
0
На самом деле getCount всегда возвращает число, поэтому проверка по сути не нужна)
Можно было прям сразу
return $modx->getCount('modResource', $q));
Артем
06 марта 2020, 21:10
0
pagetitle и price не самый удачный пример, способом с IN их не очень удобно доставать)
я бы тут из-за удобства выбрал join, хоть он действительно будет немного медленнее

Вариант с IN:
$data = [];
$c = $modx->newQuery('msProduct', ['class_key' => 'msProduct', 'published' => 1]);
$c->select(['id', 'pagetitle']);
if ($c->prepare() && $c->stmt->execute()) {
    $data = $c->stmt->fetchAll(PDO::FETCH_KEY_PAIR);
}


$c = $modx->newQuery('msProductData', ['id:IN' => array_keys($data)]);
$c->select(['id', 'price']);
if ($c->prepare() && $c->stmt->execute()) {
    while ($item = $c->stmt->fetch(PDO::FETCH_ASSOC)) {
        $data[$item['id']] = ['pagetitle' => $data[$item['id']], 'price' => $item['price']];
    }
}
print_r($data);
return; 
Total time: 0.4112 s
Memory: 22 MB
Можно было еще сделать через ASSOC и array_column, но это медленнее, как мне показалось

Вариант с join:
$c = $modx->newQuery('msProduct', ['msProduct.class_key' => 'msProduct', 'msProduct.published' => 1]);
$c->select(['msProduct.pagetitle', 'Data.price']);
$c->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
if ($c->prepare() && $c->stmt->execute()) {
    print_r($c->stmt->fetchAll(PDO::FETCH_ASSOC));
}
return;
Total time: 0.4927 s
Memory: 18 MB
Артем
06 марта 2020, 20:31
0
Да я прям копипастнул, только getCollection на getCount заменил

Вариант с IN:
$ids = [];
$q = $modx->newQuery('modResource');
$q->select('id');
$q->where(array(
    'published' => 1,
    'class_key' => 'msProduct',
));
if ($q->prepare() && $q->stmt->execute()){
    while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
        $ids[] = $row['id'];
    }
}


/* @var msProductData $object*/
$q = $modx->newQuery('msProductData');
$q->where(array(
    'id:IN' => $ids
));
if($objectCount = $modx->getCount('msProductData', $q)) {
    return $objectCount;
}
Total time: 0.4705 s
Вариант с join:
/* @var msProduct $object*/
$q = $modx->newQuery('msProductData');
$q->where(array(
    'Product.published' => 1,
    'Product.class_key' => 'msProduct',
));
$q->innerJoin('msProduct','Product','Product.id = msProductData.id');
if($objectCount = $modx->getCount('msProductData', $q)) {
    return $objectCount;
}
Total time: 0.4096 s
Сейчас разница уже не такая большая, но она все еще в пользу join'а.
Артем
06 марта 2020, 20:09
0
Не, это же таблица ms2_products, где id — PK и, естественно, с индексом.
Дело в количестве указанных id, их слишком много, поэтому join работает быстрее.
Артем
06 марта 2020, 19:41
+1
Справедливости ради, я бы поспорил про join.
IN — еще большее зло, если в нем указана целая простыня (тысячи или десятки тысяч) id.
Вот ради интереса копипастнул себе на один из проектов оба варианта и, как я и ожидал, второй существенно быстрее.
На проекте 29705 товаров.
Ну и я заменил getCollection на getCount, потому что получать 30к объектов — самоубийство, даже через более оптимальный getIterator.

Вариант с IN:
Total time: 0.7136 s
Вариант с join:
Total time: 0.4630 s
Но вариант с IN может оказаться действительно быстрее там, где небольшой перечень id, тут согласен.
Артем
04 марта 2020, 22:36
+4
Дико извиняюсь, не удержался

$where['o.makedate:>='] = '".$_GET['date1']." 00:00:00'";
$where['Detail.sk_order_id']=$.get.sk_order_id