Все равно начинать когда-то надо, так лучше на чем-нибудь реальном, чем просто так )
Не за что! Но наберись терпения. Эта задача совсем не на один час.
Почитать следует не по migxDB, а по ExtJS, потому что мига — это только обертка для конфигурации. Но учитывая твою задачу, лучше его и не трогать. Правильней допилить или наш групповой редактор, добавив в него редактирование этих цен/цветов и т.п. через дополнительный интерфейс по правой кнопки мыши, или в редактор документа еще одну вкладку сделать и там уже интерфейс. Как вкладку добавить смотри или плагин ShopModx, или плагин в XLexicon.
Понял. Я, в принципе начал ковыряться с процессорами и понял уже, что многие переписывать придется. Тут такая картина: у товара может быть несколько цветов, и по каждому цвету может быть задано разное количество размеров. А migxDB позволяет вложенные таблички делать? Не посоветуешь, где лучше почитать по нему?
Саша, привет! На самом деле очень не советую лезть в эти модели. Механизм крайне обширен, и не до конца проработан. Эта основа готовилась под конкретный проект и там индивидуально дорабатывалась, и на это были серьезные бюджеты. Там дело не только в сложных выборках, но и в интерфейсах управления и т.п. Пока для тебя наиболее приемлемый вариант — использовать TV-шки и migxDB. Как разную стоимость реализовать в зависимости от отдельных параметров — ты это уже все проходил. К сожалению, пока более удобного ничего не могу посоветовать.
Добрый день! Извиняюсь за долгий ответ, был в отъезде на несколько дней. Вопрос ваш довольно интересный. Вам ребята судя по всему помогли, но чтобы еще более фэншуйно получилось, надо конечно нам и ядро чуть-чуть доработать будет, добавив признак связанных товаров. Ведь по сути, даже если вы реализовали добавление нескольких товаров, если в итоге клиент захочет отказаться от какого-то товара, то и все сопутствующие к нему товары надо бы убирать. Да и вообще видеть их в форме заказа, хотя бы для удобства. Ну да ладно, это потом, а пока просто еще более детально разберем еще один вариант реализации этой задачи, потому что тайминги в JS — это не совсем круто, да и прочие моменты есть. Вам на самом деле просто надо переопределить action-процессор и в нем реализовать циклическое выполнение процессора добавления товара. Как это делается, написано здесь (читайте внимательно раздел «Переопределяем процессоры»). В кастомном action-процессоре укажите свой отдельный процессор, в методе process которого и пропишите примерно следующее: public function process(){ $path = $this->modx->getObject('modNamespace', 'basket')->getCorePath().'processors/';
foreach($products as $product_id => $quantity){
if(!$response = $modx->runProcessor('basket/web/orders/products/add',
array(
"product_id" => $product_id,
"quantity" => $quantity ? $quantity : 1,
), array(
'processors_path' => $path,
))){
return $this->failure("Не удалось выполнить процессор");
}
// else
if($response->isError()){
return $response->getResponse();
}
}
return $this->success('Товары успешно добавлены');
} Тут конечно могут быть логические ошибки с обработчиком ошибок (к примеру, из пяти товаров 3 добавилось, а с четвертым ошибка, и он вернет ошибку, хотя три все-таки будут добавлены), но это крайне мелкая вероятность, так что можно пренебречь. И именно поэтому и надо ядро доработать. Но в целом это вполне рабочий вариант, и выполнено будет в один запрос, после чего корректно на сервер уйдет запрос на состояние корзины. P.S. Спасибо за положительные отзывы :)
Рад, что помог. Да, примерно так. только неплохо в ajax error обрабатывать и при ошибке давать команду на удаление уже добавленных в этой транзакции товаров. А может, и не надо :)
Спасибо за подсказку, сделал все при помощи ajax запроса к коннектору напрямую: <script> $(function() { $('#product_f').submit(function(e){ //отменяем стандартное действие при отправке формы e.preventDefault(); //берем из формы метод передачи данных var m_method=$(this).attr('method'); //получаем адрес скрипта на сервере, куда нужно отправить форму var m_action='http://www.tehnofazenda.ru/assets/components/basket/connectors/connector.php?action=products/add'; {assign var=arr value=array(1,2,3,4)} {foreach from=$arr item=i}
var op_data="product_id={$object{$i}.product_id}";
if (document.getElementById('option{$link{$i}}').checked)
{
$.ajax({
type: m_method,
url: m_action,
data: op_data,
success: function(result){
}
});
}
{/foreach}
//получаем данные, введенные пользователем в формате input1=value1&input2=value2...,
//то есть в стандартном формате передачи данных формы
var m_data=$(this).serialize();
$.ajax({
type: m_method,
url: m_action,
data: m_data,
success: function(result){
setTimeout("document.location.href='http://www.tehnofazenda.ru/order/'", 700);
}
});
});
});
</script>по ajax: есть удобный компонент для форм malsup.com/jquery/form/ а где посмотреть — в окне дебаггера (есть и в FireFox и в chrome) ? т.е. при добавлении передается action=products/add, product_id и quantity. вот это и надо в запросах кидать, меняться только последние 2 параметра будут. А как сделать цикл — тут я не силен, javascript пока сам грызу по мануалам :(