Связь между таблицами

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Omen_23b
    Junior Member
    • Feb 2020
    • 6

    Связь между таблицами

    Приветствую! Спасибо за ваш продукт.
    Внедряем его в работы и возникли некоторые трудности, ответ на которые я не нашел в документации и на форуме.

    Есть таблица товаров и таблица контактов. Настроена связь на бронирование контакт - товар (один ко многим). В карточке товара есть поле "продано"(isSale), необходимо чтобы при выборе товара в карточке контакта не выводились проданные. Понятно что можно добавить фильтр, но надо что бы это правило работало перманентно. Так же получается один и тот же товар забронировать за разными контактами. Чисто логически необходимо добавить в запрос isSale = 1, но я не нашел где это прописать и не уверен что это возможно.
    Очень рассчитываю на помощь.
  • Maximus
    Senior Member
    • Nov 2018
    • 2731

    #2
    Здравствуйте,
    > Понятно что можно добавить фильтр, но надо что бы это правило работало перманентно.
    Что вы имеете ввиду под "перманентно"? Я спрашиваю не о значении этого слова, а о том, как вы себе это представляете. Имеете ли вы в виду чтобы фильтр был автоматически установлен на отсортировку при выборе товара (т.е. показывал только доступные товары) или же чтото иное?
    > Так же получается один и тот же товар забронировать за разными контактами.
    То есть если этот товар уже привязан к контакту, то он не может быть выбран для другого контакта? А может ли быть такое что у вас в наличии несколько единиц одного товара, и при привязке его к контакту количество на складе уменьшается на 1 и когда значение равно 0 то тогда и выбор его становится невозможным?
    Также напишите есть ли у вас Advanced Pack чтобы понимать объем инструментов которыми вы располагаете?

    Comment

    • Omen_23b
      Junior Member
      • Feb 2020
      • 6

      #3
      Спасибо за быстрый ответ.
      >Фильтр должен срабатывать когда выбираем товар (квартиру) для бронирования. Необходимо что бы были скрыты из списка элементы у которых стоит галочка - продано. (скриншот прилагается)
      > Товар (квартира) в единичном количестве представлен и если он уже привязан к другой карточке клиента, то он должен быть недоступен при выборе.
      Сейчас если я привязывают его к новому клиенту - у старого ссылка пропадает. Т.е. один товар привязан может быть только к одному клиенту.

      Расширенного набора нету. Если он необходим - приобретём.
      Attached Files

      Comment

      • Maximus
        Senior Member
        • Nov 2018
        • 2731

        #4
        Я могу вам посоветовать использовать наш Real Estate extension https://www.espocrm.com/extensions/real-estate/. Данное расширение абсолютно бесплатно и как раз предназначено для работы с недвижимостью. Для клиентов можно создавать запросы которые будут фильтровать предложения и показывать только подходящие.
        Если вы все же решите не пользоваться расширением, тогда список действий примерно следующий:
        1. Чтобы фильтр срабатывал автоматически его нужно будет дописать через код. Примеры реализаций можно найти как на форуме (для поиска формируйте запрос на англ. языке так как есть большая вероятность что вы найдете ответ).
        2. Для фильтра вам понадобится поле типа Boolean (true, false). Не обязательно даже выводить это поле в шаблон.
        3. Затем для сущности Товар написать формулу чтобы автоматизировать процесс изменения статуса для нашего Boolean поля. Формула типа:
        Code:
        ifThenElse(
            contactId,
            isSale = 1,
            isSale = 0
        )
        Иными словами, если контакт привязан значить isSale true, если поле контакт пусто то статус снова false.
        Фильтр из п.1 как раз должен будет зависить от значения поля isSale.

        Comment

        • Omen_23b
          Junior Member
          • Feb 2020
          • 6

          #5
          Таки спасибо за ответы.
          1) Эстейт я смотрел, оно удобно если начинать с нуля. Я подключаю нашу базу с квартирами и всё настроено для работы с ней, переносить и перестраивать это очень много времени.
          2) Кастомный фильтр искал, не нашел, но видимо плохо искал =) Буду глубже копать. Спасибо за советы!

          Comment

          • Maximus
            Senior Member
            • Nov 2018
            • 2731

            #6
            Если вдруг с созданием фильтра по умолчанию у вас возникнут трудности, вы можете избрать другой путь фильтрования просто добав это поле в условия фильтра: Администрирование -> Управление макетами -> Товары -> Фильтры поиска -> перетянуть поле "Продано".
            Attached Files

            Comment

            • Maximus
              Senior Member
              • Nov 2018
              • 2731

              #7
              Для получения нужного вам фильтра сделайте следующее:
              1. В директории /custom/Espo/Custom/SelectManagers/ если у вас нету (а я полагаю что нету так как сущность создана вами вручную) создаете php файл c названием вашей сущности (у меня к примеру файл назван BasePlusTest.php).
              2. В этот файл записываете следующий код:
              Code:
              <?php
              
              namespace Espo\Custom\SelectManagers;
              
              class [COLOR=#FF0000]BasePlusTest[/COLOR] extends \Espo\Core\SelectManagers\Base
              {
                  protected function filterActual(&$result)
                  {    
                      $result['whereClause'][] = array(
                          'isSale=' => 'false'
                      );
                  }    
              }
              Примечание. выделенный красным текст меняете на название своей сущности.
              3. Открываете файл /custom/Espo/Custom/Resources/metadata/clientDefs/BasePlusTest.json (вместо этого файла, файл с названием вашей сущности) и дописываете в него код выделенный красным:
              Code:
              {
                  "controller": "controllers/record",
                  "boolFilterList": [
                      "onlyMy"
                  ],
              [COLOR=#FF0000]"filterList":[
                      "actual"
                  ],
                  "selectDefaultFilters": {
                      "filter": "actual"
                  },[/COLOR]
                  "sidePanels": {
                      "detail": [
                          {
                              "name": "activities",
                              "label": "Activities",
                              "view": "crm:views/record/panels/activities",
                              "aclScope": "Activities"
                          },
                          .........................
              }
              4. Очищаете кэш (Администрирование -> Очистить кэш)
              5. Обновите старице браузера.
              Теперь при нажатии выбор автоматически будут фильтроваться записи (см. скриншот)
              Attached Files

              Comment

              • Omen_23b
                Junior Member
                • Feb 2020
                • 6

                #8
                Maximus

                Спасибо за помощь, но почему-то не получается.

                Вот код в /custom/Espo/Custom/SelectManagers/
                PHP Code:
                <?php
                namespace Espo\Custom\SelectManagers;
                
                class Flat extends \Espo\Core\SelectManagers\Base
                {
                    protected function filterActual(&$result)
                    {    
                        $result['whereClause'][] = array(
                            'sold=' => 'true'
                        );
                    }    
                }
                вот в /custom/Espo/Custom/Resources/metadata/clientDefs
                PHP Code:
                ..
                //
                    "filterList":[
                        "actual"
                    ],
                    "selectDefaultFilters": {
                        "filter": "actual"
                    },
                    //
                .. 
                
                Attached Files

                Comment

                • Maximus
                  Senior Member
                  • Nov 2018
                  • 2731

                  #9
                  Здравствуйте,
                  а как вы назвали свой файл? У вас сущность называется 'Flat' а файл Flat.php? Имя класса должно совпадать с названием файла. И вы ранее упоминали поле 'isSale' но в фильтре используете 'sold=' => 'true'. Ваше поле "Продано" называется 'sold'? Раз так то тогда такой фильтр покажет не те записи которые еще не проданы, а те которые проданы (т.е. привязаны к контакту).

                  Comment

                  Working...