Александр Мельник

Александр Мельник

С нами с 02 сентября 2016; Место в рейтинге пользователей: #64
Александр Мельник
03 апреля 2022, 11:52
0
Включить кэширование скриптов cache_scripts тоже выставлено в «Нет»
Александр Мельник
31 марта 2022, 20:31
+1
да, это моя вина.
Те сайты что разрабатывал я, я стараюсь скрыть такого вида кнопки и вообще удаляю виджеты с главной страницы админки. Но есть сайты, которые пришли недавно и разработаны другими разработчиками и там я не успел «почистить».
Александр Мельник
31 марта 2022, 20:25
+2
У меня сегодня много заказчиков, увидев в админке надпись «вышла версия 3,0 обязательно обновитесь», обновились и «уложили» около 15 сайтов)
Александр Мельник
27 марта 2022, 06:59
0
спасибо. Да, проще всего с телеграмом, но как раз он заказчика и не интересует(
Александр Мельник
24 марта 2022, 15:29
0
я буквально 4 дня тому назад тоже испытывал теже проблемы.
Изначально у меня не появлялась кнопка подгрузки.
Я использую синтаксис шаблонизатора fenom всегда. Потом взял переписал на синтаксисе стандартного шаблонизатора и кнопка появилась. Но При клике на нее тоже ничего не происходило, причем никаких запросов не отображалось в консоли.
Только после того как я тупо скопировал кусок кода вызова сниппета из документации, тогда заработало.
Но все равно, использование pdoMenu имеет один существенный минус (на мой взгляд)
он требует дополнительную обертку, которой в верстке проекта может и не быть.
Мало того что сами результаты должны иметь обертку с классом rows (если не переопределять), так еще нужна и дополнительная обертка #pdopage.
Раньше это не было так критично, всегда можно было без проблем добавить в верстку лишний div и ничего не ломалось, но сейчас, когда современная верстка перешла на css-grid и flexbox оборачивание данных в дополнительный див может полностью ломать верстку страницы.
Александр Мельник
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. Сразу скажу что это не готовый код, который можно скопировать, это фрагмент моего сайта, под ваши условия его нужно немного доработать. Просто вникните в сам код и он поможет решить вашу задачу.
Александр Мельник
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, я общался с Василием Наумкиным и он сказал, что нормального решения нет, можно там как то сбрасывать какие-то хеши… Для меня это было и есть темный лес. Хорошо если решение этого пофиксили, правда в документации мне не попадалось описание.
Во вторых, я очень люблю что то писать сам, а не пользоваться чужим кодом. Когда говорят мол иди изучи как там в сниппете сделано, это всегда скучно и ты зажат рамками чужой идеи. Я же почти всегда могу придумать свою идею и именно за это я обожаю программирование, за возможность каждый день строит свои мир.
Александр Мельник
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 нужных элементов которые потом подставляются на страницу.
Такой способ позволяет на странице иметь сколько угодно блоков, потому что каждый из них имеет свой уникальный идентификатор, в которые информация будет погружать отдельно.
Александр Мельник
22 марта 2022, 08:59
0
не знаю какая задача стоит перед учителем и чему именно он хочет обучить, но мне кажется выбор modx очень неудачным.
Я помню, как изучив учебник php, я открыл код modx и ужаснулся. Какие -то квадратные скобки, какие то чанки, код хранится непосредственно в базе данных — ничего этого в учебнике не было и это неимоверно сбивало с толку.
Александр Мельник
22 марта 2022, 08:35
0
ничего лучше чем официальная документация вы не найдете.
Ну и плюс, лично из моего опыта, единственный способ действительно понять, как что то работает — это разобрать это по винтикам.
В случае с программированием это означает, что я открываю текст программ в редакторе, который умеет индексировать код (это vscode, netbeans, phpstorm) открываю index.php и начинаю пошагово и построчно изучать код, пока не пойму что делает каждая точка и запятая.
Александр Мельник
22 марта 2022, 08:29
0
спасибо, Роман, что подтвердили мои опасения.
Не могу пользоваться allposition или ему подобными, поскольку задача от руководство стоит так «разработать сервис статистики для нашей компании, который будет независим от других сервисов».
В случае с яндекс я пользуюсь yandex XML. Для обхода ограничений на запросы с одного IP разработал кластерную архитектуру приложения, где к программе можно добавлять дешевые виртуальные сервера и запросы на яндекс идут с их IP.
Похоже, парсить выдачу google — это единственный вариант.
Роман, к своему стыду я не совсем понимаю фразу «купить прокси чтобы парсить». Не понимаю саму технологию процесса, можете дать ссылку почитать как это работает?
Я подозреваю, что гугл, если напрямую быстро отсылать get запросы на сайт и парсить html быстро заблокирует мой IP или включит каптчу. Но не понимаю как использование прокси может это решить, ведь это не позволит на одном сервере иметь 10 IP адресов, чтобы отсылать запросы каждый раз с разного IP и не быть забаненым?
Александр Мельник
20 марта 2022, 14:52
1
+1
не знаю что это за сниппет такой и для чего он нужен, но по идее, вот так.
{set $result = 'getRemains'|snippet}
{if $result}
    {$result}
{else}
    нет в наличии
{/if}
наверное условия можно переписать короче, но во первых так нагляднее, а во вторых — я ненавижу тернарный оператор)
Александр Мельник
20 марта 2022, 11:00
+1
1. Но вы же не передаете эти параметры внутрь AjaxForm. Чтобы внутри формы вам был доступен [[+vacancy_name]] нужно передать его при вызове AjaxForm
[[!AjaxForm?
&form=`tpl.vacancyAjaxForm`
&vacancy_name=`hello world`
]]
2. Вы наверное не так поняли Артура. Это очень плохая практика, когда у каждой услуги (товаре или что там еще) создается своя форма при помощи ajaxform. А если их будет 1000? 1000 раз будете на одной странице запускать сниппет ajaxform? Более экономично и разумно, иметь один вызов ajaxform где то в футере, он реализует одну форму. А дополнительно на js вы пишите просто скрипт который при клике на кнопку берет данные конкретно той вакансии, по которой кликнули и вставляет данные в ту форму, которая у вас в футере. И открывает модальное окно с этой формой. Тогда имея всего одну форму вы сможете сделать заказ любой вакансии, потому что данные в форме будут заполнены при клике и будут каждый раз разные.
Александр Мельник
19 марта 2022, 20:52
+1
Для этого нужно знать javascript и поискать документацию на pdoPage.

