Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Некорректное создание xml feed'a 
V
    Опции темы
Shark
  Дата 29.10.2015, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 18.6.2006
Где: Москва

Репутация: 4
Всего: 4



программисты написали такой код для яндекс.недвижимости
Код

$options=array();
$xml=simplexml_load_file ("feed.xml");
//получаем id последней записи
//$last_id = (string)$xml->offer[count($xml->offer)-1]['internal-id'];
$offer = $xml->addChild('offer');
$product_category=array();
switch ($_POST["type"]) {
    case "arend":
        $offer->addChild('type','аренда');
        $product_category[0]=60;
        break;
    case "sale":
         $offer->addChild('type','продажа');
         $product_category[0]=64;
        break;
}
$offer->addChild('property-type','жилая');
switch ($_POST["category"]) {
    case "flat":
        $offer->addChild('category','квартира');
        if ($product_category[0]==60){
          $product_category[1]=61;
        } else {
          $product_category[1]=65;  
        }
        $options[16]='квартира';
        break;
    case "house":
         $offer->addChild('category','дом');
         if ($product_category[0]==60){
          $product_category[1]=63;
        } else {
          $product_category[1]=66;  
        }
        $options[16]='дом';
        break;
    case "room":
         $offer->addChild('category','комната');
         if ($product_category[0]==60){
          $product_category[1]=62;
        } else {
          $product_category[1]=65;  
        }
        $options[16]='комната';
        break;
    case "part":
         $offer->addChild('category','участок');
          $product_category[1]=67;
          $options[16]='участок';  
        break;
}
$options[17]=$_POST["locality-name"];
$options[19]=$_POST["street"];
$options[20]=$_POST["house"];
$options[21]=$_POST["building"];
$options[26]=$_POST["floor"];
$options[27]=$_POST["floors_total"];
$options[28]=$_POST["area"];
$options[29]=$_POST["living"];
$options[30]=$_POST["kitchen"];
$options[32]=$_POST["metro"];
$options[33]=$_POST["region"];
$options[34]=$_POST["lot-area"];

$date = date("Y-m-d\TH:i:sP");
$offer->addChild('creation-date',$date);//поменять
$address=$_POST["street"] . ', ' . $_POST["house"];
if ( strlen($_POST["building"]) ) { $address.=', ' . $_POST["building"]; }
$location=$offer->addChild('location');
$location->addChild('country','Россия');
$location->addChild('region',$_POST["region"]);
$location->addChild('locality-name',$_POST["locality-name"]);
$location->addChild('sub-locality-name',$_POST["district"]);
$location->addChild('address',$address);

if ( strlen($_POST["metro"]) ) {
    $metro=$location->addChild('metro');
    $metro->addChild('name',$_POST["metro"]);
    }
$offer->addChild('description',$_POST["description"]);

$price=$offer->addChild('price');
$price->addChild('value',$_POST["sum"]);
$price->addChild('currency','RUR');
if ($product_category[0]==60){
    $price->addChild('period','месяц');
}

$area=$offer->addChild('area');
$area->addChild('value',$_POST["area"]);
$area->addChild('unit','кв.м');

$living=$offer->addChild('living-space');
$living->addChild('value',$_POST["living"]);
$living->addChild('unit','кв.м');

$kitchen=$offer->addChild('kitchen-space');
$kitchen->addChild('value',$_POST["kitchen"]);
$kitchen->addChild('unit','кв.м');

if ($_POST["lot-area"]!='') {
    $kitchen=$offer->addChild('lot-area');
    $kitchen->addChild('value',$_POST["lot-area"]);
    $kitchen->addChild('unit','сот');
}

foreach ($uploadfile as $image) {
    $image='http://premial-nedvizhimost.ru/image/'.$image;
    $offer->addChild('image',$image);
}

$agent=$offer->addChild('sales-agent');
$agent->addChild('category','агентство');
$agent->addChild('name',$_POST["agent_name"]);
$agent->addChild('phone',$_POST["agent_phone"]);

$offer->addChild('rooms',$_POST["rooms"]);

$offer->addChild('floor',$_POST["floor"]);

$offer->addChild('floors-total',$_POST["floors_total"]);
$offer->addAttribute('internal-id', $product_id);            
$xml->asXML("feed.xml");

проверка на валидацию загрузки файлов (фото) и записи в БД я вырезал из него.

Но есть проблема. Проблема заключается в том, что при создании XML файла и его последующего заполнения, он не проходит валидацию на яндекс недвижимости. Связано это с тем, что если одно из полей:
Код

