почему) как раз такой макрос есть в umi, посмотри в файле /classes/modules/catalog/class.php макрос addCatalogObject() она как раз добавляет товар в систему со стороны сайта. Для того чтобы она все ок сохранила надо сделать такой шаблон для формы добавлений (Пишу на память так что стопроцентной точности не обещаю)
<form action="/catalog/addCatalogObject/[parent_id]/[object_type_id]">
<input type="text" name="titile" value="имя нового товара" />
<xsl:apply-teplates select="document('udata://data/getCreateForm/772')/udata" />
<input type="submit" value="добавить новый товар" />
</form>
[object_type_id] - необязательный, но если у вас товар является подтипом относительно типа данных "Объект каталога", то надо его указать
772 в макросе getCreateForm это id типа данных, для которого необходимо вывести форму добавления, он же object_type_id так что это один и тот же параметр, но если в атрибуте action для тега form его можно не указывать, то для макроса getCreateForm все равно придеться иначе система не поймет какие поля выводить для заполнения
P.S. Вроде ничего не забыл, но честно говоря не проверял этот способ с 2.8.1 версии, так что пробуйте и отписывайтесь сюда по результатам
надо самому пробывать, тут скорее всего вопрос в строчке 474 в файле /classes/modules/class.php
$users->setDefaultPermissions($element_id);
а вот на что её заменить сходу не скажу, надо проверить вначале, да и еще если что-то менять, то надо сделать клон этого макроса в __custom.php файл и там уже менять и уже к кастомному файлу обращаться из шаблона, а то при обновлении перезатрет
суть да, только я бы убрал строчку
$message_id = $event->getParam('message_id');
так как это уже функция не для обработки события и $event у неё просто не будет, $message_id вы уже получали выше при создании нового объекта
и вот так
if(mail($recipient, $subject, $mail_body, $header)){
return true;
} else {
return false;
}
я почту еще не отправлял, всегда пользовался api классом для отправки почты, но на работоспособность этой функции мой личный опыт конечно вряд ли повлияет))
часть с отправкой почты не отрабатывается, так как выше стоит блок который делает редирект
if($is_xslt) {
return Array("node:result" => "ok");
} else {
if($element->getIsActive()) {
$referer_url = $hierarchy->getPathById($element_id);
} else {
$referer_url = getServer('HTTP_REFERER');
}
$this->redirect($referer_url);
}
этот блок должен быть самым последним
файле _custom.php прописываете
<?php
abstract class __custom_catalog {
//TODO: Write here your own macroses
public function addCatalogObjectSuper(){
...
}
};
?>
форме добавления:
<form method="post" action="/catalog/addCatalogObjectSuper/{$catnam}/{$catid}" enctype="multipart/form-data" class="formtastic tender_placement_object">
насчет проблемы того что гости не видят добавленные товары, надо было заменить строчку
$users = $cmsController->getModule("users");
if($users instanceof def_module) {
$users->setDefaultPermissions($element_id);
}
на
permissionsCollection::getInstance()->setDefaultPermissions($element_id);
мэйл отправляю через класс самой umi umiMail
В итоге у меня получилось следущее:
функцию я написал в файл /classes/modules/catalog/__custom.php
<?php
abstract class __custom_catalog {
//TODO: Write here your own macroses
public function addCatalogObjectCust() {
$hierarchy = umiHierarchy::getInstance();
$hierarchyTypes = umiHierarchyTypesCollection::getInstance();
$objectTypes = umiObjectTypesCollection::getInstance();
$cmsController = cmsController::getInstance();
$parent_id = (int) getRequest('param0');
$object_type_id = (int) getRequest('param1');
$title = htmlspecialchars(trim(getRequest('title')));
$parentElement = $hierarchy->getElement($parent_id);
$tpl_id = $parentElement->getTplId();
$domain_id = $parentElement->getDomainId();
$lang_id = $parentElement->getLangId();
$hierarchy_type_id = $hierarchyTypes->getTypeByName("catalog", "object")->getId();
if(!$object_type_id) {
$object_type_id = $objectTypes->getBaseType("catalog", "object");
}
$object_type = $objectTypes->getType($object_type_id);
if($object_type->getHierarchyTypeId() != $hierarchy_type_id) {
exit($object_type->getHierarchyTypeId().'='.$hierarchy_type_id);
$this->errorNewMessage("Object type and hierarchy type doesn't match");
$this->errorPanic();
}
$element_id = $hierarchy->addElement($parent_id, $hierarchy_type_id, $title, $title, $object_type_id, $domain_id, $lang_id, $tpl_id);
permissionsCollection::getInstance()->setDefaultPermissions($element_id);
$element = $hierarchy->getElement($element_id, true);
$element->setIsActive(true);
$element->setIsVisible(false);
$element->setName($title);
$data = $cmsController->getModule("data");
if($data instanceof def_module) {
$object_id = $element->getObjectId();
$data->saveEditedObject($object_id, true);
}
$element->getObject()->commit();
$element->commit();
$parentElement->setUpdateTime(time());
$parentElement->commit();
//отправка письма менеджеру
$email_from = 'info@umihelp.ru';//regedit::getInstance()->getVal("//settings/email_from");
$fio_from = 'admin';//regedit::getInstance()->getVal("//settings/fio_from");
$admin_email = 'admin@umihelp.ru';//regedit::getInstance()->getVal("//settings/admin_email");
$someMail = new umiMail();
$someMail->addRecipient($admin_email);
$someMail->setFrom($email_from, $fio_from);
$someMail->setSubject("Add new page on site");
$someMail->setContent($mail_content);
$someMail->commit();
$someMail->send();
if($is_xslt) {
return Array("node:result" => "ok");
} else {
if($element->getIsActive()) {
$referer_url = $hierarchy->getPathById($element_id);
} else {
$referer_url = getServer('HTTP_REFERER');
}
$this->redirect($referer_url);
}
}
};
?>
и создал файл с правами для гостей на эту функцию /classes/modules/catalog/permissions.custom.php
<?php
$permissions = Array(
'view' => Array('addCatalogObjectCust')
);
?>
шаблон для вывода формы на xslt выглядит так
<form action="/catalog/addCatalogObjectCust/90/71">
<input type="text" name="title" value="имя нового товара" />
<xsl:apply-templates select="document('udata://data/getCreateForm/71')" />
<input type="submit" value="добавить новый объект каталога" />
</form>
параметры у функции /catalog/addCatalogObjectCust/90/71 в атрибуте формы action:
90 - id родительского раздела куда нужно будет кидать созданную страницу
71 - тип данных "объект каталога", можно посмотреть зайдя в модуль "шаблоны данных" и открыв на редактированию нужный тип данных в адресной строке увидите его id
параметр при вызове udata://data/getCreateForm/71:
71 - тип данных "объект каталога", можно посмотреть зайдя в модуль "шаблоны данных" и открыв на редактированию нужный тип данных в адресной строке увидите его id
а вот не факт)) у меня тоже с ней были проблемы, но так как этот скрипт корректно работал раньше я погрешил на тот сервак на котором тестировал, но возможно проблема в коде или старый код уже не прокатывает с 2.8.5 версией, так что это надо еще проверять. Если будете тестировать и проверять сами, попробуйте с вашим изначальным вариантом отправки через
$Name = "otnoshenialux.ru"; //senders name
$email = "info@otnoshenialux.ru"; //senders e-mail adress
$recipient = "djalimaria@gmail.com"; //recipient
$mail_body = "The new comment on a site. For its editing follow the link: http://otnoshenialux.ru/admin/comments/edit/$message_id"; //mail body
$subject = "New comment"; //subject
$header = "From: ". $Name . " <" . $email . ">\r\n"; //optional headerfields
if(mail($recipient, $subject, $mail_body, $header)){
return true;
} else {
return false;
}
если не ошибаюсь то:
$title = $object_type_id;
$object_type_id - должен быть объявлен выше title.
Если вопрос состоит в том, чтобы id созданного объекта стал его псевдостатическим адресом или именем, то для этого используются функции
$element->setAltName('name_of_link')
$element->setName('Имя нового объекта');
соответственно setName уже есть в коде и если вам надо изменить псевдостатический адрес на id ново созданного объекта, то пониже строчки
$element->setName($title);
допишите
$element->setAltName($element_id);
А если, вы хотите избавиться от input поля title, которое вводит пользователь при создании объекта, то сделайте его скрытым и пропишите в value любое значение. Так как, используя функции setName() и setAltName() вы это значение уже после создания объекта переименуете в то, что вам надо