Pimcore:通过包含 Class 名称的字符串创建名称空间对象
Pimcore: Creating Name-Spaced Objects via String Containing Class Name
我在 Pimcore 中开发了一个区域,允许我们 select 从列表中 class 化 Pimcore 对象,并将其转换为 HTML 可渲染形式。
我想通过在后端捕获成功的提交作为对象来增加它的功能,但是我似乎无法使用 [=48] 的标准 PHP 对象创建方法=] 姓名.
我做错了什么? Pimcore 是否以不同的方式处理这个问题?
接受的答案编辑:
我稍微修改了代码以反映已接受答案中的建议。如前所述,重要的是要记住,虽然 class 名称的首字母可以是小写,但它们的实际命名空间标识符使用初始大小写,这是我的代码被破坏的地方。
例如:
$newObj_class
正在输出 Pimcore\Model\Object\className
$newObj_class
应该是 Pimcore\Model\Object\ClassName
注意 className
与 ClassName
...
的区别
这里是该地区工作view.php文件的核心:
// Get a list of available classes...
$form_class = null;
$class_list = new Pimcore\Model\Object\ClassDefinition\Listing();
$class_list->load();
// Turn the class names into dropdown options...
$class_options = array();
foreach( $class_list->getClasses() as $class )
{
$class_options[] = array( $class->name, $class->name );
}
// Admin only code...
if( $this->editmode )
{
$formSource = $this->select(
'formClass',
array(
'store' => $class_options,
'reload' => true
)
);
echo
'<table>'.
'<tr><th>Form Source:</th><td>'.$formSource.'</td></tr>'.
// Additional config fields go here...
'</table>';
}
// Iterate over the classes...
foreach( $class_list->getClasses() as $class )
{
// Skip unselected classes...
if( $this->select( 'formClass' )->getValue() != $class->name )
{
continue;
}
// Handle form submissions...
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
// Create an object using the selected class...
$newObj_class = 'Pimcore\Model\Object\'.ucfirst( (string)$this->select( 'formClass' ) );
$newObj = new $newObj_class();
// Assign field values to the object here...
$newObj->save();
}
}
您的对象 class 名称可能以小写字母开头,但实际 class 始终以大写字母开头。
这应该可以解决您的问题:
$newClass = 'Pimcore\Model\Object\' . ucfirst($this->select( 'formClass' )->getValue());
我在 Pimcore 中开发了一个区域,允许我们 select 从列表中 class 化 Pimcore 对象,并将其转换为 HTML 可渲染形式。
我想通过在后端捕获成功的提交作为对象来增加它的功能,但是我似乎无法使用 [=48] 的标准 PHP 对象创建方法=] 姓名.
我做错了什么? Pimcore 是否以不同的方式处理这个问题?
接受的答案编辑:
我稍微修改了代码以反映已接受答案中的建议。如前所述,重要的是要记住,虽然 class 名称的首字母可以是小写,但它们的实际命名空间标识符使用初始大小写,这是我的代码被破坏的地方。
例如:
$newObj_class
正在输出 Pimcore\Model\Object\className
$newObj_class
应该是 Pimcore\Model\Object\ClassName
注意 className
与 ClassName
...
这里是该地区工作view.php文件的核心:
// Get a list of available classes...
$form_class = null;
$class_list = new Pimcore\Model\Object\ClassDefinition\Listing();
$class_list->load();
// Turn the class names into dropdown options...
$class_options = array();
foreach( $class_list->getClasses() as $class )
{
$class_options[] = array( $class->name, $class->name );
}
// Admin only code...
if( $this->editmode )
{
$formSource = $this->select(
'formClass',
array(
'store' => $class_options,
'reload' => true
)
);
echo
'<table>'.
'<tr><th>Form Source:</th><td>'.$formSource.'</td></tr>'.
// Additional config fields go here...
'</table>';
}
// Iterate over the classes...
foreach( $class_list->getClasses() as $class )
{
// Skip unselected classes...
if( $this->select( 'formClass' )->getValue() != $class->name )
{
continue;
}
// Handle form submissions...
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
// Create an object using the selected class...
$newObj_class = 'Pimcore\Model\Object\'.ucfirst( (string)$this->select( 'formClass' ) );
$newObj = new $newObj_class();
// Assign field values to the object here...
$newObj->save();
}
}
您的对象 class 名称可能以小写字母开头,但实际 class 始终以大写字母开头。
这应该可以解决您的问题:
$newClass = 'Pimcore\Model\Object\' . ucfirst($this->select( 'formClass' )->getValue());