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

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

С нами с 02 сентября 2016; Место в рейтинге пользователей: #53
Александр Мельник
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 и настройте их так чтобы отбирались только товары.
Александр Мельник
27 февраля 2022, 17:09
0
@Илья Уткин Илья, прошло уже некоторое время с момента публикации.
Расскажите, продолжаете ли вы с командой пользоваться для разработки на modx докером?
Обнаружились какие-то минусы?
Александр Мельник
23 февраля 2022, 21:07
0
Дмитрий, а подскажите как вы например подключаете файлы стилей или скриптов на страницу?
Указав base href = site.com/ Можно на любой странице подключить скрипт используя относительный путь относительно base href.
<script src="assets/js/bundle.js">
и на любой странице он будет подключен, вне зависимости от url
А как поступаете вы? Для каждого скрипта указываете абсолютный путь?
Александр Мельник
23 февраля 2022, 20:54
0
Нет, у меня вполне работают и стандартные якорные ссылки. Иногда, если нужна особая плавность перехода, могу сделать и на javascript.
Та проблема которая описана на stackoverflow решается элементарно, нужно просто в якорной ссылке указывать не #id, а site.com#id
Но даже если у использование base href и создаст какие то проблемы у кого-то, то мне кажется это еще не причина так негативно отзываться о таком замечательном теге, решающим куда больше проблем чем создающим)
Александр Мельник
23 февраля 2022, 18:27
0
Поясните пожалуйста, почему тег base href ломает переход по якорю?
Я использую данный тег на всех проектах, не только modx и он прекрасен.
Не вижу никаких минусов и переходы по якорным ссылкам работают.
Александр Мельник
23 февраля 2022, 16:41
+1
попробуйте в теге header добавить тег
<base href="http://site.com/">
Александр Мельник
22 февраля 2022, 21:04
+1
Мне кажется, что у автора нет разных контекстов на сайте, у которых можно было бы переназначить системные настройки. У него просто много доменов направлены на одну директорию в которой лежит сайт.