Записи



Платформа предоставляется с возможностями CMS и она предполагает, что по умолчанию любые элементы, содержащие данные сайта, являются моделью Post. Такая структура подходит для большинства публичных веб-сайтов, так как их структура очень сильно похожа. Как например:

  • Новости,
  • Акции,
  • Страницы,
  • Вакансии

Вы можете придумать сотни вариаций. Для того, что бы не использовать почти одинаковые модели и миграции ORCHID использует базовую модель Post. Она использует JSON тип для колонок, что гораздо удобнее и проще, чем EAV формат, кроме того, это позволяет делать перевод. Некоторые подходы мы специально воспроизвели с WordPress для Laravel, что позволит вам быть эффективнее.

Получение данных

Итак, теперь вы можете получить данные базы данных:

use Orchid\Press\Models\Post;

$posts = Post::all();
// Все опубликованные записи
$posts = Post::published()->get();
$posts = Post::status('publish')->get();

// Конкретная запись
$post = Post::find(42);

//Название записи с учетом текущей локализации
echo $post->getContent('name');

Возможность хранения локализации в JSON не означает, что вы должны заполнять все значения, например запись информации о баре, может быть на русском и английском, но количество мест не изменится ни для какого языка. Соответственно, нет смысла дублировать такие параметры, а выносить их в опции

// Конкретная запись
$post = Post::find(42);

//Получить все опции
echo $post->getOptions();

//Получить все параметры локализации из опций
echo $post->getOption('locale');

// Если опции не существует или она не указана
// можно указать второй параметр, который будет возвращаться.
echo $post->getOption('countPlace',10);

Наследование одиночной таблицы

Если вы решили создать новый класс для своего настраиваемого типа сообщений, вы можете вернуть этот класс для всех экземпляров этого типа сообщений.

Определение поведения записи основано на указанном типе.

//Все объекты в коллекции $videos будут экземплярами Post
$videos = Post::type('video')->status('publish')->get();

Таксонометрия

Вы можете получить таксонометрию для определенной записи, например:

$post = Post::find(42);
$taxonomy = $post->taxonomies()->first();
echo $taxonomy->taxonomy;

Или вы можете искать записи, используя свою таксонометрию:

$post = Post::taxonomy('category', 'php')->first();

Возможны более сложные формы, например, получить все записи из категории main включая её дочерние категории:

$posts  = Post::whereHas('taxonomies.term', function($query){
    $query->whereIn('slug',
        Category::slug('main')->with('childrenTerm')
        ->first()->childrenTerm->pluck('term.slug')
    );
})->get()

Помните, что такие записи могут быть менее эффективны в скорости выборки и приведены для примера.

Категории и Таксонометрия

Для получения категории, таксонометрии или записи из определенной категории можно воспользоваться следующими методами:

// все категории
$category = Taxonomy::category()->slug('uncategorized')->posts()->first();

// Только все категории и записи, связанные с ним
$category = Taxonomy::where('taxonomy', 'category')->with('posts')->get();
$category->each(function($category) {
    echo $category->term->getContent('name');
});

// все записи из категории
$category = Category::slug('uncategorized')->posts()->first();
$category->posts->each(function($post) {
    echo $post->getContent('name');
});

Вложения

Вложения - это файлы, относящиеся к записи. Эти файлы могут быть разных форматов и разрешений. Каждый формат можно вызывать отдельно, например, принимать только изображения или только документы в записи.

$item = Post::find(42);
$item->attachment('image')->get();

Загруженным изображениям автоматически присваиваются разрешения, указанным в config/platform. Чтобы вызвать их, вы можете использовать ранее указанный ключ. Если изображения для этого ключа не найдены, исходный файл будет возвращен.

$image = $item->attachment('image')->fisrt();

//Возвращает общий адрес изображения с требуемым разрешением изображения
$image->url('standart');

Полнотекстовый поиск

Платформа поставляется с пакетом Scout который является абстракцией для полнотекстового поиска в ваши модели Eloquent. Так как Scout не содержит самого "драйвера" поиска, требуется поставить и указать требуемое решение, это могут быть elasticsearch, algolia, sphinx или другие решение.

Для использования полнотекстового поиска требуется добавить новый метод в ваш класс поведения:

/**
 * Get the indexable data array for the model.
 *
 * @param $array
 *
 * @return mixed
 */
public function toSearchableArray($array)
{
    // Customize array...

    return $array;
}

Принимать он будет все данные модели, а возвращать элементы которые требуются для индексации.

Возьмём для примера стандартный “DemoPost.php”, он имеет множество параметров, но действительно, нам необходимы лишь два:

  • Название статьи
  • Содержание статьи

Для этого мы должны их вернуть:

/**
 * Get the indexable data array for the model.
 *
 * @param $array
 *
 * @return mixed
 */
public function toSearchableArray($array)
{
    $array['content']['en']['id'] = $array['id'];

    return $array['content']['en'];
}

Мы вернули все данные на английском языке, с индексом.

Для импортирования осталось лишь применить команду:

php artisan scout:import Orchid\\Platform\\Core\\Models\\Post

Теперь мы можем использовать поиск в своих проектах:

use Orchid\Press\Models\Post;
$articles = Post::search('как пропатчить kde2 под freebsd')->get();