Андрей

Андрей

С нами с 22 сентября 2014; Место в рейтинге пользователей: #169
Андрей
26 декабря 2015, 16:06
0
Спасибо за Ваше решение.
Андрей
26 декабря 2015, 15:55
0
Ага, спасибо. А сниппет more можете привести?
Андрей
25 декабря 2015, 17:55
1
+1
Да, не вопрос. Но отмечу, что выкладываю решение работающее, но без правок, которые предложил Сергей Шлоков.
Начнем с разметки. Используем стандартную разметку модального окна на Bootstrap 3.

<div id="mymodal" class="modal fade">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h4 class="modal-title" id="modal-title"></h4>
      </div>
      <div class="modal-body" id="content">
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
Скрипт JS, размещаем на странице, на которой выводятся анонсы статей или в шаблон.
$(document).on('click','a.read-more',function(e){
	e.preventDefault();
	var id = $(this).data('id') || 0;
	$("#content").load("/assets/ajax.php",{action:"getContent",id:id}, function(response){
		if (response) {
			var data = eval("(" + response + ")");
			$('#content').html(data.content);
			$('#modal-title').html(data.pagetitle);
			$("#mymodal").modal('show');
		}
	});
});
И теперь привожу код файла коннектора запросов ajax.php, который необходимо закинуть в папку assets.

<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_REQUEST['action'])) {exit();}

$action = $_REQUEST['action'];

define('MODX_API_MODE', true);
require_once dirname(dirname(__FILE__)).'/index.php';

$modx->getService('error','error.modError');
$modx->getRequest();
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
$modx->error->message = null;

$output = '';
switch ($action) {
    case 'getContent':
        $id = isset($_POST['id']) ? (int) $_POST['id'] : 0;
        if (empty($id)) {
            exit();
        };

        $object = $modx->getObject('modResource',$id);
	$output = array();
        $output['content'] = $object->get('content');
	$output['pagetitle'] = $object->get('pagetitle');
	$output = json_encode($output);
        $maxIterations= (integer) $modx->getOption('parser_max_iterations', null, 10);
        $modx->getParser()->processElementTags('', $output, false, false, '[[', ']]', array(), $maxIterations);
        $modx->getParser()->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations);
}

@session_write_close();
exit($output);
Андрей
25 декабря 2015, 14:22
0
Да, я тупанул, все через файл у меня))
Андрей
25 декабря 2015, 14:10
0
Ага, раскурил я как нужно было делать. Выкладываю сюда, потому что думаю у меня тут с костылями все, возможно, кто-то напишет как можно было короче решить задачу)))

JS скрипт переписал так:

$(document).on('click','a.read-more',function(e){
	e.preventDefault();
	var id = $(this).data('id') || 0;
	// Вставляем контент в тело модального окна
	$("#content").load("/assets/ajax.php",{action:"getContent",id:id}, function(response){
		if (response) {
			var data = eval("(" + response + ")");
			$('#content').html(data.content);
			$('#modal-title').html(data.pagetitle);
			$("#mymodal").modal('show');
		}
	});
});
А сниппет [[!AJAX]] поправил так:

switch ($action) {
    case 'getContent':
        $id = isset($_POST['id']) ? (int) $_POST['id'] : 0;
        if (empty($id)) {
            exit();
        };
        $object = $modx->getObject('modResource',$id);
	$output = array();
        $output['content'] = $object->get('content');
	$output['pagetitle'] = $object->get('pagetitle');
	$output = json_encode($output);
        // Парсим теги MODX
        $maxIterations= (integer) $modx->getOption('parser_max_iterations', null, 10);
        $modx->getParser()->processElementTags('', $output, false, false, '[[', ']]', array(), $maxIterations);
        $modx->getParser()->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations);
}
Андрей
25 декабря 2015, 13:25
0
А помогите, пожалуйста, мне поправить контроллер и скрипт для моей задачи. У меня прямо затык на этом месте…
Я на этом месте завис:
$output = array();
$output['content'] = $object->get('content');
$output['pagetitle'] = $object->get('pagetitle');
На выходе я получаю массив с нужными полями, а как их раскидать в модальном окне? Это уже на стороне JS надо делать?
Андрей
25 декабря 2015, 10:33
1
+2
Самое оно!
Обнаружил ряд мелких недочетов. Скорее всего даже опечаток.
1. В скрипте
$(document).on('click','#read-more',function(e){
В разметке же написан не id а класс:
<a class="read-more" data-id="5" href="#">Подробнее</a>
2. В коннекторе ajax.php проверяем на наличие action
...empty($_REQUEST['action'])...
В разметке его нет вообще.
<a class="read-more" data-id="5" href="#">Подробнее</a>
И теперь вопрос еще по коду. А как мне вместо надписи Модальное окно в самом модальном окне)) выводить заголовок статьи pagetitle?

