Web
Analytics
Skip to content
Concrete5 на русском языке

Создание, чтение, поиск, обновление и удаление Express объектов

Эта документация для concrete5 8.1.0 или выше.

Несмотря на то, что вы можете программно добавить Express объекты в контроллер плагина, вы также можете использовать этот подход для программного добавления записей, их атрибутов и даже связей между этими записями. 

Создание Express объектов (сущностей)

Необходимые условия для создания плагина

Заметка: в этой документации предполагается, что вы добавляете  Express Объект в плагин через метод install(). Если вы не знакомы с созданием плагинов в  concrete5 сначала прочтите документацию.

Вначале, создайте несколько объектов Express как описано документации по созданию Express объектов. Например, довайте создадим объект Студент:

$student = Express::buildObject('student', 'students', 'Студент');
$student->addAttribute('text', 'Имя', 'student_first_name');
$student->addAttribute('text', 'Фамилия', 'student_last_name');
$student->addAttribute('textarea', 'Биография', 'student_bio');
$student->addAttribute('address', 'Адрес', 'student_contact_address');
$student->save();

Таким образом создаётся объект Студент с 4 атрибутами. Затем, мы используем Строителя записей Express, чтобы создать несколько записей о студентах.

Строитель Express объектов

Сначала, мы вызовем экземляр класса Строителя Express объектов. Это можно сделать импортировав  Express фасад в файле контроллера controller.php вашего плагина:

use Express;

Затем, внутри метода install() в файле  controller.php, вы создадите экземпляр объекта класса Concrete\Core\Express\EntryBuilder и присвоите ему несколько атрибутов:

    $address = new \Concrete\Core\Entity\Attribute\Value\Value\AddressValue();
    $address->setAddress1('123 SW Test');
    $address->setCity('Portland');
    $address->setStateProvince('OR');
    $address->setPostalCode('97200');

    $entry = Express::buildEntry('student')
        ->setStudentFirstName('Эндрю')
        ->setStudentLastName('Эмблер')
        ->setStudentContactAddress($address)
        ->save();

Объект$entry здесь это полный объект класса  Concrete\Core\Entity\Express\Entry, с тремя ключами атрибутов закреплённых за ним. Магические методы setStudent* автоматически работают на основе идентификаторов ключей атрибутов назначенных в классе ObjectBuilder.

Добавление к объекту связей

Добавить связи к объекту также легко. Это не делается через класс EntryBuilder, потому что в отличии от объектов класса EntryBuilder, связи происходят сразу (там нет метода save().). Давайте создадим объект Учитель и свяжем пару объектов Студент с учителем:

$teacher = Express::buildObject('teacher', 'teachers', 'Учитель');
$teacher->addAttribute('text', 'Имя', 'teacher_first_name');
$teacher->addAttribute('text', 'Фамилия', 'teacher_last_name');
$teacher = $teacher->save();

Теперь $student и $teacher созданные записи Concrete\Core\Entity\Express\Entity,связанные с соответствующими Express объектами.

$student1 = Express::buildEntry('student')
    ->setStudentFirstName('Эндрю')
    ->setStudentLastName('Эмблер')
    ->save();

$student2 = Express::buildEntry('student')
    ->setStudentFirstName('Джейн')
    ->setStudentLastName('Доу')
    ->save();

$teacher = Express::buildEntry('teacher')
    ->setTeacherFirstName('Альберт')
    ->setTeacherLastName('Эйнштейн')
    ->save();

Теперь, предполагая, что у нас есть связь Один-ко-Многим от Учителя к Студенту, мы можем использовать метод  associateEntries()на любом из объектов, и связать соответствующие объекты.

$teacher->associateEntries()->setStudents([$student1, $student2]);

Вот и всё! Связи обновлены.

Получение данных об Express Записи

Когда у нас есть express запись объекта, получить ее данные легко. Просто вызовите $entry->get* где  * соответствует идентификатору атрибута, где каждое слово записано с заглавной буквы и слитно (горбом верблюда). Так в этом примере наше идентификатор атрибута записан так:  teacher_first_name, если у нас есть запись об учителе, то мы её вызвваем

print $entry->getTeacherFirstName();