$options[17]=$_POST["locality-name"];
$options[19]=$_POST["street"];
$options[20]=$_POST["house"];
$options[21]=$_POST["building"];
$options[26]=$_POST["floor"];
$options[27]=$_POST["floors_total"];
$options[28]=$_POST["area"];
$options[29]=$_POST["living"];
$options[30]=$_POST["kitchen"];
$options[32]=$_POST["metro"];
$options[33]=$_POST["region"];
$options[34]=$_POST["lot-area"];

окажется по какой-то причине пустым, то в XML файле тег или правильнее будет "параметр" указываться не так:
<value></value>
а так:
<value />

Как решить данную проблему? Желательно без доп.кода на проверку заполнения той или иной части. Желания связано с тем, что продаваться может участок без дома, соответственно, эти параметры:
Код

$options[26]=$_POST["floor"];
$options[27]=$_POST["floors_total"];
$options[28]=$_POST["area"];
$options[29]=$_POST["living"];
$options[30]=$_POST["kitchen"];

будут пустые.

Или все же придется делать проверку на заполнения $options[]?



Это сообщение отредактировал(а) Shark - 28.2.2016, 21:50


--------------------
Смерть - это только начало... 
Агентство недвижимости Premial
PM MAIL WWW ICQ   Вверх
ksnk
Дата 29.10.2015, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Вообще-то, пустое значение попадает в xml в самозакрытом теге
http://ideone.com/wi8ZXZ
Где-то кто-то пробелы вставил?




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Shark
Дата 29.10.2015, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 18.6.2006
Где: Москва

Репутация: 4
Всего: 4



ksnk, в БД не видел пробелов..

Код

<?xml version="1.0" encoding="UTF-8"?>
<realty-feed xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06">
<generation-date>2015-05-13T17:23:00+04:00</generation-date>
<offer internal-id="307">
    <type>продажа</type>
    <property-type>жилая</property-type>
    <category>дом</category>
    <creation-date>2015-09-23T14:42:10+04:00</creation-date>
    <location>
        <country>Россия</country>
        <region>московская область</region>
        <locality-name>еуео</locality-name>
        <sub-locality-name>рмпо</sub-locality-name>
        <address>/, /</address>
    </location>
    <description>test</description>
    
    <price>
        <value>3650000</value>
        <currency>RUR</currency>
        <period>месяц</period>
    </price>
    
    <area>
        <value>67</value>
        <unit>кв.м</unit>
    </area>
    
    <living-space>
        <value>/</value>
        <unit>кв.м</unit>
    </living-space>
    
    <kitchen-space>
        <value>/</value>
        <unit>кв.м</unit>
    </kitchen-space>
    
    <lot-area>
        <value>10</value>
        <unit>сот</unit>
    </lot-area>
    
    <sales-agent>
        <category>агентство</category>
        <name>Анна</name>
        <phone>+71234567689</phone>
    </sales-agent>
    
    <rooms>/</rooms>
    <floor>2</floor>
    
    <floors-total/>
</offer>



обратите внимание на <floors-total/>
валидатор пишет: <detail>cvc-datatype-valid.1.2.1: '' is not a valid value for 'integer'.</detail>


--------------------
Смерть - это только начало... 
Агентство недвижимости Premial
PM MAIL WWW ICQ   Вверх
ksnk
Дата 29.10.2015, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Ну понятно же. Полю нужно числовое значение. Ибо итак записано в http://webmaster.yandex.ru/schemas/feed/realty/2010-06. Пустое значение считается неправильным. 

Нужно явно вписать 0 в значение поля.

А можно, конечно, залечить проблему регуляркой
Код

file_put_contents("feed.xml"
   preg_replace('/<(floors\-total)/>/','<$1>0</$1>',$xml->asXML())
);



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Shark
Дата 29.10.2015, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 18.6.2006
Где: Москва

Репутация: 4
Всего: 4



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


--------------------
Смерть - это только начало... 
Агентство недвижимости Premial
PM MAIL WWW ICQ   Вверх
ksnk
Дата 29.10.2015, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Ну и добавлять их черз |
Код

file_put_contents("feed.xml"
   preg_replace('/<(floors\-total|onemorefield|andnextfield)/>/','<$1>0</$1>',$xml->asXML())
);

Надо только не забывать слешить специальные символы


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Shark
Дата 30.10.2015, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 18.6.2006
Где: Москва

Репутация: 4
Всего: 4



ksnk, Спасибо за помощь, но все равно придется прописать в некоторые позиции if()else{}, т.к. некоторые параметры не могут быть пустыми и равны 0... Соответственно придется их убирать из фида конструкцией if()else{}.


--------------------
Смерть - это только начало... 
Агентство недвижимости Premial
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.