Получение дополнительных данных из уже загруженных моделей Magento - PullRequest
7 голосов
/ 26 июня 2011

В некоторых случаях мне вручают модель, содержащую только некоторые данные, которые мне требуются, например, экземпляры catalog/product, которые не содержат определенные атрибуты, которые мне могут понадобиться, такие как размер, номер виджета, или измерение талии.

Чтобы облегчить это, мои текущие параметры:

  • Создайте новый блок и загрузите необходимые атрибуты вручную, используя addAttributeToSelect($name).
  • Загрузка всей модели в шаблон с использованием идентификатора из текущей, недостаточно заполненной модели, например, с Mage::getModel('catalog/product')->getId($product->getId()).

На мой вопрос: есть ли способ выбрать дополнительные атрибуты, которые я хотел бы загрузить в мою коллекцию моделей после вызова ->load()? Кроме того, есть ли способ сделать это на отдельных моделях?

1 Ответ

5 голосов
/ 06 июля 2011

Правильный и самый безопасный подход (но не самый лучший - см. Ниже) описан под вопросом - это загрузка продукта еще раз.

Нет уже разработанных методов добавления дополнительных атрибутов после загрузки продукта по нескольким причинам:

1) Во время жизни модели много ее значений вычисляется и кэшируется внутри модели. Таким образом, добавление дополнительных атрибутов (например, цены) изменит состояние модели, но не повлияет на результаты нескольких методов, которые предназначены для возврата значений этих атрибутов (например, getPrice ()), но внутренне выполняют некоторую дополнительную предварительную обработку и зависят от ранее вычисленных значений. данные.

2) Состояние модели будет несовместимым, так как некоторые методы будут возвращать кэшированные и в настоящее время недопустимые значения, рассчитанные по предыдущему пустому атрибуту, в то время как некоторые другие методы будут возвращать не кэшированные значения. Поэтому использование такой модели будет небезопасным, а ее свойства непредсказуемыми.

3) Сложность кода для поддержки такой перезагрузки довольно велика.

* Решения 1012 *

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

2) Лучшее решение - это загрузить новую коллекцию со всеми продуктами, имеющими все дополнительные атрибуты, всякий раз, когда вы видите, что эти атрибуты требуются, а оригинальная коллекция не имеет их.

3) Лучшее решение - это загрузить оригинальную коллекцию товара всеми необходимыми атрибутами. Иногда коллекции действительно загружают продукты с подмножеством возможных атрибутов - в основном это устаревший код для оптимизации EAV (теперь плоские таблицы включены по умолчанию, и эта оптимизация не требуется) или, возможно, когда коллекция загружается поисковой системой (например, Solr в Magento EE), которая по умолчанию не хранит все атрибуты в своих записях.

3.1) Вы можете добавить необходимые атрибуты в исходную коллекцию в том месте, где она создается - с помощью упомянутого в вопросе addAttributeToSelect($attributeNames) метода

3.2) Вы можете добавить свои атрибуты в список атрибутов, автоматически пополняемый в коллекции. Списки атрибутов отличаются от модуля к модулю, и они хранятся в разных местах. Некоторые находятся в конфиге, другие - в базе данных. Конкретное место (таблица config или db), куда можно добавить атрибуты для автоматического заполнения, зависит от вашего конкретного случая.

4) Иногда, когда вам нужны только значения атрибутов, может быть гораздо проще и быстрее написать модель ресурсов, которая будет напрямую загружать их из БД с помощью productIds и текущей storeId области видимости. Затем вы можете рискнуть, установить их в качестве свойств для продуктов в коллекции или безопасно установить для них значение «Товары» в качестве свойства myAdditionalAttribuesValuesArray или использовать в качестве независимого массива, сопоставленного с идентификаторами продуктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...