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

Сразу говорю, красотой еще заморачивался и выводом через отдельный шаблон пока тоже не заморачивался.
Логика: Скрипт выполняется по крону 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, 07:43
modx.pro
6
3 872
+8
Поблагодарить автора Отправить деньги

Комментарии: 8

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

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

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

            Таким образом будет огромное поле возможностей для расширения функционала.
          Сергей Лим
          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();
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            8