• Почему не работает код?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Вот тут вы выводите видеоматериалы
    {foreach $video_material as $video}
      {$video.video_url_migx} 
    {/foreach}

    А вот тут вы зачем-то пытаетесь слепить строку из массива
    {set $content_block = $content_block ~ $video_material ~ $_modx->getPlaceholder("pages2")}

    Я думаю что у вас выводится в таком порядке
    1. {foreach $video_material as $video}
    {$video.video_url_migx}
    {/foreach}
    2. {$menu_block}
    3. {$content_block}
    Наверное стоит сделать так
    {set $materials = ''}
    {foreach $video_material as $video}
        {set $material = $materials ~ $video.video_url_migx}
    {/foreach}
    Ответ написан
    Комментировать
  • Как вывести на странице migx в fenom?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    {set $video = 91 | resource : "main_video_materials" | fromJSON}
                   {if $video}
                      {foreach $videos as $video}
                            {$video['video_url_migx']}
                           {/foreach}
    {/if}
    Ответ написан
    Комментировать
  • Как вставить api ключ в яндекс карты в дополнение mscDistance?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    В общем вам надо найти в папке core/components папку с этим компонентом и там найти, вероятно в сниппите или классе, откуда берется ключ, скорее всего это будет системная настройка, вот её вам надо будет создать и поместить туда ваш ключ. А автор обязательно ответит.
    Ответ написан
    Комментировать
  • Как к swiperjs применить wow.js?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    У swiper.js есть метод update, вероятно стоит попробовать после того как анимация отработает обновить слайдер.
    Ответ написан
  • Как сделать, чтобы футер появлялся ( из под контактов), а не просто показывался (как доскролили)?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    выставить ему в css position: fixed; bottom:0; left:0;width:100%
    Ответ написан
  • Как изменить значение суммы товаров в корзине minishop2 modx revo?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Примерно так
    <?php
    switch ($modx->event->name) {
    case 'msOnAddToCart':
        $tmp = $cart->get();
       if($tmp['total_cost'] < 5000){
            $tmp[$key]['total_cost'] =  $tmp[$key]['total_cost'] + 300;
            $cart->set($tmp);
        }
        break;

    Ну и документацию почитайте
    Ответ написан
    Комментировать
  • Как написать условие ModX?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    {if $_modx->resource.id == 1}
    {$_modx->config.site_name}
    {/if}
    Ответ написан
    Комментировать
  • Как избавиться от тега курсив в дополнительных полях пользователя?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Никак, это баг. Ждите пока пофиксят.
    Ответ написан
    Комментировать
  • Как создать новую секцию в MODX Revo 2.8?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Найдите в админке ресурс у которого в скобках справа написано 12, скопируйте, вот сюда parents' => ? вместо вопроса напишите id нового ресурса, внутри будут другие документы, по очереди открывайте их на редактирование и меняйте лицензию на нужную картинку. Вариант который я описал ужасный, но если вы плохо разбираетесь в modx пойдет, тем более кто-то же уже создал вам таким образом раздел с лицензиями, зачем-то.
    Ответ написан
    Комментировать
  • Как создать товар Minishop2 через базу данных?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Готового решения нет, но схема такая, отлавливаете форму, получаете из неё данные, создаёте ресурс, загружаете файлы в галерею, заполняете нужные поля. Вот мой вариант решения. Форма отправляется через AjaxForm + FormIt вот вызов
    {'!AjaxForm' | snippet:[
                'snippet' =>'custFranchiseEdit',
                'form' =>'@FILE chunks/forms/editFranchiseForm.html',
                'customValidators' => 'checkFileInForm',
                'validate'=>'
                    longtitle:required:minLength=^3^,
                    introtext:required:minLength=^60^:maxLength=^1000^,
                    description:required:maxLength=^130^,
                    promo:maxLength=^60^,
                    contact_person:required,
                    phone_number:required,
                    payback:required:isNumber,
                    foundation_date:required:isNumber:minLength=^4^:maxLength=^4^,
                    price:required:isNumber:minValue=^1^,
                    lump_sum:isNumber,
                    franchise_firm:isNumber,
                    own_firm:isNumber,
                    catalog_img:checkFileInForm,
                    logo_fr:checkFileInForm,
                    presentation:checkFileInForm,
                    gallery:checkFileInForm,
                    region_control:required,
                    email_address:required:email'
                'placeholderPrefix' =>'fran.'
                ]}

    <?php
    $result = $modx->runSnippet('FormIt', $scriptProperties);
    foreach($modx->placeholders as $key => $ph){
        if(strpos($key, 'fran.error.') === 0){
            $placeholders[$key] = $ph;
        } 
    }
    
    //$modx->log(1, print_r($_POST,1));
    if(!count($placeholders) && $_POST['createdby']){
        foreach($_POST as $key => $value){
            if($key != 'tv' && !is_array($value) && $key != 'content' && $key != 'introtext'){
                $_POST[$key] = strip_tags($value);
            }
            if(strpos('date', $key) !== false && $key != 'foundation_date'){
                 $_POST[$key] = strtotime($_POST[$key]);
            }
            
        }
       
        if($_POST['id'] != 'false'){
            $resource = $modx->getObject('msProduct',  array('id' => $_POST['id']));
        }else{
            $resource = $modx->newObject('msProduct');
        }
        
        $resource->fromArray($_POST);
        $resource->setTVValue('foundation_date', $_POST['foundation_date']);
        $resource->save();
        
        if($_POST['flag'] == 'fran'){
            $ranges = $modx->getCollection('modResource', array('parent' => 143));
            foreach($ranges as $range){
                $min = $range->getTVValue('invest_min');
                $max = $range->getTVValue('invest_max');
                if($_POST['price'] <= $max && $_POST['price'] >= $min){
                    $resource->set('invest_vol', $range->get('longtitle'));
                }
            }
            
            $createdbyProfile = $modx->getObject('modUserProfile', ['internalKey' => $resource->get('createdby')]); 
            $extended = $createdbyProfile->get('extended');
            $extended['category'] = $_POST['parent'];
            $extended['franchise'] = $resource->get('id');
            $createdbyProfile->set('extended', $extended);
            $createdbyProfile->save();
            
            $articles = $modx->getObject('modResource', 75);
            $tagList = json_decode($articles->getTVValue('taglist'),1);
            $tagListCount = count($tagList);
            $bool = true;
            foreach($tagList as $item){
                if($item['tagname'] == ucfirst(trim($_POST['longtitle']))){
                    $bool = false;
                }
            }
            
            if($bool){
                $tagList[$tagListCount] = array(
                'MIGX_id' => $tagListCount + 1,
                'tagname' => ucfirst(trim($_POST['longtitle'])),
                'popular' => ''
                );
                $articles->setTVValue('taglist', json_encode($tagList, JSON_UNESCAPED_UNICODE));
                $articles->save();
            }
        }
        
        if(count($_FILES)){
            foreach($_FILES as $key => $file){
                $modx->runSnippet('removePreviousFiles', array('key' => $key));
                $uploadFiles = $modx->runSnippet('loadUserFiles', array('key' => $key, 'id' => $resource->get('id')));
                switch($key){
                    case 'gallery':
    
                        $modx->runSnippet('loadInGallery', array('gallery' => $uploadFiles, 'id' => $resource->get('id')));
                        break;
                    default:
                        $search = MODX_BASE_PATH . $modx->getOption('user_files_path');
                        $resource->setTVValue($key, str_replace($search, '', $uploadFiles[0]));
                        break;
                }
                $resource->save();
            }
        }
        
        if($_POST['tv']){
            foreach($_POST['tv'] as $key => $value){
                if($key == 'features_fr' || $key == 'steps_fr'){
                    foreach($value as $k => $v){
                        if($v['text']){
                            $v['text'] = strip_tags($v['text']);
                            $v['MIGX_id'] = $k + 1;
                            $value[$k] = $v;
                        }else{
                            unset($value[$k]);
                        }
                    }
                    $resource->setTVValue($key, json_encode($value, JSON_UNESCAPED_UNICODE));
                }else{
                    $resource->setTVValue($key, strip_tags($value));
                }
                $resource->save();
            } 
        }
         
        if($resource){
            $cacheKey = $resource->getCacheKey();
            $modx->cacheManager->refresh(array(
                'resource' => array('key' => $cacheKey),
            ));
        }
    
         if($_POST['flag'] = 'fran'){
            $pdoTools = $modx->getService('pdoTools');
            $html = $modx->runSnippet('msProducts', [
                            'parents' => 121,
                            'tpl' => '@FILE chunks/profiles/conferencePreview.html',
                            'limit' => 9999,
                            'sortby' => 'createdon',
                            'sortdir' => 'DESC',
                            'where' => ['createdby' => $_POST['createdby']],
                            'includeTVs' => 'conf_logo,startdate,enddate',
                            'user' => $_POST['createdby'],
                            'showUnpublished' => 1,
                            'showDeleted' => 0,
                            'showHidden' => 1,
                            ]);
        }
            
       return $AjaxForm->success('Данные сохранены', array('success' => 'Данные сохранены', 'html' => $html, 'flag' => 'fran'));
    }else{
        return $AjaxForm->error('В форме содержатся ошибки', array('error' => $placeholders));    
    }

    Код сниппета loadInGallery для загрузки фотографий в галерею
    <?php
    if(!$gallery){return false;}
    if(!$id){return false;}
    $resource = $modx->getObject('msProduct', $id);
    if($files = $resource->getMany('Files')){
        foreach($files as $f){
            $f->remove();
        }
    }
    
    foreach ($gallery as $v) {
        if (empty($v)) {continue;}
    	$image =  $v;
    	if (!file_exists($image)) {
    		$modx->log(modX::LOG_LEVEL_ERROR, "Could not import image \"$v\" to gallery. File \"$image\" not found on server.");
    	}
    	else {
    		$response = $modx->runProcessor('gallery/upload',
    		array('id' => $id, 'name' => $v, 'file' => $image),
    		array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
    	    	);
    		if ($response->isError()) {
    			$modx->log(modX::LOG_LEVEL_ERROR, "Error on upload \"$v\": \n". print_r($response->getAllErrors(), 1));
    		}
    		else {
    			$modx->log(modX::LOG_LEVEL_INFO, "Successful upload  \"$v\": \n". print_r($response->getObject(), 1));
    		}
    	}
    }
    Ответ написан
    Комментировать
  • Почему не работает e.preventDefault();?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Вы повесили обработчик на тэг body, почему же вы считаете что кликаете именно по ссылке, а не по соседнему или родительскому элементу? Вполне может быть, что если сделать так
    let links document.querySelectorAll('.Nouxouxv a');
    for(i = 0; i < links.length; i++){
       links[i].addEventListener('click', function(e){
           e.preventDefault();
           window.open(e.target.href, '_blank');
      }, true);
    }

    будет работать лучше.
    Ответ написан
    7 комментариев
  • Как можно реализовать перехват редиректов и показ собственного модального окна?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Не благодарите, умение гуглить дано не каждому js отловить уход со страницы
    Ответ написан
  • Как на чистом Javascript сделать смещение при клике по якорной ссылке?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    const anchors = document.querySelectorAll('a[href*="#"]');
        for (let anchor of anchors) {
            if (anchor.getAttribute('href').indexOf('http') == -1) {
                anchor.addEventListener('click', function (e) {
                    e.preventDefault();
                    const blockID = anchor.getAttribute('href').substr(1);
                    if (document.getElementById(blockID)) {
                        document.getElementById(blockID).scrollIntoView({
                            behavior: 'smooth',
                            block:  'center'
                        });
                    }
                });
            }
        }

    Этот код вешает плавный скролл на все якоря на страницы.
    Подробности в документации
    Ответ написан
    Комментировать
  • Как настроить предварительную загрузку ключевых запросов?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Попробуйте в css установить для этих шрифтов в правиле @font-face свойство font-display:swap;
    Ответ написан
    5 комментариев
  • Как получить ID товаров, добавленных в корзину?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    В корзину приходит два массива $products и $total, соответственно чтобы получить id товара надо в цикле перебрать массив $products примерно
    {foreach $products as $product}
    {$product.id}
    Чтобы увидеть все данные
    {$product | print_r}
    {/foreach }
    Ответ написан
    1 комментарий
  • При передаче строки в конструктор у строки пропадают обратные слэши. Как это предотвратить?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    В этой строке 'vk.com' обратный слеш экранирует двойные кавычки, когда вы вставляете строку они естественно пропадают, выполнив свою роль.
    Ответ написан
  • Можно ли сделать отправку данных с почты с javascript?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Отправлять данные на почту можно только с сервера, значит вам нужен какой-либо серверный язык программирования, например node.js
    Ответ написан
  • Как отменить и снова повесить клик на ссылку?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    document.location.href = e.target.getAttribute('href');
    Ответ написан
    Комментировать
  • Как добавить объект в файл json?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Если это файл, то его нужно сначала прочитать, потом конвертировать строку в JSON и только потом с ним работать.
    Ответ написан
    Комментировать
  • Как проверять базу на javascript?

    Shev_Art_V
    @Shev_Art_V
    Занимаюсь разработкой сайтов на Modx Revolution
    Если вкратце, то выкиньте эту мысль из головы, нагружать сервер ajax-запросами каждую минуту это очень плохо для производительности сервера. Если вам нужно по инициативе сервера производить какие-то действия на фронте вам нужен протокол websocket.
    Ответ написан
    Комментировать