Pimcore:通过包含类名

时间:2016-06-02 13:44:33

标签: php object namespaces instance pimcore

我在Pimcore中开发了一个区域,允许我们从列表中选择Pimcore对象分类,并将其转换为HTML可渲染表单。

我想通过在后端捕获成功提交的对象来增加其功能,但是我似乎无法使用标准PHP方法通过类名创建对象。

我做错了什么? Pimcore是否以不同的方式处理这个问题?

接受的答案编辑:

我稍微修改了代码,以反映接受答案中的建议。如上所述,重要的是要记住,虽然类名可以包含小写的第一个字母,但它们的实际命名空间标识符使用初始大小写,这是我的代码破坏的地方。

例如:
$newObj_class正在输出Pimcore\Model\Object\className $newObj_class应该是Pimcore\Model\Object\ClassName

注意className vs 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();
  }

}

1 个答案:

答案 0 :(得分:2)

您的对象类名称可能以小写字母开头,但实际的类始终以大写字母显示。

这可以解决您的问题:

$newClass = 'Pimcore\\Model\\Object\\' . ucfirst($this->select( 'formClass' )->getValue());
相关问题