Путь к файлу в сниппете.
Подскажите, пожалуйста. Написала скриптик, сейчас пытаюсь сделать из него сниппет — первый раз в жизни. И проблема скорее всего в пути к файлу, по которому этот сниппет должен искать. У меня написано вот так:
Но может быть тут надо выводить относительно папок сайта? Какой нужен путь, что этот скрипт его увидел?
Весь сниппет:
if ( isset($_GET['summ']) && isset($_GET['time']) ) {
$summ = floatval($_GET['summ']);
$time = (int) $_GET['time'];
$handle = fopen(MODX_BASE_PATH.'/assets/files/banks.csv', 'r');
if ($handle) {
searchInFile($handle, $summ, $time);
fclose($handle);
}
}
Путь выводит полный серверный — /home/n/nashasemru/fksrf/public_html/assets/files/banks.csvНо может быть тут надо выводить относительно папок сайта? Какой нужен путь, что этот скрипт его увидел?
Весь сниппет:
<?php
define('MODX_API_MODE', true);
//константы, задающие столбцы в файле
define('COL_BANK', 0); //банк
define('COL_FROM_1', 3); // от с открытием р/с
define('COL_TO_1', 4); // до с открытием р/с
define('COL_FROM_2', 7); // от без открытия р/с
define('COL_TO_2', 8); // до без открытия р/с
define('COL_TIME', 2); // срок гарантии, вводится пользователем
define('COL_TARIF1', 5); // тариф с открытием р/с
define('COL_TARIF2', 9); // тариф без открытия р/с
define('COL_MIN1', 6); // минимальная сумма гарантии с открытием р/с
define('COL_MIN2', 10); // минимальная сумма гарантии без открытия р/с
function showResult($summ, $time, $ot, $do, $t, $rate, $min, $bank, $message) {
if ( ($summ > $ot) && ($summ < $do) && ($time == $t) ) {
$bg = $summ * $rate;
if ($bg < $min) {
$bg = $min;
}
echo 'Тариф ' . $message . ' р\с на сумму '.$summ.': в банке ' . $bank . ' на срок ' . $time . ' мес. ';
echo 'с процентной ставкой ' . $rate . ' будет ' . $bg . '
<hr>';
}
}
function searchInFile($handle, $summ, $time) {
while (($data = fgetcsv($handle, 2000, ';')) !== FALSE) {
$bank = $data[COL_BANK];
$ot1 = (int) $data[COL_FROM_1];
$do1 = (int) $data[COL_TO_1];
$ot2 = (int) $data[COL_FROM_2];
$do2 = (int) $data[COL_TO_2];
$t = (int) $data[COL_TIME]; // срок гарантии, ищем в файле
$rate1 = floatval( str_replace(",", ".", $data[COL_TARIF1]) );
$rate2 = floatval( str_replace(",", ".", $data[COL_TARIF2]) );
$min1 = (int) $data[COL_MIN1];
$min2 = (int) $data[COL_MIN2];
if (!empty($ot1) && !empty($do1)) {
showResult($summ, $time, $ot1, $do1, $t, $rate1, $min1, $bank, 'с открытием');
}
if (!empty($ot2) && !empty($do2)) {
showResult($summ, $time, $ot2, $do2, $t, $rate2, $min2, $bank, 'без открытия');
}
}
}
if ( isset($_GET['summ']) && isset($_GET['time']) ) {
$summ = floatval($_GET['summ']);
$time = (int) $_GET['time'];
$handle = fopen(MODX_BASE_PATH.'assets/files/banks.csv', 'r');
return MODX_BASE_PATH.'assets/files/banks.csv';
if ($handle) {
searchInFile($handle, $summ, $time);
fclose($handle);
}
}
return showResult($summ, $time, $ot, $do, $t, $rate, $min, $bank, $message);
Вообще можно функции писать в сниппете или нужно выводить их в файлы? Комментарии: 10
Как минимум вижу лишнюю косую:
Пути для работы с файлами всегда абсолютные. Даже если где-то используются относительные, это просто означает, что в другом месте они всё равно приводятся к абсолютному виду.
MODX_BASE_PATH.'/assets/files/banks.csv'
заменить наMODX_BASE_PATH.'assets/files/banks.csv'
Пути для работы с файлами всегда абсолютные. Даже если где-то используются относительные, это просто означает, что в другом месте они всё равно приводятся к абсолютному виду.
Да, я потом исправила, но все равно не работает. Видимо дело в другом.
Спасибо! Буду искать дальше.
Спасибо! Буду искать дальше.
Каким-то чудом после нашего общения сниппет заработал))) Ура!
define('MODX_API_MODE', true);
Вот это нужно только если modX подключается через отдельный php файл.В showResult нужно заменить
echo 'Тариф ' . $message . ' р\с на сумму '.$summ.': в банке ' . $bank . ' на срок ' . $time . ' мес. ';
echo 'с процентной ставкой ' . $rate . ' будет ' . $bg . '
наreturn 'Тариф ' . $message . ' р\с на сумму '.$summ.': в банке ' . $bank . ' на срок ' . $time . ' мес. ' .
'с процентной ставкой ' . $rate . ' будет ' . $bg . ';
В начале searchInFile создать переменную $result = ''; и писать в неё данные, которые потом тоже вернуть через return:
$result = '';
while (($data = fgetcsv($handle, 2000, ';')) !== FALSE) {
// ...
if (!empty($ot1) && !empty($do1)) {
$result .= showResult($summ, $time, $ot1, $do1, $t, $rate1, $min1, $bank, 'с открытием');
}
if (!empty($ot2) && !empty($do2)) {
$result .= showResult($summ, $time, $ot2, $do2, $t, $rate2, $min2, $bank, 'без открытия');
}
}
return $result;
Ну и в основном коде тоже нужен return:
$result = '';
if ( isset($_GET['summ']) && isset($_GET['time']) ) {
// ...
if ($handle) {
$result = searchInFile($handle, $summ, $time);
fclose($handle);
}
}
return $result;
То есть, всё что делается должно сохраняться в переменную и возвращаться только в конце работы сниппета. Никаких echo и print_r() быть не должно! Только для отладки, но никак не в рабочем коде.
Огромное спасибо! Сейчас перепишу.
print_r и echo — да, это для отладки только было.
print_r и echo — да, это для отладки только было.
return 'Тариф ' . $message . ' р\с на сумму '.$summ.': в банке ' . $bank . ' на срок ' . $time . ' мес. ' .
'с процентной ставкой ' . $rate . ' будет ' . $bg . ';
Вот эта штука почему-то никак не хочет срабатывать, только с echo работает. Из-за чего так может быть? ' будет ' . $bg ;
Ну это да, синтаксис правильный. Просто заменила echo на return и перестало работать.
Она не может не сработать.
А вот ты могла что-то не переделать в функции searchInFile — именно там собираются возвращаемые данные.
А вот ты могла что-то не переделать в функции searchInFile — именно там собираются возвращаемые данные.
И правда… Благодарю еще раз)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.