Ссылки

Полезные советы

Чтобы не тратить свое время на повторение элементарных действий, которые уже кто-то когда-то сделал, воспользуйтесь полезными советами.

Кнопка "Вернуться на предыдущую страницу"

Эта кнопка дублирует по действию кнопку браузера «Назад», может содержать картинку и вставлена в любое место компонента или модуля в файле *.tpl

<a  href="#" onclick="history.back();" target="_self" >
	<img alt="{$ALL_EXPONAT}" src="/images/museum/icons/arrow_left.png" border="0" title="{$LANG.BACK}" />
</a>

Если вы напишите onclick=«history.back(-3);», то вернете нажавшего на три страницы назад

Естественно, не забудте отредактировать языковой файл того компонента или модуля, куда вставляется кнопка, добавив строчку

$_LANG['BACK'] = 'Вернуться на предыдущую страницу';

Кнопка для навигации по сайту

Эту кнопку можно разместить в любом месте *.tpl-файла. В свойстве action формы прописываете адрес той страницы, куда нужно переместить нажавшего.

<form method="post" action="/museum/add_exponat" enctype="multipart/form-data">
  <button type="submit" class="button" title="{$LANG.ADD_EXPONAT}">
    <img alt="{$LANG.ADD_EXPONAT}" src="/images/museum/icons/edit_add.png" border="0" />
  </button>
</form>

Для того, чтобы кнопка работала, отредактируйте роутер того компонента, на страницы которого идет отсылка. Статья об этом тут.

Естественно, не забудте отредактировать языковой файл того компонента или модуля, куда вставляется кнопка.

Отправка данных при щелчке по картинке

Например, у вас две картинки, стрелка вверх и стрелка вниз, при щелчкам на которые вы делаете перестановку элементов

<span title="<?php echo $_LANG['AD_CATEGORY_UP']; ?>">
  <form method="post" action="catalog/images">	
    <input type="hidden" name="section" value="<?php echo $cat['id']; ?>" />
    <input type="hidden" name="direction" value="1" />
    <input type="image" src="/templates/_default_/images/icons/up.png" />
   </form>
</span>
<span title="<?php echo $_LANG['AD_CATEGORY_DOWN']; ?>">
   <form method="post" action="catalog/images">
     <input type="hidden" name="section" value="<?php echo $cat['id']; ?>" />
     <input type="hidden" name="direction" value="2" />
     <input type="image" src="/templates/_default_/images/icons/down.png" />
   </form>
</span>

Естественно, не забудте принять в скрипте эти значения:

$section        = cmsCore::request('section', 'int', 0);
$direction      = cmsCore::request('direction', 'int', 0);

Формат даты и времени

Очень часто время представлено в формате «Год-Месяц-День Час:Минута:Секунда» и представляет из себя строку. Например, в таком виде время записывается в базу данных.

Чтобы быстро получить текущее время в этом формате, достаточно присвоить переменной значение функции date() с указанием формата:

$just_now = date("Y-m-d H:i:s");

Обратное преобразование, из строки в целое число (метку времени) еще проще. Для этого строковая переменная $just_now должна быть в указанном формате:

$this_time = strtotime($just_now);

Как быть, если надо к текущим дате и времени прибавить/отнять какой-то временной интервал? Например, ровно одни сутки? Тут несколько сложнее. Не рекомендуется прибавлять к метке времени число 86400 (секунд в сутках), а потом преобразовывать в дату-время. Иногда такой способ «прокатывает», но при смене месяца или года, или в случае с февралем високосного года можно получить неадекватное значение. Поэтому, если надо добавить сутки к текущему времени, делаем так:

$allotted = 1;		
$mktime = mktime(date('H'), date('i'), date('s'), date('m'), date('d') + $allotted, date('Y'));
$enddate = date("Y-m-d H:i:s", $mktime);

Аналогично поступайте если надо добавить/отнять год, месяц, час, минуту. Такой код Вас никогда не подведет.

Если вам понадобилось вывести, например, текущий месяц на русском языке:

$months = array( 1 => 'Январь' , 'Февраль' , 'Март' , 'Апрель' , 'Май' , 'Июнь' , 'Июль' , 'Август' , 'Сентябрь' , 'Октябрь' , 'Ноябрь' , 'Декабрь' ); 
$dataw = date( 'd ' . $months[date( 'n' )] . ' Y' );

Возврат массива в Ajax (использование json)

Как быть, если на страницу в браузере нужно через ajax возратить массив? Обычный массив php джаваскрипт не понимает. «Состыковать» php и js можно через массив(объект) json. На стороне сервера (файл обработчика ajax) формируем обычный массив с данными, которые надо вернуть на страницу в браузере:

$data = array('id'=>3, 'title'=> 'Название раздела', 'value'=> 'Какое-то значение');

Отправляем его обратно, преобразовав в json:

echo json_encode($data);

Чтобы на странице в браузере были доступны значения элементов массива, пришедшие данные нужно распарсить. В приеменой части ajax пишем:

