Не могу получить имя пользователя

Главные вкладки

Аватар пользователя riaron777 riaron777 2 сентября 2022 в 22:56

не могу получить имя пользователя 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)<or count($a)>=1){
                            return 
'hello';
                    }
    }elseif(
$count<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);
        }
    }
    
    
    

  }

?>

подскажите как правильно

Комментарии

Аватар пользователя OldWarrior OldWarrior 3 сентября 2022 в 1:18
1

PS. Честно говоря, идея хранить имя пользователя (и впоследствии указывать его как условие загрузки сущностей) выглядит как-то не очень. Лучше - ID пользователя, да и поле 'field_polzovatel' можно тогда сделать ссылкой на сущность пользователя.

Аватар пользователя OldWarrior OldWarrior 3 сентября 2022 в 9:17
riaron777 wrote: на что поменять reset()(current())


Ни бельмеса не понял, чего вообще хотели добиться этой конструкцией. Да и задавать подобные вопросы в отрыве от контекста (в вышеприведённом коде не вижу такой химии) - как правило непродуктивно.

riaron777 wrote: Calling current() on an object is deprecated


Скорее всего, у вас текущая версия PHP > 8.1.0. Понижайте версию:

Аватар пользователя riaron777 riaron777 3 сентября 2022 в 10:33

Выводит что устарело. в коде не раз функцию reset() использовал, также пытался заменить reset на current(нашел в другом форуме),
Все равно выводит ошиибку что устарело, на какую функцию заменили reset() что можно вместо ресета заменить. у меня drupal 9.4

Аватар пользователя OldWarrior OldWarrior 3 сентября 2022 в 21:13

riaron777 wrote: в коде не раз функцию reset() использовал

Вы как-то тогда более понятно формулируйте вопросы. Потому что написание вида 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); ?>

Аватар пользователя riaron777 riaron777 6 сентября 2022 в 22:29

поменял все как написали, на 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).
как исправить это