metrpro

Участники
  • Публикации

    388
  • Зарегистрирован

  • Посещение

  • Days Won

    15

Изменения репутации

  1. Like
    metrpro изменил репутацию Дмитрий Кондин в Обновление объявлений, загруженных через парсер   
    apps/yandexrealty_parser/admin/admin.php
    $imgs = array(); $imgfiles = $offer->imagefile; if (!empty($imgfiles)) { foreach ($imgfiles as $if) { $imgs[] = array('preview' => (string) $if->image[0], 'normal' => (string) $if->image[1]); } } else { $imgfiles = $offer->image; if (!empty($imgfiles)) { foreach ($imgfiles as $if) { $imgs[] = (string) $if; } } }  
  2. Like
    metrpro изменил репутацию mmkulikov в Переменные в main.php   
    Если администрация не против - предлагаю здесь собирать информацию о доступных переменных для шаблона.
     
    Переменные:
    Просмотреть содержимое любого массива, например, {$special_items2|@print_r}
     
    $estate_folder - корневая папка сайта
    $current_theme_name - имя используемой темы
    $smarty.session.user_id - если пусто, значит пользователь не залогинен.
    Лучше проверять как {if intval($smarty.session.user_id)!=0}Значит авторизирован{/if}
    $main_file_tpl - имя подгружаемого файла шаблона для отображения, например, realty_grid.tpl - шаблон вывода списка категории недвижимости
    $main - в отличии от предыдущего - это готовый контент для вывода (готовится в контроллере или приложении)
    $special_items2 - массив, содержащий список спецпредложений(VIP)
    $grid_items - массив обычных объявлений
    $news_list_column - массив списка новостей
    $apps_page_view - если переменная определена, значит идет просмотр статической страницы
    $meta_keywords - keywords
    $meta_description - description
    $breadcrumbs - "хлебные крошки"
    $map_type - google, yandex
    $is_account - указывает на то, что мы сейчас в личном кабинете (1/0)
    $_layout - текущий макет, по умолчанию (как правило) layout_basic.tpl (используется, например, в main.tpl для подгрузки основного файла шаблона)
  3. Like
    metrpro изменил репутацию Дмитрий Кондин в Заголовок объявления в realty_grid_list.tpl   
    Можете в шаблоне для отладки добавить такое
    <pre> {$grid_items|print_r}; </pre> Так вы увидите что есть в этом массиве данных.
    Примерно так

    Теперь можно получить значение price с помощью такого выражения
    {$grid_items[i].price} Ниже листаем

    Можно отсюда например взять поле region
    {$grid_items[i].region} Посмотрите ваше поле select_by_query, возможно оно там будет в расшифрованном виде.
    Если нет, тогда надо будет добавить свою обработку
     
  4. Thanks
    metrpro получил репутацию от Tatyshoo в Пилим бесплатную карту на Leaflet   
    Добрый день! Все знают, что некоторое время назад корпорация добра решила заработать на сайтах, применяющих на своих страницах карты и панорамы google. И если в России и, возможно, странах СНГ эта проблема не так критична благодаря присутствию там карт Яндекса, то для зарубежных проектов остро стоит необходимость альтернативных решений, таких как Leaflet.
    Итак... Здесь и далее - решение на примере шаблона Realia с картами google.
    1. В файл шаблона header.tpl добавляем стили leaflet:
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin=""/> Если у вас там же болтаются api-скрипты карт google, можете смело их грохнуть:
    <script type="text/javascript" src="//maps.googleapis.com/maps/api/js?v=3&amp;sensor=true"></script> <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=drawing"></script> 2. Переходим в файл шаблона realty_view.tpl:
    Ищем следующую строку:
    <div id="property-map" data-geo="{$data.geo.value.lat};{$data.geo.value.lng}"></div> И меняем её на:
    <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js" integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" crossorigin=""></script> <div id="mapid" style="width:100%;height:300px;"></div> <script>var pobj_lat={$data.geo.value.lat};var pobj_lng={$data.geo.value.lng};</script> {literal} <script> var mymap = L.map('mapid').setView([pobj_lat, pobj_lng], 16); L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' + '<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' + 'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>', id: 'mapbox.streets' }).addTo(mymap); L.marker([pobj_lat, pobj_lng]).addTo(mymap) .bindPopup("Описалка объекта"); </script> {/literal}  
    В принципе, это всё. 
  5. Sad
    metrpro изменил репутацию Дмитрий Кондин в Помощь по шаблону.   
    Скидывайте в личку.
  6. Like
    metrpro изменил репутацию abushyk в В шаблоне не отображается вывод переменной   
    Права на группу лучше вернуть - иначе это поле может стать доступным для установки другим пользователям.
    Используйте для полей, скрытых правами видимости на группы, переменную {$data_shared.date_added.value} вместо {$data.date_added.value}. Во второй содержатся доступные для данной группы поля, а в первой все поля, без учета прав по группам.
  7. Like
    metrpro изменил репутацию Chernetskiy в Поле телефон   
    1. Маска на phone не накладывается, только на mobilephone/
    2. Можете хоть все телефоны перевести на mobilephone, только имейте ввиду, что в базе сохранятся только цифры, без маски, т.е. +71234567890
    3. Прописать все возможные маски... не пробовал, сомневаюсь что будет работать. В данном случае задается единый формат ввода, если Константин еще чего-то не додумал...  Скорее всего прийдется дописывать какое-то условие для переключения масок, по типу - выбрал флажок России и активируется маска +7..., выбрал флажок Украины, активируется маска +380 ...
  8. Like
    metrpro изменил репутацию Дмитрий Кондин в Платный модуль Биллинга   
    http://wiki.sitebill.ru/index.php?title=Биллинг
  9. Like
    metrpro изменил репутацию abushyk в Дата и время в "list"   
    Либо более гибкий вариант
     
    {$grid_items.date_added|date_format:"тут свой формат вывода даты"}
     
    А свой формат можно подобрать ключиками из руководства
  10. Like
    metrpro изменил репутацию TopRaN в Поменять форму номера телефона mobilephone   
    http://wiki.sitebill.ru/index.php?title=Дополнительные_параметры_элемента_модели
  11. Like
    metrpro получил репутацию от doma в Делаем уведомление об использовании cookie   
    Следуя тенденциям времени, решил поставить себе на сайт уведомление об использовании cookie. Пока это требование установлено законодательством Евросоюза, но, говорят, добавляет кармы сайту в глазах поисков (посмотрим).
    Решение состоит из двух частей - внешнего javascript-файла, который с завидной периодичностью (раз в 365 дней) уведомляет пользователя о том, что на сайте куки, и вызова этого скрипта.
    1. Скрипт, ставится во внешний файл - у меня он лежит по адресу: /js/ck.js. Вот его текст:
    (function (window, undefined){ "use strict"; var document = window.document; function log() { if (window.console && window.console.log) { for (var x in arguments) { if (arguments.hasOwnProperty(x)) { window.console.log(arguments[x]); } } } } function AcceptCookie() { if (!(this instanceof AcceptCookie)) { return new AcceptCookie(); } this.init.call(this); return this; } AcceptCookie.prototype = { init: function () { var self = this; if(self.readCookie('pjAcceptCookie') == null) { self.appendCss(); self.addCookieBar(); } var clear_cookie_arr = self.getElementsByClass("pjClearCookie", null, "a"); if(clear_cookie_arr.length > 0) { self.addEvent(clear_cookie_arr[0], "click", function (e) { if (e.preventDefault) { e.preventDefault(); } self.eraseCookie('pjAcceptCookie'); document.location.reload(); return false; }); } }, getElementsByClass: function (searchClass, node, tag) { var classElements = new Array(); if (node == null) { node = document; } if (tag == null) { tag = '*'; } var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"); for (var i = 0, j = 0; i < elsLen; i++) { if (pattern.test(els[i].className)) { classElements[j] = els[i]; j++; } } return classElements; }, addEvent: function (obj, type, fn) { if (obj.addEventListener) { obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { obj["e" + type + fn] = fn; obj[type + fn] = function() { obj["e" + type + fn](window.event); }; obj.attachEvent("on" + type, obj[type + fn]); } else { obj["on" + type] = obj["e" + type + fn]; } }, createCookie: function (name, value, days){ var expires; if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); expires = "; expires="+date.toGMTString(); } else { expires = ""; } document.cookie = name+"="+value+expires+"; path=/"; }, readCookie: function (name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0) === ' ') { c = c.substring(1,c.length); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); } } return null; }, eraseCookie: function (name) { var self = this; self.createCookie(name,"",-1); }, appendCss: function() { var self = this; var cssId = 'pjAcceptCookieCss'; if (!document.getElementById(cssId)) { var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.id = cssId; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = 'https://fonts.googleapis.com/css?family=Open+Sans'; link.media = 'all'; head.appendChild(link); } var cssCode = ""; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn,"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:after { -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; transition: all .5s ease-in-out; }"; cssCode += "#pjAcceptCookieBar { position: fixed; bottom: 0; left: 0; z-index: 9999; overflow-x: hidden; overflow-y: auto; width: 100%; max-height: 100%; padding: 10px 0; background: #3b3988; opacity: 0.8; font-family: 'Open Sans', sans-serif; text-align: center;}"; cssCode += "#pjAcceptCookieBar * { padding: 0; margin: 0; outline: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarShell { width: 90%; margin: 0 auto; }"; cssCode += "#pjAcceptCookieBar a[href^=tel] { color: inherit; }"; cssCode += "#pjAcceptCookieBar a:focus,"; cssCode += "#pjAcceptCookieBar button:focus { outline: unset; outline: none; }"; cssCode += "#pjAcceptCookieBar p { font-size: 14px; line-height: 1.4; color: #fff; font-weight: 400; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarActions { padding-top: 10px; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn { position: relative; display: inline-block; height: 20px; padding: 0 30px; border: 0; background: #4285f4; opacity: 0.9; font-size: 14px; line-height: 14px; color: #fff; text-decoration: none; vertical-align: middle; cursor: pointer; border-radius: 0; -webkit-appearance: none; -webkit-border-radius: 0; -webkit-transform: translateZ(0); transform: translateZ(0); -webkit-backface-visibility: hidden; backface-visibility: hidden; -moz-osx-font-smoothing: grayscale; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:hover,"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:focus { text-decoration: none; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:after { position: absolute; top: 0; right: 52%; bottom: 0; left: 52%; z-index: -1; border-bottom: 4px solid #14428d; background: rgba(20, 66, 141, .3); content: ''; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:hover:after,"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:focus:after { right: 0; left: 0; }"; cssCode += "@media only screen and (max-width: 767px) {"; cssCode += "#pjAcceptCookieBar { padding: 15px 0; }"; cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarShell { width: 96%; }"; cssCode += "#pjAcceptCookieBar p { font-size: 14px; }"; cssCode += "}"; var styleElement = document.createElement("style"); styleElement.type = "text/css"; if (styleElement.styleSheet) { styleElement.styleSheet.cssText = cssCode; } else { styleElement.appendChild(document.createTextNode(cssCode)); } document.getElementsByTagName("head")[0].appendChild(styleElement); }, addCookieBar: function(){ var self = this; var htmlBar = ''; htmlBar += '<div class="pjAcceptCookieBarShell"><form action="#" method="post">'; htmlBar += '<p>Для улучшения работы сайта и его взаимодействия с пользователями мы используем файлы cookie. Продолжая работу с сайтом, Вы разрешаете использование cookie-файлов. Вы всегда можете отключить файлы cookie в настройках Вашего браузера.</p>'; htmlBar += '<div class="pjAcceptCookieBarActions"><button type="button" class="pjAcceptCookieBarBtn">ОК</button></div></form></div>'; var barDiv = document.createElement('div'); barDiv.id = "pjAcceptCookieBar"; document.body.appendChild(barDiv); barDiv.innerHTML = htmlBar; self.bindCookieBar(); }, bindCookieBar: function(){ var self = this; var btn_arr = self.getElementsByClass("pjAcceptCookieBarBtn", null, "button"); if(btn_arr.length > 0) { self.addEvent(btn_arr[0], "click", function (e) { if (e.preventDefault) { e.preventDefault(); } self.createCookie('pjAcceptCookie', 'YES', 365); document.getElementById("pjAcceptCookieBar").remove(); return false; }); } } }; window.AcceptCookie = AcceptCookie; })(window); window.onload = function() {AcceptCookie = AcceptCookie();} 2. В своем шаблоне (у меня Реалия) ищем файл main.tpl, лежит по адресу /template/frontend/realia/. Перед закрывающим тегом </body> вызываем внешний скрипт:
    <script src="/js/ck.js"></script> 3. Получаем решение:

    Все. Каждый пользователь ежегодно будет уведомляться о куках. 
    PS: данное решение найдено на просторах интернета и немного адаптировано. Сам скрипт может быть ужат, но я не стал этого делать, т.к. работать с ним легче в таком форматировании.
    PPS: кому не нравится полупрозрачность фона уведомления, уберите параметр opacity: 0.8;
     
     
  12. Like
    metrpro изменил репутацию Дмитрий Кондин в $Region_list не передаёт список регионов   
    В самой форме region_id есть?
    Покажите исходник /template/frontend/шаблон/main/main.php
  13. Like
    metrpro изменил репутацию abushyk в $Region_list не передаёт список регионов   
    Что влияет из настроек на показ\формирование этого поля:
    1. наличие поля region_id и его доступность смотрящему в модели объекта - поле должно быть
    2. Настройки - Общее - Выбор региона в форме объявления(region_in_form) - должно быть включено
  14. Like
    metrpro изменил репутацию Chernetskiy в Турбо страницы отладка   
    Вы наверное плохо представляете, для чего создан канал Турбо в Яндексе. А смысл в том, чтобы посетителю поисковика в сокращенной форме предоставить свежую и актуальную информацию. Тащить туда всю базу недвижимости нет смысла, поскольку поисковик не станет засорять канал только вашими объектами. Посетителей много, у всех свои интересы и их интересует не только недвижка, кому-то интересны авто, кому-то кройка и шитьё, кому-то тряпки, игры и т.п. Соответственно, описковик, в соответствии с интересами пользователя выдает ему варианты турбо-страниц от разных источников. Публикация тубро-новостей имеет приоритет и позволяет пользователю подписаться на ваш канал. 
    Вы в свою очередь, публикуете новость, например, лезем на ЦИАН, качаем оттуда обзор рынка загородной недвижимости за последний месяц-квартал по деревне Гадюкино, переписываем его на свой лад, статьей на 300 слов, вставляем в текст пару ссылок на раздел с загородной недвижимостью по Гадюкино (одну на дома, вторую на участки, может еще третью на предложения девелоперов на вашем сайте), добавляем 1-2 картинки и публикуем новость. Эта новость будет Яндексом предложена всем в Гадюкино, кто ищет загородку, соответственно по ссылкам народ будет заходить на ваш сайт и искать конкретику. В приницпе, это будут заинтересованные (горячие) клиенты, с которыми можно работать. Сама по себе публикация новостей поднимает посещаемость на сайте, а в варианте Турбо вы получаете еще и целевую аудиторию.
  15. Like
    metrpro получил репутацию от Helenblondi в Яндекс заменяет тИЦ на ИКС — новый показатель качества сайта   
    Metrpro.ru на 6м месте - моё детище
  16. Like
    metrpro изменил репутацию Дмитрий Кондин в как вставить текст в нижнее меню   
    В /template/frontend/ваш_шаблон/main/main.php
    private function getNewest(){ require_once SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/frontend/grid/grid_constructor.php'; $grid_constructor = new Grid_Constructor(); $params['order'] = 'date_added'; $params['asc'] = 'desc'; $params['page_limit']=3; $params['page']=1; $res = $grid_constructor->get_sitebill_adv_ext( $params, false, false ); //echo count($res); //print_r($res); $this->template->assign('new_grid_items', $res); } $params['page_limit']=3;//  сколько выводить новых
  17. Like
    metrpro изменил репутацию Дмитрий Кондин в Отображение объекта на карте "на лету"   
    Такое реализовано в первых версиях шаблона agency.
    Смотрите вложение realty_view.tpl
  18. Like
    metrpro получил репутацию от DimWeb в Яндекс заменяет тИЦ на ИКС — новый показатель качества сайта   
    Даже удивительно, что никто не сравнивает тут свои ИКСы )))
    Кстати, смотрю - на cmsmagazine заменили ТИЦ на ИКС - в первой 20ке для нашего sitebill 3 созданных мною сайта!
  19. Like
  20. Like
    metrpro получил репутацию от ReatEstate в ЯН.Парсер и его глюки   
    Давно не писал, но наболело. У меня, пожалуй, тут самый богатый опыт использования ЯН.Парсера, поэтому за последний год уловил еще три глюка (плюс один старый), которые хотелось бы устранить:
    1. При импорте изображений из загружаемого фида не импортируются картинки формата png - выдается ошибка. Причем это не зависит от того, накладываете вы водяной знак или нет. 
    2. Если у вас в базе улиц есть, скажем, "Победы улица" в двух разных городах - предположим в Москве за id №100 в Справочнике и в Питере за id №200, то при импорте объявления с этой улице в Питере в самом объявлении ему привяжется улица №100 в Москве, выше расположенная в справочнике с меньшим id - т.е. при импорте перебираются только названия улиц, без привязки к городам.
    3. При применении ассоциации входящих типов для категорий объявлений в фиде не учитывается тип аренда/продажа - т.е. если у вас в фиде есть категория типа Аренда - Коммерческая - Office и вы честно ставите новый тип "Office" с переадресацией в ваш соответствующий раздел по аренде офисов, то как только парсер встретит в фиде категорию Продажа - Коммерческая - Office, то также определит объявление в аренду офисов, потому что категория Office уже привязана к ней, а то что тип объявления при этом Продажа остаётся неучтенным.
    4. Ну я об этом писал и мы с Димой обсуждали - новые генерируемые улицы не привязываются к городам, даже если в самих импортируемых объявлениях города прописаны и в базе уже есть.
    У меня все.
  21. Like
    metrpro изменил репутацию abushyk в Добавляем плагин fotorama в realia   
    да
    да
    да
    да
  22. Like
    metrpro изменил репутацию abushyk в Добавляем плагин fotorama в realia   
    Возможно что да.
    В \template\frontend\realia\css\bootstrap.corrections.css добавляем стили
    body #wrapper-outer #wrapper { display: block; height: auto; } body #wrapper-outer #wrapper #wrapper-inner { display: block; height: auto; } body #wrapper-outer #wrapper #footer-wrapper { display: block; height: auto; } Они отменят некоторую встроенную в реалию стилизацию и дадут возможность фотораме нормально позиционироваться. Хром, эмуляторы в хроме и фф отрабатывают без поломок. В остальных браузерах я не тестировал.
  23. Like
    metrpro изменил репутацию TopRaN в shema.org - кто использует структурированные данные?   
    Работы на пару часов, для стандартной структуры шаблона.
  24. Like
    metrpro получил репутацию от TopRaN в Пилим RSS Новостей для Яндекс.Турбо   
    Всем доброго дня. Как все знают, в Я.Вебмастере теперь есть возможность добавить свой фид формата rss для возможного его отображения в Яндекс.Дзене, что, со слов разработчиков яши, не только прибавляет к карме, но и улучшает посещаемость, особенно если вы добавили туда счетчики, типа лива или метрики.

    С утра решил запилить эту фичу в надежде на бурный рост трафика )) Пишу, может кому и пригодиться.
    В мануале сказано, что для того, чтобы rss-фид стал кошерным, там должно быть 2 основных атрибута: указание типа item вида turbo="true" и поле <turbo:content>. В Сайтбилл фид генерируется файлом /apps/rss/admin/admin.php. Т.к. я не слежу за обновлениями ядра система из-за большого количества подобных доработок, скажу так - ищем в файле строку с первым полем
    echo '<item>'; и правим на
    echo '<item turbo="true">'; Этим мы включили триггер того, что согласны на турбированность новостей из нашего фида. Осталось обозначит сам текст ) Для этого чуть ниже ищем строку, выдающую текст новости в фид:
    echo '<description><![CDATA['.$form_data_shared[$text_field]['value'].']]></description>'."\n"; И перед ним (а можно и после, главное не вместо) добавляем турбо-контент:
    echo '<turbo:content><![CDATA['.$form_data_shared[$text_field]['value'].']]></turbo:content>'."\n"; Ваш фид для Дзена готов! Несмотря на то, что открывая его Яндекс.Браузер будет ругаться, фид кошерный и легко подъедается тем же LiveRSS, а также без проблем проходит валидацию в вебмастере яндекса.
  25. Like
    metrpro получил репутацию от Дмитрий Кондин в Пилим RSS Новостей для Яндекс.Турбо   
    Всем доброго дня. Как все знают, в Я.Вебмастере теперь есть возможность добавить свой фид формата rss для возможного его отображения в Яндекс.Дзене, что, со слов разработчиков яши, не только прибавляет к карме, но и улучшает посещаемость, особенно если вы добавили туда счетчики, типа лива или метрики.

    С утра решил запилить эту фичу в надежде на бурный рост трафика )) Пишу, может кому и пригодиться.
    В мануале сказано, что для того, чтобы rss-фид стал кошерным, там должно быть 2 основных атрибута: указание типа item вида turbo="true" и поле <turbo:content>. В Сайтбилл фид генерируется файлом /apps/rss/admin/admin.php. Т.к. я не слежу за обновлениями ядра система из-за большого количества подобных доработок, скажу так - ищем в файле строку с первым полем
    echo '<item>'; и правим на
    echo '<item turbo="true">'; Этим мы включили триггер того, что согласны на турбированность новостей из нашего фида. Осталось обозначит сам текст ) Для этого чуть ниже ищем строку, выдающую текст новости в фид:
    echo '<description><![CDATA['.$form_data_shared[$text_field]['value'].']]></description>'."\n"; И перед ним (а можно и после, главное не вместо) добавляем турбо-контент:
    echo '<turbo:content><![CDATA['.$form_data_shared[$text_field]['value'].']]></turbo:content>'."\n"; Ваш фид для Дзена готов! Несмотря на то, что открывая его Яндекс.Браузер будет ругаться, фид кошерный и легко подъедается тем же LiveRSS, а также без проблем проходит валидацию в вебмастере яндекса.