vectorserver

vectorserver

Был в сети 10 июля 2026, 07:32
Заказы принимаю
Тоже замучился но у меня форма динамическая инпуты подставляются через JS и хеш не совпадает, сделал такой костыль пока:
В assets/components/ajaxform/action.php
Закомментировал с 25 по 27 строку проверку
$_REQUEST['af_action']
Кому лень вот готовый код (костыль):
<?php
/** @var modX $modx */
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');

// Switch context if need
if (!empty($_REQUEST['pageId'])) {
    if ($resource = $modx->getObject('modResource', (int)$_REQUEST['pageId'])) {
        if ($resource->get('context_key') != 'web') {
            $modx->switchContext($resource->get('context_key'));
        }
        $modx->resource = $resource;
    }
}

/** @var AjaxForm $AjaxForm */
$AjaxForm = $modx->getService('ajaxform', 'AjaxForm', $modx->getOption('ajaxform_core_path', null,
        $modx->getOption('core_path') . 'components/ajaxform/') . 'model/ajaxform/', array());

if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
    $modx->sendRedirect($modx->makeUrl($modx->getOption('site_start'), '', '', 'full'));
} /*elseif (empty($_REQUEST['af_action'])) {
    echo $AjaxForm->error('af_err_action_ns');
}*/ else {
    echo $AjaxForm->process($_REQUEST['af_action'], array_merge($_FILES, $_REQUEST));
}

@session_write_close();
Типо того:
<ul>
    <?php
    $contexts = $modx->getCollection('modContext', array('key:NOT IN' => array('mgr')));
    foreach ($contexts as $context) {
        $contextName = $context->get('key');
        $contextUrl = $modx->makeUrl('[[*id]]', '', $contextName);
        echo "<li><a href='{$contextUrl}'>{$contextName}</a></li>";
    }
    ?>
</ul>
дело может быть еще в плагине MinifyX, он отрубает www.google.com/recaptcha/api.js?onload=ReCaptchaCallbackV3
Временно сделал так в сниппете rcv3_html
<?php
$public = $modx->getOption('formit.recaptcha_public_key');
$action = $action ?: 'ajaxform';
$js = "";
if (!$modx->getPlaceholder('rcv3_initialized')) {
    $js.='<script src="https://www.google.com/recaptcha/api.js?onload=ReCaptchaCallbackV3&render=' . $public . '" async></script>';
    $js.='
        <script>
            var ReCaptchaCallbackV3 = function() {
                grecaptcha.ready(function() {
                    grecaptcha.reset = grecaptchaExecute;
                    grecaptcha.reset();
                });
            };
            function grecaptchaExecute() {
                grecaptcha.execute("' . $public . '", { action: "' . $action . '" }).then(function(token) {
                    var fieldsToken = document.querySelectorAll("[name =\'g-recaptcha-response\']");
                    Array.prototype.forEach.call(fieldsToken, function(el, i){
                        el.value = token;
                    });
                });
            };
            // обновляем капчу каждую минуту
            setInterval(function() {
                grecaptcha.reset();
            }, 60000);
        </script>
    ';
    $modx->setPlaceholder('rcv3_initialized', 1);
}

$output = '
    <span class="error_g-recaptcha-response error">' . $error . '</span>
    <input type="hidden" name="g-recaptcha-response">
';

return $js.$output;
Создаешь сниппет mod_image
<?php

/* @var modX $modx*/
/* @var $input*/


// Создаем объект DOMDocument
$dom = new DOMDocument();


// Загружаем HTML-код
$html = $input;
//$dom->loadHTML($html);
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));


// Получаем все элементы <img>
$xpath = new DOMXPath($dom);
$images = $xpath->query("//img");

foreach ($images as $image) {
    // Получаем старый путь из атрибута 'src'
    $oldSrc = $image->getAttribute('src');
    $new_path = $modx->runSnippet('phpthumbof',['input'=>$oldSrc,'options'=>'w=0&h=800&zc=0']);
    // Заменяем значение атрибута 'src'
    $image->setAttribute('src', $new_path);


    // Получаем родительский элемент <a> и добавляем атрибут 'href' с значением $oldSrc
    $parentLink = $image->parentNode;
    if ($parentLink->nodeName === 'a') {
        $parentLink->setAttribute('href', $oldSrc);
    } else{

        // Создаем тег a
        $a = $dom->createElement('a');
        $a->setAttribute('href', $oldSrc);

        $a->setAttribute('data-fancybox', 'gal');
        $a->setAttribute('class', 'pointer img-fluid');
        $image->parentNode->replaceChild($a, $image);
        $a->appendChild($image);
    }

    if(!$image->getAttribute('title')){
        $image->setAttribute('title', 123);
        $image->setAttribute('alt', 'Рисунок');
    }

}

// Получаем обновленный HTML-код
$content_new = $dom->saveHTML();


return $content_new;
и потом используй
{$_modx->resource.content | replace : '<h3>' : '<h3 class="title-dec">' | mod_image}
Сорян нужное указывать
{var $count_pub+=1}
)))
{var $count_pub = 0}
{var $plus = [
    ["published" => 1,"name"=>"dsdsds"],
    ["published" => 1,"name"=>"xdsdsds"],
]}

{if $plus}
    {foreach $plus as $idx => $item}
       {if $item.published ==1}
            {var $count_pub+=1}
            {$item.name}
        {/if}
    {/foreach}
    RETURN COUNT: {$count_pub}
 {/if}
Как писал выше Артур!
Создай сниппет к примеру contextKeys:
<?php
/* @var modX $modx */
/* @var modContext $ctxs */
$ctxs_obj = $modx->getCollection('modContext', array('key:!=' => "mgr"));
$ctxs = [];
if ($ctxs_obj) {
    foreach ($ctxs_obj as $ctx) {
        $ctxs[] = $ctx->key;
    }
}

return implode(",", $ctxs);
Далее впихивай его в pdoSitemap
[[!pdoSitemap?
    &tpl=`@INLINE [[+url]][[+date]]`
    &where=`{"hidemenu":0}`
    &context=`[[contextKeys]]`
]]
Вот так:
<?php
/* @var modX $modx */
$context_key = 'abc';
$context_resID = '317';

//Опция site_url
$site_url = $modx->getOption('site_url', array('context_key'=>$context_key));
var_dump($site_url);

//Поуличить ресурс из котекста
/* @var modResource $resource*/
$resource = $modx->getObject('modResource', array('id'=>$context_resID, 'context_key'=>$context_key));
if ($resource){
    var_dump($resource->pagetitle ." | ".$resource->id);
}