Attributes¶
Attributes in Sylius are used to describe traits shared among entities. The best example are products, that may be of the same category and therefore they will have many similar attributes such as number of pages for a book, brand of a T-shirt or simply details of any product.
Attribute¶
The Attribute model has a translatable name (like for instance Book pages
), code (book_pages
) and type (integer
).
There are a few available types of an Attribute:
text (default)
checkbox
integer
percent
textarea
date
datetime
select
What these types may be useful for?
text - brand of a T-Shirt
checkbox - show whether a T-Shirt is made of cotton or not
integer - number of elements when a product is a set of items.
percent - show how much cotton is there in a piece of clothing
textarea - display more detailed information about a product
date - release date of a movie
datetime - accurate date and time of an event
select - genre(s) of a book. one or more of them can be selected
Non-translatable attribute¶
Some attributes (dates, author name) don’t need a different value in each locale. For those attributes, we introduced the possibility to disable translation. Shop Owner declares values only once and regardless of the chosen locale customer will see a proper attribute value.
Warning
Once the attribute has disabled translatability it will erase attribute values in all locales for this attribute.
How to create an Attribute?¶
To give you a better insight into Attributes, let’s have a look how to prepare and add an Attribute with a Product to the system programatically.
To assign Attributes to Products firstly you will need a factory for ProductAttributes. The AttributeFactory has a special method createTyped($type), where $type is a string.
The Attribute needs a code
and a name
before it can be saved in the repository.
/** @var AttributeFactoryInterface $attributeFactory */
$attributeFactory = $this->container->get('sylius.factory.product_attribute');
/** @var AttributeInterface $attribute */
$attribute = $attributeFactory->createTyped('text');
$attribute->setName('Book cover');
$attribute->setCode('book_cover');
$this->container->get('sylius.repository.product_attribute')->add($attribute);
In order to assign value to your Attribute you will need a factory of ProductAttributeValues, use it to create a new value object.
/** @var FactoryInterface $attributeValueFactory */
$attributeValueFactory = $this->container->get('sylius.factory.product_attribute_value');
/** @var AttributeValueInterface $hardcover */
$hardcover = $attributeValueFactory->createNew();
Attach the new AttributeValue to your Attribute and set its value
, which is what will be rendered in frontend.
$hardcover->setAttribute($attribute);
$hardcover->setValue('hardcover');
Finally let’s find a product that will have your newly created attribute.
/** @var ProductInterface $product */
$product = $this->container->get('sylius.repository.product')->findOneBy(['code' => 'code']);
$product->addAttribute($hardcover);
Now let’s see what has to be done if you would like to add an attribute of integer
type. Let’s find such a one in the repository,
it will be for example the BOOK-PAGES
attribute.
/** @var AttributeInterface $bookPagesAttribute */
$bookPagesAttribute = $this->container->get('sylius.repository.product_attribute')->findOneBy(['code' => 'BOOK-PAGES']);
/** @var AttributeValueInterface $pages */
$pages = $attributeValueFactory->createNew();
$pages->setAttribute($bookPagesAttribute);
$pages->setValue(500);
$product->addAttribute($pages);
After adding attributes remember to flush the product manager.
$this->container->get('sylius.manager.product')->flush();
Your Product will now have two Attributes.