Путь к файлу в сниппете.

Подскажите, пожалуйста. Написала скриптик, сейчас пытаюсь сделать из него сниппет — первый раз в жизни. И проблема скорее всего в пути к файлу, по которому этот сниппет должен искать. У меня написано вот так:
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);
Вообще можно функции писать в сниппете или нужно выводить их в файлы?
Любовь
19 сентября 2014, 06:24
modx.pro
5 063
0

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

Василий Наумкин
19 сентября 2014, 10:38
0
Как минимум вижу лишнюю косую:
MODX_BASE_PATH.'/assets/files/banks.csv'
заменить на
MODX_BASE_PATH.'assets/files/banks.csv'

Пути для работы с файлами всегда абсолютные. Даже если где-то используются относительные, это просто означает, что в другом месте они всё равно приводятся к абсолютному виду.
    Любовь
    19 сентября 2014, 11:14
    0
    Да, я потом исправила, но все равно не работает. Видимо дело в другом.
    Спасибо! Буду искать дальше.
      Любовь
      19 сентября 2014, 11:27
      0
      Каким-то чудом после нашего общения сниппет заработал))) Ура!
      Василий Наумкин
      19 сентября 2014, 11:27
      +1
      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() быть не должно! Только для отладки, но никак не в рабочем коде.
        Любовь
        19 сентября 2014, 11:28
        0
        Огромное спасибо! Сейчас перепишу.
        print_r и echo — да, это для отладки только было.
          Любовь
          19 сентября 2014, 15:09
          0
          return 'Тариф ' . $message . ' р\с на сумму '.$summ.': в банке ' . $bank . ' на срок ' . $time . ' мес. ' .						
          'с процентной ставкой ' . $rate . ' будет ' . $bg . ';
          Вот эта штука почему-то никак не хочет срабатывать, только с echo работает. Из-за чего так может быть?
            Володя
            19 сентября 2014, 15:14
            0
            ' будет ' . $bg ;
              Любовь
              19 сентября 2014, 15:41
              0
              Ну это да, синтаксис правильный. Просто заменила echo на return и перестало работать.
              Василий Наумкин
              19 сентября 2014, 15:16
              0
              Она не может не сработать.

              А вот ты могла что-то не переделать в функции searchInFile — именно там собираются возвращаемые данные.
                Любовь
                19 сентября 2014, 15:45
                0
                И правда… Благодарю еще раз)
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10