За последние 24 часа нас посетили 55264 программиста и 1720 роботов. Сейчас ищут 1086 программистов ...

Помогите решить проблему

Тема в разделе "PHP для новичков", создана пользователем ALEXU, 5 апр 2011.

  1. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Доброго времени суток всем.

    Прошу прощения за такое название темы. Просто не могу что-то сообразить как правильно определить проблему.

    В общем имею класс widgets в котором есть такая строка
    PHP:
    1. var $active_widgets = NULL;
    Далее в другом файле такой код

    PHP:
    1. $gwidgets = new widgets();
    2.  
    3. if($widgets_list = @file(WIDGETS_DIR.'widgets.dat'))
    4. {              
    5.     $widgets_list = array_map('trim', $widgets_list);
    6.  
    7.     foreach ($widgets_list as $widget_name)
    8.     {
    9.         $awidgets[] = $widget_name;
    10.     }
    11. }
    12. $gwidgets->active_widgets = $awidgets;
    Т.е. в active_widgets падает содержимое widgets.dat

    В файле в котором происходит вывод списка этих самых виджетов такой код
    PHP:
    1.         $widget_list = new widgets();
    2.         $widgets = $widget_list->get_widgets_header();
    3.  
    4.         $widgets_list = array();
    5.         foreach ($widgets as $widget)
    6.         {
    7.             if ($gwidgets->active_widgets == NULL || in_array($widget['filename'], $gwidgets->active_widgets))
    8.                 $active = true;
    9.             else
    10.                 $active = false;
    11.  
    12.             $widgets_list[] = array
    13.             (
    14.                 'filename'      => $widget['filename'],
    15.                 'active'        => $active
    16.             );
    17.         }
    В общем проблема в том, что если в файле widgets.dat ничего нету, пустой он, то переменная $active ВСЕГДА true.
    Это в свою очередь вызывает проблему. По идее должно быть false.

    Как поправить? Подскажите пожалуйста.
    Заранее спасибо!
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    что за проверка?
     
  3. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    В $gwidgets->active_widgets активные виджеты, т.е. те, которые в файле widgets.dat каждый с новой строки
    В $widget['filename'] в цикле падают все виджеты какие есть (там чтение каталога widgets)
    Т.е. если виджет есть в файле widgets.dat, то должно вернуть true, если его там нет, то false
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а эта проверка зачем? и почему там стоит ИЛИ ?
     
  5. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Проверка нужна, чтобы определить какой виджет включен, а какой нет.
    Такой код уже был. Я вот и не могу разобраться.
     
  6. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    ALEXU
    попробуй убрать проверку на нулл, может поможет
     
  7. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Тогда появляется ошибка
    67 строка это как раз
    PHP:
    1. if (in_array($widget['filename'], $gwidgets->active_widgets))
    При этом все работает. Т.е. видно нормальный статус виджета, что он выключен, и его можно включить. После включения ошибка пропадает кстати. Но если выключить, то опять ошибка.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    только мне одному кажется что это идийский код? :D
    вглядитесь!
    PHP:
    1. <?
    2. if($widgets_list = @file(WIDGETS_DIR.'widgets.dat'))
    3.  {                
    4.      $widgets_list = array_map('trim', $widgets_list);// это единственная полезная строка, а все что ниже - следствие собаки в первой строке :D
    5.  
    6.      foreach ($widgets_list as $widget_name)
    7.      {
    8.          $awidgets[] = $widget_name;
    9.      }
    10.  }
    11.  
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    по ходу дела это должно выглядеть так:
    PHP:
    1. <?
    2. if ($gwidgets->active_widgets !== NULL AND in_array($widget['filename'], $gwidgets->active_widgets)) {
    3.  
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я бы даже сказал так:
    PHP:
    1. <?
    2.  
    3. $widget_list = new widgets();
    4. $widgets = $widget_list->get_widgets_header();
    5.  
    6. $widgets_list = array();
    7. foreach ($widgets as $widget) {
    8.   $widgets_list[] = array(
    9.       'filename' => $widget['filename'],
    10.       'active' => ($gwidgets->active_widgets !== NULL AND in_array($widget['filename'], $gwidgets->active_widgets))
    11.   );
    12. }
    13.  
    14.  
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а еще лучше так:
    PHP:
    1.  
    2. <?
    3. $widget_list = new widgets();
    4. $widgets = $widget_list->get_widgets_header();
    5. $widgets_list = array();
    6. if ($gwidgets->active_widgets !== NULL) {
    7.   foreach ($widgets as $widget) {
    8.     $widgets_list[] = array(
    9.         'filename' => $widget['filename'],
    10.         'active' => in_array($widget['filename'], $gwidgets->active_widgets)
    11.     );
    12.   }
    13. }
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    только сдается мне тут есть какой-то логический косяк: проверяется $gwidgets, а проход идет по $widgets...
     
  13. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    igordata
    вот это монолог!!! зачёт! :)
     
  14. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Спасибо! Так работает корректно.
     
  15. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    А как можно более правильно переписать?
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ALEXU
    Последний мой вариант самый эстетичный. А так - они все работать будут.

    Gromo
    вот это монолог!!! зачёт! :)
    это я еще два варианта пропустил =)
     
  17. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    В последнем варианте как я понимаю вывод будет только уже активных (т.е. тех, которые уже записаны в widgets.dat).
    Мне как раз нужно выводить все полностью. Статус нужен, чтобы ссылки правильные выводить. Т.е. какие включить, а какие выключить.

    Проще вообще было сделать с БД, но лишние запросы делать совсем не хотелось (хотя хранилось раньше в базе все).

    igordata, спасибо еще раз за помощь.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да, тогда предпоследний, и правда =)