Автоматический расчет стоимости

Добрый день!

Необходимо сделать автоматический расчет цены и вывести число на сайте

1) Есть 2 tv поля: 1-е поле (tv price 1)- цена постройки 1 этажного дома (какое-то число)

2-е поле (tv price 2) — цена постройки 2-х этажного дома (какое-то число)

2) Есть 2 категории ресурсов (одноэтажные и двухэтажные)

3) Также есть tv поле (tv plochad) с указанием площади дома

Необходимо чтобы tv plochad умножалось на цену tv price 1, если ресурс создан в категории одноэтажных домов либо на tv price 2, если ресурс создан соответственно в категории двухэтажных домов и умноженное число выводилось во фронтэнде.

Т.е должна быть проверка в какой категории создан ресурс.

Надеюсь понятно расписал )

Помогите плиз!

Спасибо!
Алексей
Алексей
23 ноября 2015, 11:46
modx.pro
1 850

Комментарии: 25

Илья Уткин
23 ноября 2015, 17:01
[[*plochad:mpy=`[[*parent:eq=`17`:then=`[[*price_1]]`:else=`[[*price_2]]`]]`]]

Но лучше, конечно, написать сниппет [[*id:getPrice]]:
if (isset($input) && $input) {
  $resource = $modx->getObject('modResource', $input);
  if (!$resource) return '';
} else {
  $resource = $modx->resource;
}
switch ($resource->parent) {
  // Перечисляем категории 1-этажных домов
  case 17:
  case 22:
  case 38:
    $output = $resource->getTVValue('price_1') * $resource->getTVValue('plochad');
    break;
  // И двухэтажных
  case 24:
    $output = $resource->getTVValue('price_2') * $resource->getTVValue('plochad');
    break;
  default:
    $output = '';
    break;
}
return $output;
    Алексей
    24 ноября 2015, 10:52
    Спасибо за ответ!

    Не работает что-то )

    Создал сниппет getPrice.

    [[*id:getPrice]] если это вставляю, то выводит просто id ресурса

    Что не так?
      Илья Уткин
      24 ноября 2015, 11:02
      Может, [[+id:getPrice]]?
        Алексей
        24 ноября 2015, 11:09
        Тогда вообще пусто…
          Алексей
          24 ноября 2015, 11:15
          Если вставляю [[*plochad:mpy=`[[*parent:eq=`17`:then=`[[*price_1]]`:else=`[[*price_2]]`]]`]]

          то выводит просто общую площадь…
    Алексей
    24 ноября 2015, 14:14
    Илья, выручайте )
      Илья Уткин
      24 ноября 2015, 14:24
      Проверьте названия твшек
        Алексей
        24 ноября 2015, 14:35
        Проверил… все правильно указываю!
          Илья Уткин
          24 ноября 2015, 14:37
          Ну тогда я не знаю… может, у сообщесва будут идеи…
    Алексей
    24 ноября 2015, 16:36
    Ребята, помогите советом.
      Воеводский Михаил
      24 ноября 2015, 17:39
      Сниппет Илья написал правильный.

      Напишите ид обеих категорий и скиньте итоговый код код сниппета, который создали у себя.
      Алексей
      25 ноября 2015, 09:19


      сам сниппет

      <?php
      if (isset($input) && $input) {
      $resource = $modx->getObject('modResource', $input);
      if (!$resource) return '';
      } else {
      $resource = $modx->resource;
      }
      switch ($resource->parent) {
      // Перечисляем категории 1-этажных домов
      case 2:
      $output = $resource->getTVValue('price_etag_1') * $resource->getTVValue('plochad_obchaya');
      break;
      // И двухэтажных и мансардных
      case 24:
      case 34:
      $output = $resource->getTVValue('price_etag_2') * $resource->getTVValue('plochad_obchaya');
      break;
      default:
      $output = '';
      break;
      }
      return $output;

      вызываю на странице так [[*id:getPrice]]

      При вызове только id категории выводится
        Алексей
        25 ноября 2015, 09:39
        Если вызывать так [[!getPrice]], и TV price_etag_1 и price_etag_2 присвоить шаблону вывода дома и вбить цифры в эти TV в любом доме, то все считается, но ТОЛЬКО для конкретного дома

        Если TV присвоить просто странице каталога, тогда пишет цена 0
          Илья Уткин
          25 ноября 2015, 19:36
          Разверните-ка дерево ресурсов и укажите, у каких ресурсов указана цена, у каких указана площадь. Если я в этот раз правильно понял, то вот так должно работать:

          <?php
          if (isset($input) && $input) {
              $resource = $modx->getObject('modResource', $input);
              if (!$resource) return '';
          } else {
              $resource = $modx->resource;
          }
          switch ($resource->parent) {
              // Перечисляем категории 1-этажных домов
              case 2:
                  $output = $resource->Parent->getTVValue('price_etag_1') * $resource->getTVValue('plochad_obchaya');
                  break;
              // И двухэтажных и мансардных
              case 24:
              case 34:
                  $output = $resource->Parent->getTVValue('price_etag_2') * $resource->getTVValue('plochad_obchaya');
                  break;
              default:
                  $output = '';
                  break;
          }
          return $output;
            Алексей
            25 ноября 2015, 20:00
            вот дерево ресурсов



            поля цены выставил для ресурса проекты домов(корень)

            поле площади есть у каждого ресурса (конкретного дома)

            Вставил Ваш обновленный код… все равно не работает… только id показывает
              Илья Уткин
              25 ноября 2015, 20:02
              <?php
              if (isset($input) && $input) {
                  $resource = $modx->getObject('modResource', $input);
                  if (!$resource) return '';
              } else {
                  $resource = $modx->resource;
              }
              $root = $modx->getObject('modResource', 1);
              switch ($resource->parent) {
                  // Перечисляем категории 1-этажных домов
                  case 2:
                      $output = $root->getTVValue('price_etag_1') * $resource->getTVValue('plochad_obchaya');
                      break;
                  // И двухэтажных и мансардных
                  case 24:
                  case 34:
                      $output = $root->getTVValue('price_etag_2') * $resource->getTVValue('plochad_obchaya');
                      break;
                  default:
                      $output = '';
                      break;
              }
              return $output;
                Алексей
                25 ноября 2015, 20:08
                УРА! Заработало!

                Спасибище Вам Илья!
                  Илья Уткин
                  25 ноября 2015, 20:12
                  Вот в следующий раз всегда структуру тоже показывайте. Мы, программисты, хоть и обладаем экстрасенсорными способностями, но в меньшей степени, чем, например, Пахом…

                    Алексей
                    26 ноября 2015, 10:44
                    Спасибо!

                    Обязательно учту!
          Алексей
          26 ноября 2015, 10:46
          Еще вопросик…

          Как мне выводимое число сделать с пробелом после 2-х знаков

          к примеру выводится число 51500, а необходимо 51 500
            Алексей
            26 ноября 2015, 11:05
            UPD Решено!
              Купчинский Михаил
              26 ноября 2015, 15:31
              Поделитесь решением)
                Алексей
                26 ноября 2015, 15:36
                Вот держите…

                последнюю строку

                return $output;


                заменяем на

                $myNumber = $output;
                
                return number_format( $myNumber, 0, ',', ' ' );
                это с округлением

                если нужны числа после запятой то укажите
                ( $myNumber, 2, ',', ' ' )
                  Купчинский Михаил
                  26 ноября 2015, 15:52
                  Ок, спасибо! попробую у себя. Мне правда нужно отформатировать число, получаемое из дополнительного поля Minishopa. наверное придется написать сниппет для этого.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            25