Это вернёт данные в соответствующем атрибуту  формате ответа . Так в нашем примере он вернёт текст. Хотите  лежащий в основе атрибута объект значения? Просто сделайте вызов

$value = $entry->getAttributeValueObject('teacher_first_name');

Получение связанных записей

Это также легко, как и получение связанных записей от записи объекта. В нашем примере выше, у нас есть студент и его связи Много-к-Одному по отношению к учителю, и наоборот. Когда получаем соответствующие учителю записи от студента, его целевое имя переменной обычно будет в единственном числе, и будет стандартное использование идентификатора для учителя ( "teacher"). Когда создаем запись учителя, и работая со связью Один-ко-Многим, мы получим название идентификатора соответствующее множественному числу  ("students."). Когда нам известно соответствующее целевое название название свойства для нашего типа связи, мы просто вызваем  $entry->get* с написанного целевого названия ГорбомВерблюда:

$students = $teacher->getStudents(); // Вернет набор студентов, так как связь Один-ко-Многим;
foreach($students as $student) {
    print $student->getStudentFirstName();
}

$teacher = $student->getTeacher(); // Вернет единственный объект учителя, так как связ Много-к-Одному
print $teacher->getTeacherFirstName();

Получение записей

Получение списка записей

Чтобы получить список записей нужно использовать класс Concrete\Core\Express\EntryList . Давайте используем этот класс, чтобы получить список всех студентов. Сначала, получим  Express объект студентов:

$entity = Express::getObjectByHandle('student');

Звтем подтвердим объект списка записей его сущностью, в качестве аргумента.

$list = new Concrete\Core\Express\EntryList($entity);

Это экземпляр класса  Concrete\Core\Search\ItemList\Database\AttributedItemList . Вы можете использовать те же методы, которые использовали для фильтрации страниц или файлов:

$students = $list->getResults();

Фильтрация списка

Отфильтровать список можно также, как вы фильтровали список страниц по пользовательскому атрибуту:

$list->filterByStudentFirstName('Эндрю');
$results = $list->getResults(); // Вернет только записи студентов, у которых имя Эндрю

Фильтрация по связям

Пока не возможно фильтровать список записей по связям. Мы бы с радостью приняли ваше предложение по написанию функционала для объекта класса EntryList.

Получение записи по ID

Нужно получить запись по ID? Это просто:

$student = Express::getEntry(1);

Теперь вы можете получить его связи или атрибуты:

print $student->getFirstName();
$teacher = $student->getTeacher();
print $teacher->getTeacherFirstName();

Сортировка списка

Магические методы, которые работают для фильтрации, работают и для сортировки.

$list = new Concrete\Core\Express\EntryList($entity);
$list->sortByStudentFirstName('desc');// сортировать по убыванию
$result = $list->getResults();

Обновление записи

Обновить запись также легко.

$student = Express::getEntry(1);

Мы получили первую запись студента. Давайте изменим его имя с Эндрю на Энди.

$student->setStudentFirstName('Энди');
$student->setAttribute("student_first_name", "Энди"); // Эти методы одинаковые и взаимозаменяемые

Назначение объекту атрибута происходит сразу, Тем не менее, если вы вызовете  getAttribute()сразу после выполнения скрипта, значение атрибута у объекта не обновится. Чтобы обойти это, используйте метод  refresh() из класса Менеджера Express объекта:

$student = Express::refresh($student);
print $student->getStudentFirstName(); // Вернет "Энди"

Обновление связей происходит также, как и их создание. Заметка: обновление связей очищает существующие связи.

$student->associateEntries()->setTeacher(null); // Теперь у Эндрю нет учителя.

Удаление записей

Нужно удалить Express запись? Это легко:

Express::deleteEntry($student);

Теперь запись о студенте удалена. Все значения атрибутов и связи в базе данных также удалены. Связи соответствующих записей обновлены.

Загрузка беседы
Новые статьи
#
Concrete5 это великолепная система управления контентом (CMS), позволяющая создавать сайты как на конструкторе сайтов, но с функциональностью,…
Как вычленить из строки только кириллические буквы и пробелы или только латинские буквы, цифры и пробелы.
При парсинге с помощью плагина SimpleHtmlDom, можно фильтровать по атрибутам, но как сделать фильтрацию по data-src и аналогичным?