Правильный и самый безопасный подход (но не самый лучший - см. Ниже) описан под вопросом - это загрузка продукта еще раз.
Нет уже разработанных методов добавления дополнительных атрибутов после загрузки продукта по нескольким причинам:
1) Во время жизни модели много ее значений вычисляется и кэшируется внутри модели. Таким образом, добавление дополнительных атрибутов (например, цены) изменит состояние модели, но не повлияет на результаты нескольких методов, которые предназначены для возврата значений этих атрибутов (например, getPrice ()), но внутренне выполняют некоторую дополнительную предварительную обработку и зависят от ранее вычисленных значений. данные.
2) Состояние модели будет несовместимым, так как некоторые методы будут возвращать кэшированные и в настоящее время недопустимые значения, рассчитанные по предыдущему пустому атрибуту, в то время как некоторые другие методы будут возвращать не кэшированные значения. Поэтому использование такой модели будет небезопасным, а ее свойства непредсказуемыми.
3) Сложность кода для поддержки такой перезагрузки довольно велика.
* Решения 1012 *
1) Первое хорошее решение (хотя и самое тяжелое) - это загрузить продукт еще раз, каждый раз, когда вашему блоку / модели / помощнику требуется расширенный набор атрибутов.
2) Лучшее решение - это загрузить новую коллекцию со всеми продуктами, имеющими все дополнительные атрибуты, всякий раз, когда вы видите, что эти атрибуты требуются, а оригинальная коллекция не имеет их.
3) Лучшее решение - это загрузить оригинальную коллекцию товара всеми необходимыми атрибутами. Иногда коллекции действительно загружают продукты с подмножеством возможных атрибутов - в основном это устаревший код для оптимизации EAV (теперь плоские таблицы включены по умолчанию, и эта оптимизация не требуется) или, возможно, когда коллекция загружается поисковой системой (например, Solr в Magento EE), которая по умолчанию не хранит все атрибуты в своих записях.
3.1) Вы можете добавить необходимые атрибуты в исходную коллекцию в том месте, где она создается - с помощью упомянутого в вопросе addAttributeToSelect($attributeNames)
метода
3.2) Вы можете добавить свои атрибуты в список атрибутов, автоматически пополняемый в коллекции. Списки атрибутов отличаются от модуля к модулю, и они хранятся в разных местах. Некоторые находятся в конфиге, другие - в базе данных. Конкретное место (таблица config или db), куда можно добавить атрибуты для автоматического заполнения, зависит от вашего конкретного случая.
4) Иногда, когда вам нужны только значения атрибутов, может быть гораздо проще и быстрее написать модель ресурсов, которая будет напрямую загружать их из БД с помощью productIds
и текущей storeId
области видимости. Затем вы можете рискнуть, установить их в качестве свойств для продуктов в коллекции или безопасно установить для них значение «Товары» в качестве свойства myAdditionalAttribuesValuesArray
или использовать в качестве независимого массива, сопоставленного с идентификаторами продуктов.