не могу получить имя пользователя 1-$user->getUsername(), 2-$user->name() или выдет ошибку:
1)Error: Call to undefined method Drupal\user\Entity\User::getUsername() in shop_addtobasket() (line 24 of modules\shop\shop.module).
2)InvalidArgumentException: Placeholders must have a trailing [] if they are to be expanded with an array of values. in Drupal\Core\Database\Connection->expandArguments() (line 1085 of core\lib\Drupal\Core\Database\Connection.php).
<?php
use Drupal\user\Entity\User;
use Drupal\node\Entity\Node;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use \Drupal\Core\Url ;
function generateCode($length = 6)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI_JKLMNOPRQSTUVWXYZ0123456789";
$code = "";
$clen = strlen($chars) - 1;
while (strlen($code) < $length) {
$code .= $chars[mt_rand(0, $clen)];
}
return $code;
}
function
shop_addtobasket() {
$user = User::load(\Drupal::currentUser()->id());
$a=\Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
'type' => 'basket',
'field_polzovatel'=>$user->getUsername(),
]);
$node=reset($a);
$count=count($a);
if($count==0){
if(strlen($user->getUsername())>4){
$request= \Drupal::request()->query;
$request=reset($request);
$article= $request['articul'];
$b=\Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
'type' => 'notebook',
'field_artikul'=>$article,
]);
$nodes=reset($b);
$tit=generateCode(10);
$nod = Node::create([
// The node entity bundle.
'type' => 'basket',
]);
$nod->set('title',$tit);
$nod->set('uid',1);
$nod->status=1;
$nod->field_itogo=$nodes->field_cena;
$nod->field_polzovatel=$user->getUsername();
$nod->field_artikuly=$article;
$nod->enforceIsNew;
$nod->save();
}
}elseif($count==1){
/**/
$request= \Drupal::request()->query;
$request=reset($request);
$article= $request['articul'];
$a=\Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
'type' => 'basket',
'field_polzovatel'=>$user->getUsername(),
'field_artikuly'=>$article,
]);
if(count($a)==0){
$values=$node->get('field_artikuly')->getValue();
$values[]=$article;
$b=\Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
'type' => 'notebook',
'field_artikul'=>$article,
]);
$nod=reset($b);
$node->set('field_artikuly', $values);
foreach($node->get('field_artikuly') as $nodes){
$b=\Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
'type' => 'notebook',
'field_artikul'=>$nodes->value,
]);
$nid=reset($b);
$tt+=$nid->get('field_cena')[0]->value;
}
$node->set('field_itogo', $tot);
$node->save();
}elseif(count($a)<0 or count($a)>=1){
return 'hello';
}
}elseif($count<0 or $count>=2){
$storage = \Drupal::entityTypeManager()->getStorage('node');
$query = $storage->getQuery();
$query->condition('uid', 1);
$query->condition('type', 'basket');
$query->condition('field_polzovatel', $user->getUsername());
$ids = $query->execute();
if (!empty(
$ids)) {
$entities = $storage->loadMultiple($ids);
$storage->delete($entities);
}
}
}
?>
подскажите как правильно
Комментарии
Deprecated
Используйте
$user->getDisplayName()
PS. Честно говоря, идея хранить имя пользователя (и впоследствии указывать его как условие загрузки сущностей) выглядит как-то не очень. Лучше - ID пользователя, да и поле 'field_polzovatel' можно тогда сделать ссылкой на сущность пользователя.
на что поменять reset()(current())?
выдаеть что et()(current()) deprecated
Calling current() on an object is deprecated in shop_addtobasket() (line 59 of
Ни бельмеса не понял, чего вообще хотели добиться этой конструкцией. Да и задавать подобные вопросы в отрыве от контекста (в вышеприведённом коде не вижу такой химии) - как правило непродуктивно.
Скорее всего, у вас текущая версия PHP > 8.1.0. Понижайте версию:
Выводит что устарело. в коде не раз функцию reset() использовал, также пытался заменить reset на current(нашел в другом форуме),
Все равно выводит ошиибку что устарело, на какую функцию заменили reset() что можно вместо ресета заменить. у меня drupal 9.4
Вы как-то тогда более понятно формулируйте вопросы. Потому что написание вида
reset()(current())
можно принять за единую связку.По существу. Что reset(), что current() - в обоих случаях вызов функции в объекте (object) объявлен устаревшим (deprecated) начиная с PHP 8.1.0. Выше вам уже предлагалось понизить версию PHP. Да и какой сакральный смысл использовать именно PHP 8 с Drupal 9.4? Достаточно ветки PHP 7.x
Как альтернатива - можно попробовать использовать конструкцию вида
<?php $result = $arr[array_key_first($arr)]; ?>
вместо<?php $result = reset($arr); ?>
Спасибо
поменял все как написали, на 59 строке это
<?php $request=[array_key_first($request)];?>
ъ при условии<?phpelseif($count==1)?>
выдет ошибку что:TypeError: array_key_first(): Argument #1 ($array) must be of type array, Drupal\Core\Http\InputBag given in array_key_first() (line 59 of modules\shop\shop.module).
как исправить это