<<
<
[ {$number} ]
{$number}
>
>>
Shown: from {$BeginItemNumber} to {$EndItemNumber}
Total: {$TotalItems}
Подробнее об используемых здесь тегах в разделе [[limb3:ru:packages:wact:pagination|"Постраничный вывод данных в WACT-шаблонах"]].
Файл shop/template/form_errors.html:
Form was not saved since form fields have the following errors:
- {$message}
Please fix these errors and submit the form once again
Напомним, что тег [[limb3:ru:packages:wact:tags:form_tags:form_errors_tag|
class Product extends lmbActiveRecord
{
protected $_default_sort_params = array('title' => 'ASC');
protected function _createValidator()
{
$validator = new lmbValidator();
$validator->addRequiredRule('title');
$validator->addRequiredRule('description');
$validator->addRequiredRule('price');
return $validator;
}
function getImagePath()
{
if(($image_name = $this->getImageName()) && file_exists(PRODUCT_IMAGES_DIR.$image_name)) {
return '/product_images/' . $image_name;
} else {
return '/images/no_image.gif';
}
}
}
Мы перекрыли в классе фабричный метод **_createValidator()**. Этот метод возвращает валидатор, который используется для проверки данных внутри объектов Product при сохранении. Подробнее о валидации данных в классах ACTIVE_RECORD в разделе [[limb3:ru:packages:active_record:validation|"Валидация данных в объектах"]].
Мы также установили сортировку продуктов по-умолчанию при помощи атрибута **$_default_sort_params**. Теперь при выборках продукты будут сортироваться по заголовку в алфавитном порядке. Подробнее о сортировке по-умолчанию можно узнать в разделе [[limb3:ru:packages:active_record:find|"Поиск и сортировка объектов"]].
Мы также создали метод **getImagePath()**. Этот метод по сути вводит новое **виртуальное поле $image_path**, которое можно использовать в шаблонах (пример будет показан ниже). Поле $image_path мы ввели для того, чтобы не выносить знания о папке product_images/ в шаблоны, и при желании эту папку можно будет легко сменить. Если товар не имеет изображения, тогда будет выводиться /images/no_image.gif
===== Создание, редактирование и удаление товаров =====
==== Шаблон admin_product/display.html ====
Файл shop/template/admin_product/display.html:
Create new product
Title/Image/Price/Description
Actions
-
{$title}
Price:{$price}
-
{$description|nl2br|raw}
Edit
Delete
Поясним некоторые моменты:
* При помощи [[limb3:ru:packages:wact:tags:lmb_fetch_tags:lmb_active_record_fetch_tag|
Файл shop/template/admin_product/edit.html:
Напомним, что **runat** указывает компилятору шаблонов, должен ли тегу соответствовать активный компонент. Элементы формы по-умолчанию наследуют значение этого атрибута, поэтому для кнопок create и edit мы использовали runat='client' чтобы отменить наследование.
Подробнее об этом в разделе [[limb3:ru:packages:wact:form_tags|"Теги форм с активными компонентами или без"]].
Так как поля для обоих форм одинаковые, мы решили вынести их в общий шаблон **form_fields.html**
Файл shop/template/admin_product/form_fields.html:
Specify image file path to upload new image.
Тег [[limb3:ru:packages:wact:tags:form_tags:js_checkbox_tag|
_performCreateOrEdit();
}
function doEdit()
{
$this->_performCreateOrEdit();
}
protected function _performCreateOrEdit()
{
if(!$id = $this->request->getInteger('id'))
$id = null;
$item = new Product($id);
$this->useForm('product_form');
$this->setFormDatasource($item);
if($this->request->hasPost())
{
$item->import($this->request);
$this->_uploadImage($item);
if($item->trySave($this->error_list))
$this->redirect(array('controller' => 'admin_product'));
}
}
function _uploadImage($item)
{
if(!$uploaded_image = $this->request->get('image'))
return;
if(!$uploaded_image['name'] || !$uploaded_image['tmp_name'])
return;
$file_name = $uploaded_image['name'];
$file_path = $uploaded_image['tmp_name'];
lmb_require('limb/util/system/lmbFs.class.php');
$dest_path = PRODUCT_IMAGES_DIR . $file_name;
lmbFs :: cp($file_path, $dest_path);
unlink($file_path);
$item->setImageName($file_name);
}
function doDelete()
{
$item = new Product($this->request->getInteger('id'));
$item->destroy();
$this->redirect();
}
}
?>
Процедуры создания и редактирования товара здесь ничем не отличаются, за исключением того, что при редактировании необходимо инициализировать форму данными из прежде сохраненного товара. Поэтому мы выделили защищенный метод **_performCreateOrEdit()**.
Напомним наиболее важные моменты:
* Объекты **$request**, **$response**, **$error_list**, **$view** доступны в контроллере как атрибуты класса lmbController.
* Если конструктор класса lmbActiveRecord получает в качестве аргумента численное значение - он пытается загрузить сразу же этот объект.
* Метод lmbController :: **useForm($form_id)** необходим чтобы передать список ошибок валидации ($error_list) в активный компонент формы в WACT-шаблоне. В шаблонах admin_product/create.html и admin_product/edit.html мы использовали тег