1. Главная
  2. Блог
  3. 1С-Битрикс
  4. Самый длинный адрес

Самый длинный адрес

12 Апреля 2019
506

Ванька свернул вчетверо исписанный лист и вложил его в конверт, купленный накануне за копейку... Подумав немного, он умокнул перо и написал адрес:

На деревню дедушке.

Потом почесался, подумал и прибавил: «Константину Макарычу».

А.П. Чехов «Ванька»

У заказчика возникла проблема – не помещался длинный адрес в отведенную строку таблицы в бланке заказа (печатные документы в «Заказах» для администраторов), который печатался и прикреплялся к коробке с товаром. Файл, содержащий предустановленный шаблон, находится в каталоге

/bitrix/modules/sale/ru/reports/order_form.php

Адрес не помещался в строку печатного документа.

1.jpg

Решили сделать, чтоб было красиво и аккуратно.

Для этого написали код:

<?
    $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-код столько раз, сколько строк содержится в массиве.

Теперь документ выглядит следующим образом:

2.jpg

Если адрес будет очень длинным, то и строк будет больше.

Существует в России адрес, ставший претендентом на внесение в книгу рекордов России, состоящий из 138 знаков.

3.jpg

(источник http://svidetel24.info/archives/35147)

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

4.jpg

8 800 201-07-68
Консультации по решению