
B3x
24.11.2016
16:27:58
404 мембера. Однако

Maxim
24.11.2016
16:31:14
Я не нашел
ht,zn
ребят

Google

Maxim
24.11.2016
16:35:41
/**
* Sets a list of filters for WHERE clause
*
* @param array $filter
* @return Query
*/
public function setFilter(array $filter)
{
$this->filter = $filter;
return $this;
}
/**
* Adds a filter for WHERE clause
*
* @param string $key
* @param mixed $value
* @return Query
*/
public function addFilter($key, $value)
{
if (is_null($key) && is_array($value))
{
$this->filter[] = $value;
}
else
{
$this->filter[$key] = $value;
}
return $this;
}
зацените эдд филтер
какй костыль
или его вижу только я?

Артём
24.11.2016
16:37:03
А в чем костыль?

Бернгардт
24.11.2016
16:37:41
скорее не костыль, а бага.. скорее всего должно было быть $this->filter = array_merge($this->filter, $value)

Артём
24.11.2016
16:38:19
Ох уж этот ваш php...

Maxim
24.11.2016
16:38:20
костыль в том, что функция ждет два параметра. при чем первый должен быть стринг

Бернгардт
24.11.2016
16:38:36
хотя.. возможно это для сложной логики было сделано.. хм..
интересно было бы посмотреть где применяеться с $key=null

Maxim
24.11.2016
16:38:48
ну мне сейчас нужно
я надеялся метод принимает массив
придется юзать через костыль

Бернгардт
24.11.2016
16:39:09
ну.. в доке указывается что должен быть стринг
методу пофиг что это будет

Google

Maxim
24.11.2016
16:39:27
if (is_null($key) && is_array($value))
вот это я считаю костыль

Артём
24.11.2016
16:40:29
Типа ключик не может быть нулом?

Бернгардт
24.11.2016
16:40:47
вот и получается.. что это возможно для сложной логики
filter=> ["LOGIC"=>"OR", 0=>$arFilter1, 1=>$arFilter2]
чтоб такое собрать к примеру
странно было бы для такого key передавать 0 и 1
но это лишь предположения.. надо смотреть где применяется key=null

Maxim
24.11.2016
16:42:16
здесь надо применять массив.

Бернгардт
24.11.2016
16:42:29
* @param string $key
надо просто заменить на
* @param string | null $key
и сразу все ок будет гыгы
ну да, надо ..
такие вещи обычно бывают когда - сначала один говорит, да что там такого, все просто же..
быстро внедряют, используют в 10+ местах
а потом вспоминают про "незначительный нюанс"
а вообще в битриксе есть более ржачные места.. это да )

Maxim
24.11.2016
16:49:42
$query->addFilter('=GS.SITE_ID', $siteId);
$query->addFilter(null, array(
'LOGIC' => 'OR',
'=VISIBLE' => 'Y',
'<=UG.ROLE' => \Bitrix\Socialnetwork\UserToGroupTable::ROLE_USER
));

Бернгардт
24.11.2016
16:50:39
ну вот.. сложная логика, почти слово в слово..
почему я не удивлен
а ключа нет - т.к. там должно быть число.. иначе битрикс не работает
в другом месте затычка стоит) гыгы
да и не считать же.. количество предыдущих вызовов, иначе будет третья затычка )
хотя логичнее конечно было бы зарезервировать слово
key=>complexFilter к примеру.. хм

Maxim
24.11.2016
16:52:48
А завтра!!!!

Бернгардт
24.11.2016
16:53:23
ага.. восьмая уже.. а послезавтра девятая )

Maxim
24.11.2016
16:53:26
Всем хорошего вечера ребят!

Виталий
24.11.2016
16:54:33
есть каталог с разделами и элементами.
как можно забубенить слайдер так, чтобы на каждый раздел можно было задать свои слайдеры?

Бернгардт
24.11.2016
16:55:01
доп.свойство секции?

Виталий
24.11.2016
16:55:27
да что-то тяжко даётся, надо в разделе показывать и в элементе

Google

Бернгардт
24.11.2016
16:55:32
и доп.логика - дернуть текущую секцию или ее родителей, пока не найдем хоть чтото заполненное
один минус - в корне слайдер так не задать
но в корне тогда только доп.галками в самом элементе.. как то так
а в чем проблема - у элемента также есть секция..
у элемента же слайдер секции показвыаем, верно?

Виталий
24.11.2016
16:57:39
да

Бернгардт
24.11.2016
16:58:02
ну вот.. в карточке товара есть section_id, логика не меняется

Виталий
24.11.2016
17:00:00
если у раздела есть подразделы, то тут получается надо будет еще и проверять есть ли у раздела родитель?

Бернгардт
24.11.2016
17:00:24
нет, ни в коем случае
надо логику утвердить другую
на секцию даем элементы, если на подсекцию в слайдере другие элементы - надо заполнить, если нет, не трогать

Анна
24.11.2016
17:00:56
Спасибо всем большое, все сделала, хорошего вечера!

Бернгардт
24.11.2016
17:01:19
тогда получается - дергаем секцию, есил чтото есть, в слайдер, если нет - тогда только дергаем родителя
объединять эти массивы нельзя

Виталий
24.11.2016
17:01:57
Василий, на ты можно?

Igor
24.11.2016
17:02:00
Отдельный инфоблок ? с привязкой к секциям

Бернгардт
24.11.2016
17:02:12

Виталий
24.11.2016
17:02:14
а ты где работаешь?))

Бернгардт
24.11.2016
17:02:29
infospice.ru

Виталий
24.11.2016
17:03:20
просто вещи ты дельные говоришь
интересно стало

