Загрузка материала в модальное окно
Добрый день!
Подскажите, что-то не могу разобраться. как сделать так, чтобы определённые материал сайта подгружался в модальном окне. Хочу сделать вывод новостей. Сами анонсы как обычно, а вот пр нажатии по кнопке «Подробнее» хочу, чтобы вылезало модальное окно, а в нем сам материал необходимой мне новости отображался.
Не пойму как надо сделать вызов AjaxSnippet, чтобы анонсы подгружались а по клику по ссылке — в модальном окне грузилось все остальное.
Подскажите, что-то не могу разобраться. как сделать так, чтобы определённые материал сайта подгружался в модальном окне. Хочу сделать вывод новостей. Сами анонсы как обычно, а вот пр нажатии по кнопке «Подробнее» хочу, чтобы вылезало модальное окно, а в нем сам материал необходимой мне новости отображался.
Не пойму как надо сделать вызов AjaxSnippet, чтобы анонсы подгружались а по клику по ссылке — в модальном окне грузилось все остальное.
Комментарии: 99
AjaxSnippet вам тут не поможет. Если вы не знаете javascript, то вам вряд ли объяснишь — нужно делать уже готовое решение, а если знаете, то вот материал в помощь.
может это то? modstore.pro/packages/ecommerce/quickview
Да, принцип тот же. Вот на этой странице так реализован вывод документации. И там используется AjaxSnippet. По идее в модалку я сам распихаю, а вот как написать запрос ajaxSnippet пока не понял.
Обрати внимание на jQuery-плагин MagnificPopup, аналог LightBox. У него есть возможность вывода материала с подгрузкой по AJAX. По крайней мере, у меня подобное срабатывало без проблем. Можно сделать билд только с AJAX, если остальные функции не нужны.
Сейчас сделал таким образом:
Сниппет AjaxNews
При нажатии на «Подробнее» вылезает модальное окно, в котором отображается ВСЯ страница новости (вместе с head и т.д.), как будто в iframe. Необходимо вывести лишь нужные поля, ну хотя бы поле «Содержимое».
И вторая проблема в том, что при повторном нажатии на ссылку Подробнее или на Подробнее из другой новости уже идет просто переход по ссылке.
Подскажите, где я накосячил?
Сниппет 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. Необходимо вывести лишь нужные поля, ну хотя бы поле «Содержимое».
И вторая проблема в том, что при повторном нажатии на ссылку Подробнее или на Подробнее из другой новости уже идет просто переход по ссылке.
Подскажите, где я накосячил?
Сделал таким образом:
1. Результат корректно выводится только если отдается через echo. return не работает.
2. Как вывести разные поля ресурса в разные div: К примеру $content в div#result, а $pagetitle в div#header
<?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
Вот как вариант.
Самое оно!
Обнаружил ряд мелких недочетов. Скорее всего даже опечаток.
1. В скрипте
P.S. Письмо о регистрации с Вашего сайта мне так и не пришло))
Обнаружил ряд мелких недочетов. Скорее всего даже опечаток.
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. Письмо о регистрации с Вашего сайта мне так и не пришло))
1. Опечатался, спасибо. Конечно нужен класс, ведь таких ссылок на странице несколько.
2. 'action' посылается в скрипте (см. «Шаг 2»). В принципе только для этого случая aсtion можно не использовать. Но это будет полезно для универсального контроллера, так как на него можно слать другие ajax-запросы для других действий.
П.С. А почта могла в спам попасть. Как минимум я и еще двое зарегистрировались без проблем.
2. 'action' посылается в скрипте (см. «Шаг 2»). В принципе только для этого случая aсtion можно не использовать. Но это будет полезно для универсального контроллера, так как на него можно слать другие ajax-запросы для других действий.
А как мне вместо надписи Модальное окно в самом модальном окне)) выводить заголовок статьи pagetitle?Для этого нужно доработать и ajax.php (чтобы возвращал и контент и заголовок) и javascript (чтобы разобрать результат запроса и расставить всё по местам). А load() заменить на post(). Т.е. это для самостоятельного примера.
П.С. А почта могла в спам попасть. Как минимум я и еще двое зарегистрировались без проблем.
А помогите, пожалуйста, мне поправить контроллер и скрипт для моей задачи. У меня прямо затык на этом месте…
Я на этом месте завис:
Я на этом месте завис:
$output = array();
$output['content'] = $object->get('content');
$output['pagetitle'] = $object->get('pagetitle');
На выходе я получаю массив с нужными полями, а как их раскидать в модальном окне? Это уже на стороне JS надо делать?
Ага, раскурил я как нужно было делать. Выкладываю сюда, потому что думаю у меня тут с костылями все, возможно, кто-то напишет как можно было короче решить задачу)))
JS скрипт переписал так:
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);
}
Все проще.
В сниппете (хотя через файл будет быстрее) в массив нужно добавить признак успешности success=true
В сниппете (хотя через файл будет быстрее) в массив нужно добавить признак успешности success=true
$output['success'] = true;
// И выводить в JSON
exit($modx->toJSON($output));
А в файле скрипта функцию load() заменить на post()$.post("/assets/ajax.php",{action:"getContent",id:id}, function(response) {
response.success = response.success || false;
if (response.success) {
$('.modal-title','#mymodal').text(response.pagetitle);
$('#content','#mymodal').html(response.content);
$("#mymodal").modal('show');
}
}, 'json');
Да, я тупанул, все через файл у меня))
Сможете выложить полное решение в тело Заметки?
Да, не вопрос. Но отмечу, что выкладываю решение работающее, но без правок, которые предложил Сергей Шлоков.
Начнем с разметки. Используем стандартную разметку модального окна на Bootstrap 3.
Начнем с разметки. Используем стандартную разметку модального окна на 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);
Приветствую, Андрей.
А как выводить в модальное окно доп. поля c изображением, к примеру tv.news_pic?
А как выводить в модальное окно доп. поля c изображением, к примеру tv.news_pic?
В файле-коннекторе получаем значение tv поля, например, так:
А уже в скрипте JS выводим на свой вкус, к примеру:
$output['img'] = $object->getTVValue('news_pic');
Таким образом, у Вас в массиве $output будет и значение TV параметра.А уже в скрипте JS выводим на свой вкус, к примеру:
var img = data.img; //Заводим в переменную JS путь к картинке
$('#content').prepend('<img src="'+img+'" id="modal-img"/>') //Вставляем изображение в тело модального окна
$("#modal-img").css({ //Прописываем свойства для созданного изображения
'float' : 'left',
'margin' : '0 10px 5px 0',
'width' : '100px',
});
Спасибо большое! Оперативность ответа на уровне.
себе на заметку.
Для такого есть раздел избранное
Приветствую!
У меня выводится вот это
— 1. Создал файл /assets/ajax.php
В него поместил вышеуказанный код:
3. Подключен JS
4. На странице
У меня выводится вот это
{"content":"","pagetitle":"\u041a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440\u044b"}
Что я делаю не так?— 1. Создал файл /assets/ajax.php
В него поместил вышеуказанный код:
<?php
// Если запрос не AJAX или не передано действие, выходим
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);
2. Подключен jQuery3. Подключен JS
$(document).on('click','.read-more',function(e){
e.preventDefault();
var id = $(this).data('id') || 0;
// Вставляем полученный контент в HTML блок с id="content"
$("#content").load("/assets/ajax.php",{action:"getContent", id:id});
});
4. На странице
<a class="read-more" data-id="42" href="#content">Подробнее</a>
<div id="content"></div>
Он у Вас возвращает ответ в виде массива json. Вам нужно его разобрать.
Каким образом это можно сделать? У тебя так же работает или!?
Вам нужно его разобрать. по идее все верно — ведь в коде есть строка
$output = json_encode($output);
А в том коде что Вы привели — вы не разбираете JSON массив. Посмотрите в моем коде это есть:$("#content").load("/assets/ajax.php",{action:"getContent",id:id}, function(response){
if (response) {
var data = eval("(" + response + ")"); //Вот тут раскидываем JSON массив
$('#content').html(data.content);
$('#modal-title').html(data.pagetitle);
$("#mymodal").modal('show');
}
});
К сожалению нет, тоже самое =(
Я не использую бутстрап, по этому немного другие данные. Результата нет
Я не использую бутстрап, по этому немного другие данные. Результата нет
$(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 + ")"); //Вот тут раскидываем JSON массив
$('#txt').html(data.content);
$('#title').html(data.pagetitle);
}
});
});
Вроде разобрался, заработало!
Дело не в бутстрапе, а в том что вы на выходе после файла ajax.php получаете json массив. И Вам его нужно разобрать, чтобы вставлять отдельно название, контент и т.д.
Вот команда eval("(" + response + ")"); позволяет это сделать.
Вот команда eval("(" + response + ")"); позволяет это сделать.
Только оказывается это не то, что мне нужно.
Сейчас при загрузке страницы эти данные (Ajax) подгружаются на эту же страницу.
Мне же нужно было, что бы только при клике на ссылку они подгрузились.
Где можно посмотреть, что бы подходило под мои задачи не знаешь?
Сейчас при загрузке страницы эти данные (Ajax) подгружаются на эту же страницу.
Мне же нужно было, что бы только при клике на ссылку они подгрузились.
Где можно посмотреть, что бы подходило под мои задачи не знаешь?
Если тебе нужен переход по ссылке, то делай переход с передачей параметров. А там уже выводи…
Если тебе нужен переход по ссылке, то делай переход с передачей параметров. А там уже выводи…Можно развернуть ответ, не совсем понял мыль!
Сорри, после гулянки, голова плохо соображает =(
Вот сайт, это на Битриксе, мне нужно сделать такое же!
_http://pro.bitbitrix.ru/catalog/odezhda_i_obuv/
Когда наводишь на картинку товара, появляется кнопка, нажимаешь на нее, появляется модальное окно с данными этого товара. Тут прикол в чем, что данные в модальном окно подгружается только тогда, когда ты их вызываешь.
На этой странице реализовано что данные уже при загрузке страницы загружаются, что для меня не вариант.
Ну так ты тоже самое и сделал.
Тебе нужно получить нужные поля — например, картинку, название, цену.
Вот скриптов в файле ajax.php из получаешь.
В итоге в скрипт JS тебе падает JSON с этими полями
Ты его разбираешь и просто путем подстановки в заранее сверстанный макет разметки подставляешь:
Ну а на последнем этапе показывай саму модалку .modal('show')
Тебе нужно получить нужные поля — например, картинку, название, цену.
Вот скриптов в файле ajax.php из получаешь.
В итоге в скрипт JS тебе падает JSON с этими полями
Ты его разбираешь и просто путем подстановки в заранее сверстанный макет разметки подставляешь:
$('#txt').html(data.content); // Здесь в блок с ID txt вставляешь то что в поле content
$('#title').html(data.pagetitle);// Здесь в блок с ID title вставляешь то что в поле title
Таким образом сама модалка у тебя пустая, без каких-либо заранее выводимых данных. Их ты получаешь только после нажатия на ссылку, после чего начинает работать скрипт и собирать данные.Ну а на последнем этапе показывай саму модалку .modal('show')
Да, я был не прав, говорю же после гулянки. То что ты выше написал, я сделал, все уже реализовал, вот ссылка посмотри, потом удалю
_http://remstroigrupp.ru/page под заголовком ссылка подробнее (тестовый вариант без оформления)
Просто я изначально запустил, посмотрел, а уже потом залез и посмотрел код, что у меня есть.
Тут наверное проблема в другом, что после закрытия модального окна, подгруженные данные остается на странице. К примеру у того же Битрикса он исчезает/удаляется _http://pro.bitbitrix.ru/catalog/odezhda_i_obuv/
Как это можно реализовать, или это уже лишнее?
_http://remstroigrupp.ru/page под заголовком ссылка подробнее (тестовый вариант без оформления)
Просто я изначально запустил, посмотрел, а уже потом залез и посмотрел код, что у меня есть.
Тут наверное проблема в другом, что после закрытия модального окна, подгруженные данные остается на странице. К примеру у того же Битрикса он исчезает/удаляется _http://pro.bitbitrix.ru/catalog/odezhda_i_obuv/
Как это можно реализовать, или это уже лишнее?
Сделай после закрытия окна очистку полей .empty()
Спасибо!
… а как указать, что вот оно закрылось? а то у меня все в теле получается =(
… а как указать, что вот оно закрылось? а то у меня все в теле получается =(
Например, так .fadeOut(); или так .hide();
Андрей ты меня еще в больший в ступор ввел =(
Не будет наглостью, если я попрошу пример написать? Спасибо
Не будет наглостью, если я попрошу пример написать? Спасибо
У тебя все это дело в модалке открывается?
У нее есть например id=«modal»
Значит, закрываешь так
У нее есть например id=«modal»
Значит, закрываешь так
$(#modal).hide();
Нет, не отрабатывает, к сожалению =(
и .hide(); не пойдет, нужно что бы удаляло/очищало данные в полях, а не скрывало (display: none;)
и .hide(); не пойдет, нужно что бы удаляло/очищало данные в полях, а не скрывало (display: none;)
hide() ты закрываешь модалку, а после того, как она закрылась, тебе нужно очистить поля. Если сначала очистить а потом закрыть, то пользователь увидит, что поля очистились.
Закрываешь hide()
а потом
Закрываешь hide()
а потом
$('#txt').empty();
$('#title').empty();
Ни как не хочет, display: none присваивает а поля ни очищает
$(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);
}
});
$('modal-page').hide(function(){
$('#content').empty();
$('#modal-title').empty();
});
});
$('#content').empty(); — может здесь запятая в конце а не точка с запятой должна быть?
Не работает =( Попробуй у себя!
Я на даче))
$('#content').html('');
Если не сработает — проверь, что скрипт вообще доходит до этой строки:
alert ('test');
Да, либо так))
Мда, незадача! alert раньше срабатывает
т.е. сперва алерт, потом открывает модальное окно!
т.е. сперва алерт, потом открывает модальное окно!
Кинь скрипт полностью, чтобы было понятно как у тебя там напсиано
$(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);
}
});
// alert ('test'); - тут тестил
$('modal-page').hide(function(){
$('#content').empty();
$('#modal-title').empty();
});
});
чето я алерта не вижу
обновил
$('modal-page').hide(function(){
alert ('test');
$('#content').html('');
$('#modal-title').html('');
});
— сделай вот так и посмотри, будет ли срабатывать алерт при закрытии.
и да, алерт у тебя не там и не для того. Тебе нужно проверить срабатывает ли он при зарытии
Ну я чего-то вообще не вижу функции открытия модалки — она где?
По идее надо после
По идее надо после
$('#modal-title').html(data.pagetitle);
хотя может я туплю?)
Вооот! С этого и нужно было наверное капать )))
Моделька у меня на FancyBox
Моделька у меня на FancyBox
$(document).ready(function() {
$(".read-more").fancybox({
maxWidth : 800,
maxHeight : 600,
fitToView : false,
width : '70%',
height : '70%',
autoSize : false,
closeClick : false,
openEffect : 'none',
closeEffect : 'none'
});
});
или я что то опять не понял $(document).ready(function() {
$(".read-more").fancybox({
maxWidth : 800,
maxHeight : 600,
fitToView : false,
width : '70%',
height : '70%',
autoSize : false,
closeClick : false,
openEffect : 'none',
closeEffect : 'none',
afterClose : function(){
$('#content').html('');
$('#modal-title').html('');
}
});
});
Если вот так, то он открывает модальное окно, потом срабатывает алерт
$(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);
}
});
$('#modal-page').hide(function(){
alert ('test');
$('#content').empty();
$('#modal-title').empty();
});
});
Потому что у тебя все завязано на одной функции, по клику на ссылку.
А закрытие окна отсюда вообще убери — тебе Макс написал как нужно оформить закрытие модалки.
А закрытие окна отсюда вообще убери — тебе Макс написал как нужно оформить закрытие модалки.
Приветствую!
Андрей, а обычный TV ты выводил? У меня почему то не хочет, так же не работает выше указанный код на картинку?
1) ajax.php
3) JS
Андрей, а обычный TV ты выводил? У меня почему то не хочет, так же не работает выше указанный код на картинку?
1) ajax.php
<?php
// Если запрос не AJAX или не передано действие, выходим
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['pagetitle'] = $object->get('pagetitle');
$output['content'] = $object->get('content');
$output['img'] = $object->getTVValue('tplImage');
$output['h1'] = $object->getTVValue('tplH1');
$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);
2) jQuery3) JS
$(document).on('click','a.quick-preview',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 + ")");
$('#title').html(data.pagetitle);
$('#h1').html(data.h1);
$('#content').html(data.content);
var img = data.img;
$('#modal-img').prepend('<img src="'+img+'" class="modal-img"/>')
$(".modal-img").css({
'width' : '100%',
});
}
});
});
4) Разметка<a href="#modal-page" data-id="[[+id]]" class="favorites-button quick-preview">Предпросмотр</a>
<div id="modal-page">
<div class="col-md-6">
<div id="modal-img"></div>
</div>
<div class="col-md-6">
<h1 id="title"></h1>
<h2 id="h1"></h2>
<div id="content"></div>
</div>
</div>
Простое TV вообще не выводит, а с картинкой «undefined»
Сейчас не могу посмотреть как я делал, но картинку выводил. Напомни завтра скину как делать, если сам не раскуришь)))
Возможно, через data параметры передавал. Или в скрипте их получал. Не помню…
Возможно, через data параметры передавал. Или в скрипте их получал. Не помню…
Ок, напомню!
Андрей — напоминаю тебе посмотреть как у тебя выводятся обычные TV и картинки =)!
Спасибо!
Спасибо!
Как называется у тебя TV поле с картинкой? У меня оно называется image
Эта строка получает его значение
Дальше уже в JS ты разбираешь JSON
Чтобы тестить php код — установи дополнение Console — там ты сможешь протестировать свой код, получить все необходимые значения и быть уверенным, что в той части (PHP) все правильно работает.
Эта строка получает его значение
$output['img'] = $object->getTVValue('image');
В результате ты получишь json, где одним из значений будет путь к картинке.Дальше уже в JS ты разбираешь JSON
var img = data.img;
$('#modal-img').prepend('<img src="'+img+'" class="modal-img"/>') //В разметке должен быть блок с ID=modal-img
Здесь тебе есть смысл добавить строкуconsole.log(img);
Это выведет тебе в консоль значение IMG — ты уже тут увидишь, правильно ли у тебя все передается-получается.Чтобы тестить php код — установи дополнение Console — там ты сможешь протестировать свой код, получить все необходимые значения и быть уверенным, что в той части (PHP) все правильно работает.
Максим Кузнецов +1 спасибо! Победили )))
del
Так бы и сказал. Максим все правильно написал.
Таки да ))) Спасибо парни за помощь!
Приветствую!
С помощью ваших советов удалось сделать загрузку Pagetitle, introtext и price. Делаю что-то вроде быстрого просмотра товара в модальном окне непосредственно из каталога, используется minishop2.
Как туда добавить другие поля?
нужны еще:
Картинки товара
свойства товара (favorite, popular, new, свои плагины)
кнопку добавления в корзину
или это можно сделать как-то иначе?
пробую еще так
[[!msProducts?
&resources=`13`
&tpl=`msProduct.content`
&includeThumbs=`340x476`
]]
выводятся свойства, цена, название. но как туда передавать id ресурса не знаю, и не показываются картинки (This resource is not instance of msProduct class.) кнопка тоже не работает
С помощью ваших советов удалось сделать загрузку Pagetitle, introtext и price. Делаю что-то вроде быстрого просмотра товара в модальном окне непосредственно из каталога, используется minishop2.
Как туда добавить другие поля?
нужны еще:
Картинки товара
свойства товара (favorite, popular, new, свои плагины)
кнопку добавления в корзину
или это можно сделать как-то иначе?
пробую еще так
[[!msProducts?
&resources=`13`
&tpl=`msProduct.content`
&includeThumbs=`340x476`
]]
выводятся свойства, цена, название. но как туда передавать id ресурса не знаю, и не показываются картинки (This resource is not instance of msProduct class.) кнопка тоже не работает
нужны еще:Картинка как выводится — стандартно для Minishop?
Картинки товара
свойства товара (favorite, popular, new, свои плагины)
кнопку добавления в корзину
Свойства получай как обычные значения товара minishop
Кнопка просто верстка — без всякой динамики
Свойства товара удалось получить так же
кнопка получается не функциональной
млжет этой форме нужно как-то передать ID товара?
$output['popular'] = $object->get('popular');
$output['favorite'] = $object->get('favorite');
$output['gipur'] = $object->get('gipur');
если чекбокс выбран – возвращает true. как сделать чтобы работало так же как плейсхолдер:[[+popular:isnot=`0`:then=`<span class="hit">Хит</span>`:else=``]]
?кнопка получается не функциональной
<button class="button button_green" type="submit" name="ms2_action" value="cart/add"><span>[[%ms2_frontend_add_to_cart]]</span></button>
пробую внутри модального окна вставить форму из чанка tpl.msProducts.row<form method="post" class="ms2_form">
<input type="hidden" name="id" value="[[+id]]">
<input type="hidden" name="count" value="1">
<input type="hidden" name="options" value="[]">
<div class="price">[[+price]] [[%ms2_frontend_currency]]</div>
<button class="button button_green" type="submit" name="ms2_action" value="cart/add"><span>[[%ms2_frontend_add_to_cart]]</span></button>
</form>
но так же не работает, товар в корзину не добавляется. Вместо «Добавить в корзину» – ms2_frontend_add_to_cart.млжет этой форме нужно как-то передать ID товара?
value="[[+id]]"
картинки выводятся стандартно<img src="[[+340x476:default=`/assets/components/minishop2/img/web/ms2_medium.png`]]" />
Модалку выводишь по ссылке?
Передай вместе с ней data параметр с ID data-uid=[[+id]]
а в JS так:
Передай вместе с ней data параметр с ID data-uid=[[+id]]
а в JS так:
var id = $(this).data('uid');
да, по ссылке, вывожу так:
<a class="read-more" data-id="[[+id]]" href="#modal-page">Быстрый просмотр</a>
в 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.introtext);
$('#modal-title').html(data.pagetitle);
$('#price').html(data.price);
...
Ну так назад ты id не возвращаешь…
как его вернуть?)
В ajax.php пихни его в массив $output. Здесь получишь в JS как
var id = data.id;
Ну и потом в value = "'+id+'"
получилось так:
еще подскажи пожалуйста как вывести сюда картинки minishop?
$("input[name='id']").val(data.id)
спасибо!еще подскажи пожалуйста как вывести сюда картинки minishop?
Точно не помню, как делал. Сейчас не у компа.
Но можно передать также data параметром на крайняк:
Если на выходных напомнишь, напишу как получить картинку minishop
Но можно передать также data параметром на крайняк:
data-pimg="[[+thumb]]"
Ну а потом по той же схеме.Если на выходных напомнишь, напишу как получить картинку minishop
Параметром не получилось. Ошибаюсь, по незнанию, наверно в php здесь
$pimg = isset($_POST['pimg'])? (int) $_POST['pimg']: 0;
полный код
$pimg = isset($_POST['pimg'])? (int) $_POST['pimg']: 0;
полный код
$id = isset($_POST['id']) ? (int) $_POST['id'] : 0;
$pimg = isset($_POST['pimg']) ? (int) $_POST['pimg'] : 0;
if (empty($id)) {
exit();
};
$object = $modx->getObject('modResource',$id);
$output = array();
$output['id'] = $id;
$output['introtext'] = $object->get('introtext');
$output['pagetitle'] = $object->get('pagetitle');
$output['new'] = $object->get('new');
$output['pimg'] = $object->get('pimg');
в JS здесь («src»,«data.pimg»);var id = $(this).data('id') || 0;
var pimg = $(this).data('pimg') || 0;
$("#content").load("assets/ajax.php",{action:"getContent",id:id}, function(response){
if (response) {
var data = eval("(" + response + ")");
$('#content').html(data.introtext);
$('#modal-title').html(data.pagetitle);
$('#new').html(data.new);
$("input[name='id']").val(data.id);
$('#pimg').html(data.pimg);
$("#image").attr("src","data.pimg");
как правильно? как делал ты?
так а зачем ты приводишь переменную картинки к integer?
Оставляешь так:
Оставляешь так:
$pimg = isset($_POST['pimg']);
...
$output['pimg'] = $pimg;
А в JS вроде все правильно.$("#content").load(«assets/ajax.php»,{action:«getContent»,id:id},ты здесь не отправляешь pimg
$("#content").load("assets/ajax.php",{action:"getContent",id:id,pimg:pimg}, function(response){
теперь выдает true, а не /kupalnik/assets/images/products/13/80x112/3.jpg var pimg = $(this).data('pimg') || 0;Попробуй замени на
var pimg = $(this).data('pimg');
нет, по-прежнему true.
Чего-то он не так передает, как будто тип данных не тот.
Скинь мне все скрипты, я у себя попробую потестить.
Кусок html, JS, php
Скинь мне все скрипты, я у себя попробую потестить.
Кусок html, JS, php
<a class="read-more" data-id="[[+id]]" data-pimg="[[+thumb]]" href="#modal-page">Быстрый просмотр</a>
<div id="modal-page">
<img src="" id="image">
<div id="modal-title"></div>
<div id="content"></div>
<div id="price"></div>
<div id="oldprice"></div>
<div id="new"></div>
<div id="popular"></div>
<div id="favorite"></div>
<div id="gipur"></div>
<div id="pimg"></div>
<form method="post" class="ms2_form">
<input type="hidden" name="id" value="">
<input type="hidden" name="count" value="1">
<input type="hidden" name="options" value="[]">
<div class="price">[[+price]] [[%ms2_frontend_currency]]</div>
<button class="button button_green" type="submit" name="ms2_action" value="cart/add"><span>В корзину</span></button>
</form>
</div>
JS<script src="[[++assets_url]]tempalates/js/jquery.fancybox.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".read-more").fancybox({
maxWidth : 800,
maxHeight : 600,
fitToView : false,
width : '70%',
height : '70%',
autoSize : false,
closeClick : false,
openEffect : 'none',
closeEffect : 'none',
afterClose : function(){
$('#content').html('');
$('#modal-title').html('');
$('#price').html('');
}
});
});
$(document).on('click','a.read-more',function(e){
e.preventDefault();
var id = $(this).data('id') || 0;
var pimg = $(this).data('pimg');
$("#content").load("assets/ajax.php",{action:"getContent",id:id,pimg:pimg}, function(response){
if (response) {
var data = eval("(" + response + ")");
$('#content').html(data.introtext);
$('#modal-title').html(data.pagetitle);
$('#price').html(data.price);
$('#oldprice').html(data.oldprice);
$('#new').html(data.new);
$('#popular').html(data.popular);
$('#favorite').html(data.favorite);
$('#gipur').html(data.gipur);
$('#pimg').html(data.pimg);
$("input[name='id']").val(data.id);
$("#image").attr("src","data.pimg");
}
});
});
</script>
PHP<?php
// Если запрос не AJAX или не передано действие, выходим
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;
$pimg = isset($_POST['pimg']);
if (empty($id)) {
exit();
};
$object = $modx->getObject('modResource',$id);
$output = array();
$output['id'] = $id;
$output['introtext'] = $object->get('introtext');
$output['pagetitle'] = $object->get('pagetitle');
$output['price'] = $object->get('price');
$output['oldprice'] = $object->get('old_price');
$output['new'] = $object->get('new');
$output['popular'] = $object->get('popular');
$output['favorite'] = $object->get('favorite');
$output['gipur'] = $object->get('gipur');
$output['pimg'] = $pimg;
$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);
Андрей Здравствуйте! Помогите пж разобраться, получается выводить в модалку только, контент и итротекст а так же картинку, но не получается tv поля.
В ajax.php прописываю так:
В JS прописываю так:
В ajax.php прописываю так:
$output['titok'] = $object->get('titok');
В JS прописываю так:
$('#titok').html(data.titok);
В бутстрап разметке прописываю так:<div class="modal-titok" id="modal-titok"></div>
Не выводится почему-то подскажите что делаю не так, так же не получается вывести и хлебные крошки[[Breadcrumbs? &homeCrumbTitle=`Главная` &crumbSeparator=`<li> » </li> `¤tAsLink=`0` &pathThruUnPub=`0` &respectHidemenu=`1`]]
Уже просто замучился экспериментировать помогите пожалуйста разобраться как это сделать?
А если TV так получить:
$modx->resource->getTVValue('titok');
Попробуйте, получится?
Андрей вставил в эту часть ajax.php правильно я сделал? остальное не чего не изменял, но не работает, модалка вообще не грузит если я так вставляю
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;
$modx->resource->getTVValue('titok');
$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);
}
Вставил вот так: всё равно не работает, модалка загружается но поля этого нет, я вроде правильно вставил?
$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);
$modx->resource->getTVValue('titok');
}
Андрей возможны ли ищё варианты, может ли это зависить от поля числовое или текстовое, или это не играет роли?
Спасибо огромное всё работает, недосмотрел вот в этом была проблема TVValue.
Здравствуйте! Получается выводить в модалку только, контент и итротекст а так же картинку, но не получается tv поля.
В ajax.php прописываю так:
В ajax.php прописываю так:
$output['titok'] = $object->get('titok');
В JS прописываю так: $('#titok').html(data.titok);
В бутстрап разметке прописываю так: <div class="modal-titok" id="modal-titok"></div>
Не выводится почему-то подскажите что делаю не так, так же не получается вывести и хлебные крошки[[Breadcrumbs? &homeCrumbTitle=`Главная` &crumbSeparator=`<li> » </li> `¤tAsLink=`0` &pathThruUnPub=`0` &respectHidemenu=`1`]]
Уже просто замучился экспериментировать помогите пожалуйста разобраться как это сделать?
А крошки лучше выводите через [[pdoCrumbs]]
А как это прописывать в аякс и скрипте?
Андрей если Вам не трудно подскажите пожалуйста как сделать чтобы [[!prevNext]] работало в модальном окне?
Замучился экспериментировать с [[pdoCrumbs]] как прописать в ajax и Php чтобы работало в модальном окне,
в ajax вставляю так:
json так:
И если нужно чтобы в модалку загружался весь контент страницы, что нужно убрать или добавить?
в ajax вставляю так:
$output['pdoCrumbs'] = $object->get('pdoCrumbs');
json так:
$modx->resource->get('pdoCrumbs');
в JS так: $('#modal-pdoCrumbs').html(data.pdoCrumbs);
Поправьте пожалуйста что я не так делаю?И если нужно чтобы в модалку загружался весь контент страницы, что нужно убрать или добавить?
Обновлю топик…
Вопрос не совсем к modx, но всё же
Вызываю страницу auth.html кнопкой
Если содержимое auth.html положить на одной странице с кнопкой и вызывать стандартными методами bootstrap,
PS стоит написать — появляется решение
Вопрос не совсем к modx, но всё же
Вызываю страницу auth.html кнопкой
<a href="#" class="btn btn-primary more" data-id="16">Подключен скрипт
$(document).on('click','.more',function(e){ e.preventDefault(); // Вставляем контент в тело модального окна $("#ins").load("auth.html", function(response){ // Если ответ не пустой, открываем модальное окно if (response) { $("#loginModalCenter").modal('show'); } }); });Загружается модальное окно и в нём не загружаются лексиконы, не работают закладки, не срабатывает jgrowl, не срабатывает авторизация и т.д.
Если содержимое auth.html положить на одной странице с кнопкой и вызывать стандартными методами bootstrap,
<a href="#" class="btn btn-primary" data-toggle="modal" data-target="#loginModalCenter">Все загружается и работает нормально.
PS стоит написать — появляется решение
$(document).ready(function(){ $(".more").click(function(){ $.ajax({ type: "POST", url: "/auth", success: function(){ $("#loginModalCenter").modal('show'); } }); }); });
а, нет, простите — это не решение, поторопился
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.