Получаю следующий объект:
Bitrix\Tasks\Item\Result Object
(
[instance:protected] => Bitrix\Tasks\Item\Task Object
(
[id:protected] => 443904
[userId:protected] => 0
[transitionState:protected] => Bitrix\Tasks\Item\State Object
(
[isInside:protected] =>
[result:protected] => Bitrix\Tasks\Item\Result Object
(
[instance:protected] =>
[errors:protected] => Bitrix\Tasks\Util\Error\Collection Object
(
[fatalCount:protected] => 0
[values:protected] => Array
(
)
)
[data:protected] =>
)
[time:protected] => 0
[mode:protected] => 1
[parameters:protected] =>
[values:protected] => Array
(
)
)
...
Как мне из него получить значение 443904?
Мой вариант, если битрикс таки не оборачивают:
class CustomTask extends Bitrix\Tasks\Item\Task
{
public function getTaskId()
{
return $this->id;
}
}
И уже вызывать CustomTask
Чтобы получить информацию о создании задачи достаточно вызвать метод getData
после создания задачи.
Пример:
$task = new \Bitrix\Tasks\Item\Task(0, 1);
$task->save();
$taskResult = $task->getData();
В общем у меня получилось добраться к id через защищённые свойства, но думаю есть более простой способ, кто знает прошу написать. Вот мой вариант:
class A{
protected $b;
public function __construct(B $b){
$this->b = $b;
}
}
class B{
protected $id = 43243;
}
$a = new A(new B);
$reflectionClass = new ReflectionClass('A');
$reflectionProperty = $reflectionClass->getProperty('b');
$reflectionProperty->setAccessible(true);
$bClass = $reflectionProperty->getValue($a);
$reflectionClass = new ReflectionClass($bClass);
$reflectionProperty = $reflectionClass->getProperty('id');
$reflectionProperty->setAccessible(true);
print_r($reflectionProperty->getValue($bClass));
Сначала я сделал доступным свойство класса A
и затем уже взялся за id
Структура такая же как и у вас, вам стоит только заменить переменные
Если посмотреть все методы объекта, то увидим, что нет метода для получения id. Поэтому единственный вариант, кроме расширения класса Битрикс, использовать зеркальный класс:
function accessProtected($obj, $prop) {
$reflection = new \ReflectionClass($obj);
$property = $reflection->getProperty($prop);
$property->setAccessible(true);
return $property->getValue($obj);
}
Еще один недостаток - вложенность свойств, поэтому эту функцию придется вызвать дважды:
$inst = self::accessProtected($result, 'instance');
$id = self::accessProtected($inst, 'id');
Но использовать такой метод в Production можно только после профайлинга. А если нужно более изящное решения, то нужно искать реализацию подобных задач в исходных кодах самого Битрикс:
bash: grep -r 'Bitrix\Tasks\Item\Task' /path/to/bitrix/
Пришлось решить вопрос через init.php, там отследить событие создания задачи. Как раз и возвращается id.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Потому, что логическая конструкция ! работает только с приведенными типами?
я изучаю PHPМне интересно решать задачи по средствам PHP, HTML и CSS, поэтому прошу не предлагать решения по средствам JS, AJAX