Trying to update the order property, but does not write the property, I tried to declare
1st option:
use bitrix \ main;
Main \ eventManager :: getInstance () - & gt; addheventhandler (
'Sale', 'OnsaleOrdersaved', 'AddOrderProperty'
);
FUNCTION AddOrderProperty ($ EVENT)
{
$ Order = $ Event- & GT; GetParameter ("Entity");
$ code = 'pay_link';
$ Value = "https: //". $ _Server ["Server_name"]. "/Pay.php?Order_id=". $ Order- & gt; getid ();
If (CModule :: Includemodule ('Sale')) {
if ($ prop = csalerprops :: getlist ([], ['Code' = & gt; $ code]) - & gt; fetch ()) {
Return CSalerDerProprpsValue :: Add ([
'Name' = & gt; $ Prop ['Name']
'Code' = & gt; $ Prop ['Code']
'Order_props_id' = & gt; $ prop ['id'],
'Order_id' = & gt; $ Order
'Value' = & gt; $ value
]);
}
}
}
2nd option:
use bitrix \ main;
Main \ eventManager :: getInstance () - & gt; addheventhandler (
'Sale', 'OnsaleOrdersaved', 'PAYLINK'
);
FUNCTION PAYLINK (Main \ event $ event) {
CModule :: Includemodule ("Sale");
$ Order = $ Event- & GT; GetParameter ("Entity");
$ paymentids = $ order- & gt; getpaymentsystemid ();
$ persononypeid = $ OrderR- & gt; getpersonteid ();
$ propertycollection = $ OrderCollection ();
if ($ paymentids [0] == 10) {
$ OrderPropertyID = ($ PersontePeid == 1)? 55: 56;
$ somepropvalue = $ propertycollection- & gt; getItemByORDerPropertyID ($ OrderPropertyID);
VAR_DUMP ($ somepropvalue);
If (! $ somepropvalue) {
CSalerDerProprosValue :: Add (Array (
'Order_id' = & gt; $ Order- & gt; getid (),
'Order_props_id' = & gt; $ OrderPropertyID
'Name' = & gt; "Reference to payment",
'Value' = & gt; "https: //". $ _Server ["Server_name"]. "/Pay.php?Order_id=". $ Order- & gt; getid (),
'Code' = & gt; "Pay_link",
));
} else {
$ propvalue = $ somepropvalue- & gt; getValue ();
VAR_DUMP ($ Propvalue);
If (Empty ($ Propvalue)) {
$ somepropvalue- & gt; setValue ("https: //". $ _Server ["Server_Name"]. "/Pay.php.Order_id=". $ Order- & gt; getID ());
$ somepropvalue- & gt; save ();
}
}
}
}
Tell me how to do to work?
Answer 1
something you use D7 in your code, then old methods .. Here is the solution on clean D7. These code, when saving an order, checks whether the PAY_LINK property is checked and depending on this adds property or updates if it is filled not as it should. Other checks, such as physical or legal, add, add.
/ * addition for /bitrix/php_interface/init.php * /
$ eventManager = \ Bitrix \ Main \ eventManager :: getInstance ();
$ eventManager- & gt; AddEventHandler (
'Sale',
'OnsaleOrdersaved',
'AddOrderPropertyPayLink'
);
Function AddOrderPropertyPayLink (\ Bitrix \ Main \ event $ event) {
/ ** @Var \ Bitrix \ Sale \ Order $ Order * /
$ Order = $ Event- & GT; GetParameter ("Entity");
$ paylinkcode = 'pay_link';
$ ServerName = \ Bitrix \ Main \ Context :: getCurrent () - & gt; getServer () - & gt; getservername ();
$ paylinkvalue = 'https: //'. $ ServerName. "/Pay.php?Order_id=". $ Order- & gt; getid ();
/ ** @Var \ Bitrix \ Sale \ PropertyValueCollection $ PropertyCollection * /
$ propertycollection = $ OrderCollection ();
$ property = null;
If ($ PropertyCollection- & GT; GetItembyorderPropertyCode ($ PAYLinkCode) === NULL) {
$ Property = $ PropertyCollection- & GT; CreateItem (
[
'Name' = & gt; 'Reference to payment',
'Code' = & gt; $ paylinkcode
'Type' = & gt; 'String',
]
);
} else {
$ property = $ propertycollection- & gt; getItembyorderPropertyCode ($ paylinkcode);
}
if ($ Property & Amp; & amp; $ Property- & GT; getValue ()! == $ paylinkvalue) {
$ property- & gt; setfield ('value', $ paylinkvalue);
$ Order- & gt; save ();
}
}