Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 1 Гость просматривают эту тему.

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Как добавить вывод информации и  редактирование информации в профиль
А именно редактирование адресов доставки?

Не нашел совсем информации :(

*

ilyar

Как добавить вывод информации и  редактирование информации в профиль
А именно редактирование адресов доставки?

Не нашел совсем информации :(

Для этого можно использовать %data getEditForm()% — выводит список свойств для редактирования объекта с указанным id.

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Спасибо за информацию!
Написал такой шаблон:
<ul style="overflow: hidden; list-style: none;">
                <xsl:for-each select="$user//properties/group[@name='more_info']/property[@name='delivery_addresses']/value/item">
                  <li  style="overflow: hidden; overflow: hidden; border: 1px solid silver; padding: 0px 20px 20px; margin-bottom: 20px;">
                  <h5><xsl:value-of select="document(concat('uobject://',@id))/udata/object/properties/group/property[@name='street']" /></h5>
                  <form enctype="multipart/form-data" method="post" action="/users/custom_adress_do/" role="form">
                    <xsl:apply-templates select="document(concat('udata://data/getEditForm/',@id))/udata" />
                    <button type="submit" class="btn btn-default pull-right">&save;</button>
                  </form>
                  </li>
                </xsl:for-each>
              </ul>
форма создалась.
Все отлично.
теперь не понимаю что мне надо дописать чтобы данные сохранялись?
Создал макрос custom_adress_do.
А дальше не знаю что писать :(


Данные получаю вот эти:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="data" method="getEditForm" generation-time="0.009451">
<group name="common" title="Основное">
<field name="country" title="Страна" field_id="67" input_name="data[854][country]" type="string" id="67" required="required">1</field>
<field name="index" title="Почтовый индекс" field_id="68" input_name="data[854][index]" type="int" id="68" required="required">2</field>
<field name="region" title="Регион" field_id="69" input_name="data[854][region]" type="string" id="69">3</field>
<field name="city" title="Город" field_id="70" input_name="data[854][city]" type="string" id="70" required="required">4</field>
<field name="street" title="Улица" field_id="71" input_name="data[854][street]" type="string" id="71" required="required">5</field>
<field name="house" title="Дом" field_id="72" input_name="data[854][house]" type="string" id="72" required="required">6</field>
<field name="flat" title="Квартира" field_id="73" input_name="data[854][flat]" type="string" id="73">7</field>
</group>
</udata>


Нашел пример на дурака сделал так

 public function custom_adress_do($template = "default") {
      $objectsCollection = umiObjectsCollection::getInstance();
$cmsController = cmsController::getInstance();
 
$object_id = (int) getRequest('param0');
if(!permissionsCollection::getInstance()->isOwnerOfObject($object_id)) {
return "%data_edit_foregin_object%";
}
$object = $objectsCollection->getObject($object_id);
$data_module = $cmsController->getModule('data');
$data_module->saveEditedObject($object_id);
$object->commit();
       $url = getRequest("from_page");
if (!$url) {
$url = ($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : $this->pre_lang . "/users/settings/";
}

$this->redirect($url);
      
      
}

выдает пустой экран. если закоментировать эту строку то все ок:
   $object->commit();
« Последнее редактирование: 27 Апреля 2014, 02:12:17 от rellai »

*

ilyar

Re:Как добавить вывод информации и редактир&
« Ответ #3 : 27 Апреля 2014, 12:48:54 »
Нашел пример на дурака сделал так

<?php
        public function custom_adress_do($template = "default") {
            $objectsCollection = umiObjectsCollection::getInstance();
$cmsController = cmsController::getInstance();
 
$object_id = (int) getRequest('param0');
if(!permissionsCollection::getInstance()->isOwnerOfObject($object_id)) {
                return "%data_edit_foregin_object%";
            }
$object = $objectsCollection->getObject($object_id);
$data_module = $cmsController->getModule('data');
$data_module->saveEditedObject($object_id);
$object->commit();
            $url = getRequest("from_page");
if (!$url) {
                $url = ($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : $this->pre_lang . "/users/settings/";
            }
           
$this->redirect($url);
}

выдает пустой экран. если закоментировать эту строку то все ок:
   $object->commit();

Почему так происходит не могу сказать, не должно, разве что обращаешься к макросу через udata.
В целом  $object->commit() в твоем коде не нужен, потому что объект коммитится в $data_module->saveEditedObject($object_id).

Стоит обратить внимание на то что твой код дает текущему пользователю возможность изменить любой объект в системе, владельцем которого является он, т.е. не только адрес доставки и для этого достаточно знать id объекта и строковый кодификатор поля.

Вот немного изменил, есть проверки на реальность объекта, владельца и тип данных:

Код: PHP [Выделить]

<?php
abstract class __emarket_custom {

        /**
         * Editing delivery address
         *
         * @author Ilya Rogov <ilyar.software@gmail.com>
         * @link http://team.emom.ru/umicms/patchs/snippets/2
         *
         * @param bool|int $objectId object identifier
         * @throws publicException
         */
        public function addressEdit($objectId = false) {

            $objectId = (int) ($objectId ? $objectId: getRequest("param0"));
            $object = umiObjectsCollection::getInstance()->getObject($objectId);

            if(!$object instanceof umiObject){
                throw new publicException("Error load object #{$objectId}");
            }

            if(!permissionsCollection::getInstance()->isOwnerOfObject($objectId) && $object->getTypeGUID() != "emarket-deliveryaddress") {
                throw new publicException("Permission denied");
            }

            $moduleData = cmsController::getInstance()->getModule('data');
            $moduleData->saveEditedObject($objectId);

            $url = getServer('HTTP_REFERER') ? getServer('HTTP_REFERER'): $this->pre_lang . '/users/settings/';
            $url = getRequest('from_page') ? getRequest('from_page'): $url;

            $this->redirect($url);

        }
}
« Последнее редактирование: 29 Апреля 2014, 15:00:13 от ilyar »

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Спасибо!
Белый экран не появляется
но данные не сохраняет и вылетает вот такая ошибка
Error load object #0

ну собственно это сам обработчик говорит:
 if(!$object instanceof umiObject){
                throw new publicException("Error load object #{$objectId}");
            }
« Последнее редактирование: 27 Апреля 2014, 17:22:59 от rellai »

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Если что вот вывод формы
<form enctype="multipart/form-data" method="post" action="/users/custom_adress_do/" role="form">
                        <div xmlns="" class="form-group70 form-group required">
                          <label for="field70">Город:</label>
                          <input type="text" name="data[854][city]" id="field70" placeholder="" class="form-control" value="4">
                        </div>
                        <div xmlns="" class="form-group71 form-group required">
                          <label for="field71">Улица:</label>
                          <input type="text" name="data[854][street]" id="field71" placeholder="" class="form-control" value="5">
                        </div>
                        <div xmlns="" class="form-group72 form-group required">
                          <label for="field72">Дом:</label>
                          <input type="text" name="data[854][house]" id="field72" placeholder="" class="form-control" value="6">
                        </div>
                        <div xmlns="" class="form-group73 form-group ">
                          <label for="field73">Квартира:</label>
                          <input type="text" name="data[854][flat]" id="field73" placeholder="" class="form-control" value="7">
                        </div>
                        <div xmlns="" class="form-group433 form-group ">
                          <label for="field433">Корпус:</label>
                          <input type="text" name="data[854][korpus]" id="field433" placeholder="" class="form-control">
                        </div>
                        <div xmlns="" class="form-group434 form-group ">
                          <label for="field434">Телефон:</label>
                          <input type="text" name="data[854][telefon]" id="field434" placeholder="" class="form-control">
                        </div>
                        <button type="submit" class="btn btn-default pull-right">Сохранить</button>
                      </form>

*

ilyar

Надо указать id объекта в action="/users/custom_adress_do/854/"

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Спасибо огромное!!!
Все заработало!!!