Kategorien
Vue

Daten direkt von Elternkomponente an Enkel senden (provide/inject)

Wir können somit Daten über mehreren Komponenten direkt einbinden.

Nachteil:
* das Kindelement weiss nicht woher diese Daten kommen
* die inject-Daten sind nicht reaktiv
* provide / inject nur nutzen, wenn mit statischen Daten gearbeitet wird, die sich nicht reactiv aktualisieren
* Nutzung eines stores erübrigt das Problem

#Elternkomponente, Bereitstellung der Daten
export default {
  name: "App",
  components: {
    StatusCard,
  },
  provide:(){
    maxNumbersOfChars: 255,
    
  },
#Enkel(Kind)komponente, Daten-Injection
export default {
  name: "NewTask",
  inject: ["maxNumbersOfChars"],
  computed: {
    numberOfCharsLeft() {
      return this.maxNumbersOfChars - this.content.length;
    },
  },
Kategorien
Vue

Daten von Kind an Elternkomponente ( Emit)

Wenn Daten als Props von der Root-Komponente an die unteren Kind-Komponenten übergeben werden und die Datenhaltung in der Elternkomponente stattfindet, können die Daten bspw. über eigene Ereignishandler hochgereicht werden, um diese hinzuzufügen.

Bspw.
Elternkomponente -> Kind -> Enkelkind
APP.vue -> StatusCard.vue -> NewTask.vue

Um Daten von NewTask an APP.vue ( Datenhaltung) zu übertragen, nutzen wir:

this.$emit('custom-ereignis',payload);

In der höheren Komponente können wir das Ereignis dann abfangen.

<NewTask v-if="newTasks" @custom-ereignis="createNewTask"></NewTask>

#NewTask.vue
<button class="btn btn-secondary" @click="submitTask">Eintragen</button>

export default {
emits: {
    "new-task": (task) => {
      if (task.content === "") {
        console.warn("Der Content sollte nich leer sein");
        return false;
      }
      return true;
    },
  },
 data() {
    return {
      content: "",
    };
  },
  methods: {
    submitTask() {
      this.$emit("new-task", {
        //Payload
        content: this.content,
      });
      this.content = "";
    },
  },
}

#StatusCard.vue
<NewTask v-if="newTasks" @new-task="createNewTask"></NewTask>

 emits: {
    "new-task": (task) => {
      if ("status" in task === false) {
        console.warn(
          "StatusCardComponent: Jede Aufgabe muss ein Status-Attribut haben."
        );
export default {
  name: "StatusCard",
  components: {
    Task: OneTask,
    NewTask,
  },
  emits: {
    "new-task": (task) => {
      if ("status" in task === false) {
        console.warn(
          "StatusCardComponent: Jede Aufgabe muss ein Status-Attribut haben."
        );
        return false;
      }
      return true;
    },
  },
  props: {
    // card: {
    //   type: Object,
    // },
    title: String,
    titleClasses: String,
    status: Number,
    newTasks: Boolean,
    tasks: {
      type: Array,
    },
  },
  computed: {
  },
  methods: {
    createNewTask(task) {
      console.log(task);

      // Nicht möglich, da task als PROP übergeben wurde und Urheber der Daten ist App.vue
      // this.tasks.push(task);

      task.status = this.status;
      this.$emit("new-task",task);
    },
  },
};
</script>

Kategorien
Allgemein Vue

MIXINS

  • besitzt das mixin gleiche Attribute oder Methoden, wie auch die Komponente, werden diese zusammengeführt
  • bei gleichen Methodennamen in Mixin und Komponente hat die der Komponente Vorrang und die mixin-Methode verfällt
    Methodenname daher entsprechend anpassen
  • Life-Cycle Hooks (mounted) haben in den Mixins Vorrang, dann erst die Hooks aus der Komponente

LOKALE EINBINDUNG

# /mixin/logger.js  - mounted und methods
export default {
    mounted(){
        this.writeLogEntry(`${this.$options.name}-Component vollständig geladen`);
    },
    methods: {
        writeLogEntry(text){
            console.log(text);
        }
    }
}
#App.vue - verwendet mixin und hat eigene method und mounted
export default {
  name: "App",
  mixins: [logger],
  components: {
    StatusCard,
  },
  mounted(){
    console.log("APP Komponente vollständig geladen");
  },

GLOABALE EINBINDUNG

#main.js
import { createApp } from 'vue'
import App from './App.vue'

import logger from './mixins/logger';

const app = createApp(App);
app.mixin(logger)
app.mount('#app')
Kategorien
Allgemein Vue

Slots

Daten von außen nach innen reichen. Slots sind Platzhalter, die von außen gefüllt werden. So kann bspw. vorgegeben werden welche Angaben erwartet werden.

#default
<slot></slot>
<slot name="title"></slot>


Von außen angesteuert:
<template v-slot:title>Text der durchgereicht wird</template>

Kurzschreibweise
<template #title>Titeltext</template>

Freigabe von Daten von innen nach aussen

Definition Slot-Name
<slot name="eventdaten" :eventNameVonAussen="eventDaten"></slot>

Ansteuerung Slot mit Namen
<template #eventdaten="slotProps">{{ slotProps.eventDaten }}</template>

Die Daten werden nach aussen gereicht, Vue sammelt alle Daten, Funktion, Objekte. Wir bestimmen "slotProps" in dem alles gesammelt wurde. Name frei wählbar.

Kategorien
Allgemein Befehle Linux

Certbot renew Certificate or add new Domain





sudo /usr/local/bin/certbot-auto --apache
sudo systemctl restart httpd

Kategorien
XML

Array →XML

Normal Array to XML Format. Sometimes i ve the competetion in projects to parse to in differently formats i.e. API response formats (JSON,XML) and so on.

1.STEP
We

$data =
                [
                    'status' =>  $exception->getStatus(),
                    'error' =>   $exception->getCode(),
                    'message' =>  $exception->getMessage(),
                    'errors'  => $exception->getErrors()
                ];

2.STEP
Create SimpleXMLElement Object then pass addChild elements and then asXML does the rest.

$xmlobj = new SimpleXMLElement('<response/>');

Flip $data 😉 Keys and Values otherwise twisted
$toxml = array_flip($data); 
array_walk_recursive($toxml, array ($xmlobj, 'addChild'));

echo $xmlobj->asXML();

Best Solution for Multidimensional Arrays

 $xmlobj = new SimpleXMLElement('<response/>');
 array2XML($obj, $data);
 
echo $xmlobj->asXML();

function array2XML($obj, $array)
    {
        foreach ($array as $key => $value)
        {
            if(is_numeric($key))
                $key = 'item' . $key;

            if (is_array($value))
            {
                $node = $obj->addChild($key);
                $this->array2XML($node, $value);
            }
            else
            {
                $obj->addChild($key, htmlspecialchars($value));
            }
        }
    }
Kategorien
Allgemein Git

.gitignore

How do I prevent .gitignore from being committed?

//open file in your local project and adding files or directories
//which excluded from commiting
.git/info/exclude

Kategorien
Allgemein IDE Stacks

XDebug with Postman

Normally we rely on browser extension to debugging with PHPStorm /VisualCode and XDebug. But Postman is an own application, so i couldnt install any extension.

The trick 🙂 only append to the end „http://myurl/service?XDEBUG_SESSION_START=PHPSTORM

Kategorien
Allgemein Git

Easy Git Deploying

You like to deploy automatically our Git Project to Production or Testing System.

We create a bare Repository and a Deployment-Directory
/home/user/project/projectname (Git Repository)
/home/user/project/testsystemname (Git Repository)

/var/www/project (Working Tree – Deployment Directory)
/var/www/testsystem (Working Tree – Deployment Directory)

  1. Create an empty „bare“ git repository on your Target (i.e. Production System or Testsystem)
mkdir -p ~/projects/projectname
cd /home/user/projects/procjectname or cd ~/projects/projectname
mkdir project-name.git

git init --bare


mkdir -p ~/projects/projectname-testsystem
cd /home/user/projects/projectname-testsystem 
alternativly cd ~/projects/testsystem
mkdir projectname-testsystem.git

git init --bare

2. User privileges, suggestioned the user has grant to Repository /home/user/projects/project/projectname.git
sudo chown -R `whoami`:`id -gn` /var/www/projectname
sudo chown -R `whoami`:`id -gn` /var/www/projectname-testsystem

3. Create a post-receive hook at 
/home/user/projects/project-name.git/hooks/post-receive/
/home/user/projects/project-name.git/hooks/post-receive

4. Edit post-receive Hook (Production Repo)
You can customize i.e. automatically composer update Project or Backup currently Project files for Rollback possibility.

This example for Production , you can also use for Testsystem.

#!/bin/sh
NOW=$(date +'%d-%m-%Y_%T')
BACKUP=/backups/project/$NOW/

TARGET="/var/www/project"
GIT_DIR="/home/birneos/projekt/guestbook"

# backup current version, in case we need to do a rollback
echo "Create Backup form Old-Version for Rollbacks"
echo "see at $BACKUP"
cp -R /var/www/project/. "$BACKUP"

while read oldrev newrev ref
do
    if [[ $ref =~ .*/master$ ]];
    then
        echo "Master ref received. Deploying master branch to production..."
        git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
    else
	echo "Ref $ref successfully received. Doing nothing: only the ${BRANCH} branch may bei deployed on this server."
    fi
done

# custom steps for deployment
# For example, let's execute composer to refresh our dependencies : 
cd /var/www/project
composer update

5. Make sure it is executable

chmod +x post-receive

6. Add the remote-repository to your local system
Let’s now add a reference to this bare repository to our local system, as a remote location. Let’s call this remote „production“. (It could also be called „staging“ or „live“ or „test“… should you want to deploy to a different system or to multiple systems.)

cd ~/path/to/working-copy/
$ git remote add production ssh://username@myserver.com:22/path/to/project/folder/project-name.git

OR THE ALTERNATIVE...
# ~/project/projectname (the tilde means login into home directory from user (user@remoteip)

cd ~/path/to/working-copy/

git remote add production user@remoteip:~/projekt/projectname

git remote add testsystem birneos@remoteip:~/projekt/projectname-testsystem

7. Check git remote references

git remote -v

8. Thats it. let go and pushing…

git push production master 
git push testsystem master
git push staging master

Kategorien
Linux

Tar Archive , Backups – Exclude Directories


tar -cvzpf backup.tar --exclude=vendor --exclude="logs/" --exclude="tmp/" /var/www/your/project/

-c … create Archive
-v …and show me
-z …compress that
-p …take over all permissions
-f …to folder

Unpacking

tar -xzf archiv.tar.gz -C /home/verzeichnis1/archiv_verzeichnis

-x ...extract archive
-z ...that compressed  
-f ...to folder