Вы можете написать свою функцию, указав ее в качестве функции обратного вызова при событии pdopage_load
Ваша функция может получить количество карточек товаров (услуг или чего вы там выводите) и вставить это число в нужное вам место страницы.
Таким образом у вас общее число будет браться с [[+page.total]] а реальное количество на странице динамически подставляться через javascript
Александр Мельник
15 марта 2022, 15:11
0
Возврат к тому же товару, если нажать на стрелку назад, это функция современных браузеров и она работает автоматически. Но в вашем случае изза того что товары не присутствуют на странице постоянно, а подгружаются по кнопке, этого не происходит.

готовых решений наверняка нет.
Вы можете или разработать этот функционал самостоятельно или же оставить запрос на платную разработку
modx.pro/work
Александр Мельник
15 марта 2022, 10:08
+1
И все же, это не является ни стандартом, ни требованием, можно сказать что это лишь вялая рекомендация.
По сути использование const не дает никакой выгоды перед let, как это например наблюдается в других языках, где если объявляется константа, то под нее в памяти резервируется минимально необходимое количество байт.
В javascript использование const не более чем попытка пойти по модному течению «сейчас в моде снова языки строгой типизации». Раньше был турбо паскаль, фортран, позже с++, джава в которых нельзя было обьявить переменную не указав точно тип данных, которые мы планируем в ней хранить.
int var x = 5;
Потом мода менялась и стали говорить мол, вот вам новые языки, здесь не нужно думать о типе переменной, творите что хотите, теперь вы свободны и появились php, javascript и прочее.
Сейчас же (лично по моим наблюдениям) новый виток спирали — снова в моду входит строгая типизация. Javascript разрабатывает typescript, php вводит typehinting, позволяет указывать что должна вернуть функция, в общем становится очень похож на с++.
И const в javascript (на мой взгляд) не более чем баловство, ведь работает это только на примитивных данных, а для ссылочных типов данных работает некорректно, тоесть позволяет мутировать объект. Поэтому мне кажется, кому нужна строгая типизация тот пойдет писать на typescript, а остальным без разницы let или const, хотя может я и ошибаюсь.
Александр Мельник
06 марта 2022, 08:52
+3
Дмитрий, вы очень плохо описываете свой вопрос. Два предложения и даже они почти бессмысленные.
Честь и хвала Артуру, что ему хватает нервов и времени попытаться разобраться и найти хоть крупицу логики, написать вам ответ. А потом вы вдруг все переворачиваете с ног на голову, говоря про админку.
Если бы вы описали задачу кратко, но полностью — вероятность что вам бы помогли была бы больше.

Артур вам правильно написал, formit это лишь программа для отправки форм, а форма передает информацию, данные, а не теги. Есть множество способов передать данные в форму. К примеру используя возможности javascript работать с DOM деревом, как описал Артут. Либо можно просто информацию которую лежит у вас в теге p продублировать уже в виде тега input type=hidden value=название категории name=categoryName
Если этот тег будет размешен внутри формы, то название категории отправится.
Если вы хотите чтобы отправляемые пользователем данные просто сохранялись в админке, то ознакомьтесь с документацией на formit
docs.modx.com/current/en/extras/formit/index
и особенно
docs.modx.com/current/en/extras/formit/formit.hooks/formitsaveform
Александр Мельник
04 марта 2022, 08:20
+1
Я любитель еще более простых решений) Зачем вам статичные пункты меню, такие как — о компании, контакты, формировать динамически через pdoMenu. Оставьте их в html и пропишите руками ссылки. А для формирования подменю с товарами используйте уже pdoMenu или pdoResources или msProducts и настройте их так чтобы отбирались только товары.