Ванька свернул вчетверо исписанный лист и вложил его в конверт, купленный накануне за копейку... Подумав немного, он умокнул перо и написал адрес:
На деревню дедушке.
Потом почесался, подумал и прибавил: «Константину Макарычу».
А.П. Чехов «Ванька»
У заказчика возникла проблема – не помещался длинный адрес в отведенную строку таблицы в бланке заказа (печатные документы в «Заказах» для администраторов), который печатался и прикреплялся к коробке с товаром. Файл, содержащий предустановленный шаблон, находится в каталоге
/bitrix/modules/sale/ru/reports/order_form.php
Адрес не помещался в строку печатного документа.
Решили сделать, чтоб было красиво и аккуратно.
Для этого написали код:
<?
$userAddr = $arOrderProps["ADDRESS"];
$addrArray = explode (" ", $userAddr);
$rowNum = 0;
$addrRow = [];
foreach($addrArray as $addrElement){
if (strlen($addrRow[$rowNum]) + strlen($addrElement) > 55){
$rowNum++;
}
$addrRow[$rowNum] = $addrRow[$rowNum] . $addrElement . " ";
}
?>
<?
foreach($addrRow as $userAddr){?>
<tr>
<td width="180"><font class="sub_header"></font></td>
<td style="border-bottom : 1px solid Black;">
<input class="user" size="50" style="border:0px solid #000000;"
type="text" value="<?=$userAddr?>">
</td>
</tr>
}
?>
Этот метод универсален, и применяется не только для 1С-Битрикс.
Разберем код.
В переменной $userAddr хранится строка с адресом, который вводил пользователь. Строка адреса передается в документ в элементе массива $arOrderProps["ADDRESS"], содержащего данные формы, которую заполняет пользователь при оформлении заказа. Там может оказаться любое количество символов.
Блок <tr>…</tr> в конце – это та часть html кода, которая отвечает за вывод строки с адресом, который находится в переменной $userAddr
Изначально кроме переменной и блока вывода строки ничего не было. Но у пользователя «случился» длинный адрес и печатный документ был не читабелен.
(Первая строка – это адрес, выбираемый из списков. Нас интересует вторая строка, в которой пользователь мог бы не заполнять первую половину адреса, но система его никак в этом не ограничивает, и он написал и выбрал всё, что мог)
Пришлось писать код, чтоб было красиво и аккуратно.
К переменной с адресом применили функцию explode:
$addrArray = explode (" ", $userAddr);
Она разбивает строку на массив элементов и использует в качестве сепаратора символ пробела. Можно было бы использовать запятую, но где гарантия, что все умеют ими пользоваться? :)
Далее мы задаем номер элемента массива для первой строки:
$rowNum = 0;
foreach($addrArray as $addrElement){
Цикл перебирает все элементы массива $addrArray и кладет их содержимое в $addrElement.
То есть на каждой итерации этой функции мы в $addrElement имеем «слово» от пробела до пробела.
Далее идет условие:
if (strlen($addrRow[$rowNum]) + strlen($addrElement) > 55){
Это условие проверяет, не превышает ли наша строка ограничение по длине (55 знаков), если к ней присоединить еще одно «слово».
Если нет:
$addrRow[$rowNum] = $addrRow[$rowNum] . $addrElement . " ";
добавляет к текущей строке очередное «слово» $addrElement и пробел (у нас же теперь нет пробелов)
Если да:
$rowNum++;
Инкрементирует номер элемента массива и новый элемент начинает заполнятся «словами». Это будет следующая строка.
Повторяем, пока не кончатся «слова».
Длина строки подбирается под конкретные условия. В нашем случае помещалось 55 символов.
После завершения работы цикла у нас будет массив $addrRow[n], где n – количество строк. И в каждой строке будут содержаться «слова», суммарная длина которых не превышает 55 символов.
Далее мы переходим к выводу массива на страницу.
<?
foreach($addrRow as $userAddr){
?>
<tr>
…
</tr>
<?}?>
Функция перебирает все элементы массива $addrRow[n], содержащие строки для вывода, и выполняет html-код столько раз, сколько строк содержится в массиве.
Теперь документ выглядит следующим образом:
Если адрес будет очень длинным, то и строк будет больше.
Существует в России адрес, ставший претендентом на внесение в книгу рекордов России, состоящий из 138 знаков.
(источник http://svidetel24.info/archives/35147)
И даже он помещается теперь в документ и выглядит там хорошо и читабельно.