php metadaten Yii-Wie kann man Modelldaten in eine Layoutseite einlesen?



php get page title (2)

Ich möchte einige Kategorien auf meiner main.php Seite auflisten. Da das Layout über keinen zugeordneten Controller oder Modell verfügt, möchte ich eine statische Methode wie diese im Kategoriemodell erstellen:

public static function getHeaderModels()
{
   // get all models here
   return $models;
}

und dann im Hauptlayout

<?php
$models = Category::getHeaderModels();
foreach($models as $model)
{
   // ....
}
?>

Meine Frage ist sehr einfach: Wie kann ich diese Kategorienamen aus dem Modell abrufen?

Hier ist das vollständige Modell:

class Category extends CActiveRecord {


    public static function model($className=__CLASS__) {
        return parent::model($className);
    }

    public function tableName() {
        return 'category';
    }

    public function rules() {
        return array(
            array('parent_id', 'numerical', 'integerOnly' => true),
            array('name', 'length', 'max' => 255),
            array('id, parent_id, name', 'safe', 'on' => 'search'),
        );
    }

    public function relations() {
        return array(
            'users' => array(self::MANY_MANY, 'User', 'categories(category_id, user_id)'),
        );
    }

    public function scopes()
    {
        return array(
            'toplevel'=>array(
                'condition' => 'parent_id IS NULL'
            ),
        );
    }

    public function attributeLabels() {
        $id = Yii::t('trans', 'ID');
        $parentId = Yii::t('trans', 'Parent');
        $name = Yii::t('trans', 'Name');

        return array(
            'id' => $id,
            'parent_id' => $parentId,
            'name' => $name,
        );
    }

    public function search() {
        $criteria = new CDbCriteria;
        $criteria->compare('id', $this->id);
        $criteria->compare('parent_id', $this->parent_id);
        $criteria->compare('name', $this->name, true);

        return new CActiveDataProvider(get_class($this), array(
                'criteria' => $criteria,
            ));
    }


        public static function getHeaderModels() {

            //what sintax should I use to retrieve the models here ?

            return $models;

        }

Answer #1

Wenn ich mich nicht irre, können Sie auch jede Variable, die in einer Ansicht verfügbar ist, an das Layout übergeben. Sie tun es einfach aus der Sicht, die Ihre Variable hat. Dies ist der Haken: Sie müssen die Variable deklarieren, die Ihren Wert in der Steuerung erhalten soll:

<?php

class MyController extends Controller
{

    public $myvariable;

Danach ordnen Sie Ihr Modell oder was auch immer dieser öffentlichen Variablen innerhalb Ihrer Ansicht zu, wie folgt:

$this->myvariable = $modeldata;

Nachdem Sie Ihre Modelldaten dem öffentlichen Attribut der Steuerung zugewiesen haben, können Sie diese einfach in Ihrem Layout anzeigen, z.

echo $this->myvariable;

Yii erledigt das bereits, indem Sie dem side2-Menü der Menüleiste von der Ansicht aus Menüpunkte zuweisen:

$this->menu=array(
    array('label'=>'List Item', 'url'=>array('index')),
    array('label'=>'Manage Item', 'url'=>array('admin')),
);

Sie können es in allen create / update Ansichten sehen, die gii crud erstellt.


Answer #2

Vielleicht hilft dir diese Antwort. Zuerst müssen Sie ein Widget erstellen, damit Sie es effektiver nutzen können.

Zuerst erstellen Sie ein neues Widget. Nehmen wir an, der Name ist CategoryWidget . Setzen Sie dieses Widget unter Komponenten Verzeichnis protected/components .

class CategoryWidget extends CWidget {

    public function run() {
        $models = Category::model()->findAll();

        $this->render('category', array(
            'models'=>$models   
        ));
    }
}

Erstellen Sie dann eine Ansicht für dieses Widget. Der Dateiname lautet category.php. Setzen Sie es unter protected/components/views

Kategorie.php

<?php if($models != null): ?>
<ul>
    <?php foreach($models as $model): ?>
    <li><?php echo $model->name; ?></li>
    <?php endforeach; ?>
</ul>
<?php endif; ?>

Dann rufen Sie dieses Widget von Ihrem Hauptlayout auf.

main.php

// your code ...

<?php $this->widget('CategoryWidget') ?>

...