Расширял функционал, может кому пригодиться.
Задача: Сделать функционал закладок (корзины) на сайте с возможностью отправки заказа на email. Редакция бизнес, стандартной корзины нет, плюс нет цены, так сказать по запросу, так как товар уж больно дорогой. Все подцеплено к аяксу. Страница закладок работает только с xslt. Код выдран из проекта, по этому поставляю код "как есть" по лицензии GNU GPL :D
<?php
/*
* Расширение модуля контент
*
*/
class content_custom extends def_module
{
/*
* Добавление продукции в закладки на базе сессий по ajax
*/
public function addBookmark($productId = 0)
{
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
if ( (int) $productId > 0) {
$return['message'] = 'При добавлении товара возникли ошибки';
$hierarchy = umiHierarchy::getInstance();
$page = $hierarchy->getElement($productId);
if ( ($page instanceof umiHierarchyElement) ) {
$data = (empty($_SESSION['content.bookmark'])) ? array() : $_SESSION['content.bookmark'] ;
if (!in_array($productId, $data))
array_push($data, $productId);
$_SESSION['content.bookmark'] = $data;
echo json_encode(array('message'=> 'Продукт успешно добавлен в корзину')); exit();
} else {
echo json_encode($return); exit();
}
}
} else {
$referer = (empty($_SERVER['HTTP_REFERER'])) ? '/' : $_SERVER['HTTP_REFERER'];
$this->redirect($referer);
return;
}
}
/*
* Проверка наличия закладок
* (заглушка)
*/
public function isCheckBookmark()
{
return true;
}
/*
* Страница Закладки
*/
public function bookmark()
{
$data = (empty($_SESSION['content.bookmark'])) ? array() : $_SESSION['content.bookmark'] ;
//Вернуть айтемы
return array("nodes:item" => $data);
}
public function delBookmark($productId = 0)
{
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
if ( (int) $productId > 0) {
$data = (empty($_SESSION['content.bookmark'])) ? array() : $_SESSION['content.bookmark'] ;
if (in_array($productId, $data) && ($key = array_search($productId, $data))) {
unset($data[$key]);
$_SESSION['content.bookmark'] = $data;
}
exit();
return;
}
} else {
$referer = (empty($_SERVER['HTTP_REFERER'])) ? '/' : $_SERVER['HTTP_REFERER'];
$this->redirect($referer);
return;
}
}
public function checkout()
{
$error = false;
$message = array();
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
$data = (empty($_SESSION['content.bookmark'])) ? array() : $_SESSION['content.bookmark'] ;
if (count($data) < 1) {
$message[] = "Не выбрано не одного товара";
$error = true;
}
if (empty($_POST['username']) || empty($_POST['userphone']) || empty($_POST['useremail'])) {
$message[] = "Отсутствуют контактные данные. Все поля обязательны для заполнения.";
$error = true;
}
if (!$error) {
$body = "Был отправлен запрос с сайта.<br />\n";
$body .= "Контактные данные <br /> \n";
$body .= "Имя: ". htmlspecialchars($_POST['username']) . "<br />\n";
$body .= "Телефон: ". htmlspecialchars($_POST['userphone']) . "<br />\n";
$body .= "Email: ". htmlspecialchars($_POST['useremail']) . "<br />\n";
$body .= "<br /> \n";
$hierarchy = umiHierarchy::getInstance();
foreach ($data as $pageId) {
$product = $hierarchy->getElement($pageId);
if ( ($product instanceof umiHierarchyElement) ) {
$body .= "<p>";
$body .= "Товар каталога: ";
$body .= '<a href="'. $hierarchy->getPathById($pageId) . '">'. $product->getName() .'</a>';
$body .= "</p>";
$body .= "\n";
}
}
$mail = new umiMail();
$mail->addRecipient("кому@отравим");
$mail->setFrom("от@кого", "Имя");
$mail->setSubject("Новая заявка с корзины сайта");
$mail->setContent($body);
$mail->commit();
$mail->send();
}
if (!$error)
$_SESSION['content.bookmark'] = array();
echo json_encode(array('messages' => $message, 'error' => $error)); exit();
} else {
$referer = (empty($_SERVER['HTTP_REFERER'])) ? '/' : $_SERVER['HTTP_REFERER'];
$this->redirect($referer);
return;
}
}
}
Можете адаптировать под свой проект. Отправку можно переделать под модуль webforms стандартного ядра.
Кому надо, но сам адаптировать не может, могу дописать под ваш проект за символическое вознаграждение :)
Чтоб проще было разбираться, xslt шаблончик к модулю, а точнее к вызову
<xsl:apply-templates select="document('udata://content/bookmark/')/udata" mode="bookmarks"/>
:)
<xsl:template match="udata[@module = 'content' and @method = 'bookmark']" mode="bookmarks">
<div class="bookmarks-page">
<p>У вас нет отложенных товаров!</p>
</div>
</xsl:template>
<xsl:template match="udata[@module = 'content' and @method = 'bookmark' and count(item) > 0]" mode="bookmarks">
<div class="bookmarks-page products">
<xsl:apply-templates select="item" mode="bookmarks" />
</div>
<div id="bookmarks-order">
<h3>Оформить запрос на продукцию</h3>
<form id="bookmark-send" method="post" action="/content/checkout/">
<div class="form-row">
<input type="text" placeholder="Ваше имя" class="place-black" name="username" data-required="true" />
</div>
<div class="form-row">
<input type="text" placeholder="Ваш телефон" class="place-black" name="userphone" data-required="true" />
</div>
<div class="form-row">
<input type="text" placeholder="Ваш Email" class="place-black" name="useremail" data-required="true" />
</div>
</form>
<div class="actions-checkout">
<button class="bookmark-btn" id="form-send">Отправить</button>
</div>
</div>
<script type="text/javascript" src="{$template-resources}js/jquery-validate.min.js"></script>
<script type="text/javascript" src="{$template-resources}js/jquery.form.js"></script>
<script type="text/javascript">
<![CDATA[
$("#bookmark-send").validate({
sendForm : false,
valid : function() {
$("input", this).each(function(key, value) {
$(value).removeClass("error");
});
$("#bookmark-send").ajaxSubmit({
success: function (data) {
response = $.parseJSON(data);
if (response.error) {
$.each(response.message, function(k, m) {
$(".bookmarks-page").append("<p>" + m + "</p>");
});
} else {
$(".bookmarks-page").html("<p>Ваш запрос будет обработан в ближайшее время.</p>");
$("#bookmarks-order").remove();
}
}
});
},
invalid : function() {
$("input", this).each(function(key, value) {
if ($(value).val().length < 4) {
$(value).addClass("error");
} else {
$(value).removeClass("error");
}
});
},
});
$("#form-send").on("click", function() {
$("#bookmark-send").submit();
});
$("#bookmark-send").ajaxForm();
]]>
</script>
</xsl:template>
<xsl:template match="item" mode="bookmarks">
<xsl:param name="pageInfo" select="document(concat('upage://', .))/udata" />
<div class="bookmark-item" id="product-{.}">
<div class="catalog-item">
<div class="product-image">
<img alt="" src="{document(concat('udata://system/makeThumbnailFull/(', $pageInfo//property[@name = 'main']/value/@path,')/200/170/'))//src}" />
</div>
<div class="equals">
<div class="product-title">
<a href="{$pageInfo/page/@link}"><xsl:value-of select="$pageInfo/page/name"/></a>
</div>
<div class="product-manufacture">
<span><xsl:apply-templates select="$pageInfo//property[@name = 'manufacture']/value/item/@name" /></span>
</div>
</div>
<div class="bookmark-button">
<button class="bookmark-btn" onclick="deleteProduct({.})">Удалить</button>
</div>
</div>
</div>
</xsl:template>