Квалификационный тест на должность веб-разработчика.
Битрикс.
1. Что нужно прописать в php файле, чтобы использовать API Битрикса?
2. Как подлючить шаблон сайта в php файле?
3. Какой модуль необходимо подключить для использования статического метода CIBlockElement::GetList() ?
4. В какой последовательности происходит подключение файлов компонента: .parameters.php, component.php, result_modifier.php, template/.default/template.php
5. Как работают и где настраиваются ЧПУ?
6. Как в составном компоненте подключаются простые компоненты?
7. Что такое агенты и где они создаются/подключаются?
8. Как подключаются обработчики событий?
9. Какие глобальные переменные недоступны в файле /php_include/init.php?
10. Какие платёжные системы интегрированы в модуле «Интернет-магазин»?
11. Что такое кеширование, и как использовать кеширование (используя API Битрикса) в компонентах?
12. Что такое почтовые события и почтовые шаблоны?
PHP
Пусть у нас есть три вложенных друг в друга раздела A, B, C, каждый из которых представлен в виде массива:
$A = array('ID' => 1, 'SECTION_ID' =>'');
$B=array('ID' => 2, 'SECTION_ID' => 1);
$C = array('ID'=>3, 'SECTON_ID' => 2);
Пусть пользователь, переходит в раздел, представляемый переменной $C. Необходимо используя рекурсивную функцию, определить ID самого верхнего родителя (в данном случае $A) этого раздела. То есть на вход функции должен передаваться ID (но не обязательно только он) текущего раздела (C), а в результате её работы мы должны получить ID раздела A.
Javascript
Пусть у нас есть некое число n. Необходимо преобразовать его к такому виду, чтобы каждые три знака (начиная с конца) в нём были отделены от остальных пробелом.
Например: n = 12345678. Тогда нужно получить 12 345 678.
Код написать на JS (или хотя бы написать алгоритм).
Jquery
Пусть у нас есть вот такой html код:
<a href='#' id='id1'>Click Me!</a>
<input type='radio' class='myclass' />
<img src='123.lpg' title='texttexttext' />
<textarea></textarea>
<input type='text' />
Необходимо написать код, обрабатывающий событие click на теге с id=id1. По клику на данном теге, значение трибута title тега <img> должно быть скопировано в атрибут value тегов <textarea></textarea> и <input type='text'>, сам тег с id=id1 должен получить новый атрибут rel, значение которого так же должно быть равно значению title тега <img>, а <input type='radio' class='myclass' /> должен стать отмеченным.
SQL
Пусть у нас есть три таблицы:
Магазин_ноутбуков
ID |
Название_магазина |
Производитель_ноутбуков |
Производитель
ID |
Название |
Модели_ноутбуков |
Модель
ID |
Название |
Цена |
а) Необходимо указать связи и их типы между атрибутами (столбцами) таблиц
б) Необходимо написать следующие запросы на языке SQL :
1. Выбрать названия всех производителей ноутбуков, представленных в каком-то одном магазине
2. Выбрать названия всех моделей ноутбуков представленные в каком-то одном магазине
3. Выбрать названия всех моделей ноутбуков, цена которых выше средней для данного производителя
Безопасность
Указать на потенциальные уязвимости в данном коде:
<html><body>
<?
if($_REQUEST['text']) {
mysql_connect ($hostname, $user , $password);
mysql_select_db($db);
$q = mysql_query("INSERT INTO Messages (lgn, pswd, txt) VALUES ($_REQUEST['login'], $_REQUEST['password'], $_REQUEST['text'])");
}
?>
Ваше сообщение: <?=$_REQUEST['text']?> принято!
<form>
<input type='text' name='login'>
<input type='text' name='password'>
<textarea name='text'></textarea>
</form>
</body></html>
Ответы к тесту (тест проходила Кочерова А.С.)
БИТРИКС.
1. Чтобы использовать API Битрикса, нужно в php-файле подключить пролог.
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
2. (Если я правильно поняла вопрос) Чтобы подключить шаблон сайта в данном php файле, нужно в настройках продукта -> сайты выбрать тип условия "для папки или файла", выбрать нужный php-файл, выбрать нужный шаблон сайта, сохранить.
Замечание. Может быть имеется в виду как именно подключается шаблон в php файле, то все шаблоны хранятся в папке /bitrix/templates/. Папка шаблона содержит обязательные файлы header.php и footer.php. Применить тот или иной шаблон к сайту можно в административном меню "Сайты", в настройках сайта, раздел "Внешний вид".
3. Необходимо подключить модуль "Информационные блоки" (iblock).
4. result_modifier.php, .parameters.php, component.php, templates/.default/template.php
5. ЧПУ (человекопонятные УРЛ) - механизм переопределения адресов. Обработка адресов применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указанному адресу. Управление правилами преобразования адресов производится на странице: /bitrix/admin/urlrewrite_list.php. При добавлении на страницу компонента с поддержкой ЧПУ (если файл сохраняется с помощью API) автоматически создается правило переопределения адреса. Проверить настройки ЧПУ можно на странице: Настройки –> Настройки продукта –> Обработка адресов.
6. Простые компоненты в составном подключаются так:
$APPLICATION->IncludeComponent("componentName","", array(), "parentComponent").
7. Агенты - технология, позволяющая запускать произвольные PHP функции (агенты) с заданной периодичностью. В самом начале загрузки каждой страницы (непосредственно перед событием OnPageStart) система автоматически проверяет, есть ли агент, который нуждается в запуске и в случае необходимости - исполняет его. Для того чтобы агент выполнился в заданное время, его необходимо зарегистрировать в системе при помощи метода CAgent::AddAgent. Функция-агент принадлежит либо модулю, либо ее необходимо разместить в файле /bitrix/php_interface/init.php. Этот файл автоматически подключается в прологе.
8. RegisterModuleDependences - функция для регистрации обработчиков, расположенных в модулях. Эту функцию необходимо вызвать один раз при инсталляции модуля, либо AddEventHandler - функция, предназначенная для регистрации произвольных обработчиков, которые не расположены в модулях. Ее необходимо вызывать до возникновения события на тех страницах, где требуется его обработать. Например, если событие нужно обработать на всех страницах, где оно возникает, то функцию можно вызвать в /bitrix/php_interface/init.php.
9. APPLICATION, USER, DB, DBType, DBHost, DBName, DBLogin, DBPassword
10. Платёжные системы, интегрированные в модуле "Интернет-магазин": наличный расчет, кредитная карта, WebMoney, Яндекс.Деньги, Сбербанк, счет, наличные курьеру.
11. Кеширование - это запись информации, которая может быть запрошена с наибольшей вероятностью, в промежуточный буфер с быстрым доступом. В компонентах 2.0 есть встроенная поддержка кеширования. Для тех компонентов, для
которых возможно кеширование, в наборе параметров отражаются настройки
кеширования: авто, кешировать или не кешировать. Если отмечена опция Кешировать при установленном фильтре, то после выборки пользователем информации с помощью фильтра, она будет закеширована. При этом будет использоваться установленный тип кеширования и время кеширования.
12. Почтовое событие - это почтовое сообщение, имеющее свой тип и отправляемое по соответствующему почтовому шаблону. Почтовый шаблон определяет текст почтового сообщения, а также порядок расположения полей заданных в типе почтового события.
Почтовые шаблоны доступны в административном меню "Настройки системы" -> "Почтовые шаблоны". Для манипуляции почтовыми шаблонами предназначен класс CEventMessage. Для создания почтового события предназначен класс CEvent.
------------------------------------------------
PHP
<?PHP
//$id - id текущего раздела
//$ar_name название раздела
//$p_id - id родительского раздела
function parent_id($id, $ar_name)
{
$p_id = $ar_name[$id]['SECTION_ID'];
return $p_id;
return parent_id($p_id, $B);
return parent_id($p_id, $A);
}
echo parent_id($id, $C);
?>
--------------------------------------------------
JAVASCRIPT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Untitled Document</title>
<script language="javascript">
<!--//
function test(obj)
{
var a=obj.num.value
var l=a.length
var result=""
M=Math.floor(l/3)
for (var i=1; i <=M; i++)
{
l=a.length
b=a.slice(l-3)
a=a.slice(0,-3)
result=" ".concat(b,result)
}
result=a.concat(result)
obj.res.value=result
}
//-->
</script>
</head>
<body>
<form name="form1">
Введите число: <input name="num" type="text" size="10" /><hr />
<input type="button" value="Преобразовать" onclick="test(form1)" /><hr />
Результат: <input type="text" size="20" name="res" /><hr />
</form>
</body>
</html>
----------------------------------------------------
JQUERY
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Untitled Document</title>
<script src="/js/jquery-1.6.2.min.js"></script>
<script language="javascript">
<!--//
function change()
{
$(":radio").attr("checked","checked");
var a=$("img").attr("title");
$("input").attr("value",a);
$("textarea").attr("value",a);
$("#id1").attr("rel",a);
}
//-->
</script>
<body>
<a href='#' id='id1' onclick="change()">Click Me!</a>
<input type="radio" class='myclass'/ > <img src="123.jpg" title="texttexttext"/>
<textarea></textarea>
<input type="text" />
</body>
</html>
----------------------------------------------------
SQL
a) Типы связей:
между атрибутом id и названием магазина, названием производителя и названием модели жесткая,
между названием и ценой, и остальными - гибкая
б) SQL-запросы:
1. SELECT Производитель_ноутбуков FROM Магазин_ноутбуков Where ID=Данный_ID
2. SELECT Модели_ноутбуков FROM Производитель Where ID IN
(SELECT Производитель_ноутбуков FROM Магазин_ноутбуков Where ID=Данный_ID)
3. SELECT Модели_ноутбуков FROM Модель WHERE Цена >= AVG(SELECT Цена FROM Модель Where ID IN (SELECT Модели_ноутбуков FROM Производитель Where ID=Данный_ID))
----------------------------------------------------
БЕЗОПАСНОСТЬ
Потенциальная уязвимость в данном коде в следующем:
<input type="text" name="login">
<input type="text" name="password">
<textarea name="text"></textarea>
Требуется проверка введенных данных на наличие запрещенных символов, ограничение на длину текста. Кроме того нужно закрыть доступ к файлу, хранящему пароли к базе данных. Лучше запрос к бд вынести в отдельный файл и запаролировать этот файл.