Программно создать страницу

Аватар пользователя natalikarn natalikarn 18 октября в 15:37

Здравствуйте всем!

Может мне кто-то подсказать каким образом я могу создать программно страницу?)

Есть несколько стандартных страниц , которые созданы посредством друпал.

Как сделать, чтобы, чтобы по кнопке создалась и сохранилась страница, в которую загрузится содержание от имеющихся определенных страниц (нод).

Лучший ответ

Аватар пользователя vlucas vlucas 19 октября в 8:58

код - это просто пример...
По идее и так будет работать:

$node = Node::create(['type' => 'page', 'title' => 'Test']);
$node->save();

Node конечно должны подключить

Комментарии

Аватар пользователя VasyOK VasyOK 18 октября в 15:44

Скорей всего вам нужно искать на Ютюбе видики по Views. Для D8 подойдут. Да и для D7 не особо отличаются.

Аватар пользователя vlucas vlucas 18 октября в 19:18

Можно, например, так:

<?php    // Create a "Llama" node.
    
$node Node::create(['type' => 'page']);
    
$node->setTitle('Llama')
      ->
setOwnerId(1)
      ->
setPublished()
      ->
setCreatedTime(123456789)
      ->
setChangedTime(123456789)
      ->
setRevisionCreationTime(123456789)
      ->
set('path''/llama')
      ->
save();

?>

В тестах валом примеров.

Аватар пользователя natalikarn natalikarn 18 октября в 19:50

извините, только учусь.. как этот код обработать кнопкой? Добавила в функцию в модуль, но ничего не произошло

Аватар пользователя vlucas vlucas 18 октября в 19:51

Сначала нужно сделать саму форму, а затем в её сабмите реализовать код, пример, которого дан

Аватар пользователя natalikarn natalikarn 18 октября в 23:51

это само-собой, но что-то не работает у меня, должна ли я что-то еще подключить в модуле кроме, как - use Drupal\node\Entity\Node;

и как правильно указать - path?

Аватар пользователя vlucas vlucas 19 октября в 8:58

код - это просто пример...
По идее и так будет работать:

$node = Node::create(['type' => 'page', 'title' => 'Test']);
$node->save();

Node конечно должны подключить

Аватар пользователя natalikarn natalikarn 19 октября в 11:31

А с определением текущего пользователя, можете что-то подсказать? Что-то опять непонятки.., вроде правильно выглядит, а не хочет работать

// Определить текущего пользователя
    $userCurrent = \Drupal::currentUser();
    $user_uid = \Drupal\user\Entity\User::load($userCurrent->id());
    $name_user_uid = $user_uid->getUsername();
Аватар пользователя vlucas vlucas 19 октября в 11:35

Вы используете xdebug? Если нет - очень рекомендую.
Что приходит в $userCurrent у вас?

Аватар пользователя natalikarn natalikarn 19 октября в 12:20

установлю xdebug и проверю, сейчас вижу в логах такую ошибку -

Error: Object of class Drupal\user\Entity\User could not be converted to string в PDOStatement->execute() (строка 59 из /var/www/num.com/core/lib/Drupal/Core/Database/Statement.php)
Аватар пользователя vlucas vlucas 19 октября в 12:05

такой код писать без xdebug - попросту тратить огромное количество времени на всякого рода гадания

Аватар пользователя natalikarn natalikarn 19 октября в 13:03

На первый взгляд, уведомление указывает на то, что по какой-то причине свойство uid сеанса UserSession на самом деле является объектом User, а не целым числом.

Аватар пользователя vlucas vlucas 19 октября в 15:19

Если бы вы поставили xdebug или хотя бы девелом вывели, то сразу бы поняли что возвращает $userCurrent и не было бы этих "гаданий на кофейной гуще"

Аватар пользователя natalikarn natalikarn 19 октября в 14:50

Соорудилась у меня вот такая конструкция - рабочая

<?php

namespace Drupal\num\Form;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Implementing a numerology calculator form.
 */

class TestForm extends FormBase {
   
  /**
   * @var AccountInterface $account
   */

  protected $account;
   
  /**
   * Class constructor.
   */

  public function __construct(AccountInterface $account) {
    $this->account = $account;
  }
 
   /**
   * {@inheritdoc}
   */

  public static function create(ContainerInterface $container) {
    // Instantiates this form class.
    return new static(
      // Load the service required to construct this class.
      $container->get('current_user')
    );
  }
 
  /**
   * {@inheritdoc}
   */

  public function getFormId() {
    return 'test_form';
  }

  /**
   * {@inheritdoc}.
   */

  public function buildForm(array $form, FormStateInterface $form_state) {

     $form['actions']['submit'] = [
        '#id' => 'button',
        '#type' => 'submit',
        '#value' => $this->t('Определить'),
        '#ajax' => [
        'callback' => '::getID',
         ],
    ];
     
    $form['message'] = [
        '#type' => 'markup',
        '#markup' => '<div class="result"></div>',
    ];
     
    return $form;
  }

  public function getID(array $form, FormStateInterface $form_state) {
     
        $uid = $this->account->id();

        $response = new AjaxResponse();
        $response->addCommand(
        new HtmlCommand(
        '.result',  
            '<div class="my_mess_notlink">' .'UID - Пользователя' . $uid . '</div>'
                       ),);    
        return $response;
  }

  /**
   * Submitting the form.
   */

  public function submitForm(array &$form, FormStateInterface $form_state) {
  }

}

Аватар пользователя natalikarn natalikarn 19 октября в 15:52

у меня по другому не работает.. не знаю почему, может быть к моему модулю библиотечки надо какие-то подключить

Аватар пользователя vlucas vlucas 19 октября в 17:58

Что не работает?
Тот метод, который вам нужен уже доступен в классе! А вы дополнительно загружаете сервис.

Аватар пользователя vlucas vlucas 19 октября в 19:35

Здесь вам не нужен конструктор и create, т.к. метод currentUser() уже доступен в объекте.