function (data){
                if (data) {
		  var record =  JSON.parse(data);
                  $('#id').html(record.id);
                  $("#title").html(record.title);
                  $("#value").html(record.value);
                }
              }

Вывод ошибок синтаксиса в браузер

На многих хостингах при возникновении синтаксической ошибки в коде сайт просто валится и ничего не показывает. Чтобы посмотреть в чем дело, в файле index.php вставьте строку

Error_Reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

или, если надо подавить ошибку типа Strict Standards, а синтаксические ошибки выводить:

Error_Reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT);

Но иногда и это не помогает. Тогда в файле .htassecc вставьте строку

php_flag display_errors On

Отладка кода

Иногда нужно посмотреть значение переменой или просмотреть массив. Часто просто выводят значение переменной $а в браузер:

echo'$a = '.$a.'<br>'

Аналогично поступают с массивом $array_a:

echo'$array_a = ';print_r($array_a);echo'<br>';

Однако иногда эта методика не срабатывает. Такое случается, если страница имеет редирект на другую страницу. Тогда мы ничего не увидим (по идее, значение переменных все-таки посмотреть можно, если временно закомментировать строчку с редиректом). Но если Вы, к примеру, отлаживаете приемник ajax, то никакой print_r() или echo работать не будут.

Как быть в этом случае?

Всегда можно записать информацию в файл. Расширение у файла можете поставить любое, например txt или log:

$filename = 'debug_a.log';
if(file_exists($filename)){unlink($filename);} 
$fd = @fopen($filename, 'x');
@fwrite($fd, '$a = '.$a."\r\n");
@fclose($fd);

Или, для массива

$filename = 'debug_array_a.log';
if(file_exists($filename)){unlink($filename);} 
$fd = @fopen($filename, 'x');
$result = print_r($a, true);
@fwrite($fd, '$a = '.$result."\r\n");
@fclose($fd);

Как видим, информация в этих файлах (debug_a.log и/или debug_array_a.log) всегда самая свежая, поскольку файл со старой информацией перед записью удаляется. После выполнения скрипта файлы debug_a.log и/или debug_array_a.log окажутся либо в той папке, где находится скрипт, либо в корне сайта (зависит он настроек сервера). Перед именем файла можно сразу прописать путь, чтобы не искать долго среди файлов движка. Затем мы скачиваем по ftp этот файл себе на локальную машину и досконально анализируем.

Это особенно удобно, если массив в вашем коде подвергается изменениям. Тогда можно создать два файла. В первый записать массив до изменения, второй после. Смержив два файла, вы сразу увидите, что подверглось изменению.

Отладка кода js или jquery

Практически все современные браузеры содержат консоль. Как посмотреть значение переменной, например, с именем ui, при загрузке страницы? Естественным решением является команда вывода значения переменной в консоль

console.log('ui  = '+ ui). 


Однако, как быть, если данная команда выводит что-то вроде ui = [object Object]?
Object - это массив в js, причем не такой, как в php. Чтобы добраться до его элементов (свойств), приходится указывать их явно, например:
console.log('ui.item.offsetHeight = '+ ui.item.offsetHeight).
Естественно, чтобы вывести значение свойства, имя свойства нужно, как минимум, знать. А как быть, если вы разбираетесь с чужой программой и имена свойств просто не знаете? В этом Вам поможет простой метод, который можно вставить прямо в любое место tpl-файла:

{literal}
<script>
function dump(obj, obj_name) {
  var result = ""
  for (var i in obj)
    result += obj_name + "." + i + " = " + obj[i] + "\n";
  return result
}
</script>
{/literal}

Теперь, чтобы узнать все свойства объекта ui, вам достаточно написать:

console.log(dump(ui, 'ui')); 

Результатом будет что-то вроде

ui.helper = null
ui.placeholder = [object Object]
ui.position = [object Object]
ui.originalPosition = [object Object]
ui.offset = [object Object]
ui.item = [object Object]
ui.sender = null

Как видим, свойства ui сами представляют собой объекты, но мы, по крайней мере, узнали их имена. Двигаемся дальше:

console.log('ui  = '+ dump(ui.item, 'ui.item')); 

И так далее, пока среди свойств объекта не обнаружим необходимое нам для дальнейшей работы.

Если нужно развернуть все свойства объекта, можно применить рекурсивную функцию

{literal}
<script>
 function dumpN(obj, prefix, depth) {
  var result = "";
  for(k in obj) {
   result += prefix+" "+k+" : "+ obj[k]+"\r\n";
   if(obj[k] && 'object' === typeof obj[k] && prefix.length < depth-1) {
    result += dumpN(obj[k], prefix+"-", depth)
   }
  }
  return result;
 }
</script>
{/literal}

Обращаться с ней нужно аналогично. Пишем:

console.log(dumpN(ui, 'ui', 10)); 

Здесь третий параметр (depth) является «глубиной» рекурсии, позволяющий избежать зацикливания. В данном случае на десятой итерации функция остановится.


Советы давал Странник


 
справочник/полезные_советы_для_разработчиков.txt · Последние изменения: 2017/08/09 10:21 От stroller7