Доброго времени суток всем. Прошу прощения за такое название темы. Просто не могу что-то сообразить как правильно определить проблему. В общем имею класс widgets в котором есть такая строка PHP: var $active_widgets = NULL; Далее в другом файле такой код PHP: $gwidgets = new widgets(); if($widgets_list = @file(WIDGETS_DIR.'widgets.dat')) { $widgets_list = array_map('trim', $widgets_list); foreach ($widgets_list as $widget_name) { $awidgets[] = $widget_name; } } $gwidgets->active_widgets = $awidgets; Т.е. в active_widgets падает содержимое widgets.dat В файле в котором происходит вывод списка этих самых виджетов такой код PHP: $widget_list = new widgets(); $widgets = $widget_list->get_widgets_header(); $widgets_list = array(); foreach ($widgets as $widget) { if ($gwidgets->active_widgets == NULL || in_array($widget['filename'], $gwidgets->active_widgets)) $active = true; else $active = false; $widgets_list[] = array ( 'filename' => $widget['filename'], 'active' => $active ); } В общем проблема в том, что если в файле widgets.dat ничего нету, пустой он, то переменная $active ВСЕГДА true. Это в свою очередь вызывает проблему. По идее должно быть false. Как поправить? Подскажите пожалуйста. Заранее спасибо!
В $gwidgets->active_widgets активные виджеты, т.е. те, которые в файле widgets.dat каждый с новой строки В $widget['filename'] в цикле падают все виджеты какие есть (там чтение каталога widgets) Т.е. если виджет есть в файле widgets.dat, то должно вернуть true, если его там нет, то false
Проверка нужна, чтобы определить какой виджет включен, а какой нет. Такой код уже был. Я вот и не могу разобраться.
Тогда появляется ошибка 67 строка это как раз PHP: if (in_array($widget['filename'], $gwidgets->active_widgets)) При этом все работает. Т.е. видно нормальный статус виджета, что он выключен, и его можно включить. После включения ошибка пропадает кстати. Но если выключить, то опять ошибка.
только мне одному кажется что это идийский код? вглядитесь! PHP: <? if($widgets_list = @file(WIDGETS_DIR.'widgets.dat')) { $widgets_list = array_map('trim', $widgets_list);// это единственная полезная строка, а все что ниже - следствие собаки в первой строке :D foreach ($widgets_list as $widget_name) { $awidgets[] = $widget_name; } }
по ходу дела это должно выглядеть так: PHP: <? if ($gwidgets->active_widgets !== NULL AND in_array($widget['filename'], $gwidgets->active_widgets)) {
я бы даже сказал так: PHP: <? $widget_list = new widgets(); $widgets = $widget_list->get_widgets_header(); $widgets_list = array(); foreach ($widgets as $widget) { $widgets_list[] = array( 'filename' => $widget['filename'], 'active' => ($gwidgets->active_widgets !== NULL AND in_array($widget['filename'], $gwidgets->active_widgets)) ); }
а еще лучше так: PHP: <? $widget_list = new widgets(); $widgets = $widget_list->get_widgets_header(); $widgets_list = array(); if ($gwidgets->active_widgets !== NULL) { foreach ($widgets as $widget) { $widgets_list[] = array( 'filename' => $widget['filename'], 'active' => in_array($widget['filename'], $gwidgets->active_widgets) ); } }
только сдается мне тут есть какой-то логический косяк: проверяется $gwidgets, а проход идет по $widgets...
ALEXU Последний мой вариант самый эстетичный. А так - они все работать будут. Gromo вот это монолог!!! зачёт! это я еще два варианта пропустил =)
В последнем варианте как я понимаю вывод будет только уже активных (т.е. тех, которые уже записаны в widgets.dat). Мне как раз нужно выводить все полностью. Статус нужен, чтобы ссылки правильные выводить. Т.е. какие включить, а какие выключить. Проще вообще было сделать с БД, но лишние запросы делать совсем не хотелось (хотя хранилось раньше в базе все). igordata, спасибо еще раз за помощь.