Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Динамический фильтр топа со сложной логикой.

00 голосов
4
Итак, сваял такой вот выгруз данных:

Код
<?
 if(CModule::IncludeModule("partnernet"))
   {
    //Получаем свой ид==================================
   $arUser=CUser::GetByID($USER->GetID())->GetNext();
   //==================================================
    global $USER;
   $currentUserId = ($USER->GetID());
      $id;
      $frId =  Array();      //айди френд-компании
      $frComp = Array();      //нэйм её же
      $dbFriends = CPNUserRelations::GetRelatedUsers(
                  $currentUserId,
                  PN_RELATIONS_FRIEND
                     );
         while ($arFriends = $dbFriends->GetNext())

//тут определяем 1й и 2й айди связи и смотрим - если это не мы сами ==> значит друг (то что нужно)
         {
                $first_friend_id = $arFriends["FIRST_USER_ID"];
               $second_friend_id = $arFriends["SECOND_USER_ID"];

            //если 1й ид мой собственный, то выводим 2й ид друга
            if ($arUser["ID"] == $first_friend_id)
            {   if(($second_friend_id != NULL)& ($arUser["ID"] != NULL))
               {
                  $IDFr = $second_friend_id;
                       $FrUser = CUser::GetByID($IDFr);
                  $arFrUser = $FrUser->Fetch();
                   }
            }

               //если 2й ид - мой собственный, то выводим 1й ид друга
               elseif ($arUser["ID"] == $second_friend_id)
               {
                  if(($first_friend_id != NULL)& ($arUser["ID"] != NULL))
               {
                     $IDFr = $first_friend_id;
                       $FrUser = CUser::GetByID($IDFr);
                  $arFrUser = $FrUser->Fetch();
                    }
            }
               else
               {
                  echo "<pre>";
                  print_r("Нет у тебя друзей и не будет!)");
                  echo "</pre>";
               }
//наращиваем массивы с ид и нэймами соотв-но
               array_push($frId,$IDFr);
            array_push($frComp,$arFrUser[WORK_COMPANY]);
             }
   }
 а вот тут собственно косяк...
заполнение массива описанным ниже образом 
Код
GLOBAL $arrFilterTop;
   $arrFilterTop[] = array(
       "LOGIC" => "OR",
      /*"PROPERTY_CML2_COMPANY_SELLER" =>"ООО ЫЫЫ"*/   );
foreach($frComp as $arFrUser[WORK_COMPANY])
   {
      $arrIncludeArrs = array("PROPERTY_CML2_COMPANY_SELLER" => $arFrUser[WORK_COMPANY]);
      array_push($arrFilterTop,$arrIncludeArrs);
   }
?>

<pre>
<?var_dump($arrFilterTop);?>
</pre>

выводит результ в виде:
Код
array(3) {
  [0]=>
  array(1) {
    ["LOGIC"]=>
    s tring(2) "OR"
  }
  [1]=>
  array(1) {
    ["PROPERTY_CML2_COMPANY_SELLER"]=>
    s tring(13) "ООО ИТС"
  }
  [2]=>
  array(1) {
    ["PROPERTY_CML2_COMPANY_SELLER"]=>
    s tring(13) "ООО ЫЫЫ"
  }
}

т.е. создается массив с неск-ми массивами... а нужен по сути один, вида:

Код
 array(1) {
    ["PROPERTY_CML2_COMPANY_SELLER"]=>
    s tring(13) "ООО ИТС"
  ["PROPERTY_CML2_COMPANY_SELLER"]=>
    s tring(13) "ООО ЫЫЫ"

и т.д. но трабла в том что объявить напрямую а ля:
 $arrIncludeArrs = "PROPERTY_CML2_COMPANY_SELLER" => $arFrUser[WORK_COMPANY]; 
нельзя...
миновал 2й час раздумий, в общем тупнина...
как его можно корректно заполнять дабы потом нормально в аррфильтр выгрузить...?
спросил 19 Июнь, 13 от Quevatar (200 баллов)

4 Ответы

00 голосов
Вы не указали задачу, приводятся попытки решения непонятной задачи, да и вообще просто непонятное. Вряд ли вам здесь ответят.
Попробуйте указать Вашу задачу, и еще раз описать что не получается.
ответил 19 Июнь, 13 от SleepLess (1,220 баллов)
00 голосов
Прошу меня извинить, голова к концу рабочего дня тяжело соображает...
Итак, я пытаюсь реализовать фильтрацию каталога (точнее пока что топа каталога) в зависимости от свойства WORK_COMPANY  у тех людей которые состоят в "друзьях" в соцсети.
Т.е. к примеру у меня 2 друга в соцсети (в данном случае я сваял свою "сеть партнеров" по образу и подобию)
со свойствами 1й:  WORK_COMPANY = "ООО ЫЫЫ" и  2й:  WORK_COMPANY = " ООО ИТС" к примеру.
далее я пытаюсь сформировать фильтр таким образом, чтобы он отсортировал торговый каталог оставив только товары, содержащие значения  "ООО ЫЫЫ" и  " ООО ИТС". (добавил абсолютно всем товарам каталога свойство  CML2_COMPANY_SELLER , содержит наименование поставщика товара, PS работает и отображает все корректно)
Ну а выше я привел код как и что я там реализовывал... на комментарии вроде бы не поскупился,  только вот теперь не могу последний шаг добить... сформировать уже результирующий массив arrFilter таким образом чтобы он заполнялся не несколькими массивами а одним... два результата var_dump() я показал выше:

1) Как выводится массив продемонстрировал после:
Цитата
Yurant пишет:
выводит результ в виде:
2) А как нужно по идее для корректной работы arrFilter чуть ниже, после:
Цитата
Yurant пишет:
т.е. создается массив с неск-ми массивами... а нужен по сути один, вида:

