Всего 125 966 комментариев

Александр Мельник
24 марта 2022, 15:29
0
я буквально 4 дня тому назад тоже испытывал теже проблемы.
Изначально у меня не появлялась кнопка подгрузки.
Я использую синтаксис шаблонизатора fenom всегда. Потом взял переписал на синтаксисе стандартного шаблонизатора и кнопка появилась. Но При клике на нее тоже ничего не происходило, причем никаких запросов не отображалось в консоли.
Только после того как я тупо скопировал кусок кода вызова сниппета из документации, тогда заработало.
Но все равно, использование pdoMenu имеет один существенный минус (на мой взгляд)
он требует дополнительную обертку, которой в верстке проекта может и не быть.
Мало того что сами результаты должны иметь обертку с классом rows (если не переопределять), так еще нужна и дополнительная обертка #pdopage.
Раньше это не было так критично, всегда можно было без проблем добавить в верстку лишний div и ничего не ломалось, но сейчас, когда современная верстка перешла на css-grid и flexbox оборачивание данных в дополнительный див может полностью ломать верстку страницы.
Zhan
24 марта 2022, 15:18
0
а вот в том вопросе на страничке которой мы сейчас находимся, я выводил ресурсы с помощью данного ajax фильтра webdesign-master.ru/blog/modx/2016-05-03-modx-ajax-filter.html, но по факту мне было бы удобно выводить через pdoPage, но не могу исправить проблему с пагинацией уже 2 дня((((
Zhan
24 марта 2022, 15:14
0
Извиняюсь что вопрос некорректно задаю. Получается так, что в самом начале я хотел использовать PdoPage, но проблема в том что у меня почему-то PdoPage выводит ресурсы, но при выводе пагинации(ajaxMode button) он выводит кнопку правильно, но при нажатие на кнопку ничего происходит.
а например если я вывожу обычную пагинацию то выводится вот так:
Александр Мельник
24 марта 2022, 14:59
0
Zhan, нужно как то все разложить по полочкам, а то уже перестало быть понятно, на какой вопрос вам давать ответ.
Вы используете на одной странице несколько раз вызов pdoPage и с кнопкой для подгрузки ресурсов по кнопке.
В самом начале в тексте этого поста вы пишите, что нажимаете на одну кнопку, а ресурсы подгружаются сразу во все блоки, так?
Вам предложили несколько вариантов решения
— Баха пишет вам, что нужно просто для каждого вызова pdoMenu указывать свой уникальный идентификатор и плюс прописывать все остальные параметры сниппета
'pageVarKey' => 'unique',
'pageNavVar' => 'unique.nav',
'ajaxElemWrapper' => '#unique',
'ajaxElemRows' => '#unique .rows',
'ajaxElemPagination' => '#unique .pagination',
'ajaxElemLink' => '#unique .pagination a',
'ajaxElemMore' => '#unique .more',
с учетом этого идентификатора.
Вы проверили этот вариант?
Я написал вам вариант, как сделать подгрузку данных по нажатию кнопки, не используя pdoPage. Сразу скажу что это не готовый код, который можно скопировать, это фрагмент моего сайта, под ваши условия его нужно немного доработать. Просто вникните в сам код и он поможет решить вашу задачу.
Zhan
24 марта 2022, 14:34
0
modx.pro/help/22774 я тут вопрос задавал если знаете в чём может быть причина, можете пожалуйста подсказать, webdesign-master.ru/blog/modx/2016-05-03-modx-ajax-filter.html я в проекте ещё такой ajax фильтр использую может в нём проблема? ( хотя его убирал на проверку и тоже не работал pdoPage
Zhan
24 марта 2022, 14:29
0
Проблема в том что, у меня почему-то PdoPage не работает, то есть ресурсы выводить, но пагинация не работает (хотя всё по документации сделал) AjaxMode button выводит кнопку, но при клике ничего не происходит и никаких ошибок не выводит
Александр Мельник
24 марта 2022, 13:50
0
для корректного снятия позиций в разных регионах, потому что гугл плевать хотел что вы задаёте регион явно, выдача все равно идёт с учётом ip.
Вот этого я не знал, спасибо.
Александр Мельник
24 марта 2022, 13:37
0
где вы встретили ограничение запросов по ip,
Возможно я не совсем корректно сформулировал, не думал что нужно так детально.
Смотрите с чем столкнулся я касательно яндекса.
Покупаем на той самой бирже о которой вы говорите аккаунт. На нем к примеру 5000 лимитов и при покупке мы указали ip адрес сервера, с которого будем слать запросы яндексу. Получаем токен для подключение.
На этом сервере работает мое программное обеспечение (там много всего, включая построитель очереди задач на сутки в редис и прочее), но суть сбора данных с яндекса заключается в отправке запросов на определенный url яндекса (передаем фразу которую ищем, регион, токен и прочее если нужно) и получение в формате xml результатов. Парсю этот xml и нахожу на какой позиции находится (если находится) домен, статистику для которого я снимаю.
Так вот. Яндекс во первых вводит ограничения на то, сколько мы можем использовать лимитов в час (ночью больше, а днем на час дается очень мало) и плюс ограничивает частоту запросов С ОДНОГО IP. Если пытаешься отсылать запросы чаще чем… ну к примеру раз в секунду, то яндекс временно тебя отключит.
И исходя из этого возникают проблемы.
Первая — купили мы на бирже аккаунт на 5000 лимитов, а что если у нас запросов наши сеошники набросали 24 000 штук. Мы физически не можем за сутки их обработать, потому что в идеальном варианте (если нигде ничего не сбоило) у нас всего 5000 лимитов. Вроде бы логично иметь несколько аккаунтов (купленных на бирже или же своих) и если на одном закончились лимиты, просто переключиться на другой. И изначально такую систему балансировки между несколькими аккаунтами я и разработал. Но оказалось что яндекс не позволяет иметь два аккаунта, которые работают с одного IP. Тоесть вы не можете на бирже купить один акаунт и указать 123.123.123.123 и купить второй аккаунт и указать такой же IP.
Один аккаунт = один IP и именно это я имел ввиду под «ограничением на один IP»
Я по прежнему не понимаю о каком прокси все говорят и как он может отправлять запросы с одного сервера но при этом чтобы все запросы шли с разных IP (причем не случайных, а заранее определенных IP)
Мне кажется это называется не прокси, а VPN.
Я же понимаю проксирование как например работает nginx. Он может принять запрос слушая определенный порт, проанализировать его и понять куда его направить. Но как он может отправить первый запрос на яндекс с одного IP а другой — с другого. а третий снова с первого — не понимаю.
Разве что где то в сети интернет стоят сервера, суть которых просто принять запрос и в таком же виде передать его…
Ну в общем пока я не пойму теорию, я не моги понять о чем речь, нельзя же просто так сказать — тебе поможет прокси) Это все равно что раненому больному сказать — тебе поможет скальпель. Оно вроде как и логично, но без теории проведения хирургических операций — скальпель не поможет.
Поэтому буду благодарен за ссылки где изучить, что такое — прокси, о котором все говорят)
Но и кстати, я так понимаю что это тоже чей то чужой платный сервис и если он перестал рабоать — то мой сервис тоже лег? В таком случае содержать свои vps ки мне кажется более правильным, я моги следить за ними, администрировать. И что важно — регулировать их количество в зависимости от нагрузки на систему. К примеру в этом месяце сешники хотят в день снимать 50 000 запросов, я могу просчитать сколько серверов мне для этого нужно и за 20 минут установить на них убунту, свое программное обеспечение и они сразу включаться в работу. Если нагрузка упала — я пошел их удалил и не платим за них.
Александр Мельник
24 марта 2022, 13:09
+1
Наверное вы правы, но есть два НО.
Во первых я когда то несколько лет назад, когда только столкнулся впервые с modx и с такой проблемой в работе pdoPage, я общался с Василием Наумкиным и он сказал, что нормального решения нет, можно там как то сбрасывать какие-то хеши… Для меня это было и есть темный лес. Хорошо если решение этого пофиксили, правда в документации мне не попадалось описание.
Во вторых, я очень люблю что то писать сам, а не пользоваться чужим кодом. Когда говорят мол иди изучи как там в сниппете сделано, это всегда скучно и ты зажат рамками чужой идеи. Я же почти всегда могу придумать свою идею и именно за это я обожаю программирование, за возможность каждый день строит свои мир.
Сергей Карпович
24 марта 2022, 10:56
0
Кажись разобрался, ситуация такая.
Были изначально созданы опции, допустим 1,2,3,4.
Созданы товары и указаны значения этих опций.
Затем созданы опции 5,6,7,8…
Так вот эти новые опции стали выводиться, даже если пустые. До тех пор пока я не прошелся по товаром и тупо их не пересохранил.
Я так понимаю, это какой баг в minishop?
Баха Волков
24 марта 2022, 10:47
0
А всего лишь нужно было документацию почитать или взглянуть на код pdoPage:

'pageVarKey' => 'unique',
'pageNavVar' => 'unique.nav',
'ajaxElemWrapper' => '#unique',
'ajaxElemRows' => '#unique .rows',
'ajaxElemPagination' => '#unique .pagination',
'ajaxElemLink' => '#unique .pagination a',
'ajaxElemMore' => '#unique .more',
Михаил
24 марта 2022, 09:42
0
И как полностью поменять чанк письма, задать свои стили и использовать ms2_frontend_currency вместо р?
Михаил
24 марта 2022, 09:32
0
Как вернуть старую логику работы компонента, для расчёта скидки по полю «Стоимость покупок»?

Просто, если взять, что пользователю нужно сделать скидку на доставку, то условно компонент пересчитывает доставку каждого товара и придется каждый раз считать скидку самостоятельно. А изменение количества товаров и добавление товаров к заказу происходит крайне редко, в отличии от первого.
Дима Сайт old см. профиль
24 марта 2022, 01:46
0
Ещё к позволит, смысл прокси тот же самый, что и ваша «кластерная архитектура», только без vps и ещё дешевле.

Интересно, Александр, где вы встретили ограничение запросов по ip, ведь на сколькр мне известно, там наоборот нужно указать конкретный ip с которого будут запросы, а ограничение основано на XML-лимитах, которые выдает Яндекс щас подключенные сайты в сервисе я.вебмастер.

Существует даже «рынок» этих лимитов.

Сколько раз переносили наш сборщик на новы сервер, каждый раз приходилось руками указывать его новый ip в Яндекс.XML…

А для Гугла вам по-любому понадобятся прокси или VPS или ещё что-то для подмены ip (хоть vpn), для корректного снятия позиций в разных регионах, потому что гугл плевать хотел что вы задаёте регион явно, выдача все равно идёт с учётом ip. Поправьте меня если что!
Дима Сайт old см. профиль
24 марта 2022, 01:32
0
Ошибка с кодом 500 обязательно будет расшифрована в логах вебсервера. Кидайте сюда текст этой ошибки, сможем дальше подсказать!
Дима Сайт old см. профиль
24 марта 2022, 01:27
0
Попробуйте копать в сторону &pageVarKey и других параметров pdoPage в которых есть слово *var* (variable).

Кажется, то что вам нужно, есть там из коробки!
Артур Шевченко
23 марта 2022, 18:05
0
Вооот ещё одна странность.
Илья Уткин
23 марта 2022, 16:49
0
Ну так теперь же всё как раз хорошо раскрыто — теперь вы можете разрабатывать дополнение, которое повторяет функциональные возможности существующих пакетов. Статья ведь про то, что ограничение сняли, теперь об этом не надо думать.
Александр Мельник
23 марта 2022, 15:40
0
Тоже постоянно сталкиваюсь с такой проблемой.
Обычно отказываюсь от использования pdoPage и придумываю что-то сам.
Вот недавно делал такое.
В шаблоне
{set $result = '!pdoResources'|snippet:[
'parents'=>$id,
'depth'=>0,
'limit'=>3,
'includeTVs'=>'',
'tvPrefix'=>'',
'tpl'=>'@FILE tpls/oneSolution.tpl'
]}
{if $result}
<section class="current-projects-use ip-decisions-slider wrapper">
    <div class="h4 completed-projects__title">name</div>
    <ul class="completed-projects__list-slider ip-decisions__slider" id="solutionsWrapper-{$id}">
        {$result}
    </ul>
    <a href="#" class="completed-projects__order button loadDataByAjax completed-projects__order-text"
        data-parent="{$id}" data-limit="3">
       Показать больше
    </a>
</section>
{/if}
на ссылке при клике по которой идет загрузке висят два дата атрибута. С идентификатором родителя и с числом, по сколько данных подгружать.

Есть javascript
const loadDataByAjaxs = document.querySelectorAll('.loadDataByAjax');
if (loadDataByAjaxs) {
    loadDataByAjaxs.forEach((btn) => {
        btn.addEventListener('click', async (event) => {
            event.preventDefault();
            const btn = event.target;
            const parent = btn.dataset.parent;
            const limit = btn.dataset.limit;
            const wrapper = document.querySelector(`#solutionsWrapper-${parent}`);
            const offset = wrapper.childElementCount ? wrapper.childElementCount : 3;
            console.log(wrapper.childElementCount);

            const data = new FormData();
            data.append('parent', parent);
            data.append('limit', limit);
            data.append('offset', offset);

            let response = await fetch('/core/elements/snippets/getData.php', {
                method: 'POST',
                headers: {},
                body: data
            });

            let result = await response.text();
            if (result) { wrapper.innerHTML += result; } else { btn.remove(); }
        });
    });
}
Он навешивает функцию на событие click, собирает данные о родителе, сколько загружать и высчитывает, а сколько данных уже отображено на странице, чтобы создать offset

И есть php файл
<?php
require_once 'path_to/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');
$parent = $_POST['parent'];
$limit = $_POST['limit'];
$offset = $_POST['offset'];

$output = $modx->runSnippet('pdoResources',array(
    'parents' => $parent,
    'limit'=> $limit,
    'offset'=>$offset,
    'includeTVs'=>'',
    'tvPrefix'=>'',
    'tpl'=>'oneSolution.tpl'
 ));
 echo $output; 
die();
К этому скрипту отправляет запрос javascript и получает назад html нужных элементов которые потом подставляются на страницу.
Такой способ позволяет на странице иметь сколько угодно блоков, потому что каждый из них имеет свой уникальный идентификатор, в которые информация будет погружать отдельно.