Dmitry
24.11.2016
17:03:53

Google

Dmitry
24.11.2016
17:04:43

Бернгардт
24.11.2016
17:04:44
А не только говорим. Свету проще будет на новый плакат раскрутить )

Виталий
24.11.2016
17:06:33
да я не особо разработчик, в преоктировщики ушел, проекты еще просто тянутся, где просят что-то сделать и от денег отказываться думаю глупо

Dmitry
24.11.2016
17:06:42

Бернгардт
24.11.2016
17:07:03

Dmitry
24.11.2016
17:08:17
if (is_null($key) && is_array($value))
{
$this->filter[] = $value;
}
setFilter(null,['=ID' => 100500]) работает

Бернгардт
24.11.2016
17:08:44
$class->addFilter('key', 'value');
$filter == ['key'=>'value'];
$class->addFilter(null, ['key'=>'value']);
$filter == [0=>['key'=>'value']];
вглядись внимательнее

Admin
ERROR: S client not available

Бернгардт
24.11.2016
17:08:55
там не merge массива

Dmitry
24.11.2016
17:12:17
там не merge массива
Несколько массивов работают как AND, если в массиве 1 элемент, то битрикс скушает и применит фильтр '=ID' => 100500, просто в запросе будут двойные скобки WHERE ((ID=100500))

Бернгардт
24.11.2016
17:13:13
я не говорю что нельзя собрать конечный запрос идентичный простому
я говорю лишь о том что оно немного для другого - а именно для сложной логики
и массив $this->filter отличается, т.к. логика сбора другая
в простом, без null ты логику or не соберешь

Dmitry
24.11.2016
17:14:17

Бернгардт
24.11.2016
17:14:20
с null без LOGIC явно обнозначенной работать не будет
просто забыли "небольшой нюанс", либо собирались делать отдельный инструмент, а потом передумали

Dmitry
24.11.2016
17:15:19

Бернгардт
24.11.2016
17:15:21
ну тут скорее речь о том что будет когда несколько раз addFilter вызовешь
вроде при нескольких без LOGIC уже не сработает
или я не прав? хм

Google

Dmitry
24.11.2016
17:15:57
работает работает

Бернгардт
24.11.2016
17:16:07
хыыы
"это битрикс, детка, в жопу логику"
ну спасибо, буду знать

Dmitry
24.11.2016
17:21:44
нефиг наезжать, очень удобно. Когда компонент через класс делаешь. заводишь поле $baseQuery
в куче методов добавляешь по условиям addFilter, причем и a,b и null,arX потом делаешь
$q1 = clone $this>baseQuery;
$q1->addSelect('CNT', ....)
$q1->exec()
общее кол-во
$q2 = clone $this>baseQuery;
$q2->setSelect([туева хуча полей]);
чтобы два раза не вставать

Бернгардт
24.11.2016
17:23:01
хм
подумал еще раз - и решил что массив както привлекательнее нового непонятного объекта..
видимо я не познал дзен.. хм

Dmitry
24.11.2016
17:31:55

Бернгардт
24.11.2016
17:32:13
ну это понятно, и этот метод мне больше нравится
просто я не особый сторонник подхода винды - когда одно и тоже можно 10 разными способами сделать, причем совершенно разными и по совершенно разной логике
и въезжать сложнее на поддержке, и дообучать
и тут как раз вопрос о том - был бы гдето выигрыш в читаемости, или скорости..
а тут просто сахар
причем весьма сомнительный

Dmitry
24.11.2016
17:34:05
query - это для ООП-шников. Я например делаю компонент на классах. Базовый класс уже содержит всю логику запроса, а в потомках в две строчки добавляю фильтры, которых не достает

Бернгардт
24.11.2016
17:34:35
ну это то понятно

Dmitry
24.11.2016
17:36:39
Ну и опять же ))) UNION можно получить только через $query1->getQuery . ' UNION ' . $query2->getQuery

Бернгардт
24.11.2016
17:36:50
но тут опять же.. или я стал стар, или действительно такой подход не самый хороший
неявностями очень попахивает..
но это скорее общий недостаток ооп, если завернуть в более чем три слоя наследования - источник ошибки хрен найдешь
в классах впринципе - это допустим хоть както оправдано
в компонентах вывода .. оправдано ли..
а хз на самом деле, но дебажить будет сложнее, поддерживать тоже сложнее, т.к. хз сколько еще ссылаются
код имеет несколько совершенно разных подходов
одно радует - без работы лично меня это еще долго не оставит
union зло в чистом виде )
а, ну да.. волшебное слово, имхо )


Dmitry
24.11.2016
17:41:47
> в компонентах вывода .. оправдано ли..
ну например, у меня куча компонентов выводящих отчет по разным данным, у всех запросов джоинится несколько одних и тех же справочных таблиц, различаются только таблицы с данными. Фильтры одни и теже (дата, юзер, и т.д) Базовый запрос я формирую в одном базовом классе, где через queryформирую весь фарш кроме селекта, метод вызова запроса, вызов шаблона, валидацию входящих параметров и т.д.
потом делаю десяток компонентов-потомков, в которых всего 1 (один) метод $this->baseQuery->addSelect() и свой шаблон

Бернгардт
24.11.2016
17:43:14
> различаются только таблицы с данными
чистой воды параметр компоненты
если оно действительно так просто как ты написал
несколько свойств с названиями таблиц выглядят несколько более привлекательно чем несколько компонент..

Dmitry
24.11.2016
17:44:42
зато когда в одном из 10 надо будет переписать функционал, то я только в нем переопределю пару методов