Итак, ну вот... вроде бы описал.  В общем вот такая идея, и застрял на последнем этапе... =/
ответил 09 Июль, 13 от Quevatar (200 баллов)
00 голосов
Цитата
Yurant пишет:
таким образом чтобы он заполнялся не несколькими массивами а одним
А почему это так важно? Здесь весь смысл в том, что, задавая логику ИЛИ, фильтр отбирает все элементы, которые удовлетворяют либо всем условиям первого массива, либо всем условиям второго массива. В принципе, как у Вас получается (с двумя массивами) - так по идее и должно работать.

Можно попробовать чуть по-другому, попробуйте вот такого типа фильтр:

Код
$arFilter = array( 
   CML2_COMPANY_SELLER => array("ООО ЫЫЫ", "ООО ИТС") 
);
Единственное - не помню точно по какой логике это работает: И или ИЛИ. Заодно и проверите smile:)
ответил 12 Окт, 13 от SleepLess (1,220 баллов)
00 голосов
Денис Сон, пасибищще вам огромное =) то что надо!)
задал фильтр вот таким образом:
Код
GLOBAL $arrFilterTop;
   $arrFilterTop[] = array(
       "LOGIC" => "OR",
      "PROPERTY_CML2_COMPANY_SELLER" => $frComp
            );
Итак. Приведу полный код дабы если кто столкнется с подобным - не шли по моим граблям, вдруг поможет кому.

www\e-store\partner_catalog\index.php
Код
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Каталог товаров, предоставляемых партнерами");
?><?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Каталог товаров, предоставляемых партнерами");
?><?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Каталог товаров, предоставляемых партнерами");
?> <?if(IsModuleInstalled('sale')):?>
<div align="right"><?$APPLICATION->IncludeComponent(
   "bitrix:sale.basket.basket.line",
   "",
   Array(
      "PATH_TO_BASKET" => "/personal/cart/",
      "PATH_TO_PERSONAL" => "/personal/",
      "SHOW_PERSONAL_LINK" => "N"
   )
);?></div>
 <?endif?> <?
 if(CModule::IncludeModule("partnernet"))
   {
    //Получаем свой ид==================================
   $arUser=CUser::GetByID($USER->GetID())->GetNext();
   //==================================================
    global $USER;
   $currentUserId = ($USER->GetID());
      $id;
      $frId =  Array();
      $frComp = Array();
      $dbFriends = CPNUserRelations::GetRelatedUsers(
                                             $currentUserId,
                                             PN_RELATIONS_FRIEND
                                             );
         while ($arFriends = $dbFriends->GetNext())
         {
                $first_friend_id = $arFriends["FIRST_USER_ID"];
               $second_friend_id = $arFriends["SECOND_USER_ID"];

            //если 1й ид мой собственный, то выводим 2й ид друга
            if ($arUser["ID"] == $first_friend_id)
            {   if(($second_friend_id != NULL)& ($arUser["ID"] != NULL))
               {
                  $IDFr = $second_friend_id;
                       $FrUser = CUser::GetByID($IDFr);
                  $arFrUser = $FrUser->Fetch();
                   }
            }

               //если 2й ид - мой собственный, то выводим 1й ид друга
               elseif ($arUser["ID"] == $second_friend_id)
               {
                  if(($first_friend_id != NULL)& ($arUser["ID"] != NULL))
               {
                     $IDFr = $first_friend_id;
                       $FrUser = CUser::GetByID($IDFr);
                  $arFrUser = $FrUser->Fetch();
                    }
            }
               else
               {
                  echo "<pre>";
                  print_r("Нет у тебя друзей!)");
                  echo "</pre>";
               }
               array_push($frId,$IDFr);
            array_push($frComp,$arFrUser[WORK_COMPANY]);
             }
   }

GLOBAL $arrFilterTop;
   $arrFilterTop[] = array(
       "LOGIC" => "OR",
      "PROPERTY_CML2_COMPANY_SELLER" => $frComp
                     );
?>
ответил 13 Янв, 14 от Quevatar (200 баллов)

Похожие вопросы

0 голосов
0 ответов
спросил 04 Май, 14 от ddvfty (440 баллов)
0 голосов
3 ответов
спросил 02 Авг, 13 от Skarler (280 баллов)
0 голосов
7 ответов
спросил 06 Июнь, 13 от TeoRex (280 баллов)
0 голосов
1 ответ
спросил 13 Авг, 14 от аноним
0 голосов
7 ответов
спросил 13 Янв, 13 от Storitell (340 баллов)