FOF30\Form\Form::modelToBindSource PHP Method

modelToBindSource() protected method

The $modelsProcessed array which is passed in successive recursions lets us prevent pointless Inception-style recursions, e.g. Model A is related to Model B is related to Model C is related to Model A. You clearly don't care to see a.b.c.a.b in the results. You just want a.b.c. Obviously c is indirectly related to a because that's where you began the recursion anyway.
protected modelToBindSource ( DataModel $model, integer $maxLevel = 1, array $modelsProcessed = [] ) : array
$model FOF30\Model\DataModel The item to dump its contents into an array
$maxLevel integer Maximum nesting level of relations to process. Default: 1.
$modelsProcessed array Array of the fully qualified model class names already processed.
return array
    protected function modelToBindSource(DataModel $model, $maxLevel = 1, $modelsProcessed = array())
    {
        $maxLevel--;
        $data = $model->toArray();
        $relations = $model->getRelations()->getRelationNames();
        $relationTypes = $model->getRelations()->getRelationTypes();
        $relationTypes = array_map(function ($x) {
            return ltrim($x, '\\');
        }, $relationTypes);
        $relationTypes = array_flip($relationTypes);
        if (is_array($relations) && count($relations) && $maxLevel >= 0) {
            foreach ($relations as $relationName) {
                $rel = $model->getRelations()->getRelation($relationName);
                $class = get_class($rel);
                if (!isset($relationTypes[$class])) {
                    continue;
                }
                if (!in_array($relationTypes[$class], array('hasOne', 'belongsTo'))) {
                    continue;
                }
                /** @var DataModel $relData */
                $relData = $model->{$relationName};
                if (!$relData instanceof DataModel) {
                    continue;
                }
                $modelType = get_class($relData);
                if (in_array($modelType, $modelsProcessed)) {
                    continue;
                }
                $modelsProcessed[] = $modelType;
                $relDataArray = $this->modelToBindSource($relData, $maxLevel, $modelsProcessed);
                if (!is_array($relDataArray) || empty($relDataArray)) {
                    continue;
                }
                foreach ($relDataArray as $k => $v) {
                    $data[$relationName . '.' . $k] = $v;
                }
            }
        }
        return $data;
    }