2016-07-15 7 views
2

Я пытаюсь расширить функциональность импорта массивных объектов в Pimcore, чтобы ограничить пользователей полями, которые они им доступны в своем настраиваемом макете.Pimcore: Как переопределить встроенный контроллер

файл мне нужно переопределить это

pimcore/модули/админ/контроллеры/ObjectController.php

, и я считаю, что метод мне нужно расширить это:

public function importGetFileInfoAction() 
{ 
    $success = true; 
    $supportedFieldTypes = ["checkbox", "country", "date", "datetime", "href", "image", "input", "language", "table", "multiselect", "numeric", "password", "select", "slider", "textarea", "wysiwyg", "objects", "multihref", "geopoint", "geopolygon", "geobounds", "link", "user", "email", "gender", "firstname", "lastname", "newsletterActive", "newsletterConfirmed", "countrymultiselect", "objectsMetadata"]; 
    $file = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_" . $this->getParam("id"); 
    // determine type 
    $dialect = Tool\Admin::determineCsvDialect(PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_" . $this->getParam("id") . "_original"); 
    $count = 0; 
    if (($handle = fopen($file, "r")) !== false) { 
     while (($rowData = fgetcsv($handle, 0, $dialect->delimiter, $dialect->quotechar, $dialect->escapechar)) !== false) { 
      if ($count == 0) { 
       $firstRowData = $rowData; 
      } 
      $tmpData = []; 
      foreach ($rowData as $key => $value) { 
       $tmpData["field_" . $key] = $value; 
      } 
      $data[] = $tmpData; 
      $cols = count($rowData); 
      $count++; 
      if ($count > 18) { 
       break; 
      } 
     } 
     fclose($handle); 
    } 
    // get class data 
    $class = Object\ClassDefinition::getById($this->getParam("classId")); 
    $fields = $class->getFieldDefinitions(); 
    $availableFields = []; 
    foreach ($fields as $key => $field) { 
     $config = null; 
     $title = $field->getName(); 
     if (method_exists($field, "getTitle")) { 
      if ($field->getTitle()) { 
       $title = $field->getTitle(); 
      } 
     } 
     if (in_array($field->getFieldType(), $supportedFieldTypes)) { 
      $availableFields[] = [$field->getName(), $title . "(" . $field->getFieldType() . ")"]; 
     } 
    } 
    $mappingStore = []; 
    for ($i = 0; $i < $cols; $i++) { 
     $mappedField = null; 
     if ($availableFields[$i]) { 
      $mappedField = $availableFields[$i][0]; 
     } 
     $firstRow = $i; 
     if (is_array($firstRowData)) { 
      $firstRow = $firstRowData[$i]; 
      if (strlen($firstRow) > 40) { 
       $firstRow = substr($firstRow, 0, 40) . "..."; 
      } 
     } 
     $mappingStore[] = [ 
      "source" => $i, 
      "firstRow" => $firstRow, 
      "target" => $mappedField 
     ]; 
    } 
    //How many rows 
    $csv = new SplFileObject($file); 
    $csv->setFlags(SplFileObject::READ_CSV); 
    $csv->setCsvControl($dialect->delimiter, $dialect->quotechar, $dialect->escapechar); 
    $rows = 0; 
    $nbFields = 0; 
    foreach ($csv as $fields) { 
     if (0 === $rows) { 
      $nbFields = count($fields); 
      $rows++; 
     } elseif ($nbFields == count($fields)) { 
      $rows++; 
     } 
    } 
    $this->_helper->json([ 
     "success" => $success, 
     "dataPreview" => $data, 
     "dataFields" => array_keys($data[0]), 
     "targetFields" => $availableFields, 
     "mappingStore" => $mappingStore, 
     "rows" => $rows, 
     "cols" => $cols 
    ]); 
} 

Конкретно эти две линии:

$class = Object\ClassDefinition::getById($this->getParam("classId"));

$fields = $class->getFieldDefinitions();

Что я хотел бы сделать, это выяснить, как получить поля, которые пользователь может видеть в пользовательском макете, а затем отфильтровать $fields соответственно. Я бы хотел избежать перезаписи основного файла и вместо этого хотел бы расширить его с помощью плагина.

+0

Вы переопределили файл выше, если у вас есть ответ, напишите как ответ. –

+0

К сожалению, мне не удалось найти ответ. Я закончил переписывание основного файла. –

ответ

2

Возможно, вам необходимо создать плагин, который переопределяет элементы меню в пользовательском интерфейсе, чтобы заменить стандартный импорт объекта на свой собственный.

Вам необходимо создать CustomObjectController, который затем может расширить стандартный объект ObjectController.

+0

, пожалуйста, предоставьте некоторый программный способ перекрыть файл –

Смежные вопросы