Мой первый скрипт - Сеансы кино
Сразу говорю, красотой еще заморачивался и выводом через отдельный шаблон пока тоже не заморачивался.
Логика: Скрипт выполняется по крону 1 раз в час, записывает данные в [[*content]] ресурса 6(Афиша)
Хотелось бы создать отдельную таблицу для афиши и туда заносить данные по отдельности, но пока не очень могу сообразить.
Логика: Скрипт выполняется по крону 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();
Не знаю, насколько код правильный, но все отображаемые ошибки пофиксил.Хотелось бы создать отдельную таблицу для афиши и туда заносить данные по отдельности, но пока не очень могу сообразить.
Поблагодарить автора
Отправить деньги
Комментарии: 8
Я, конечно, тоже далеко не бог программирования, но позволю себе пару замечаний.
1. В коде мешать вывод HTML и PHP код не очень хорошо. Может обращаться к какому-чанку и заполнять данные через него? Если надо будет поправить что-то, например стили какие-нибудь или слой удалить, этож надо опять в сниппет лезть, ковырять его там…
2. Как-то слишком много foreach, как мне кажется. Я так и не понял, что они делают, но может, можно сократить их количество?
3. Наверное, самое главное замечание. А зачем все складывать в один ресурс? Так и фильтровать сложнее, и вообще… Я в свободное время мастерю тоже что-то вроде афиши, и там я под каждое мероприятие создаю ресурс. Данные легко фильтровать через pdoTools, удобно редактировать и все такое.
1. В коде мешать вывод HTML и PHP код не очень хорошо. Может обращаться к какому-чанку и заполнять данные через него? Если надо будет поправить что-то, например стили какие-нибудь или слой удалить, этож надо опять в сниппет лезть, ковырять его там…
2. Как-то слишком много foreach, как мне кажется. Я так и не понял, что они делают, но может, можно сократить их количество?
3. Наверное, самое главное замечание. А зачем все складывать в один ресурс? Так и фильтровать сложнее, и вообще… Я в свободное время мастерю тоже что-то вроде афиши, и там я под каждое мероприятие создаю ресурс. Данные легко фильтровать через pdoTools, удобно редактировать и все такое.
1. Согласен, пробовал сделать рефакторинг, не получилось, знаний не хватает
2. Тоже согласен, но по другому опять же не знаю как сделать
3. У меня смысл такой, чтобы сеансы сами обновлялись, без трудозатрат
2. Тоже согласен, но по другому опять же не знаю как сделать
3. У меня смысл такой, чтобы сеансы сами обновлялись, без трудозатрат
Соглашусь с Дмитрием. Но вы двигаетесь в нужном направлении, это уже хорошо)
Глядишь так и до плагина по созданию автонаполняемых сайтов дойдем. Ждем.
Для записи сеансов можно воспользоваться customExtra
- Проходимся по списку фильмов на сегодня. Каждый фильм сохраняем как customExtraItem. Здесь можно в отдельных полях сохранить название, жанр, описание, картинку и filmID. Если фильм с таким filmID у нас в базе уже есть, обновляем у него информацию (мало ли, могло что-то поменяться).
- Во время получения информации о каждом фильме сохраняем кинотеатры, как customExtraOrder. Так же записывая ID кинотеатра, и обновляя данные в нашей базе, если такой кинотеатр есть.
- Каждый сеанс фильма сохраняем как customExtraOperation, указывая в нём наш внутренний ID кинотеатра и внутренний ID фильма (дату и время можно совместить в одном поле, сохраняя его как timestamp).
А можешь логику объяснить? А то я ни разу не работал с migx или CustomExtra.
Логика примерно такая.
При такой структуре данных будет очень просто сделать разные выборки. Например, при клике на кинотеатр, можно составить его расписание на сегодня, с указанием всех фильмов и сеансов. Можно дать пользователю возможность выбора даты, чтобы он мог посмотреть сеансы на завтра или послезавтра, если скрипт будет запрашивать данные на несколько дней вперёд.
Таким образом будет огромное поле возможностей для расширения функционала.
При такой структуре данных будет очень просто сделать разные выборки. Например, при клике на кинотеатр, можно составить его расписание на сегодня, с указанием всех фильмов и сеансов. Можно дать пользователю возможность выбора даты, чтобы он мог посмотреть сеансы на завтра или послезавтра, если скрипт будет запрашивать данные на несколько дней вперёд.
Таким образом будет огромное поле возможностей для расширения функционала.
Не получается сделать 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
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();
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.