P.S. Письмо о регистрации с Вашего сайта мне так и не пришло))
Андрей
21 декабря 2015, 22:51
0
Подскажите, пожалуйста. Я создал дополнительны поля по инструкции. Все работает хорошо. Но такой момент — у меня значения во всех полях и товарах одинаковые. Можно ли задать таким полям значения по умолчанию? как тогда нужно изменить плагин?
Андрей
21 декабря 2015, 21:56
0
Подскажите, у вас при нажатии в 1 клик просто модальное окно открывается с формой, в которой пользователь заполняет данные? Или как-то иначе все работает.
Андрей
21 декабря 2015, 15:53
+1
Лучше поздно, чем никогда))) Хотя все уже на mSearch2 сидят, но мало ли кому-то пригодится.
bezumkin.ru/sections/components/1268/
Андрей
20 декабря 2015, 15:39
0
Сделал таким образом:

<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}

if (empty($_POST['action'])) {return;}

$action = $_POST['action'];
$res = '';
switch ($action) {
	case 'NewsContent':
		$rid = filter_input(INPUT_POST,'rid');
		$params = array();
		$params['action'] = $_POST['action'];
		$params['rid'] = $rid;
		$res = $params['rid'];
		$resource = $modx->getObject('modResource',$rid);
		$output = $resource->toArray();
		$pagetitle = $resource->get('pagetitle');
		$content = $resource->get('content');
		break;
}

if (!empty($res)) {
	echo $pagetitle;
	echo "$content";
	die();
}
Но есть несколько вопросов:

1. Результат корректно выводится только если отдается через echo. return не работает.
2. Как вывести разные поля ресурса в разные div: К примеру $content в div#result, а $pagetitle в div#header
Андрей
20 декабря 2015, 10:54
0
Сейчас сделал таким образом:
Сниппет AjaxNews

<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}

if (empty($_POST['rid'])) {return;}

$res = '';
switch ($_POST['rid']) {
    case 'getResources':
        $id= filter_input(INPUT_POST,'rid');
        $resource = $modx->getObject('modResource',array('id' => $id));
        $pagetitle = $resource->get('pagetitle');
        $content = $resource->get('content');
        echo "<h1>$pagetitle</h1>";
        echo "$content";
        break;
}
if (!empty($res)) {
	die($res);
}
Вызов AjaxSnippet в шаблоне в модальном окне.

[[AjaxSnippet?
            &snippet=`AjaxNews`
            &parents=`9`
            &as_mode=`onload`
        ]]
Сами же анонсы выводятся просто

[[pdoResources?
  &parents=`9`
  &depth=`0`
  &tpl=`NewsRowTpl`
  &includeTVs=`news-image`
]]
И чанк NewsRowTpl такой:

<div class="col-xs-[[+tv.news-class]]">
    <div class="news-image col-xs-5">
        <img src="../[[+tv.news-image]]" class="img-responsive">
    </div>
    <div class="news-intro col-xs-15">
        [[+introtext]]
    </div>
    <a href="[[~[[+id]]]]" data-rid="[[+id]]" data-toggle="modal" data-target="#myModal">Подробнее</a>
</div>
Проблема в том, что сейчас все работает так: Анонсы выводятся правильно, тут ничего хитрого.
При нажатии на «Подробнее» вылезает модальное окно, в котором отображается ВСЯ страница новости (вместе с head и т.д.), как будто в iframe. Необходимо вывести лишь нужные поля, ну хотя бы поле «Содержимое».
И вторая проблема в том, что при повторном нажатии на ссылку Подробнее или на Подробнее из другой новости уже идет просто переход по ссылке.

Подскажите, где я накосячил?
Андрей
20 декабря 2015, 09:39
0
Да, принцип тот же. Вот на этой странице так реализован вывод документации. И там используется AjaxSnippet. По идее в модалку я сам распихаю, а вот как написать запрос ajaxSnippet пока не понял.
Андрей
19 декабря 2015, 23:28
0
Павел, а не могли бы привести полный код Вашей реализации. Мне понадобилось тоже самое, но не могу реализовать.
Андрей
10 декабря 2015, 15:05
0
Когда можно ждать в modstore.pro?
Андрей
10 декабря 2015, 14:54
0
Отличное решение. А подскажите, как собрать транспортный пакет из файлов на github? Иликак установить с github?
Андрей
10 декабря 2015, 12:49
0
Типа такого?
case 'Москва':$output = "в Москве"; break;
Но городов масса. получается кода будет ооочень много.
И в БД носить тоже можно. Но по идее можно ограничиться только крупными городами и областными центрами.

Подскажите как с БД связать, мне кажется будет лучше через БД.
Андрей
09 декабря 2015, 20:42
0
Да, все сделал. У Вас какая проблема?
Андрей
08 декабря 2015, 20:33
0
Журнал ошибок пуст. Вот у человечка такой же вопрос был: https://modx.pro/help/5670/ Но ему никто не ответил((
Андрей
08 декабря 2015, 19:39
0
Да, все так и делаю. Но вот меня смущает один момент — галерея фото товаров выводиться сниппетом msGallery. К нему применим параметр &includeThumbs? Я прописал, но ничего не меняется. Выводится фотка оригинальная.
По п.1 и 2 все так и сделал.