Мой первый скрипт - Сеансы кино


Сразу говорю, красотой еще заморачивался и выводом через отдельный шаблон пока тоже не заморачивался.
Логика: Скрипт выполняется по крону 1 раз в час, записывает данные в [[*content]] ресурса 6(Афиша)



<?php
$date=date('d.m.Y');
$array = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://api.kinopoisk.cf/getTodayFilms?date="$date"&cityID=5536');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "User Agent");
if ($content = curl_exec($ch)) {
  $array = json_decode($content, true);  
}
curl_close($ch);

$array2=$array['filmsData'];
if (is_array($array2) || is_object($array2))
$x='';
foreach ($array2 as $array3) {
   $filmid=$array3['id'];
   $url="http://api.kinopoisk.cf/getSeance?filmID="."$filmid"."&cityID=5536&date="."$date";
   
   $arrays = array();
   $ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "$url");
curl_setopt($ch2, CURLOPT_HEADER, false);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_USERAGENT, "User Agent");
if ($content2 = curl_exec($ch2)) {
  $arrays = json_decode($content2, true);  
}
curl_close($ch2);

    $x.= '<div class="uk-grid uk-width-1-1">';
    $x.= '<div class="uk-width-2-10">';
    $x.= "<img src=https://st.kp.yandex.net/images/film_iphone/iphone360_".$arrays['filmID'].'.jpg>';
    $x.= '</div><div class="uk-width-8-10">';
    $x.= '<strong>'.$arrays['nameRU']."</strong></br>";
    $x.= 'Жанр: '.$arrays['genre']."</br>";
$arrays2=$arrays['items'];
if (is_array($arrays2) || is_object($arrays2))

foreach ($arrays2 as $arrays3) {
    //Список кинотеаторов
    $x .=$arrays3['cinemaName']."</br>";
    
if (is_array($arrays3) || is_object($arrays3))
foreach ($arrays3 as $arrays4) {
    if (is_array($arrays4) || is_object($arrays4))
foreach ($arrays4 as $arrays5) {
        if (is_array($arrays5) || is_object($arrays5))
foreach ($arrays5 as $arrays6=>$time) {
    //Время сеансов
    $x .=$time."</br>";
}
}
}
} $x.= '</div></div>';
}

$res = $modx->getObject('modResource',6);
$res->set('content',$x);
$res->save();
Не знаю, насколько код правильный, но все отображаемые ошибки пофиксил.
Хотелось бы создать отдельную таблицу для афиши и туда заносить данные по отдельности, но пока не очень могу сообразить.
20 октября 2016, 10:43    Сергей Лим   
6    863 +8

Комментарии (8)

  1. Дмитрий 20 октября 2016, 11:11 # 0
    Я, конечно, тоже далеко не бог программирования, но позволю себе пару замечаний.
    1. В коде мешать вывод HTML и PHP код не очень хорошо. Может обращаться к какому-чанку и заполнять данные через него? Если надо будет поправить что-то, например стили какие-нибудь или слой удалить, этож надо опять в сниппет лезть, ковырять его там…
    2. Как-то слишком много foreach, как мне кажется. Я так и не понял, что они делают, но может, можно сократить их количество?
    3. Наверное, самое главное замечание. А зачем все складывать в один ресурс? Так и фильтровать сложнее, и вообще… Я в свободное время мастерю тоже что-то вроде афиши, и там я под каждое мероприятие создаю ресурс. Данные легко фильтровать через pdoTools, удобно редактировать и все такое.
    1. Сергей Лим 20 октября 2016, 11:52 # 0
      1. Согласен, пробовал сделать рефакторинг, не получилось, знаний не хватает
      2. Тоже согласен, но по другому опять же не знаю как сделать
      3. У меня смысл такой, чтобы сеансы сами обновлялись, без трудозатрат
    2. Hiddenski 20 октября 2016, 11:20 # 0
      Соглашусь с Дмитрием. Но вы двигаетесь в нужном направлении, это уже хорошо)
      1. Yar 20 октября 2016, 11:40 # 0
        Глядишь так и до плагина по созданию автонаполняемых сайтов дойдем. Ждем.
        1. Илья Уткин 20 октября 2016, 12:24 # +3
          Для записи сеансов можно воспользоваться customExtra
          1. Сергей Лим 22 октября 2016, 08:31 # 0
            А можешь логику объяснить? А то я ни разу не работал с migx или CustomExtra.
            1. Илья Уткин 22 октября 2016, 20:19 # +1
              Логика примерно такая.

              1. Проходимся по списку фильмов на сегодня. Каждый фильм сохраняем как customExtraItem. Здесь можно в отдельных полях сохранить название, жанр, описание, картинку и filmID. Если фильм с таким filmID у нас в базе уже есть, обновляем у него информацию (мало ли, могло что-то поменяться).
              2. Во время получения информации о каждом фильме сохраняем кинотеатры, как customExtraOrder. Так же записывая ID кинотеатра, и обновляя данные в нашей базе, если такой кинотеатр есть.
              3. Каждый сеанс фильма сохраняем как customExtraOperation, указывая в нём наш внутренний ID кинотеатра и внутренний ID фильма (дату и время можно совместить в одном поле, сохраняя его как timestamp).

              При такой структуре данных будет очень просто сделать разные выборки. Например, при клике на кинотеатр, можно составить его расписание на сегодня, с указанием всех фильмов и сеансов. Можно дать пользователю возможность выбора даты, чтобы он мог посмотреть сеансы на завтра или послезавтра, если скрипт будет запрашивать данные на несколько дней вперёд.

              Таким образом будет огромное поле возможностей для расширения функционала.
          2. Сергей Лим 09 ноября 2016, 03:59 # 0
            Не получается сделать cron (Timeweb)

            PHP Warning: Invalid argument supplied for foreach() in /home/s/***/public_html/core/components/afisha/afisha.php on line 21

            Warning: Invalid argument supplied for foreach() in /home/s/***/public_html/core/components/afisha/afisha.php on line 21
            PHP Warning: require_once(/home/s/***/index.php): failed to open stream: No such file or directory in /home/s/***/public_html/core/components/afisha/afisha.php on line 64

            Warning: require_once(/home/s/***/index.php): failed to open stream: No such file or directory in /home/s/***/public_html/core/components/afisha/afisha.php on line 64
            PHP Fatal error: require_once(): Failed opening required '/home/s/servack/nhk-city/index.php' (include_path='.:/opt/php53/share/pear:/usr/share/pear') in /home/s/servack/nhk-city/public_html/core/components/afisha/afisha.php on line 64

            Fatal error: require_once(): Failed opening required '/home/s/***/index.php' (include_path='.:/opt/php53/share/pear:/usr/share/pear') in /home/s/***/public_html/core/components/afisha/afisha.php on line 64

            Я вынес сниппет в отдельный php файл и сделал подключение к api

            define('MODX_API_MODE', true);
            require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/index.php';
            $modx->getService('error', 'error.modError');
            $modx->getRequest();
            $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
            $modx->setLogTarget('FILE');
            $modx->error->message = null;
            
            $res = $modx->getObject('modResource',6);
            $res->set('content',$x);
            $res->save();
            Вы должны авторизоваться, чтобы оставлять комментарии.